This commit is contained in:
fade 2022-08-15 12:24:32 +03:00
commit cd868e44b1
4 changed files with 142 additions and 0 deletions

3
.gitignore vendored Normal file
View file

@ -0,0 +1,3 @@
go.mod
go.sum
mastodon-group-bot

35
README.md Normal file
View file

@ -0,0 +1,35 @@
# Mastodon group bot
This is a bot which implements group functionality in Mastodon.
# Configuration
The bot is configured in a JSON file that looks like this:
```
{
"Server": "https://example.com",
"ClientID": "0000000000000000000000000000000000000000000",
"ClientSecret": "0000000000000000000000000000000000000000000",
"AccessToken": "0000000000000000000000000000000000000000000",
"WelcomeMessage": "We have a new member in our group. Please love and favor"
}
```
# Building
```
go mod init mastodon-group-bot
go mod tidy
go build
```
# Usage
```
Usage of mastodon-group-bot:
-config string
Path to config (default "config.json")
```

7
config.json Normal file
View file

@ -0,0 +1,7 @@
{
"Server": "https://example.com",
"ClientID": "0000000000000000000000000000000000000000000",
"ClientSecret": "0000000000000000000000000000000000000000000",
"AccessToken": "0000000000000000000000000000000000000000000",
"WelcomeMessage": "We have a new member in our group. Please love and favor"
}

97
main.go Normal file
View file

@ -0,0 +1,97 @@
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")
}
}
}
}