Wire up bot entry point
This commit is contained in:
+101
@@ -0,0 +1,101 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"log/slog"
|
||||||
|
"os"
|
||||||
|
"os/signal"
|
||||||
|
"syscall"
|
||||||
|
|
||||||
|
"github.com/disgoorg/disgo/bot"
|
||||||
|
"github.com/disgoorg/disgolink/v4/disgolink"
|
||||||
|
"github.com/joho/godotenv"
|
||||||
|
|
||||||
|
"discord-music-bot/internal/commands"
|
||||||
|
"discord-music-bot/internal/config"
|
||||||
|
"discord-music-bot/internal/discord"
|
||||||
|
"discord-music-bot/internal/lavalink"
|
||||||
|
"discord-music-bot/internal/logging"
|
||||||
|
"discord-music-bot/internal/music"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
_ = godotenv.Load()
|
||||||
|
|
||||||
|
cfg, err := config.Load()
|
||||||
|
if err != nil {
|
||||||
|
slog.Error("invalid configuration", slog.Any("err", err))
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
logger := logging.New(cfg.Debug)
|
||||||
|
|
||||||
|
ctx, stop := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM)
|
||||||
|
defer stop()
|
||||||
|
|
||||||
|
discordClient, err := discord.NewClient(cfg.DiscordToken, logger)
|
||||||
|
if err != nil {
|
||||||
|
logger.Error("failed to build discord client", slog.Any("err", err))
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
defer discordClient.Close(context.Background())
|
||||||
|
|
||||||
|
lavalinkClient, err := lavalink.Connect(ctx, discordClient.ApplicationID, logger, disgolink.NodeConfig{
|
||||||
|
Name: cfg.LavalinkNodeName,
|
||||||
|
Address: cfg.LavalinkAddress,
|
||||||
|
Password: cfg.LavalinkPassword,
|
||||||
|
Secure: cfg.LavalinkSecure,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
logger.Error("failed to connect to lavalink", slog.Any("err", err))
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
defer lavalinkClient.Close()
|
||||||
|
|
||||||
|
musicManager := music.NewManager(lavalinkClient, logger)
|
||||||
|
lavalinkClient.AddListeners(disgolink.NewListenerFunc(musicManager.OnTrackEnd))
|
||||||
|
|
||||||
|
deps := &commands.Dependencies{
|
||||||
|
Discord: discordClient,
|
||||||
|
Lavalink: lavalinkClient,
|
||||||
|
Music: musicManager,
|
||||||
|
}
|
||||||
|
|
||||||
|
registry := commands.NewRegistry(
|
||||||
|
commands.NewPlayCommand(deps),
|
||||||
|
commands.NewSkipCommand(deps),
|
||||||
|
commands.NewStopCommand(deps),
|
||||||
|
commands.NewPauseCommand(deps),
|
||||||
|
commands.NewResumeCommand(deps),
|
||||||
|
commands.NewQueueCommand(deps),
|
||||||
|
commands.NewNowPlayingCommand(deps),
|
||||||
|
commands.NewSeekCommand(deps),
|
||||||
|
commands.NewVolumeCommand(deps),
|
||||||
|
commands.NewLoopCommand(deps),
|
||||||
|
commands.NewShuffleCommand(deps),
|
||||||
|
commands.NewRemoveCommand(deps),
|
||||||
|
)
|
||||||
|
|
||||||
|
router := discord.NewRouter(registry, logger)
|
||||||
|
voiceForwarder := discord.NewVoiceForwarder(discordClient, lavalinkClient, musicManager, logger)
|
||||||
|
|
||||||
|
discordClient.AddEventListeners(
|
||||||
|
bot.NewListenerFunc(router.OnApplicationCommand),
|
||||||
|
bot.NewListenerFunc(voiceForwarder.OnVoiceStateUpdate),
|
||||||
|
bot.NewListenerFunc(voiceForwarder.OnVoiceServerUpdate),
|
||||||
|
)
|
||||||
|
|
||||||
|
if err := discord.RegisterCommands(discordClient, registry.Definitions()); err != nil {
|
||||||
|
logger.Error("failed to register commands", slog.Any("err", err))
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := discordClient.OpenGateway(ctx); err != nil {
|
||||||
|
logger.Error("failed to open gateway", slog.Any("err", err))
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
logger.Info("bot is running", slog.String("application_id", discordClient.ApplicationID.String()))
|
||||||
|
<-ctx.Done()
|
||||||
|
logger.Info("shutting down")
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user