package music import ( "math/rand" "sync" "github.com/disgoorg/disgolink/v4/lavalink" ) type Queue struct { mu sync.Mutex tracks []lavalink.Track } func NewQueue() *Queue { return &Queue{} } func (q *Queue) Push(track lavalink.Track) { q.mu.Lock() defer q.mu.Unlock() q.tracks = append(q.tracks, track) } func (q *Queue) Pop() (lavalink.Track, bool) { q.mu.Lock() defer q.mu.Unlock() if len(q.tracks) == 0 { return lavalink.Track{}, false } track := q.tracks[0] q.tracks = q.tracks[1:] return track, true } func (q *Queue) Clear() { q.mu.Lock() defer q.mu.Unlock() q.tracks = nil } func (q *Queue) List() []lavalink.Track { q.mu.Lock() defer q.mu.Unlock() tracks := make([]lavalink.Track, len(q.tracks)) copy(tracks, q.tracks) return tracks } func (q *Queue) Len() int { q.mu.Lock() defer q.mu.Unlock() return len(q.tracks) } func (q *Queue) Shuffle() int { q.mu.Lock() defer q.mu.Unlock() rand.Shuffle(len(q.tracks), func(i, j int) { q.tracks[i], q.tracks[j] = q.tracks[j], q.tracks[i] }) return len(q.tracks) } func (q *Queue) RemoveAt(index int) (lavalink.Track, bool) { q.mu.Lock() defer q.mu.Unlock() if index < 0 || index >= len(q.tracks) { return lavalink.Track{}, false } track := q.tracks[index] q.tracks = append(q.tracks[:index], q.tracks[index+1:]...) return track, true }