--- /dev/null
+Copyright (c) 2023 Izuru Yakumo <postmaster@chaotic.ninja>
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
+REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
+INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+PERFORMANCE OF THIS SOFTWARE.
--- /dev/null
+![](https://raddle.me/submission_images/61e31cb98ba6f807847098560a6b29b2fbdf822069186d2cfe5fa67f747b13f2.gif)
+
+# mizuchi
+The above animated picture says it all.
+That aside, this was a full port from a shell script that I have never used seriously.
+
+## Build
+It has two flavors, and have slightly different output.
+
+### For [ip-api.com](https://ip-api.com)
+
+```
+go build ./cmd/mizuchi-ipapi
+```
+
+### For [ipinfo.io](https://ipinfo.io)
+
+```
+go build ./cmd/mizuchi-ipinfo
+```
+
+## Usage
+Only required argument is `-i`
--- /dev/null
+package main
+
+import (
+ "encoding/json"
+ "flag"
+ "fmt"
+ "net/http"
+)
+type Status struct {
+ Continent string `json:"continent"`
+ Country string `json:"country"`
+ Region string `json:"region"`
+ City string `json:"city"`
+ Zip string `json:"zip"`
+ Latitude string `json:"lat"`
+ Longitude string `json:"lon"`
+ Timezone string `json:"timezone"`
+ Query string `json:"query"`
+}
+const (
+ url = "http://ip-api.com"
+)
+var (
+ ip_addr string
+)
+func init() {
+ flag.StringVar(&ip_addr, "i", "1.1.1.1", "IP address to check")
+}
+func main() {
+ flag.Parse()
+
+ if len(ip_addr) == 0 {
+ fmt.Println("No IP address given, trying default")
+ }
+
+ var status Status
+ query_url := url + "/" + ip_addr
+ resp, err := http.Get(query_url)
+ if err != nil {
+ fmt.Println(err)
+ }
+ defer resp.Body.Close()
+ _ = json.NewDecoder(resp.Body).Decode(&status)
+ fmt.Printf("Continent: %v\nCountry: %v\nRegion: %v\nCity: %v\nZip: %v\nLatitude: %v\nLongitude: %v\nTimezone: %v\nQuery: %v\n", status.Continent, status.Country, status.Region, status.City, status.Zip, status.Latitude, status.Longitude, status.Timezone, status.Query)
+}
--- /dev/null
+package main
+
+import (
+ "encoding/json"
+ "flag"
+ "fmt"
+ "net/http"
+)
+type Status struct {
+ IP string `json:"ip"`
+ Hostname string `json:"hostname"`
+ City string `json:"city"`
+ Region string `json:"region"`
+ Country string `json:"country"`
+ Location string `json:"loc"`
+ Organization string `json:"org"`
+ Postal string `json:"postal"`
+ Timezone string `json:"timezone"`
+}
+const (
+ url = "https://ipinfo.io"
+)
+var (
+ ip_addr string
+)
+func init() {
+ flag.StringVar(&ip_addr, "i", "1.1.1.1", "IP address to check")
+}
+func main() {
+ flag.Parse()
+
+ if len(ip_addr) == 0 {
+ fmt.Println("No IP address given, trying default")
+ }
+
+ var status Status
+ query_url := url + "/" + ip_addr
+ resp, err := http.Get(query_url)
+ if err != nil {
+ fmt.Println(err)
+ }
+ defer resp.Body.Close()
+ _ = json.NewDecoder(resp.Body).Decode(&status)
+ fmt.Printf("IP: %v\nHostname: %v\nCity: %v\nRegion: %v\nCountry %v\nLocation: %v\nOrganization: %v\nPostal: %v\nTimezone: %v\n", status.IP, status.Hostname, status.City, status.Region, status.Country, status.Location, status.Organization, status.Postal, status.Timezone)
+}
--- /dev/null
+module git.chaotic.ninja/yakumo.izuru/mizuchi
+
+go 1.20
--- /dev/null
+Copyright (c) 2023 Izuru Yakumo <postmaster@chaotic.ninja>
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
+REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
+INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+PERFORMANCE OF THIS SOFTWARE.
--- /dev/null
+![](https://raddle.me/submission_images/61e31cb98ba6f807847098560a6b29b2fbdf822069186d2cfe5fa67f747b13f2.gif)
+
+# mizuchi
+The above animated picture says it all.
+That aside, this was a full port from a shell script that I have never used seriously.
+
+## Build
+It has two flavors, and have slightly different output.
+
+### For [ip-api.com](https://ip-api.com)
+
+```
+go build ./cmd/mizuchi-ipapi
+```
+
+### For [ipinfo.io](https://ipinfo.io)
+
+```
+go build ./cmd/mizuchi-ipinfo
+```
+
+## Usage
+Only required argument is `-i`
--- /dev/null
+package main
+
+import (
+ "encoding/json"
+ "flag"
+ "fmt"
+ "net/http"
+)
+type Status struct {
+ Continent string `json:"continent"`
+ Country string `json:"country"`
+ Region string `json:"region"`
+ City string `json:"city"`
+ Zip string `json:"zip"`
+ Latitude string `json:"lat"`
+ Longitude string `json:"lon"`
+ Timezone string `json:"timezone"`
+ Query string `json:"query"`
+}
+const (
+ url = "http://ip-api.com"
+)
+var (
+ ip_addr string
+)
+func init() {
+ flag.StringVar(&ip_addr, "i", "1.1.1.1", "IP address to check")
+}
+func main() {
+ flag.Parse()
+
+ if len(ip_addr) == 0 {
+ fmt.Println("No IP address given, trying default")
+ }
+
+ var status Status
+ query_url := url + "/" + ip_addr
+ resp, err := http.Get(query_url)
+ if err != nil {
+ fmt.Println(err)
+ }
+ defer resp.Body.Close()
+ _ = json.NewDecoder(resp.Body).Decode(&status)
+ fmt.Printf("Continent: %v\nCountry: %v\nRegion: %v\nCity: %v\nZip: %v\nLatitude: %v\nLongitude: %v\nTimezone: %v\nQuery: %v\n", status.Continent, status.Country, status.Region, status.City, status.Zip, status.Latitude, status.Longitude, status.Timezone, status.Query)
+}
--- /dev/null
+package main
+
+import (
+ "encoding/json"
+ "flag"
+ "fmt"
+ "net/http"
+)
+type Status struct {
+ IP string `json:"ip"`
+ Hostname string `json:"hostname"`
+ City string `json:"city"`
+ Region string `json:"region"`
+ Country string `json:"country"`
+ Location string `json:"loc"`
+ Organization string `json:"org"`
+ Postal string `json:"postal"`
+ Timezone string `json:"timezone"`
+}
+const (
+ url = "https://ipinfo.io"
+)
+var (
+ ip_addr string
+)
+func init() {
+ flag.StringVar(&ip_addr, "i", "1.1.1.1", "IP address to check")
+}
+func main() {
+ flag.Parse()
+
+ if len(ip_addr) == 0 {
+ fmt.Println("No IP address given, trying default")
+ }
+
+ var status Status
+ query_url := url + "/" + ip_addr
+ resp, err := http.Get(query_url)
+ if err != nil {
+ fmt.Println(err)
+ }
+ defer resp.Body.Close()
+ _ = json.NewDecoder(resp.Body).Decode(&status)
+ fmt.Printf("IP: %v\nHostname: %v\nCity: %v\nRegion: %v\nCountry %v\nLocation: %v\nOrganization: %v\nPostal: %v\nTimezone: %v\n", status.IP, status.Hostname, status.City, status.Region, status.Country, status.Location, status.Organization, status.Postal, status.Timezone)
+}
--- /dev/null
+module git.chaotic.ninja/yakumo.izuru/mizuchi
+
+go 1.20
--- /dev/null
+Copyright (c) 2023 Izuru Yakumo <postmaster@chaotic.ninja>
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
+REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
+INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+PERFORMANCE OF THIS SOFTWARE.
--- /dev/null
+![](https://raddle.me/submission_images/61e31cb98ba6f807847098560a6b29b2fbdf822069186d2cfe5fa67f747b13f2.gif)
+
+# mizuchi
+The above animated picture says it all.
+That aside, this was a full port from a shell script that I have never used seriously.
+
+## Build
+It has two flavors, and have slightly different output.
+
+### For [ip-api.com](https://ip-api.com)
+
+```
+go build ./cmd/mizuchi-ipapi
+```
+
+### For [ipinfo.io](https://ipinfo.io)
+
+```
+go build ./cmd/mizuchi-ipinfo
+```
+
+## Usage
+Only required argument is `-i`
--- /dev/null
+package main
+
+import (
+ "encoding/json"
+ "flag"
+ "fmt"
+ "net/http"
+)
+type Status struct {
+ Continent string `json:"continent"`
+ Country string `json:"country"`
+ Region string `json:"region"`
+ City string `json:"city"`
+ Zip string `json:"zip"`
+ Latitude string `json:"lat"`
+ Longitude string `json:"lon"`
+ Timezone string `json:"timezone"`
+ Query string `json:"query"`
+}
+const (
+ url = "http://ip-api.com"
+)
+var (
+ ip_addr string
+)
+func init() {
+ flag.StringVar(&ip_addr, "i", "1.1.1.1", "IP address to check")
+}
+func main() {
+ flag.Parse()
+
+ if len(ip_addr) == 0 {
+ fmt.Println("No IP address given, trying default")
+ }
+
+ var status Status
+ query_url := url + "/" + ip_addr
+ resp, err := http.Get(query_url)
+ if err != nil {
+ fmt.Println(err)
+ }
+ defer resp.Body.Close()
+ _ = json.NewDecoder(resp.Body).Decode(&status)
+ fmt.Printf("Continent: %v\nCountry: %v\nRegion: %v\nCity: %v\nZip: %v\nLatitude: %v\nLongitude: %v\nTimezone: %v\nQuery: %v\n", status.Continent, status.Country, status.Region, status.City, status.Zip, status.Latitude, status.Longitude, status.Timezone, status.Query)
+}
--- /dev/null
+package main
+
+import (
+ "encoding/json"
+ "flag"
+ "fmt"
+ "net/http"
+)
+type Status struct {
+ IP string `json:"ip"`
+ Hostname string `json:"hostname"`
+ City string `json:"city"`
+ Region string `json:"region"`
+ Country string `json:"country"`
+ Location string `json:"loc"`
+ Organization string `json:"org"`
+ Postal string `json:"postal"`
+ Timezone string `json:"timezone"`
+}
+const (
+ url = "https://ipinfo.io"
+)
+var (
+ ip_addr string
+)
+func init() {
+ flag.StringVar(&ip_addr, "i", "1.1.1.1", "IP address to check")
+}
+func main() {
+ flag.Parse()
+
+ if len(ip_addr) == 0 {
+ fmt.Println("No IP address given, trying default")
+ }
+
+ var status Status
+ query_url := url + "/" + ip_addr
+ resp, err := http.Get(query_url)
+ if err != nil {
+ fmt.Println(err)
+ }
+ defer resp.Body.Close()
+ _ = json.NewDecoder(resp.Body).Decode(&status)
+ fmt.Printf("IP: %v\nHostname: %v\nCity: %v\nRegion: %v\nCountry %v\nLocation: %v\nOrganization: %v\nPostal: %v\nTimezone: %v\n", status.IP, status.Hostname, status.City, status.Region, status.Country, status.Location, status.Organization, status.Postal, status.Timezone)
+}
--- /dev/null
+module git.chaotic.ninja/yakumo.izuru/mizuchi
+
+go 1.20
--- /dev/null
+Copyright (c) 2023 Izuru Yakumo <postmaster@chaotic.ninja>
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
+REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
+INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+PERFORMANCE OF THIS SOFTWARE.
--- /dev/null
+![](https://raddle.me/submission_images/61e31cb98ba6f807847098560a6b29b2fbdf822069186d2cfe5fa67f747b13f2.gif)
+
+# mizuchi
+The above animated picture says it all.
+That aside, this was a full port from a shell script that I have never used seriously.
+
+## Build
+It has two flavors, and have slightly different output.
+
+### For [ip-api.com](https://ip-api.com)
+
+```
+go build ./cmd/mizuchi-ipapi
+```
+
+### For [ipinfo.io](https://ipinfo.io)
+
+```
+go build ./cmd/mizuchi-ipinfo
+```
+
+## Usage
+Only required argument is `-i`
--- /dev/null
+package main
+
+import (
+ "encoding/json"
+ "flag"
+ "fmt"
+ "net/http"
+)
+type Status struct {
+ Continent string `json:"continent"`
+ Country string `json:"country"`
+ Region string `json:"region"`
+ City string `json:"city"`
+ Zip string `json:"zip"`
+ Latitude string `json:"lat"`
+ Longitude string `json:"lon"`
+ Timezone string `json:"timezone"`
+ Query string `json:"query"`
+}
+const (
+ url = "http://ip-api.com"
+)
+var (
+ ip_addr string
+)
+func init() {
+ flag.StringVar(&ip_addr, "i", "1.1.1.1", "IP address to check")
+}
+func main() {
+ flag.Parse()
+
+ if len(ip_addr) == 0 {
+ fmt.Println("No IP address given, trying default")
+ }
+
+ var status Status
+ query_url := url + "/" + ip_addr
+ resp, err := http.Get(query_url)
+ if err != nil {
+ fmt.Println(err)
+ }
+ defer resp.Body.Close()
+ _ = json.NewDecoder(resp.Body).Decode(&status)
+ fmt.Printf("Continent: %v\nCountry: %v\nRegion: %v\nCity: %v\nZip: %v\nLatitude: %v\nLongitude: %v\nTimezone: %v\nQuery: %v\n", status.Continent, status.Country, status.Region, status.City, status.Zip, status.Latitude, status.Longitude, status.Timezone, status.Query)
+}
--- /dev/null
+package main
+
+import (
+ "encoding/json"
+ "flag"
+ "fmt"
+ "net/http"
+)
+type Status struct {
+ IP string `json:"ip"`
+ Hostname string `json:"hostname"`
+ City string `json:"city"`
+ Region string `json:"region"`
+ Country string `json:"country"`
+ Location string `json:"loc"`
+ Organization string `json:"org"`
+ Postal string `json:"postal"`
+ Timezone string `json:"timezone"`
+}
+const (
+ url = "https://ipinfo.io"
+)
+var (
+ ip_addr string
+)
+func init() {
+ flag.StringVar(&ip_addr, "i", "1.1.1.1", "IP address to check")
+}
+func main() {
+ flag.Parse()
+
+ if len(ip_addr) == 0 {
+ fmt.Println("No IP address given, trying default")
+ }
+
+ var status Status
+ query_url := url + "/" + ip_addr
+ resp, err := http.Get(query_url)
+ if err != nil {
+ fmt.Println(err)
+ }
+ defer resp.Body.Close()
+ _ = json.NewDecoder(resp.Body).Decode(&status)
+ fmt.Printf("IP: %v\nHostname: %v\nCity: %v\nRegion: %v\nCountry %v\nLocation: %v\nOrganization: %v\nPostal: %v\nTimezone: %v\n", status.IP, status.Hostname, status.City, status.Region, status.Country, status.Location, status.Organization, status.Postal, status.Timezone)
+}
--- /dev/null
+module git.chaotic.ninja/yakumo.izuru/mizuchi
+
+go 1.20