From 8e5bb4b4794be8da144df8899235eaea92f64ada Mon Sep 17 00:00:00 2001 From: Steve Date: Sun, 7 Feb 2021 15:25:02 -0500 Subject: [PATCH 1/4] announce auto status change, respect what voice channel used for manual link --- bridge.go | 12 +++++++++--- discord-handlers.go | 6 ++++-- main.go | 2 +- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/bridge.go b/bridge.go index 6e6bac5..0c71c6c 100644 --- a/bridge.go +++ b/bridge.go @@ -73,7 +73,8 @@ type BridgeState struct { } // startBridge established the voice connection -func (b *BridgeState) startBridge() { +// if channelID is empty, use channelID from config +func (b *BridgeState) startBridge(channelID string) { b.lock.Lock() defer b.lock.Unlock() @@ -90,7 +91,12 @@ func (b *BridgeState) startBridge() { // DISCORD Connect Voice log.Println("Attempting to join Discord voice channel") - b.DiscordVoice, err = b.DiscordSession.ChannelVoiceJoin(b.BridgeConfig.GID, b.BridgeConfig.CID, false, false) + if channelID == "" { + b.DiscordVoice, err = b.DiscordSession.ChannelVoiceJoin(b.BridgeConfig.GID, b.BridgeConfig.CID, false, false) + } else { + b.DiscordVoice, err = b.DiscordSession.ChannelVoiceJoin(b.BridgeConfig.GID, channelID, false, false) + } + if err != nil { log.Println(err) b.DiscordVoice.Disconnect() @@ -241,7 +247,7 @@ func (b *BridgeState) AutoBridge() { if !b.Connected && b.MumbleUserCount > 0 && len(b.DiscordUsers) > 0 { log.Println("users detected in mumble and discord, bridging") - go b.startBridge() + go b.startBridge("") } if b.Connected && b.MumbleUserCount == 0 && len(b.DiscordUsers) <= 1 { log.Println("no one online, killing bridge") diff --git a/discord-handlers.go b/discord-handlers.go index ac46684..ea23ea2 100644 --- a/discord-handlers.go +++ b/discord-handlers.go @@ -88,7 +88,7 @@ func (l *DiscordListener) messageCreate(s *discordgo.Session, m *discordgo.Messa for _, vs := range g.VoiceStates { if vs.UserID == m.Author.ID { log.Printf("Trying to join GID %v and VID %v\n", g.ID, vs.ChannelID) - go l.Bridge.startBridge() + go l.Bridge.startBridge(vs.ChannelID) return } } @@ -114,7 +114,7 @@ func (l *DiscordListener) messageCreate(s *discordgo.Session, m *discordgo.Messa time.Sleep(5 * time.Second) - go l.Bridge.startBridge() + go l.Bridge.startBridge(vs.ChannelID) return } } @@ -122,10 +122,12 @@ func (l *DiscordListener) messageCreate(s *discordgo.Session, m *discordgo.Messa if strings.HasPrefix(m.Content, prefix+" auto") { if l.Bridge.Mode != bridgeModeAuto { + l.Bridge.DiscordSession.ChannelMessageSend(m.ChannelID, "Auto mode enabled") l.Bridge.Mode = bridgeModeAuto l.Bridge.AutoChanDie = make(chan bool) go l.Bridge.AutoBridge() } else { + l.Bridge.DiscordSession.ChannelMessageSend(m.ChannelID, "Auto mode disabled") l.Bridge.AutoChanDie <- true l.Bridge.Mode = bridgeModeManual } diff --git a/main.go b/main.go index b39e224..3627262 100644 --- a/main.go +++ b/main.go @@ -174,7 +174,7 @@ func main() { Bridge.Mode = bridgeModeConstant go func() { for { - Bridge.startBridge() + Bridge.startBridge("") log.Println("Bridge died. Restarting") } }() From 027d970c117d04a421f03227d00b62b69d2f7b5f Mon Sep 17 00:00:00 2001 From: Steve Date: Sun, 7 Feb 2021 15:44:20 -0500 Subject: [PATCH 2/4] store channelid in state so other functions can use it --- bridge.go | 16 +++++++++------- discord-handlers.go | 11 +++++++---- main.go | 4 +++- 3 files changed, 19 insertions(+), 12 deletions(-) diff --git a/bridge.go b/bridge.go index 0c71c6c..2e55cec 100644 --- a/bridge.go +++ b/bridge.go @@ -70,11 +70,13 @@ type BridgeState struct { // Mumble Duplex and Event Listener MumbleStream *MumbleDuplex MumbleListener *MumbleListener + + // Discord Voice channel to join + DiscordChannelID string } // startBridge established the voice connection -// if channelID is empty, use channelID from config -func (b *BridgeState) startBridge(channelID string) { +func (b *BridgeState) startBridge() { b.lock.Lock() defer b.lock.Unlock() @@ -91,11 +93,11 @@ func (b *BridgeState) startBridge(channelID string) { // DISCORD Connect Voice log.Println("Attempting to join Discord voice channel") - if channelID == "" { - b.DiscordVoice, err = b.DiscordSession.ChannelVoiceJoin(b.BridgeConfig.GID, b.BridgeConfig.CID, false, false) - } else { - b.DiscordVoice, err = b.DiscordSession.ChannelVoiceJoin(b.BridgeConfig.GID, channelID, false, false) + if b.DiscordChannelID == "" { + log.Println("Tried to start bridge but no Discord channel specified") + return } + b.DiscordVoice, err = b.DiscordSession.ChannelVoiceJoin(b.BridgeConfig.GID, b.DiscordChannelID, false, false) if err != nil { log.Println(err) @@ -247,7 +249,7 @@ func (b *BridgeState) AutoBridge() { if !b.Connected && b.MumbleUserCount > 0 && len(b.DiscordUsers) > 0 { log.Println("users detected in mumble and discord, bridging") - go b.startBridge("") + go b.startBridge() } if b.Connected && b.MumbleUserCount == 0 && len(b.DiscordUsers) <= 1 { log.Println("no one online, killing bridge") diff --git a/discord-handlers.go b/discord-handlers.go index ea23ea2..eb1800d 100644 --- a/discord-handlers.go +++ b/discord-handlers.go @@ -24,7 +24,7 @@ func (l *DiscordListener) guildCreate(s *discordgo.Session, event *discordgo.Gui } for _, vs := range event.VoiceStates { - if vs.ChannelID == l.Bridge.BridgeConfig.CID { + if vs.ChannelID == l.Bridge.DiscordChannelID { if s.State.User.ID == vs.UserID { // Ignore bot continue @@ -88,7 +88,8 @@ func (l *DiscordListener) messageCreate(s *discordgo.Session, m *discordgo.Messa for _, vs := range g.VoiceStates { if vs.UserID == m.Author.ID { log.Printf("Trying to join GID %v and VID %v\n", g.ID, vs.ChannelID) - go l.Bridge.startBridge(vs.ChannelID) + l.Bridge.DiscordChannelID = vs.ChannelID + go l.Bridge.startBridge() return } } @@ -114,7 +115,7 @@ func (l *DiscordListener) messageCreate(s *discordgo.Session, m *discordgo.Messa time.Sleep(5 * time.Second) - go l.Bridge.startBridge(vs.ChannelID) + go l.Bridge.startBridge() return } } @@ -124,10 +125,12 @@ func (l *DiscordListener) messageCreate(s *discordgo.Session, m *discordgo.Messa if l.Bridge.Mode != bridgeModeAuto { l.Bridge.DiscordSession.ChannelMessageSend(m.ChannelID, "Auto mode enabled") l.Bridge.Mode = bridgeModeAuto + l.Bridge.DiscordChannelID = l.Bridge.BridgeConfig.CID l.Bridge.AutoChanDie = make(chan bool) go l.Bridge.AutoBridge() } else { l.Bridge.DiscordSession.ChannelMessageSend(m.ChannelID, "Auto mode disabled") + l.Bridge.DiscordChannelID = "" l.Bridge.AutoChanDie <- true l.Bridge.Mode = bridgeModeManual } @@ -154,7 +157,7 @@ func (l *DiscordListener) voiceUpdate(s *discordgo.Session, event *discordgo.Voi // Sync the channel voice states to the local discordUsersMap for _, vs := range g.VoiceStates { - if vs.ChannelID == l.Bridge.BridgeConfig.CID { + if vs.ChannelID == l.Bridge.DiscordChannelID { if s.State.User.ID == vs.UserID { // Ignore bot continue diff --git a/main.go b/main.go index 3627262..49efff9 100644 --- a/main.go +++ b/main.go @@ -165,6 +165,7 @@ func main() { log.Println("bridge starting in automatic mode") Bridge.AutoChanDie = make(chan bool) Bridge.Mode = bridgeModeAuto + Bridge.DiscordChannelID = Bridge.BridgeConfig.CID go Bridge.AutoBridge() case "manual": log.Println("bridge starting in manual mode") @@ -172,9 +173,10 @@ func main() { case "constant": log.Println("bridge starting in constant mode") Bridge.Mode = bridgeModeConstant + Bridge.DiscordChannelID = Bridge.BridgeConfig.CID go func() { for { - Bridge.startBridge("") + Bridge.startBridge() log.Println("Bridge died. Restarting") } }() From aac90dd11352179caee26b73fcef54185a68ce8c Mon Sep 17 00:00:00 2001 From: Steve Date: Tue, 9 Feb 2021 18:04:11 -0500 Subject: [PATCH 3/4] give feedback on commands --- discord-handlers.go | 24 +++++++++++++++++++----- main.go | 2 +- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/discord-handlers.go b/discord-handlers.go index eb1800d..5118693 100644 --- a/discord-handlers.go +++ b/discord-handlers.go @@ -61,10 +61,6 @@ func (l *DiscordListener) guildCreate(s *discordgo.Session, event *discordgo.Gui func (l *DiscordListener) messageCreate(s *discordgo.Session, m *discordgo.MessageCreate) { - if l.Bridge.Mode == bridgeModeConstant { - return - } - // Ignore all messages created by the bot itself if m.Author.ID == s.State.User.ID { return @@ -83,9 +79,19 @@ func (l *DiscordListener) messageCreate(s *discordgo.Session, m *discordgo.Messa return } prefix := "!" + l.Bridge.BridgeConfig.Command + + if l.Bridge.Mode == bridgeModeConstant && strings.HasPrefix(m.Content, prefix) { + l.Bridge.DiscordSession.ChannelMessageSend(m.ChannelID, "Constant mode enabled, manual commands can not be entered") + return + } + if strings.HasPrefix(m.Content, prefix+" link") { // Look for the message sender in that guild's current voice states. for _, vs := range g.VoiceStates { + if l.Bridge.Connected { + l.Bridge.DiscordSession.ChannelMessageSend(m.ChannelID, "Bridge already running, unlink first") + return + } if vs.UserID == m.Author.ID { log.Printf("Trying to join GID %v and VID %v\n", g.ID, vs.ChannelID) l.Bridge.DiscordChannelID = vs.ChannelID @@ -97,8 +103,12 @@ func (l *DiscordListener) messageCreate(s *discordgo.Session, m *discordgo.Messa if strings.HasPrefix(m.Content, prefix+" unlink") { // Look for the message sender in that guild's current voice states. + if !l.Bridge.Connected { + l.Bridge.DiscordSession.ChannelMessageSend(m.ChannelID, "Bridge is not currently running") + return + } for _, vs := range g.VoiceStates { - if vs.UserID == m.Author.ID { + if vs.UserID == m.Author.ID && vs.ChannelID == l.Bridge.DiscordChannelID { log.Printf("Trying to leave GID %v and VID %v\n", g.ID, vs.ChannelID) l.Bridge.BridgeDie <- true return @@ -108,6 +118,10 @@ func (l *DiscordListener) messageCreate(s *discordgo.Session, m *discordgo.Messa if strings.HasPrefix(m.Content, prefix+" refresh") { // Look for the message sender in that guild's current voice states. + if !l.Bridge.Connected { + l.Bridge.DiscordSession.ChannelMessageSend(m.ChannelID, "Bridge is not currently running") + return + } for _, vs := range g.VoiceStates { if vs.UserID == m.Author.ID { log.Printf("Trying to refresh GID %v and VID %v\n", g.ID, vs.ChannelID) diff --git a/main.go b/main.go index 49efff9..5c2ddf4 100644 --- a/main.go +++ b/main.go @@ -193,7 +193,7 @@ func main() { <-sc // Signal the bridge to exit cleanly - Bridge.BridgeDie <- true + close(Bridge.BridgeDie) log.Println("OS Signal. Bot shutting down") From e85f521cb344cd5fea649222d0debbdfd295c0de Mon Sep 17 00:00:00 2001 From: Steve Date: Thu, 11 Feb 2021 14:37:34 -0500 Subject: [PATCH 4/4] kill bridge only when connected --- main.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/main.go b/main.go index 5c2ddf4..dc60c25 100644 --- a/main.go +++ b/main.go @@ -192,13 +192,12 @@ func main() { signal.Notify(sc, syscall.SIGINT, syscall.SIGTERM, os.Interrupt, os.Kill) <-sc - // Signal the bridge to exit cleanly - close(Bridge.BridgeDie) - log.Println("OS Signal. Bot shutting down") // Wait or the bridge to exit cleanly if Bridge.Connected { + //TODO BridgeDie occasionally panics on send to closed channel + Bridge.BridgeDie <- true Bridge.WaitExit.Wait() } }