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 @@ -
+ + - - + + +{{.IP}}
{{.Country}}
{{.Continent}}
{{.AsName}}
{{.Ip.IP}}
+{{.Ip.Country}}
+{{.Ip.Continent}}
+{{.Ip.AsName}}
+{{.IP2.City}}
+{{.IP2.Lat}}, {{.IP2.Lon}}
+