QB64 Phoenix Edition
Christmas Info (Windows Users) - Printable Version

+- QB64 Phoenix Edition (https://qb64phoenix.com/forum)
+-- Forum: QB64 Rising (https://qb64phoenix.com/forum/forumdisplay.php?fid=1)
+--- Forum: Prolific Programmers (https://qb64phoenix.com/forum/forumdisplay.php?fid=26)
+---- Forum: SMcNeill (https://qb64phoenix.com/forum/forumdisplay.php?fid=29)
+---- Thread: Christmas Info (Windows Users) (/showthread.php?tid=3132)



Christmas Info (Windows Users) - SMcNeill - 10-17-2024

Code: (Select All)
$Console:Only
_Dest _Console

ip$ = GetPublicIP$
Print "Your IP Address is:"; ip$
Print
Lat_Long ip$, lat, lon
Print "Your Latitude and Longitude is: "; lat, lon
Print
Print "For your location, the following is true for Xmas day:"
SunStuff lat, lon, 12, 25, 2020


Function GetPublicIP$
f = FreeFile
Open "tempPIP.txt" For Output As #f: Close f
Shell _Hide "cmd /c nslookup myip.opendns.com resolver1.opendns.com>tempPIP.txt"

Open "tempPIP.txt" For Input As #f
If LOF(f) Then
Do
Line Input #f, temp$
If temp$ <> "" Then last$ = temp$ 'there's a blank line after the data we need.
' Ignore it. What we want is the last line of info generated here.
Loop Until EOF(1)
End If
Close f
l = _InStrRev(last$, "Address:")
If l Then GetPublicIP$ = Mid$(last$, l + 10)
Kill "tempPIP.txt"
End Function

Sub Lat_Long (ip$, lat, lon)
out$ = "powershell.exe -c " + Chr$(34) + "Invoke-Webrequest 'ip-api.com/line/"
out$ = out$ + ip$
out$ = out$ + "?fields=lat,lon' -OutFile '.\temp.txt'" + Chr$(34)
Shell _Hide out$
Open "temp.txt" For Input As #1
Input #1, lat
Input #1, lon
Close 1
End Sub

Sub SunStuff (lat, lon, month, day, year)
out$ = "powershell.exe -c " + Chr$(34) + "Invoke-Webrequest 'https://api.sunrise-sunset.org/json?lat="
out$ = out$ + _Trim$(Str$(lat)) + "&lng="
out$ = out$ + _Trim$(Str$(lon)) + "&date="
d$ = _Trim$(Str$(year)) + _Trim$(Str$(month)) + _Trim$(Str$(day))
out$ = out$ + d$ + "' -OutFile '.\temp.txt'"
Shell out$
Open "temp.txt" For Binary As #1
t$ = Space$(LOF(1))
Get #1, 1, t$
'strip off unwanted stuff
l = InStr(t$, ":{"): t$ = Mid$(t$, l + 2)
Do
l = InStr(t$, Chr$(34))
t$ = Left$(t$, l - 1) + Mid$(t$, l + 1)
Loop Until l = 0
Do
l = InStr(t$, "_")
t$ = Left$(t$, l - 1) + " " + Mid$(t$, l + 1)
Loop Until l = 0
t$ = _Trim$(t$)
t$ = Left$(t$, Len(t$) - 1)

Do
l = InStr(t$, ",")
If l = 0 Then Exit Do
whole$ = Left$(t$, l)
l$ = Left$(whole$, InStr(whole$, ":") - 1)
r$ = Mid$(whole$, InStr(whole$, ":") + 1)
r$ = Left$(r$, Len(r$) - 1)
Print l$; " is "; r$
t$ = Mid$(t$, l + 1)
Loop
Close 1
End Sub



RE: Christmas Info (Windows Users) - PhilOfPerth - 10-18-2024

Should be an interesting day in Aus: Sunrise 9:08 pm, Sunset 11:25 am ??? [Image: biggrin.png]


RE: Christmas Info (Windows Users) - SMcNeill - 10-18-2024

(10-18-2024, 03:22 AM)PhilOfPerth Wrote: Should be an interesting day in Aus: Sunrise 9:08 pm, Sunset 11:25 am ??? [Image: biggrin.png]

That's actually right.   Big Grin

You just have to adjust for the time zone difference for wherever you are from UTC, and then maybe add/subtract an hour for Daylight Savings Time, if applicable.

Times are all in UTC time.  (I guess I should've said that to start with.  Tongue

I'm just guessing, but would +9 sound about right for you, where you're at?  6:08 AM  and  8:25 PM for DEC 25th?


RE: Christmas Info (Windows Users) - CletusSnow - 10-18-2024

I noticed a problem in line 34: After changing 'ip-api.com' to 'www.ip-api.com', it worked fine. Without 'www', an error occurs during execution in line 38 because the file 'temp.txt' is not found.
Greetings from Germany


RE: Christmas Info (Windows Users) - SMcNeill - 10-18-2024

(10-18-2024, 12:44 PM)CletusSnow Wrote: I noticed a problem in line 34: After changing 'ip-api.com' to 'www.ip-api.com', it worked fine. Without 'www', an error occurs during execution in line 38 because the file 'temp.txt' is not found.
Greetings from Germany

Which version of Windows an Powershell, do you know?  I haven't had any issues with it, but that doesn't mean much as various versions of these tools get upgraded over time and systems and such.  I'm just curious if I can narrow down the problem and see why it works on my machine (and apparently Phil's as well), and yet needs to be modified for yours.  

Maybe it's a firewall or antivirus thing in effect?    Honestly, it's sometimes hard to tell when dealing with interweb unk.  Wink


RE: Christmas Info (Windows Users) - CletusSnow - 10-19-2024

I have Windows 10 19045.5070 and PowerShell 7.4.5. Standard Windows security and firewall. Same issue on my Tablet and my other PC. Maybe special effects only for Germany?

Edit: It works fine on a virtual machine with Windows 11 26100 and PowerShell 1.0. It still works after an upgrade to PS 7.4.5


RE: Christmas Info (Windows Users) - JRace - 10-19-2024

The program doesn't work for me even with @CletusSnow's fix.

It looks like Invoke-Webrequest was introduced in PS 3, so it doesn't work on my lowly Win7 box which is stuck with PS 2.0.  (I've tried upgrading, but the MS installer package laughs in derision and shuts down.)

If someone needs to check their PS version, they can type $PSVersionTable at the PS prompt.


Edit: got it to work using curl instead of PowersHell:
Code: (Select All)
$Console:Only
_Dest _Console

ip$ = GetPublicIP$
Print "Your IP Address is:"; ip$
Print
Lat_Long ip$, lat, lon
Print "Your Latitude and Longitude is: "; lat, lon
Print
Print "For your location, the following is true for Xmas day:"
SunStuff lat, lon, 12, 25, 2020


Function GetPublicIP$
    f = FreeFile
    Open "tempPIP.txt" For Output As #f: Close f
    Shell _Hide "cmd /c nslookup myip.opendns.com resolver1.opendns.com>tempPIP.txt"

    Open "tempPIP.txt" For Input As #f
    If LOF(f) Then
        Do
            Line Input #f, temp$
            If temp$ <> "" Then last$ = temp$ 'there's a blank line after the data we need.
            '                                 Ignore it.  What we want is the last line of info generated here.
        Loop Until EOF(1)
    End If
    Close f
    l = _InStrRev(last$, "Address:")
    If l Then GetPublicIP$ = Mid$(last$, l + 10)
    Kill "tempPIP.txt"
End Function

Sub Lat_Long (ip$, lat, lon)
    'out$ = "powershell.exe -c " + Chr$(34) + "Invoke-Webrequest 'ip-api.com/line/"
    out$ = "curl -s -o ./temp.txt " + Chr$(34) + "http://www.ip-api.com/line/"
    out$ = out$ + ip$
    out$ = out$ + "?fields=lat,lon" + Chr$(34)
    'out$ = out$ + "?fields=lat,lon' -OutFile '.\temp.txt'" + Chr$(34)
    Shell _Hide out$
    Open "temp.txt" For Input As #1
    Input #1, lat
    Input #1, lon
    Close 1
End Sub

Sub SunStuff (lat, lon, month, day, year)
    'out$ = "powershell.exe -c " + Chr$(34) + "Invoke-Webrequest 'https://api.sunrise-sunset.org/json?lat="
    out$ = "curl -s -o temp.txt " + Chr$(34) + "http://api.sunrise-sunset.org/json?lat="
    out$ = out$ + _Trim$(Str$(lat)) + "&lng="
    out$ = out$ + _Trim$(Str$(lon)) + "&date="
    d$ = _Trim$(Str$(year)) + _Trim$(Str$(month)) + _Trim$(Str$(day))
    '    out$ = out$ + d$ + "'   -OutFile '.\temp.txt'"
    Shell out$
    Open "temp.txt" For Binary As #1
    t$ = Space$(LOF(1))
    Get #1, 1, t$
    'strip off unwanted stuff
    l = InStr(t$, ":{"): t$ = Mid$(t$, l + 2)
    Do
        l = InStr(t$, Chr$(34))
        t$ = Left$(t$, l - 1) + Mid$(t$, l + 1)
    Loop Until l = 0
    Do
        l = InStr(t$, "_")
        t$ = Left$(t$, l - 1) + " " + Mid$(t$, l + 1)
    Loop Until l = 0
    t$ = _Trim$(t$)
    t$ = Left$(t$, Len(t$) - 1)

    Do
        l = InStr(t$, ",")
        If l = 0 Then Exit Do
        whole$ = Left$(t$, l)
        l$ = Left$(whole$, InStr(whole$, ":") - 1)
        r$ = Mid$(whole$, InStr(whole$, ":") + 1)
        r$ = Left$(r$, Len(r$) - 1)
        Print l$; " is "; r$
        t$ = Mid$(t$, l + 1)
    Loop
    Close 1
End Sub



   

Man, that late sunrise/sunset in the wintertime really messes with my sleep schedule.


RE: Christmas Info (Windows Users) - SMcNeill - 10-20-2024

@CletusSnow
@JRace

Give this version a shot, guys:

Code: (Select All)
$Unstable:Http

$Console:Only
_Dest _Console

ip$ = GetPublicIP$
Print "Your IP Address is:"; ip$
Print
Lat_Long ip$, lat, lon
Print "Your Latitude and Longitude is: "; lat, lon
Print
Print "For your location, the following is true for Xmas day:"
SunStuff lat, lon, 12, 25, 2024


Function GetPublicIP$
    f = FreeFile
    Open "tempPIP.txt" For Output As #f: Close f
    Shell _Hide "cmd /c nslookup myip.opendns.com resolver1.opendns.com>tempPIP.txt"

    Open "tempPIP.txt" For Input As #f
    If LOF(f) Then
        Do
            Line Input #f, temp$
            If temp$ <> "" Then last$ = temp$ 'there's a blank line after the data we need.
            '                                Ignore it.  What we want is the last line of info generated here.
        Loop Until EOF(1)
    End If
    Close f
    l = _InStrRev(last$, "Address:")
    If l Then GetPublicIP$ = Mid$(last$, l + 10)
    Kill "tempPIP.txt"
End Function

Sub Lat_Long (ip$, lat, lon)
    out$ = "www.ip-api.com/line/" + ip$ + "?fields=lat"
    t$ = Download$(out$, junk&)
    lat = Val(t$)
    out$ = "www.ip-api.com/line/" + ip$ + "?fields=lon"
    t$ = Download$(out$, junk&)
    lon = Val(t$)
End Sub

Sub SunStuff (lat, lon, month, day, year)
    out$ = "api.sunrise-sunset.org/json?lat="
    out$ = out$ + _Trim$(Str$(lat)) + "&lng="
    out$ = out$ + _Trim$(Str$(lon)) + "&date="
    d$ = _Trim$(Str$(year)) + _Trim$(Str$(month)) + _Trim$(Str$(day))
    out$ = out$ + d$
    t$ = Download$(out$, junk&)
    'strip off unwanted stuff
    l = InStr(t$, ":{"): t$ = Mid$(t$, l + 2)
    Do
        l = InStr(t$, Chr$(34))
        t$ = Left$(t$, l - 1) + Mid$(t$, l + 1)
    Loop Until l = 0
    Do
        l = InStr(t$, "_")
        t$ = Left$(t$, l - 1) + " " + Mid$(t$, l + 1)
    Loop Until l = 0
    t$ = _Trim$(t$)
    t$ = Left$(t$, Len(t$) - 1)

    Do
        l = InStr(t$, ",")
        If l = 0 Then Exit Do
        whole$ = Left$(t$, l)
        l$ = Left$(whole$, InStr(whole$, ":") - 1)
        r$ = Mid$(whole$, InStr(whole$, ":") + 1)
        r$ = Left$(r$, Len(r$) - 1)
        Print l$; " is "; r$
        t$ = Mid$(t$, l + 1)
    Loop
    Close 1
End Sub



' Content of the HTTP response is returned. The statusCode is also assigned.
Function Download$ (url As String, statusCode As Long)
    h& = _OpenClient("HTTP:" + url)
    statusCode = _StatusCode(h&)
    While Not EOF(h&)
        _Limit 60
        Get #h&, , s$
        content$ = content$ + s$
    Wend
    Close #h&
    Download$ = content$
End Function

Here, I've taken out the powershell commands and swapped this over to using our native QB64PE tcp/ip connections to download from the internet.  I'm thinking this should work for everyone without any issues.

(This may even work for Linux/Mac folks, if you can supply your lat/lon coordinates for it.  (Or ip address, as we use it to look up your lat/lon for you.)


RE: Christmas Info (Windows Users) - JRace - 10-20-2024

Smooth as silk on Win7 Pro 64-bit.


RE: Christmas Info (Windows Users) - CletusSnow - 10-21-2024

Yep, it works.