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:
commit
e89e3bbac9
5 changed files with 93 additions and 24 deletions
64
internal/discord/discord.go
Normal file
64
internal/discord/discord.go
Normal 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)
|
||||||
|
}
|
||||||
21
internal/discord/handlers.go
Normal file
21
internal/discord/handlers.go
Normal 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")
|
||||||
|
}
|
||||||
|
|
@ -13,7 +13,7 @@ import (
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/bwmarrin/discordgo"
|
"gitlab.com/whom/bingobot/internal/discord"
|
||||||
"gitlab.com/whom/bingobot/internal/logging"
|
"gitlab.com/whom/bingobot/internal/logging"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -27,7 +27,6 @@ const (
|
||||||
EventValidationFailedError = "event failed validation: "
|
EventValidationFailedError = "event failed validation: "
|
||||||
)
|
)
|
||||||
|
|
||||||
var DiscordSession *discordgo.Session
|
|
||||||
var eventMutex sync.RWMutex
|
var eventMutex sync.RWMutex
|
||||||
var eventSubscriptionCache = [NumEventTypes][]chan Event{}
|
var eventSubscriptionCache = [NumEventTypes][]chan Event{}
|
||||||
var eventCache = []Event{}
|
var eventCache = []Event{}
|
||||||
|
|
@ -360,8 +359,8 @@ func (ue UserEvent) Data() map[string]string {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ue UserEvent) Validate() error {
|
func (ue UserEvent) Validate() error {
|
||||||
if DiscordSession != nil {
|
if discord.Connected() {
|
||||||
_, err := DiscordSession.User(ue.uid)
|
_, err := discord.User(ue.uid)
|
||||||
return err
|
return err
|
||||||
} else {
|
} else {
|
||||||
// I would love to know how to actually fail here
|
// I would love to know how to actually fail here
|
||||||
|
|
|
||||||
23
main.go
23
main.go
|
|
@ -6,25 +6,19 @@ import (
|
||||||
"os"
|
"os"
|
||||||
"os/signal"
|
"os/signal"
|
||||||
|
|
||||||
"github.com/bwmarrin/discordgo"
|
|
||||||
"gitlab.com/whom/bingobot/internal/config"
|
"gitlab.com/whom/bingobot/internal/config"
|
||||||
|
"gitlab.com/whom/bingobot/internal/discord"
|
||||||
"gitlab.com/whom/bingobot/internal/logging"
|
"gitlab.com/whom/bingobot/internal/logging"
|
||||||
"gitlab.com/whom/bingobot/internal/state"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
Token = flag.String("token", "", "Bot authentication token")
|
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?
|
|
||||||
|
|
||||||
appConfig *config.AppConfig
|
appConfig *config.AppConfig
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
if *App == "" {
|
|
||||||
log.Fatal("application id is not set")
|
|
||||||
}
|
|
||||||
|
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
|
|
@ -44,27 +38,18 @@ func main() {
|
||||||
}
|
}
|
||||||
|
|
||||||
func startBot() error {
|
func startBot() error {
|
||||||
state.DiscordSession, _ = discordgo.New("Bot " + *Token)
|
err := discord.Connect(*token)
|
||||||
|
|
||||||
err := state.DiscordSession.Open()
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logging.Error("could not open discord session", "type", "error", "error", err)
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
logging.Info("shutting down gracefully", "type", "shutdown")
|
|
||||||
|
|
||||||
sigch := make(chan os.Signal, 1)
|
sigch := make(chan os.Signal, 1)
|
||||||
signal.Notify(sigch, os.Interrupt)
|
signal.Notify(sigch, os.Interrupt)
|
||||||
<-sigch
|
<-sigch
|
||||||
|
|
||||||
logging.Info("shutting down gracefully", "type", "shutdown")
|
logging.Info("shutting down gracefully", "type", "shutdown")
|
||||||
|
discord.Close()
|
||||||
err = state.DiscordSession.Close()
|
|
||||||
if err != nil {
|
|
||||||
logging.Error("could not close discord session gracefully", "type", "error", "error", err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
||||||
2
start.sh
2
start.sh
|
|
@ -7,4 +7,4 @@ fi
|
||||||
|
|
||||||
BOT_TOKEN=$(cat bot.token)
|
BOT_TOKEN=$(cat bot.token)
|
||||||
|
|
||||||
./bingobot --app ${APP_ID} --token ${BOT_TOKEN}
|
./bingobot --token ${BOT_TOKEN}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue