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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
|
package main
import (
"log/slog"
"os"
"os/signal"
"path"
"strings"
"syscall"
services "github.com/ChausseBenjamin/songlinkr/internal/service"
"github.com/ChausseBenjamin/songlinkr/internal/urls"
"github.com/bwmarrin/discordgo"
"github.com/urfave/cli/v2"
)
func AppAction(ctx *cli.Context) error {
token, err := getSecret(ctx.String("secrets-path"), "token")
if err != nil {
return err
}
sess, err := discordgo.New("Bot " + token)
if err != nil {
slog.Error("Unable to launch slog", "error", err)
os.Exit(1)
}
sess.AddHandler(func(s *discordgo.Session, m *discordgo.MessageCreate) {
if m.Author.ID == s.State.User.ID {
return
}
services := services.GetServices()
links := urls.Find(m.Content)
for _, link := range links {
for _, srvc := range services {
if srvc.Owns(link) {
link = srvc.Resolve(link)
src, err := urls.Resolve(link)
if err != nil {
src = link // An error occured, use the less elegant link...
}
msg := srvc.Name() + " link detected!\n"
msg += "[Here is a universal link for everyone to enjoy](" + src + ")! 🎶\n"
msg += "Beep boop! Have a nice one! 🤖"
s.ChannelMessageSend(m.ChannelID, msg)
break
}
}
}
})
sess.Identify.Intents = discordgo.IntentsAllWithoutPrivileged
err = sess.Open()
if err != nil {
return err
}
defer sess.Close()
slog.Info("Bot is now running")
sc := make(chan os.Signal, 1)
signal.Notify(sc, syscall.SIGINT, syscall.SIGTERM, os.Interrupt)
<-sc
return nil
}
func getSecret(secretsPath, secretName string) (string, error) {
secretValue, err := os.ReadFile(path.Join(secretsPath, secretName))
if err != nil {
return "", err
}
return strings.TrimSpace(string(secretValue)), nil
}
func main() {
loggr := slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{}))
slog.SetDefault(loggr)
app := &cli.App{
Name: "Songlinkr",
Usage: "A Discord bot that converts song links to Universal Song.link",
Action: AppAction,
Flags: []cli.Flag{
&cli.StringFlag{
Name: "secrets-path",
EnvVars: []string{"SECRETS_PATH"},
},
},
}
if err := app.Run(os.Args); err != nil {
slog.Error("An error occured during runtime", "error", err)
os.Exit(1)
}
}
|