From 959ca3cef3f4cf2ca45078deb01c1bcdbd17a135 Mon Sep 17 00:00:00 2001 From: Wim Date: Thu, 13 Dec 2018 20:49:14 +0100 Subject: [PATCH 1/5] Fix bot (legacy token) messages not being send. Closes #571 --- bridge/slack/helpers.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bridge/slack/helpers.go b/bridge/slack/helpers.go index bbe95320..ff039c58 100644 --- a/bridge/slack/helpers.go +++ b/bridge/slack/helpers.go @@ -250,7 +250,7 @@ func (b *Bslack) populateMessageWithBotInfo(ev *slack.MessageEvent, rmsg *config } b.Log.Debugf("Found bot %#v", bot) - if bot.Name != "" && bot.Name != "Slack API Tester" { + if bot.Name != "" { rmsg.Username = bot.Name if ev.Username != "" { rmsg.Username = ev.Username From 192fe89789cb8d35b0be990b7fb9eb4ae2be9d60 Mon Sep 17 00:00:00 2001 From: David Hill Date: Sat, 15 Dec 2018 16:57:54 -0500 Subject: [PATCH 2/5] Populate user on channel join (slack) (#644) --- bridge/slack/handlers.go | 3 +++ bridge/slack/helpers.go | 20 ++++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/bridge/slack/handlers.go b/bridge/slack/handlers.go index 89c800da..b9011c92 100644 --- a/bridge/slack/handlers.go +++ b/bridge/slack/handlers.go @@ -89,7 +89,10 @@ func (b *Bslack) handleSlackClient(messages chan *config.Message) { b.Log.Fatalf("Invalid Token %#v", ev) case *slack.ConnectionErrorEvent: b.Log.Errorf("Connection failed %#v %#v", ev.Error(), ev.ErrorObj) + case *slack.MemberJoinedChannelEvent: + b.populateUser(ev.User) default: + b.Log.Debugf("Unhandled incoming event: %T", ev) } } } diff --git a/bridge/slack/helpers.go b/bridge/slack/helpers.go index ff039c58..6f049561 100644 --- a/bridge/slack/helpers.go +++ b/bridge/slack/helpers.go @@ -63,6 +63,26 @@ func (b *Bslack) getChannelBy(lookupKey string, lookupMap map[string]*slack.Chan const minimumRefreshInterval = 10 * time.Second +func (b *Bslack) populateUser(userID string) { + b.usersMutex.RLock() + _, exists := b.users[userID] + b.usersMutex.RUnlock() + if exists { + // already in cache + return + } + + user, err := b.sc.GetUserInfo(userID) + if err != nil { + b.Log.Debugf("GetUserInfo failed for %v: %v", userID, err) + return + } + + b.usersMutex.Lock() + b.users[userID] = user + b.usersMutex.Unlock() +} + func (b *Bslack) populateUsers() { b.refreshMutex.Lock() if time.Now().Before(b.earliestUserRefresh) || b.refreshInProgress { From 53c86702a35b3f9d12993d613d17b74ebb99258d Mon Sep 17 00:00:00 2001 From: Wim Date: Sat, 15 Dec 2018 23:11:03 +0100 Subject: [PATCH 3/5] Add wait option for populateUsers/Channels (slack) Fixes #579 (#653) When setting wait to true, we wait until the populating isn't in progress anymore. This is used on startup connections where we really need the initial information which could take a long time on big servers. --- bridge/slack/handlers.go | 10 +++++----- bridge/slack/helpers.go | 14 ++++++++++---- bridge/slack/slack.go | 2 +- 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/bridge/slack/handlers.go b/bridge/slack/handlers.go index b9011c92..40a9666a 100644 --- a/bridge/slack/handlers.go +++ b/bridge/slack/handlers.go @@ -75,7 +75,7 @@ func (b *Bslack) handleSlackClient(messages chan *config.Message) { // When we join a channel we update the full list of users as // well as the information for the channel that we joined as this // should now tell that we are a member of it. - b.populateUsers() + b.populateUsers(false) b.channelsMutex.Lock() b.channelsByID[ev.Channel.ID] = &ev.Channel @@ -83,8 +83,8 @@ func (b *Bslack) handleSlackClient(messages chan *config.Message) { b.channelsMutex.Unlock() case *slack.ConnectedEvent: b.si = ev.Info - b.populateChannels() - b.populateUsers() + b.populateChannels(true) + b.populateUsers(true) case *slack.InvalidAuthEvent: b.Log.Fatalf("Invalid Token %#v", ev) case *slack.ConnectionErrorEvent: @@ -200,7 +200,7 @@ func (b *Bslack) handleMessageEvent(ev *slack.MessageEvent) (*config.Message, er func (b *Bslack) handleStatusEvent(ev *slack.MessageEvent, rmsg *config.Message) bool { switch ev.SubType { case sChannelJoined, sMemberJoined: - b.populateUsers() + b.populateUsers(false) // There's no further processing needed on channel events // so we return 'true'. return true @@ -208,7 +208,7 @@ func (b *Bslack) handleStatusEvent(ev *slack.MessageEvent, rmsg *config.Message) rmsg.Username = sSystemUser rmsg.Event = config.EventJoinLeave case sChannelTopic, sChannelPurpose: - b.populateChannels() + b.populateChannels(false) rmsg.Event = config.EventTopicChange case sMessageChanged: rmsg.Text = ev.SubMessage.Text diff --git a/bridge/slack/helpers.go b/bridge/slack/helpers.go index 6f049561..fb7a25d5 100644 --- a/bridge/slack/helpers.go +++ b/bridge/slack/helpers.go @@ -83,15 +83,18 @@ func (b *Bslack) populateUser(userID string) { b.usersMutex.Unlock() } -func (b *Bslack) populateUsers() { +func (b *Bslack) populateUsers(wait bool) { b.refreshMutex.Lock() - if time.Now().Before(b.earliestUserRefresh) || b.refreshInProgress { + if !wait && (time.Now().Before(b.earliestUserRefresh) || b.refreshInProgress) { b.Log.Debugf("Not refreshing user list as it was done less than %v ago.", minimumRefreshInterval) b.refreshMutex.Unlock() return } + for b.refreshInProgress { + time.Sleep(time.Second) + } b.refreshInProgress = true b.refreshMutex.Unlock() @@ -127,14 +130,17 @@ func (b *Bslack) populateUsers() { b.refreshInProgress = false } -func (b *Bslack) populateChannels() { +func (b *Bslack) populateChannels(wait bool) { b.refreshMutex.Lock() - if time.Now().Before(b.earliestChannelRefresh) || b.refreshInProgress { + if !wait && (time.Now().Before(b.earliestChannelRefresh) || b.refreshInProgress) { b.Log.Debugf("Not refreshing channel list as it was done less than %v seconds ago.", minimumRefreshInterval) b.refreshMutex.Unlock() return } + for b.refreshInProgress { + time.Sleep(time.Second) + } b.refreshInProgress = true b.refreshMutex.Unlock() diff --git a/bridge/slack/slack.go b/bridge/slack/slack.go index 225e16e9..d8dfc62f 100644 --- a/bridge/slack/slack.go +++ b/bridge/slack/slack.go @@ -160,7 +160,7 @@ func (b *Bslack) JoinChannel(channel config.ChannelInfo) error { return nil } - b.populateChannels() + b.populateChannels(false) channelInfo, err := b.getChannel(channel.Name) if err != nil { From 0121d7503213fec4d286bfa5d3ede16434a4aefe Mon Sep 17 00:00:00 2001 From: Wim Date: Sat, 15 Dec 2018 23:24:28 +0100 Subject: [PATCH 4/5] Update changelog --- changelog.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/changelog.md b/changelog.md index 71f7f3f1..fdd6e980 100644 --- a/changelog.md +++ b/changelog.md @@ -1,3 +1,9 @@ +# v1.12.3 +## Bugfix +* slack: Fix bot (legacy token) messages not being send. Closes #571 +* slack: Populate user on channel join (slack) (#644) +* slack: Add wait option for populateUsers/Channels (slack) Fixes #579 (#653) + # v1.12.2 ## Bugfix From 288f0a06bb7c0d9a9805697eb0cd71448cbeaaff Mon Sep 17 00:00:00 2001 From: Wim Date: Sat, 15 Dec 2018 23:33:13 +0100 Subject: [PATCH 5/5] Bump version --- matterbridge.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/matterbridge.go b/matterbridge.go index e713fb0b..894051b0 100644 --- a/matterbridge.go +++ b/matterbridge.go @@ -15,7 +15,7 @@ import ( ) var ( - version = "1.12.3-dev" + version = "1.12.4-dev" githash string )