go-mastodon-matrix-webhooks/main.go
2022-11-20 18:12:08 +13:00

157 lines
3.2 KiB
Go

package main
import (
"bytes"
"encoding/json"
"fmt"
"log"
"net/http"
"os"
"github.com/ip2location/ip2location-go/v9"
"github.com/joho/godotenv"
)
var MATRIX_WEBHOOK_URL string
var MATRIX_WEBHOOK_API_KEY string
var MATRIX_CHANNEL string
var PORT string
var IP2LOCATION_API_KEY string
func init() {
err := godotenv.Load()
if err != nil {
log.Fatal("Error loading .env file")
}
MATRIX_WEBHOOK_URL = os.Getenv("MATRIX_WEBHOOK_URL")
if MATRIX_WEBHOOK_URL == "" {
log.Fatal("MATRIX_WEBHOOK_URL empty or invalid")
}
MATRIX_WEBHOOK_API_KEY = os.Getenv("MATRIX_WEBHOOK_API_KEY")
if MATRIX_WEBHOOK_API_KEY == "" {
log.Fatal("MATRIX_WEBHOOK_API_KEY empty or invalid")
}
MATRIX_CHANNEL = os.Getenv("MATRIX_CHANNEL")
if MATRIX_CHANNEL == "" {
log.Fatal("MATRIX_CHANNEL empty or invalid")
}
PORT = os.Getenv("PORT")
if PORT == "" {
log.Fatal("PORT empty or invalid")
}
IP2LOCATION_API_KEY = os.Getenv("IP2LOCATION_API_KEY")
}
func main() {
http.HandleFunc("/", handler)
if err := http.ListenAndServe(":"+PORT, nil); err != nil {
log.Fatal(err)
}
}
// Handle requests
func handler(w http.ResponseWriter, r *http.Request) {
if r.Body != nil {
var i IdentifyingRequest
err := json.NewDecoder(r.Body).Decode(&i)
if err != nil {
log.Println(err.Error())
return
}
if i.Event == "report.created" {
var report MastodonReportEvent
err := json.NewDecoder(r.Body).Decode(&report)
if err != nil {
log.Println(err.Error())
return
}
err = sendWebhook("New report!")
if err != nil {
log.Println(err.Error())
return
}
} else if i.Event == "account.created" {
var account MastodonSignUpEvent
err := json.NewDecoder(r.Body).Decode(&account)
if err != nil {
log.Println(err.Error())
return
}
country := ipLookup(account.Object.IP)
err = sendWebhook(fmt.Sprintf("*New Signup* %s has joined from %s", account.Object.Username, country))
if err != nil {
log.Println(err.Error())
return
}
}
}
}
// sendWebhook - takes msg, sends to matrix
func sendWebhook(msgText string) error {
log.Println(msgText)
data := MatrixWebhook{
Key: MATRIX_WEBHOOK_API_KEY,
}
data.Body = msgText
b, err := json.Marshal(data)
if err != nil {
return err
}
req, err := http.NewRequest("POST", MATRIX_WEBHOOK_URL+"/"+MATRIX_CHANNEL, bytes.NewBuffer(b))
if err != nil {
return err
}
req.Header.Set("X-Custom-Header", "myvalue")
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
return nil
}
// Lookup to country!
func ipLookup(ip string) string {
if IP2LOCATION_API_KEY == "" {
return ""
}
apipackage := "WS25"
usessl := true
addon := "continent,country,region,city,geotargeting,country_groupings,time_zone_info" // leave blank if no need
lang := "en" // leave blank if no need
ws, err := ip2location.OpenWS(IP2LOCATION_API_KEY, apipackage, usessl)
if err != nil {
fmt.Print(err)
return ""
}
res, err := ws.LookUp(ip, addon, lang)
if err != nil {
fmt.Print(err)
return ""
}
if res.Response != "OK" {
fmt.Printf("Error: %s\n", res.Response)
}
return res.Country.Name
}