all repos — disgord @ 51a9c2cfcbc125082d568e794758fec3a409cc1c

A simple Discord bot in Go.

add vsuHandler
Marco Andronaco andronacomarco@gmail.com
Mon, 11 Nov 2024 10:49:06 +0100
commit

51a9c2cfcbc125082d568e794758fec3a409cc1c

parent

cf05b999c70e36d5bf89c4e18ef7d21ac96dbe05

6 files changed, 92 insertions(+), 33 deletions(-)

jump to
M go.modgo.mod

@@ -6,18 +6,18 @@ require (

github.com/FoxeiZ/dca v0.0.0-20240420115706-e4859a963796 github.com/bwmarrin/discordgo v0.28.1 github.com/kkdai/youtube/v2 v2.10.1 - golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c + golang.org/x/exp v0.0.0-20241108190413-2d47ceb2692f ) require ( github.com/bitly/go-simplejson v0.5.1 // indirect github.com/dlclark/regexp2 v1.11.4 // indirect - github.com/dop251/goja v0.0.0-20241009100908-5f46f2705ca3 // indirect + github.com/dop251/goja v0.0.0-20241024094426-79f3a7efcdbd // indirect github.com/go-sourcemap/sourcemap v2.1.4+incompatible // indirect - github.com/google/pprof v0.0.0-20241023014458-598669927662 // indirect + github.com/google/pprof v0.0.0-20241101162523-b92577c0c142 // indirect github.com/gorilla/websocket v1.5.3 // indirect github.com/jonas747/ogg v0.0.0-20161220051205-b4f6f4cf3757 // indirect - golang.org/x/crypto v0.28.0 // indirect - golang.org/x/sys v0.26.0 // indirect - golang.org/x/text v0.19.0 // indirect + golang.org/x/crypto v0.29.0 // indirect + golang.org/x/sys v0.27.0 // indirect + golang.org/x/text v0.20.0 // indirect )
M go.sumgo.sum

@@ -10,12 +10,12 @@ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=

github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dlclark/regexp2 v1.11.4 h1:rPYF9/LECdNymJufQKmri9gV604RvvABwgOA8un7yAo= github.com/dlclark/regexp2 v1.11.4/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= -github.com/dop251/goja v0.0.0-20241009100908-5f46f2705ca3 h1:MXsAuToxwsTn5BEEYm2DheqIiC4jWGmkEJ1uy+KFhvQ= -github.com/dop251/goja v0.0.0-20241009100908-5f46f2705ca3/go.mod h1:MxLav0peU43GgvwVgNbLAj1s/bSGboKkhuULvq/7hx4= +github.com/dop251/goja v0.0.0-20241024094426-79f3a7efcdbd h1:QMSNEh9uQkDjyPwu/J541GgSH+4hw+0skJDIj9HJ3mE= +github.com/dop251/goja v0.0.0-20241024094426-79f3a7efcdbd/go.mod h1:MxLav0peU43GgvwVgNbLAj1s/bSGboKkhuULvq/7hx4= github.com/go-sourcemap/sourcemap v2.1.4+incompatible h1:a+iTbH5auLKxaNwQFg0B+TCYl6lbukKPc7b5x0n1s6Q= github.com/go-sourcemap/sourcemap v2.1.4+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= -github.com/google/pprof v0.0.0-20241023014458-598669927662 h1:SKMkD83p7FwUqKmBsPdLHF5dNyxq3jOWwu9w9UyH5vA= -github.com/google/pprof v0.0.0-20241023014458-598669927662/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/pprof v0.0.0-20241101162523-b92577c0c142 h1:sAGdeJj0bnMgUNVeUpp6AYlVdCt3/GdI3pGRqsNSQLs= +github.com/google/pprof v0.0.0-20241101162523-b92577c0c142/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=

@@ -28,20 +28,20 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=

github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw= -golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U= -golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c h1:7dEasQXItcW1xKJ2+gg5VOiBnqWrJc+rq0DPKyvvdbY= -golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c/go.mod h1:NQtJDoLvd6faHhE7m4T/1IY708gDefGGjR/iUW8yQQ8= +golang.org/x/crypto v0.29.0 h1:L5SG1JTTXupVV3n6sUqMTeWbjAyfPwoda2DLX8J8FrQ= +golang.org/x/crypto v0.29.0/go.mod h1:+F4F4N5hv6v38hfeYwTdx20oUvLLc+QfrE9Ax9HtgRg= +golang.org/x/exp v0.0.0-20241108190413-2d47ceb2692f h1:XdNn9LlyWAhLVp6P/i8QYBW+hlyhrhei9uErw2B5GJo= +golang.org/x/exp v0.0.0-20241108190413-2d47ceb2692f/go.mod h1:D5SMRVC3C2/4+F/DB1wZsLRnSNimn2Sp/NPsCrsv8ak= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo= -golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s= +golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM= -golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/text v0.20.0 h1:gK/Kv2otX8gz+wn7Rmb3vT96ZwuoxnQlY+HlJVj7Qug= +golang.org/x/text v0.20.0/go.mod h1:D4IsuqiFMhST5bX19pQ9ikHC2GsaKyk/oF+pn3ducp4= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
M main.gomain.go

@@ -6,6 +6,7 @@ "os/signal"

"github.com/birabittoh/disgord/src" g "github.com/birabittoh/disgord/src/globals" + "github.com/birabittoh/disgord/src/music" "github.com/birabittoh/disgord/src/myconfig" "github.com/birabittoh/disgord/src/mylog" "github.com/bwmarrin/discordgo"

@@ -44,6 +45,15 @@ func readyHandler(s *discordgo.Session, r *discordgo.Ready) {

logger.Infof("Logged in as %s", r.User.String()) } +func vsuHandler(s *discordgo.Session, vsu *discordgo.VoiceStateUpdate) { + if vsu.UserID != s.State.User.ID { + // update is not from this bot + return + } + + music.HandleBotVSU(vsu) +} + func main() { logger.Info("Starting bot... Commit " + g.CommitID) var err error

@@ -60,6 +70,7 @@

src.InitHandlers() session.AddHandler(messageHandler) session.AddHandler(readyHandler) + session.AddHandler(vsuHandler) err = session.Open() if err != nil {
M src/music/audio.gosrc/music/audio.go

@@ -6,11 +6,10 @@ "github.com/bwmarrin/discordgo"

) type Audio struct { - session *dca.EncodeSession - stream *dca.StreamingSession - Done chan error - onFinish func() - paused bool + session *dca.EncodeSession + stream *dca.StreamingSession + paused bool + Done chan error } var audioEncodeOptions = &dca.EncodeOptions{

@@ -64,15 +63,16 @@ a.paused = false

} func (a *Audio) Stop() { - if a.stream == nil { - return + if a.stream != nil { + a.stream.FinishNow() + a.stream = nil } - a.stream.FinishNow() - a.session.Stop() - a.session.Cleanup() - a.stream = nil - a.session = nil + if a.session != nil { + a.session.Stop() + a.session.Cleanup() + a.session = nil + } } func (a *Audio) Finished() (bool, error) {
M src/music/commands.gosrc/music/commands.go

@@ -174,3 +174,31 @@ }

return MsgLeft } + +func HandleBotVSU(vsu *discordgo.VoiceStateUpdate) { + if vsu.BeforeUpdate == nil { + // user joined a voice channel + return + } + + queue := GetQueue(vsu.GuildID) + if queue == nil { + // no queue for this guild + return + } + + if queue.NowPlaying() == nil { + // song has ended naturally + return + } + + vc := queue.VoiceConnection() + if vc == nil { + return + } + + if vsu.ChannelID == "" && vsu.BeforeUpdate.ChannelID == vc.ChannelID { + logger.Println("Bot disconnected from voice channel, stopping audio playback.") + queue.Stop() + } +}
M src/music/queue.gosrc/music/queue.go

@@ -29,7 +29,7 @@ queues[vc.GuildID] = q

return } - if q.vc.Ready == false { + if !q.vc.Ready { q.vc = vc } return

@@ -96,8 +96,16 @@ // Stop stops the player and clears the queue

func (q *Queue) Stop() error { q.Clear() q.nowPlaying = nil - q.audioStream.Stop() - return q.vc.Disconnect() + + if q.audioStream != nil { + q.audioStream.Stop() + } + + if q.vc != nil { + return q.vc.Disconnect() + } + + return nil } // Pause pauses the player

@@ -126,3 +134,15 @@

func (q *Queue) VoiceChannelID() string { return q.vc.ChannelID } + +func (q *Queue) AudioStream() *Audio { + return q.audioStream +} + +func (q *Queue) VoiceConnection() *discordgo.VoiceConnection { + return q.vc +} + +func (q *Queue) NowPlaying() *youtube.Video { + return q.nowPlaying +}