54 lines
1.1 KiB
Go
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),
|
|
)
|
|
}
|
|
}
|