route/vendor/github.com/Xe/x/mastodon/furrybb/main.go

75 lines
1.6 KiB
Go

package main
import (
"github.com/McKael/madon"
"github.com/Xe/ln"
"github.com/caarlos0/env"
_ "github.com/joho/godotenv/autoload"
)
var cfg = &struct {
Instance string `env:"INSTANCE,required"`
AppID string `env:"APP_ID,required"`
AppSecret string `env:"APP_SECRET,required"`
Token string `env:"TOKEN,required"`
Hashtag string `env:"HASHTAG,required"`
}{}
var scopes = []string{"read", "write", "follow"}
func main() {
err := env.Parse(cfg)
if err != nil {
ln.Fatal(ln.F{"err": err, "action": "startup"})
}
c, err := madon.RestoreApp("furry boostbot", cfg.Instance, cfg.AppID, cfg.AppSecret, &madon.UserToken{AccessToken: cfg.Token})
if err != nil {
ln.Fatal(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(ln.F{"err": err, "action": "c.StreamListener"})
}
ln.Log(ln.F{
"action": "streaming.toots",
})
for {
select {
case _, ok := <-done:
if !ok {
ln.Fatal(ln.F{"action": "stream.dead"})
}
case ev := <-evChan:
switch ev.Event {
case "error":
ln.Fatal(ln.F{"err": ev.Error, "action": "processing.event"})
case "update":
s := ev.Data.(madon.Status)
for _, tag := range s.Tags {
if tag.Name == cfg.Hashtag {
err = c.ReblogStatus(s.ID)
if err != nil {
ln.Fatal(ln.F{"err": err, "action": "c.ReblogStatus", "id": s.ID})
}
ln.Log(ln.F{
"action": "reblogged",
"id": s.ID,
})
}
}
}
}
}
}