mirror of
https://github.com/stryan/mumble-discord-bridge.git
synced 2024-11-23 05:45:41 -05:00
Merge pull request #9 from stryan/main
swap GuildCreate and Ready, fix auto-mode
This commit is contained in:
commit
2fe2080bcf
@ -139,6 +139,8 @@ It is a known issue with a dependency of this project.
|
|||||||
|
|
||||||
Audio leveling from Discord needs to be improved.
|
Audio leveling from Discord needs to be improved.
|
||||||
|
|
||||||
|
Delays in connecting to Mumble (such as from external authentication plugins) may result in extra error messages on initial connection.
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
Distributed under the MIT License. See LICENSE for more information.
|
Distributed under the MIT License. See LICENSE for more information.
|
||||||
|
35
bridge.go
35
bridge.go
@ -50,6 +50,9 @@ type BridgeState struct {
|
|||||||
MumbleUsers map[string]bool
|
MumbleUsers map[string]bool
|
||||||
MumbleUsersMutex sync.Mutex
|
MumbleUsersMutex sync.Mutex
|
||||||
|
|
||||||
|
// Total Number of Mumble users
|
||||||
|
MumbleUserCount int
|
||||||
|
|
||||||
// Kill the auto connect routine
|
// Kill the auto connect routine
|
||||||
AutoChanDie chan bool
|
AutoChanDie chan bool
|
||||||
|
|
||||||
@ -95,6 +98,7 @@ func (b *BridgeState) startBridge() {
|
|||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println(err)
|
log.Println(err)
|
||||||
|
b.DiscordVoice.Disconnect()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
defer b.MumbleClient.Disconnect()
|
defer b.MumbleClient.Disconnect()
|
||||||
@ -129,14 +133,21 @@ func (b *BridgeState) startBridge() {
|
|||||||
ticker := time.NewTicker(500 * time.Millisecond)
|
ticker := time.NewTicker(500 * time.Millisecond)
|
||||||
for {
|
for {
|
||||||
<-ticker.C
|
<-ticker.C
|
||||||
if b.MumbleClient.State() != 2 {
|
if b.MumbleClient == nil || b.MumbleClient.State() != 2 {
|
||||||
log.Println("Lost mumble connection " + strconv.Itoa(int(b.MumbleClient.State())))
|
if b.MumbleClient != nil {
|
||||||
|
log.Println("Lost mumble connection " + strconv.Itoa(int(b.MumbleClient.State())))
|
||||||
|
} else {
|
||||||
|
log.Println("Lost mumble connection due to bridge dieing")
|
||||||
|
return
|
||||||
|
}
|
||||||
select {
|
select {
|
||||||
default:
|
|
||||||
close(b.BridgeDie)
|
|
||||||
case <-b.BridgeDie:
|
case <-b.BridgeDie:
|
||||||
//die is already closed
|
//die is already closed
|
||||||
|
|
||||||
|
default:
|
||||||
|
close(b.BridgeDie)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
@ -150,6 +161,7 @@ func (b *BridgeState) startBridge() {
|
|||||||
det.Detach()
|
det.Detach()
|
||||||
close(toDiscord)
|
close(toDiscord)
|
||||||
close(toMumble)
|
close(toMumble)
|
||||||
|
close(b.BridgeDie)
|
||||||
b.Connected = false
|
b.Connected = false
|
||||||
b.DiscordVoice = nil
|
b.DiscordVoice = nil
|
||||||
b.MumbleClient = nil
|
b.MumbleClient = nil
|
||||||
@ -170,17 +182,17 @@ func (b *BridgeState) discordStatusUpdate() {
|
|||||||
b.DiscordSession.UpdateListeningStatus("an error pinging mumble")
|
b.DiscordSession.UpdateListeningStatus("an error pinging mumble")
|
||||||
} else {
|
} else {
|
||||||
b.MumbleUsersMutex.Lock()
|
b.MumbleUsersMutex.Lock()
|
||||||
userCount := resp.ConnectedUsers
|
b.MumbleUserCount = resp.ConnectedUsers
|
||||||
if b.Connected {
|
if b.Connected {
|
||||||
userCount = userCount - 1
|
b.MumbleUserCount = b.MumbleUserCount - 1
|
||||||
}
|
}
|
||||||
if userCount == 0 {
|
if b.MumbleUserCount == 0 {
|
||||||
status = "No users in Mumble"
|
status = "No users in Mumble"
|
||||||
} else {
|
} else {
|
||||||
if len(b.MumbleUsers) > 0 {
|
if len(b.MumbleUsers) > 0 {
|
||||||
status = fmt.Sprintf("%v/%v users in Mumble\n", len(b.MumbleUsers), userCount)
|
status = fmt.Sprintf("%v/%v users in Mumble\n", len(b.MumbleUsers), b.MumbleUserCount)
|
||||||
} else {
|
} else {
|
||||||
status = fmt.Sprintf("%v users in Mumble\n", userCount)
|
status = fmt.Sprintf("%v users in Mumble\n", b.MumbleUserCount)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
b.MumbleUsersMutex.Unlock()
|
b.MumbleUsersMutex.Unlock()
|
||||||
@ -207,14 +219,13 @@ func (b *BridgeState) AutoBridge() {
|
|||||||
b.MumbleUsersMutex.Lock()
|
b.MumbleUsersMutex.Lock()
|
||||||
b.DiscordUsersMutex.Lock()
|
b.DiscordUsersMutex.Lock()
|
||||||
|
|
||||||
if !b.Connected && len(b.MumbleUsers) > 0 && len(b.DiscordUsers) > 0 {
|
if !b.Connected && b.MumbleUserCount > 0 && len(b.DiscordUsers) > 0 {
|
||||||
log.Println("users detected in mumble and discord, bridging")
|
log.Println("users detected in mumble and discord, bridging")
|
||||||
go b.startBridge()
|
go b.startBridge()
|
||||||
}
|
}
|
||||||
if b.Connected && len(b.MumbleUsers) == 0 && len(b.DiscordUsers) <= 1 {
|
if b.Connected && b.MumbleUserCount == 0 && len(b.DiscordUsers) <= 1 {
|
||||||
log.Println("no one online, killing bridge")
|
log.Println("no one online, killing bridge")
|
||||||
b.BridgeDie <- true
|
b.BridgeDie <- true
|
||||||
b.BridgeDie = nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
b.MumbleUsersMutex.Unlock()
|
b.MumbleUsersMutex.Unlock()
|
||||||
|
@ -15,25 +15,15 @@ type DiscordListener struct {
|
|||||||
Bridge *BridgeState
|
Bridge *BridgeState
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *DiscordListener) ready(s *discordgo.Session, event *discordgo.Ready) {
|
func (l *DiscordListener) guildCreate(s *discordgo.Session, event *discordgo.GuildCreate) {
|
||||||
log.Println("READY event registered")
|
log.Println("CREATE event registered")
|
||||||
|
|
||||||
//Setup initial discord state
|
if event.ID != l.Bridge.BridgeConfig.GID {
|
||||||
var g *discordgo.Guild
|
log.Println("received GuildCreate from a guild not in config")
|
||||||
g = nil
|
|
||||||
|
|
||||||
for _, i := range event.Guilds {
|
|
||||||
if i.ID == l.Bridge.BridgeConfig.GID {
|
|
||||||
g = i
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if g == nil {
|
|
||||||
log.Println("bad guild on READY")
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, vs := range g.VoiceStates {
|
for _, vs := range event.VoiceStates {
|
||||||
if vs.ChannelID == l.Bridge.BridgeConfig.CID {
|
if vs.ChannelID == l.Bridge.BridgeConfig.CID {
|
||||||
if s.State.User.ID == vs.UserID {
|
if s.State.User.ID == vs.UserID {
|
||||||
// Ignore bot
|
// Ignore bot
|
||||||
@ -143,20 +133,6 @@ func (l *DiscordListener) messageCreate(s *discordgo.Session, m *discordgo.Messa
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *DiscordListener) guildCreate(s *discordgo.Session, event *discordgo.GuildCreate) {
|
|
||||||
|
|
||||||
if event.Guild.Unavailable {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, channel := range event.Guild.Channels {
|
|
||||||
if channel.ID == event.Guild.ID {
|
|
||||||
log.Println("Mumble-Discord bridge is active in new guild")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (l *DiscordListener) voiceUpdate(s *discordgo.Session, event *discordgo.VoiceStateUpdate) {
|
func (l *DiscordListener) voiceUpdate(s *discordgo.Session, event *discordgo.VoiceStateUpdate) {
|
||||||
l.Bridge.DiscordUsersMutex.Lock()
|
l.Bridge.DiscordUsersMutex.Lock()
|
||||||
defer l.Bridge.DiscordUsersMutex.Unlock()
|
defer l.Bridge.DiscordUsersMutex.Unlock()
|
||||||
|
1
main.go
1
main.go
@ -144,7 +144,6 @@ func main() {
|
|||||||
Bridge.DiscordListener = &DiscordListener{
|
Bridge.DiscordListener = &DiscordListener{
|
||||||
Bridge: Bridge,
|
Bridge: Bridge,
|
||||||
}
|
}
|
||||||
Bridge.DiscordSession.AddHandler(Bridge.DiscordListener.ready)
|
|
||||||
Bridge.DiscordSession.AddHandler(Bridge.DiscordListener.messageCreate)
|
Bridge.DiscordSession.AddHandler(Bridge.DiscordListener.messageCreate)
|
||||||
Bridge.DiscordSession.AddHandler(Bridge.DiscordListener.guildCreate)
|
Bridge.DiscordSession.AddHandler(Bridge.DiscordListener.guildCreate)
|
||||||
Bridge.DiscordSession.AddHandler(Bridge.DiscordListener.voiceUpdate)
|
Bridge.DiscordSession.AddHandler(Bridge.DiscordListener.voiceUpdate)
|
||||||
|
Loading…
Reference in New Issue
Block a user