Merge branch 'basic-discord-handlers' into 'main'

Create discord package and connect/disconnect handlers

See merge request whom/bingobot!9
This commit is contained in:
piper pentagram 2024-11-09 00:34:30 +00:00
commit e89e3bbac9
5 changed files with 93 additions and 24 deletions

View file

@ -0,0 +1,64 @@
package discord
import (
"errors"
"fmt"
"github.com/bwmarrin/discordgo"
"gitlab.com/whom/bingobot/internal/logging"
)
type Session struct {
connected bool
s *discordgo.Session
}
var (
session *Session
ErrNotConnected = errors.New("session not connected")
)
func Connect(token string) error {
// throw away err because discordgo.New() actually can't return an error.
// https://github.com/bwmarrin/discordgo/blob/da9e191069d09e1b467145f5758d9b11cb9cca0d/discord.go#L32
s, _ := discordgo.New("Bot " + token)
session = &Session{
s: s,
}
addHandlers()
err := session.s.Open()
if err != nil {
return fmt.Errorf("failed to open discord session: %s", err)
}
return nil
}
func Close() {
err := session.s.Close()
if err != nil {
// don't bubble up this error because we can't do anything about it and
// the bot is exiting anyway.
logging.Error("could not close discord session gracefully", "type", "error", "error", err)
}
session.connected = false
}
func Connected() bool {
return session != nil && session.connected
}
func User(uid string) (*discordgo.User, error) {
if !Connected() {
return nil, ErrNotConnected
}
return session.s.User(uid)
}

View file

@ -0,0 +1,21 @@
package discord
import (
"github.com/bwmarrin/discordgo"
"gitlab.com/whom/bingobot/internal/logging"
)
func addHandlers() {
session.s.AddHandler(handleConnect)
session.s.AddHandler(handleDisconnect)
}
func handleConnect(s *discordgo.Session, e *discordgo.Connect) {
session.connected = true
logging.Info("discord session connected")
}
func handleDisconnect(s *discordgo.Session, e *discordgo.Disconnect) {
session.connected = false
logging.Info("discord session disconnected")
}

View file

@ -13,7 +13,7 @@ import (
"sync"
"time"
"github.com/bwmarrin/discordgo"
"gitlab.com/whom/bingobot/internal/discord"
"gitlab.com/whom/bingobot/internal/logging"
)
@ -27,7 +27,6 @@ const (
EventValidationFailedError = "event failed validation: "
)
var DiscordSession *discordgo.Session
var eventMutex sync.RWMutex
var eventSubscriptionCache = [NumEventTypes][]chan Event{}
var eventCache = []Event{}
@ -360,8 +359,8 @@ func (ue UserEvent) Data() map[string]string {
}
func (ue UserEvent) Validate() error {
if DiscordSession != nil {
_, err := DiscordSession.User(ue.uid)
if discord.Connected() {
_, err := discord.User(ue.uid)
return err
} else {
// I would love to know how to actually fail here

23
main.go
View file

@ -6,25 +6,19 @@ import (
"os"
"os/signal"
"github.com/bwmarrin/discordgo"
"gitlab.com/whom/bingobot/internal/config"
"gitlab.com/whom/bingobot/internal/discord"
"gitlab.com/whom/bingobot/internal/logging"
"gitlab.com/whom/bingobot/internal/state"
)
var (
Token = flag.String("token", "", "Bot authentication token")
App = flag.String("app", "", "Application ID")
Guild = flag.String("guild", "", "Guild ID") // Do we want it to be tied to one server?
token = flag.String("token", "", "Bot authentication token")
appConfig *config.AppConfig
)
func main() {
flag.Parse()
if *App == "" {
log.Fatal("application id is not set")
}
var err error
@ -44,27 +38,18 @@ func main() {
}
func startBot() error {
state.DiscordSession, _ = discordgo.New("Bot " + *Token)
err := discord.Connect(*token)
err := state.DiscordSession.Open()
if err != nil {
logging.Error("could not open discord session", "type", "error", "error", err)
return err
}
logging.Info("shutting down gracefully", "type", "shutdown")
sigch := make(chan os.Signal, 1)
signal.Notify(sigch, os.Interrupt)
<-sigch
logging.Info("shutting down gracefully", "type", "shutdown")
err = state.DiscordSession.Close()
if err != nil {
logging.Error("could not close discord session gracefully", "type", "error", "error", err)
return err
}
discord.Close()
return nil
}

View file

@ -7,4 +7,4 @@ fi
BOT_TOKEN=$(cat bot.token)
./bingobot --app ${APP_ID} --token ${BOT_TOKEN}
./bingobot --token ${BOT_TOKEN}