aboutsummaryrefslogtreecommitdiff
path: root/mastodon/furrybb/main.go
blob: 2eebb6ad23000888a5e1d82380e403cbdd73c882 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
package main

import (
	"context"
	"flag"

	"github.com/McKael/madon/v2"
	"within.website/x/internal"
	_ "github.com/joho/godotenv/autoload"
	"within.website/ln"
)

var (
	instance  = flag.String("instance", "", "mastodon instance")
	appID     = flag.String("app-id", "", "oauth2 app id")
	appSecret = flag.String("app-secret", "", "oauth2 app secret")
	token     = flag.String("token", "", "oauth2 token")
	hashtag   = flag.String("hashtag", "furry", "hashtag to monitor")
)

var scopes = []string{"read", "write", "follow"}
var ctx = context.Background()

func main() {
	internal.HandleStartup()

	c, err := madon.RestoreApp("furry boost bot", *instance, *appID, *appSecret, &madon.UserToken{AccessToken: *token})
	if err != nil {
		ln.Fatal(ctx, ln.F{"err": err, "action": "madon.RestoreApp"})
	}

	evChan := make(chan madon.StreamEvent, 10)
	stop := make(chan bool)
	done := make(chan bool)

	err = c.StreamListener("public", "", evChan, stop, done)
	if err != nil {
		ln.Fatal(ctx, ln.F{"err": err, "action": "c.StreamListener"})
	}

	ln.Log(ctx, ln.F{
		"action": "streaming.toots",
	})

	for {
		select {
		case _, ok := <-done:
			if !ok {
				ln.Fatal(ctx, ln.F{"action": "stream.dead"})
			}

		case ev := <-evChan:
			switch ev.Event {
			case "error":
				ln.Fatal(ctx, ln.F{"err": ev.Error, "action": "processing.event"})
			case "update":
				s := ev.Data.(madon.Status)

				for _, tag := range s.Tags {
					if tag.Name == *hashtag {
						err = c.ReblogStatus(s.ID)
						if err != nil {
							ln.Fatal(ctx, ln.F{"err": err, "action": "c.ReblogStatus", "id": s.ID})
						}

						ln.Log(ctx, ln.F{
							"action": "reblogged",
							"id":     s.ID,
						})
					}
				}
			}
		}
	}
}