84 lines
1.3 KiB
Go
84 lines
1.3 KiB
Go
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
|
|
}
|