From 53cae52067df2958fcbedc9f118017db145ea2a8 Mon Sep 17 00:00:00 2001 From: Wim Date: Tue, 11 Dec 2018 23:56:10 +0100 Subject: [PATCH] Add wait option for populateUsers/Channels. Fixes #579 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 {