Files

54 lines
1.1 KiB
Go

package music
import (
"context"
"log/slog"
"sync"
"github.com/disgoorg/disgolink/v4/disgolink"
"github.com/disgoorg/snowflake/v2"
)
type Manager struct {
lavalink *disgolink.Client
logger *slog.Logger
mu sync.Mutex
guilds map[snowflake.ID]*GuildPlayer
}
func NewManager(lavalinkClient *disgolink.Client, logger *slog.Logger) *Manager {
return &Manager{
lavalink: lavalinkClient,
logger: logger,
guilds: make(map[snowflake.ID]*GuildPlayer),
}
}
func (m *Manager) Guild(guildID snowflake.ID) *GuildPlayer {
m.mu.Lock()
defer m.mu.Unlock()
if gp, ok := m.guilds[guildID]; ok {
return gp
}
gp := newGuildPlayer(m.lavalink.Player(guildID))
m.guilds[guildID] = gp
return gp
}
func (m *Manager) OnTrackEnd(event *disgolink.PlayerTrackEndEvent) {
if !event.Reason.MayStartNext() {
return
}
ctx := context.Background()
if err := m.Guild(event.Player.GuildID).PlayNext(ctx, event.Track); err != nil {
m.logger.ErrorContext(ctx, "failed to play next queued track",
slog.String("guild_id", event.Player.GuildID.String()),
slog.Any("err", err),
)
}
}