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