mirror of
https://github.com/cwinfo/matterbridge.git
synced 2025-07-02 15:06:17 +00:00
Sync channel topics between Slack bridges (#585)
Added logic to allow for configurable synchronisation of topics and purposes of channels between Slack bridges.
This commit is contained in:

committed by
Duco van Amstel

parent
5ed7abdbeb
commit
f5659d455d
@ -281,8 +281,14 @@ func (b *Bslack) sendRTM(msg config.Message) (string, error) {
|
||||
return "", nil
|
||||
}
|
||||
|
||||
// Handle message deletions.
|
||||
var handled bool
|
||||
|
||||
// Handle topic/purpose updates.
|
||||
if handled, err = b.handleTopicOrPurpose(&msg, channelInfo); handled {
|
||||
return "", err
|
||||
}
|
||||
|
||||
// Handle message deletions.
|
||||
if handled, err = b.deleteMessage(&msg, channelInfo); handled {
|
||||
return msg.ID, err
|
||||
}
|
||||
@ -315,6 +321,49 @@ func (b *Bslack) sendRTM(msg config.Message) (string, error) {
|
||||
return b.postMessage(&msg, messageParameters, channelInfo)
|
||||
}
|
||||
|
||||
func (b *Bslack) updateTopicOrPurpose(msg *config.Message, channelInfo *slack.Channel) (bool, error) {
|
||||
var updateFunc func(channelID string, value string) (*slack.Channel, error)
|
||||
|
||||
incomingChangeType, text := b.extractTopicOrPurpose(msg.Text)
|
||||
switch incomingChangeType {
|
||||
case "topic":
|
||||
updateFunc = b.rtm.SetTopicOfConversation
|
||||
case "purpose":
|
||||
updateFunc = b.rtm.SetPurposeOfConversation
|
||||
default:
|
||||
b.Log.Errorf("Unhandled type received from extractTopicOrPurpose: %s", incomingChangeType)
|
||||
return true, nil
|
||||
}
|
||||
for {
|
||||
_, err := updateFunc(channelInfo.ID, text)
|
||||
if err == nil {
|
||||
return true, nil
|
||||
}
|
||||
if err = b.handleRateLimit(err); err != nil {
|
||||
return true, err
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// handles updating topic/purpose and determining whether to further propagate update messages.
|
||||
func (b *Bslack) handleTopicOrPurpose(msg *config.Message, channelInfo *slack.Channel) (bool, error) {
|
||||
if msg.Event != config.EventTopicChange {
|
||||
return false, nil
|
||||
}
|
||||
|
||||
if b.GetBool("SyncTopic") {
|
||||
return b.updateTopicOrPurpose(msg, channelInfo)
|
||||
}
|
||||
|
||||
// Pass along to normal message handlers.
|
||||
if b.GetBool("ShowTopicChange") {
|
||||
return false, nil
|
||||
}
|
||||
|
||||
// Swallow message as handled no-op.
|
||||
return true, nil
|
||||
}
|
||||
|
||||
func (b *Bslack) deleteMessage(msg *config.Message, channelInfo *slack.Channel) (bool, error) {
|
||||
if msg.Event != config.EventMsgDelete {
|
||||
return false, nil
|
||||
|
Reference in New Issue
Block a user