mirror of
https://git.phreedom.club/localhost_frssoft/mastodon-group-bot.git
synced 2024-11-18 08:33:02 +00:00
98 lines
2.0 KiB
Go
98 lines
2.0 KiB
Go
|
package main
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"encoding/json"
|
||
|
"flag"
|
||
|
"fmt"
|
||
|
"log"
|
||
|
"os"
|
||
|
|
||
|
"github.com/mattn/go-mastodon"
|
||
|
)
|
||
|
|
||
|
func main() {
|
||
|
// Parse args
|
||
|
ConfPath := flag.String("config", "config.json", "Path to config")
|
||
|
flag.Parse()
|
||
|
|
||
|
// Reading config
|
||
|
type Config struct {
|
||
|
Server string `json:"Server"`
|
||
|
ClientID string `json:"ClientID"`
|
||
|
ClientSecret string `json:"ClientSecret"`
|
||
|
AccessToken string `json:"AccessToken"`
|
||
|
WelcomeMessage string `json:"WelcomeMessage"`
|
||
|
}
|
||
|
|
||
|
data, err := os.ReadFile(*ConfPath)
|
||
|
if err != nil {
|
||
|
log.Fatal(err)
|
||
|
}
|
||
|
|
||
|
var Conf Config
|
||
|
json.Unmarshal(data, &Conf)
|
||
|
|
||
|
c := mastodon.NewClient(&mastodon.Config{
|
||
|
Server: Conf.Server,
|
||
|
ClientID: Conf.ClientID,
|
||
|
ClientSecret: Conf.ClientSecret,
|
||
|
AccessToken: Conf.AccessToken,
|
||
|
})
|
||
|
|
||
|
ctx := context.Background()
|
||
|
events, err := c.StreamingUser(ctx)
|
||
|
if err != nil {
|
||
|
log.Fatal(err)
|
||
|
}
|
||
|
|
||
|
my_account, _ := c.GetAccountCurrentUser(ctx)
|
||
|
followers, _ := c.GetAccountFollowers(ctx, my_account.ID, &mastodon.Pagination{Limit: 60})
|
||
|
signed := false
|
||
|
|
||
|
// Run bot
|
||
|
for {
|
||
|
notifEvent, ok := (<-events).(*mastodon.NotificationEvent)
|
||
|
if !ok {
|
||
|
continue
|
||
|
}
|
||
|
|
||
|
notif := notifEvent.Notification
|
||
|
|
||
|
// Posting function
|
||
|
postToot := func(toot string, vis string) error {
|
||
|
conToot := mastodon.Toot{
|
||
|
Status: toot,
|
||
|
Visibility: vis,
|
||
|
}
|
||
|
_, err := c.PostStatus(ctx, &conToot)
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
// New subscriber
|
||
|
if notif.Type == "follow" {
|
||
|
var message = fmt.Sprintf("%s @%s", Conf.WelcomeMessage, notif.Account.Acct)
|
||
|
postToot(message, "public")
|
||
|
}
|
||
|
|
||
|
// Reblog toot
|
||
|
if notif.Type == "mention" {
|
||
|
sender := notif.Status.Account.Acct
|
||
|
|
||
|
// Subscription check
|
||
|
for i := 0; i < len(followers); i++ {
|
||
|
if sender == string(followers[i].Acct) {
|
||
|
signed = true
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if signed {
|
||
|
c.Reblog(ctx, notif.Status.ID)
|
||
|
} else {
|
||
|
var message = fmt.Sprintf("@%s%s", notif.Account.Acct, ", you are not subscribed!")
|
||
|
postToot(message, "direct")
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|