diff --git a/main.go b/main.go index 1c169ce..393c7f1 100644 --- a/main.go +++ b/main.go @@ -2,9 +2,9 @@ package main import ( "encoding/json" - "errors" "fmt" "io" + "log/slog" "net" "net/http" "os" @@ -24,6 +24,28 @@ type ipResponse struct { Continent string `json:"continent"` } +type IPInfo struct { + Query string `json:"query"` + Status string `json:"status"` + Country string `json:"country"` + CountryCode string `json:"countryCode"` + Region string `json:"region"` + RegionName string `json:"regionName"` + City string `json:"city"` + Zip string `json:"zip"` + Lat float64 `json:"lat"` + Lon float64 `json:"lon"` + Timezone string `json:"timezone"` + ISP string `json:"isp"` + Org string `json:"org"` + AS string `json:"as"` +} + +type TemolateData struct { + Ip ipResponse + IP2 IPInfo +} + func main() { mux := http.NewServeMux() @@ -40,6 +62,7 @@ func main() { http.ListenAndServe(":8080", mux) } +// Routes func handleRoot(w http.ResponseWriter, r *http.Request) { templ, err := template.ParseFiles("templates/home.html") if err != nil { @@ -58,34 +81,35 @@ func handleRoot(w http.ResponseWriter, r *http.Request) { host, _, _ = net.SplitHostPort(r.RemoteAddr) } - dox, err := callApi(host) - if err != nil { - http.Error(w, "api call failed", http.StatusInternalServerError) - return - } + dox := callApi(host) + dox2 := secondApi(host) - templ.Execute(w, dox) + templ.Execute(w, TemolateData{Ip: dox, IP2: *dox2}) } func serveRobots(w http.ResponseWriter, r *http.Request) { http.ServeFile(w, r, ("templates/robots.txt")) } -func callApi(ip string) (ipResponse, error) { +// utils +func callApi(ip string) ipResponse { api := os.Getenv("IPAPI") - fmt.Printf("api: %v\n", api) + + slog.Info("client called", "ip", ip) var values ipResponse if api == " " { - return values, errors.New("No api key") + slog.Error("No api provided") + return values } url := fmt.Sprintf("https://api.ipinfo.io/lite/%s?token=%s", ip, api) request, err := http.Get(url) if err != nil { - return values, errors.New("request failed") + slog.Error("callApi Error") + return values } defer request.Body.Close() @@ -93,5 +117,26 @@ func callApi(ip string) (ipResponse, error) { err = json.Unmarshal(body, &values) - return values, nil + return values +} + +func secondApi(ip string) *IPInfo { + url := fmt.Sprintf("http://ip-api.com/json/%s", ip) + + var res IPInfo + + response, err := http.Get(url) + if err != nil { + slog.Error("secondApi err") + return &res + } + defer response.Body.Close() + + body, _ := io.ReadAll(response.Body) + + json.Unmarshal(body, &res) + + slog.Debug("secondApi", "city", res.City, "lat", res.Lat, "lon", res.Lon, "status", res.Status) + + return &res } diff --git a/static/styles.css b/static/styles.css index 41d5c14..20dad70 100644 --- a/static/styles.css +++ b/static/styles.css @@ -13,6 +13,23 @@ h1 { font-family: GlitchGoblin; } +.layout { + display: flex; + gap: 40px; + align-items: flex-start; + padding: 0 40px; +} + +.container { + flex-shrink: 0; +} + +#map { + width: 400px; + height: 400px; + flex-shrink: 0; +} + .info { margin-bottom: 20px; } diff --git a/templates/home.html b/templates/home.html index f140e08..7c32de5 100644 --- a/templates/home.html +++ b/templates/home.html @@ -1,24 +1,60 @@ - + + - - + + + Who are you? - - + + +

U HAVE THREAD
UPON MY DOMAIN
& MUST SUFFER
WHO R U?

-
-

IP Address:

{{.IP}}

-

Country:

{{.Country}}

-

Continent:

{{.Continent}}

-

Internet Provider:

{{.AsName}}

+
+
+
+

IP Address:

+

{{.Ip.IP}}

+
+
+

Country:

+

{{.Ip.Country}}

+
+
+

Continent:

+

{{.Ip.Continent}}

+
+
+

Internet Provider:

+

{{.Ip.AsName}}

+
+
+

City:

+

{{.IP2.City}}

+
+
+

Coordinates:

+

{{.IP2.Lat}}, {{.IP2.Lon}}

+
+
+
+ + +
- + +