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), ) } }