diff --git a/.env.example b/.env.example index 116e8e0..afd0c0d 100644 --- a/.env.example +++ b/.env.example @@ -12,4 +12,8 @@ PEERTUBE_DB_SCHEMA=peertube_prod MATRIX_WEBHOOK_URL="" MATRIX_WEBHOOK_API_KEY="" -MATRIX_WEBHOOK_CHANNEL="" \ No newline at end of file +MATRIX_WEBHOOK_CHANNEL="" + +MASTODON_INSTANCE_URL="" +MASTODON_USERNAME="" +MASTODON_PASSWORD="" \ No newline at end of file diff --git a/cmd/gomastodonstats/main.go b/cmd/gomastodonstats/main.go index c509adf..0d751a4 100644 --- a/cmd/gomastodonstats/main.go +++ b/cmd/gomastodonstats/main.go @@ -49,6 +49,19 @@ func main() { gms.MATRIX_WEBHOOK_URL = "" } + // Load mastodon data if exists + gms.MASTODON_INSTANCE_URL = os.Getenv("MASTODON_INSTANCE_URL") + gms.MASTODON_USERNAME = os.Getenv("MASTODON_USERNAME") + gms.MASTODON_PASSWORD = os.Getenv("MASTODON_PASSWORD") + if gms.MASTODON_INSTANCE_URL == "" || + gms.MASTODON_USERNAME == "" || + gms.MASTODON_PASSWORD == "" { + log.Println("MASTODON_INSTANCE_URL info incompelete. Skipping") + + // Set URL empty so we can check this later on + gms.MASTODON_INSTANCE_URL = "" + } + // Load schemas if set gms.PIXELFED_DB_SCHEMA = os.Getenv("PIXELFED_DB_SCHEMA") gms.MATRIX_DB_SCHEMA = os.Getenv("MATRIX_DB_SCHEMA") diff --git a/go.mod b/go.mod index 6dd2bc4..f8bb715 100644 --- a/go.mod +++ b/go.mod @@ -3,6 +3,9 @@ module gomastodonstats go 1.19 require ( + github.com/gorilla/websocket v1.5.0 // indirect github.com/joho/godotenv v1.4.0 // indirect github.com/lib/pq v1.10.7 // indirect + github.com/mattn/go-mastodon v0.0.6 // indirect + github.com/tomnomnom/linkheader v0.0.0-20180905144013-02ca5825eb80 // indirect ) diff --git a/go.sum b/go.sum index ce28800..85c6538 100644 --- a/go.sum +++ b/go.sum @@ -1,4 +1,10 @@ +github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= +github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/joho/godotenv v1.4.0 h1:3l4+N6zfMWnkbPEXKng2o2/MR5mSwTrBih4ZEkkz1lg= github.com/joho/godotenv v1.4.0/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/lib/pq v1.10.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw= github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/mattn/go-mastodon v0.0.6 h1:lqU1sOeeIapaDsDUL6udDZIzMb2Wqapo347VZlaOzf0= +github.com/mattn/go-mastodon v0.0.6/go.mod h1:cg7RFk2pcUfHZw/IvKe1FUzmlq5KnLFqs7eV2PHplV8= +github.com/tomnomnom/linkheader v0.0.0-20180905144013-02ca5825eb80 h1:nrZ3ySNYwJbSpD6ce9duiP+QkD3JuLCcWkdaehUS/3Y= +github.com/tomnomnom/linkheader v0.0.0-20180905144013-02ca5825eb80/go.mod h1:iFyPdL66DjUD96XmzVL3ZntbzcflLnznH0fr99w5VqE= diff --git a/internal/gomastodonstats/consts.go b/internal/gomastodonstats/consts.go index 1f2c089..2f747b7 100644 --- a/internal/gomastodonstats/consts.go +++ b/internal/gomastodonstats/consts.go @@ -14,6 +14,10 @@ var ( MATRIX_WEBHOOK_API_KEY string MATRIX_WEBHOOK_CHANNEL string + MASTODON_INSTANCE_URL string + MASTODON_USERNAME string + MASTODON_PASSWORD string + // UserCount metric name METRICNAME_USERCOUNT = "userCount" diff --git a/internal/gomastodonstats/main.go b/internal/gomastodonstats/main.go index 1157f27..7bfbbec 100644 --- a/internal/gomastodonstats/main.go +++ b/internal/gomastodonstats/main.go @@ -15,4 +15,6 @@ func Run() { updatedMetrics := persistMetrics(metrics) sendToMatrix(updatedMetrics) + + postToMastodon(updatedMetrics) } diff --git a/internal/gomastodonstats/mastodon.go b/internal/gomastodonstats/mastodon.go index c0a1355..113a3b7 100644 --- a/internal/gomastodonstats/mastodon.go +++ b/internal/gomastodonstats/mastodon.go @@ -1 +1,43 @@ package gomastodonstats + +import ( + "context" + "fmt" + "log" + + "github.com/mattn/go-mastodon" +) + +func postToMastodon(metrics []metric) { + if MASTODON_INSTANCE_URL == "" { + log.Printf("Skipping posting to mastodon. Missing configuration") + return + } + + c := mastodon.NewClient(&mastodon.Config{ + Server: fmt.Sprintf("https://%s", MASTODON_INSTANCE_URL), + ClientID: "client-id", + ClientSecret: "client-secret", + }) + err := c.Authenticate(context.Background(), MASTODON_USERNAME, MASTODON_PASSWORD) + if err != nil { + log.Println("Invalid mastodon credentials") + return + } + + // Build status + startOfDay := getStartofDay() + msg := fmt.Sprintf("Stats for %s\n\n", startOfDay.String()) + for _, m := range metrics { + msg = msg + getPrintableString(m) + "\n" + } + + toot := mastodon.Toot{ + Status: msg, + } + + _, err = c.PostStatus(context.Background(), &toot) + if err != nil { + log.Print(err) + } +} diff --git a/internal/gomastodonstats/metrics.go b/internal/gomastodonstats/metrics.go index 63e6126..83fe702 100644 --- a/internal/gomastodonstats/metrics.go +++ b/internal/gomastodonstats/metrics.go @@ -4,6 +4,8 @@ import ( "fmt" "log" "time" + + "golang.org/x/text/cases" ) // Stores out metric/row data @@ -114,5 +116,5 @@ func getUserCounts() ([]metric, error) { } func getPrintableString(m metric) string { - return fmt.Sprintf("%s: %d", m.Service, m.MetricValue) + return fmt.Sprintf("%s: %d", cases.Title(m.Service), m.MetricValue) }