Implement per guild music queue and player
This commit is contained in:
@@ -0,0 +1,53 @@
|
||||
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),
|
||||
)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user