External Chat Linking (!4)

This PR adds the functionality for plugins to send and recieve messages linked to a specific channel.

Co-authored-by: Layla <layla@layla.gg>
Reviewed-on: https://gitea.sumulayla.synology.me/layla/birdbot/pulls/4
This commit is contained in:
2023-06-17 19:38:47 -04:00
parent b252d5e62e
commit 73a63fbf4d
12 changed files with 207 additions and 17 deletions

View File

@ -9,6 +9,7 @@ import (
"github.com/bwmarrin/discordgo"
"github.com/stretchr/testify/mock"
"github.com/yeslayla/birdbot/common"
"github.com/yeslayla/birdbot/persistence"
)
type Discord struct {
@ -21,12 +22,14 @@ type Discord struct {
commands map[string]*discordgo.ApplicationCommand
commandHandlers map[string]func(session *discordgo.Session, i *discordgo.InteractionCreate)
db persistence.Database
// Signal for shutdown
stop chan os.Signal
}
// New creates a new Discord session
func New(applicationID string, guildID string, token string) *Discord {
func New(applicationID string, guildID string, token string, db persistence.Database) *Discord {
// Create Discord Session
session, err := discordgo.New(fmt.Sprint("Bot ", token))
@ -35,6 +38,8 @@ func New(applicationID string, guildID string, token string) *Discord {
}
session.ShouldReconnectOnError = true
return &Discord{
db: db,
session: session,
applicationID: applicationID,
guildID: guildID,
@ -117,6 +122,17 @@ func (discord *Discord) OnEventUpdate(handler func(*Discord, common.Event)) {
})
}
// OnMessageRecieved registers a handler when a message is recieved
func (discord *Discord) OnMessageRecieved(handler func(*Discord, string, common.User, string)) {
discord.session.AddHandler(func(s *discordgo.Session, r *discordgo.MessageCreate) {
if r.GuildID != discord.guildID {
return
}
handler(discord, r.ChannelID, NewUser(r.Author), r.Content)
})
}
func (discord *Discord) SetStatus(status string) {
if err := discord.session.UpdateGameStatus(0, status); err != nil {
log.Fatal("Failed to update status: ", err)

45
discord/message.go Normal file
View File

@ -0,0 +1,45 @@
package discord
import (
"log"
"github.com/bwmarrin/discordgo"
"github.com/yeslayla/birdbot/core"
"github.com/yeslayla/birdbot/persistence"
)
func (discord *Discord) WebhookSendMessage(channel *core.Channel, displayName string, message string) {
webhookData, err := discord.db.GetDiscordWebhook(channel.ID)
if err != nil {
log.Printf("Error getting webhook from DB: %s", err)
return
}
if webhookData == nil {
webhook, err := discord.session.WebhookCreate(channel.ID, "BirdBot", "")
if err != nil {
log.Printf("Error creating webhook: %s", err)
return
}
webhookData = &persistence.DBDiscordWebhook{
ID: webhook.ID,
Token: webhook.Token,
}
if err := discord.db.SetDiscordWebhook(channel.ID, webhookData); err != nil {
log.Fatalf("Error failed to store webhook in DB: %s", err)
return
}
}
if _, err = discord.session.WebhookExecute(webhookData.ID, webhookData.Token, false, &discordgo.WebhookParams{
Content: message,
Username: displayName,
}); err != nil {
log.Printf("Failed to send message over webhook: %s", err)
}
}