4
0
mirror of https://github.com/cwinfo/matterbridge.git synced 2025-06-26 22:19:26 +00:00

Compare commits

...

16 Commits

Author SHA1 Message Date
Wim
35736bbbfe Release v1.12.3 2018-12-15 23:25:31 +01:00
Wim
85fa4df39d Update changelog 2018-12-15 23:24:28 +01:00
Wim
859b084814 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.
2018-12-15 23:21:31 +01:00
315a038e00 Populate user on channel join (slack) (#644) 2018-12-15 23:13:53 +01:00
Wim
b3999b6e71 Fix bot (legacy token) messages not being send. Closes #571 2018-12-15 23:13:42 +01:00
Wim
6bef998bb3 Release v1.12.2 2018-12-04 10:26:29 +01:00
Wim
919a0309ad Update changelog 2018-12-04 10:24:44 +01:00
Wim
95bcca7335 Fix multiple channel join regression. Closes #639 2018-12-04 10:21:52 +01:00
Wim
c78bd24c61 Make slack-legacy change less restrictive (#626) 2018-12-04 10:21:38 +01:00
Wim
d2cfd235ef Release v1.12.1 2018-11-29 00:09:18 +01:00
Wim
f8bf7f8d76 Update changelog 2018-11-29 00:08:58 +01:00
Wim
8432330cb2 Fix regression on using server ID (discord). #619 #617 2018-11-29 00:04:55 +01:00
Wim
02577a2b5c Make sure threaded files stay in thread (slack). Fixes #590 2018-11-29 00:04:54 +01:00
Wim
73501739d5 Do not post empty messages (slack). Fixes #574 2018-11-29 00:04:53 +01:00
Wim
ba674af5d4 Handle deleted/edited thread starting messages (slack). Fixes #600 (#605) 2018-11-29 00:04:53 +01:00
3c85d937c6 Remove double " from Discord gateway webhookurl= (#607) 2018-11-29 00:04:53 +01:00
8 changed files with 90 additions and 26 deletions

View File

@ -76,9 +76,10 @@ func (b *Bdiscord) Connect() error {
if err != nil { if err != nil {
return err return err
} }
serverName := strings.Replace(b.GetString("Server"), "ID:", "", -1)
b.Nick = userinfo.Username b.Nick = userinfo.Username
for _, guild := range guilds { for _, guild := range guilds {
if guild.Name == b.GetString("Server") { if guild.Name == serverName || guild.ID == serverName {
b.Channels, err = b.c.GuildChannels(guild.ID) b.Channels, err = b.c.GuildChannels(guild.ID)
b.guildID = guild.ID b.guildID = guild.ID
if err != nil { if err != nil {

View File

@ -172,7 +172,6 @@ func (b *Birc) JoinChannel(channel config.ChannelInfo) error {
} else { } else {
b.i.Cmd.Join(channel.Name) b.i.Cmd.Join(channel.Name)
} }
b.authDone = false
return nil return nil
} }

View File

@ -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 // 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 // well as the information for the channel that we joined as this
// should now tell that we are a member of it. // should now tell that we are a member of it.
b.populateUsers() b.populateUsers(false)
b.channelsMutex.Lock() b.channelsMutex.Lock()
b.channelsByID[ev.Channel.ID] = &ev.Channel b.channelsByID[ev.Channel.ID] = &ev.Channel
@ -83,13 +83,16 @@ func (b *Bslack) handleSlackClient(messages chan *config.Message) {
b.channelsMutex.Unlock() b.channelsMutex.Unlock()
case *slack.ConnectedEvent: case *slack.ConnectedEvent:
b.si = ev.Info b.si = ev.Info
b.populateChannels() b.populateChannels(true)
b.populateUsers() b.populateUsers(true)
case *slack.InvalidAuthEvent: case *slack.InvalidAuthEvent:
b.Log.Fatalf("Invalid Token %#v", ev) b.Log.Fatalf("Invalid Token %#v", ev)
case *slack.ConnectionErrorEvent: case *slack.ConnectionErrorEvent:
b.Log.Errorf("Connection failed %#v %#v", ev.Error(), ev.ErrorObj) b.Log.Errorf("Connection failed %#v %#v", ev.Error(), ev.ErrorObj)
case *slack.MemberJoinedChannelEvent:
b.populateUser(ev.User)
default: default:
b.Log.Debugf("Unhandled incoming event: %T", ev)
} }
} }
} }
@ -193,7 +196,7 @@ func (b *Bslack) handleMessageEvent(ev *slack.MessageEvent) (*config.Message, er
func (b *Bslack) handleStatusEvent(ev *slack.MessageEvent, rmsg *config.Message) bool { func (b *Bslack) handleStatusEvent(ev *slack.MessageEvent, rmsg *config.Message) bool {
switch ev.SubType { switch ev.SubType {
case sChannelJoined, sMemberJoined: case sChannelJoined, sMemberJoined:
b.populateUsers() b.populateUsers(false)
// There's no further processing needed on channel events // There's no further processing needed on channel events
// so we return 'true'. // so we return 'true'.
return true return true
@ -202,6 +205,13 @@ func (b *Bslack) handleStatusEvent(ev *slack.MessageEvent, rmsg *config.Message)
rmsg.Event = config.EventJoinLeave rmsg.Event = config.EventJoinLeave
case sChannelTopic, sChannelPurpose: case sChannelTopic, sChannelPurpose:
rmsg.Event = config.EventTopicChange rmsg.Event = config.EventTopicChange
case sMessageChanged:
rmsg.Text = ev.SubMessage.Text
// handle deleted thread starting messages
if ev.SubMessage.Text == "This message was deleted." {
rmsg.Event = config.EventMsgDelete
return true
}
case sMessageDeleted: case sMessageDeleted:
rmsg.Text = config.EventMsgDelete rmsg.Text = config.EventMsgDelete
rmsg.Event = config.EventMsgDelete rmsg.Event = config.EventMsgDelete

View File

@ -65,15 +65,38 @@ func (b *Bslack) getChannelByID(ID string) (*slack.Channel, error) {
const minimumRefreshInterval = 10 * time.Second const minimumRefreshInterval = 10 * time.Second
func (b *Bslack) populateUsers() { 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(wait bool) {
b.refreshMutex.Lock() 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.", b.Log.Debugf("Not refreshing user list as it was done less than %v ago.",
minimumRefreshInterval) minimumRefreshInterval)
b.refreshMutex.Unlock() b.refreshMutex.Unlock()
return return
} }
for b.refreshInProgress {
time.Sleep(time.Second)
}
b.refreshInProgress = true b.refreshInProgress = true
b.refreshMutex.Unlock() b.refreshMutex.Unlock()
@ -109,14 +132,17 @@ func (b *Bslack) populateUsers() {
b.refreshInProgress = false b.refreshInProgress = false
} }
func (b *Bslack) populateChannels() { func (b *Bslack) populateChannels(wait bool) {
b.refreshMutex.Lock() 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.", b.Log.Debugf("Not refreshing channel list as it was done less than %v seconds ago.",
minimumRefreshInterval) minimumRefreshInterval)
b.refreshMutex.Unlock() b.refreshMutex.Unlock()
return return
} }
for b.refreshInProgress {
time.Sleep(time.Second)
}
b.refreshInProgress = true b.refreshInProgress = true
b.refreshMutex.Unlock() b.refreshMutex.Unlock()
@ -251,7 +277,7 @@ func (b *Bslack) populateMessageWithBotInfo(ev *slack.MessageEvent, rmsg *config
} }
} }
if bot.Name != "" && bot.Name != "Slack API Tester" { if bot.Name != "" {
rmsg.Username = bot.Name rmsg.Username = bot.Name
if ev.Username != "" { if ev.Username != "" {
rmsg.Username = ev.Username rmsg.Username = ev.Username

View File

@ -48,6 +48,7 @@ const (
sChannelLeave = "channel_leave" sChannelLeave = "channel_leave"
sChannelJoined = "channel_joined" sChannelJoined = "channel_joined"
sMemberJoined = "member_joined_channel" sMemberJoined = "member_joined_channel"
sMessageChanged = "message_changed"
sMessageDeleted = "message_deleted" sMessageDeleted = "message_deleted"
sSlackAttachment = "slack_attachment" sSlackAttachment = "slack_attachment"
sPinnedItem = "pinned_item" sPinnedItem = "pinned_item"
@ -76,14 +77,9 @@ func New(cfg *bridge.Config) bridge.Bridger {
// Print a deprecation warning for legacy non-bot tokens (#527). // Print a deprecation warning for legacy non-bot tokens (#527).
token := cfg.GetString(tokenConfig) token := cfg.GetString(tokenConfig)
if token != "" && !strings.HasPrefix(token, "xoxb") { if token != "" && !strings.HasPrefix(token, "xoxb") {
cfg.Log.Error("Non-bot token detected. It is STRONGLY recommended to use a proper bot-token instead.") cfg.Log.Warn("Non-bot token detected. It is STRONGLY recommended to use a proper bot-token instead.")
cfg.Log.Error("Legacy tokens may be deprecated by Slack at short notice. See the Matterbridge GitHub wiki for a migration guide.") cfg.Log.Warn("Legacy tokens may be deprecated by Slack at short notice. See the Matterbridge GitHub wiki for a migration guide.")
cfg.Log.Error("See https://github.com/42wim/matterbridge/wiki/Slack-bot-setup") cfg.Log.Warn("See https://github.com/42wim/matterbridge/wiki/Slack-bot-setup")
cfg.Log.Error("")
cfg.Log.Error("To continue using a legacy token please move your configuration to a \"slack-legacy\" bridge instead.")
cfg.Log.Error("See https://github.com/42wim/matterbridge/wiki/Section-Slack-(basic)#legacy-configuration)")
cfg.Log.Error("Delaying start of bridge by 30 seconds. Future Matterbridge release will fail here unless you use a \"slack-legacy\" bridge.")
time.Sleep(30 * time.Second)
return NewLegacy(cfg) return NewLegacy(cfg)
} }
return newBridge(cfg) return newBridge(cfg)
@ -164,7 +160,7 @@ func (b *Bslack) JoinChannel(channel config.ChannelInfo) error {
return nil return nil
} }
b.populateChannels() b.populateChannels(false)
channelInfo, err := b.getChannel(channel.Name) channelInfo, err := b.getChannel(channel.Name)
if err != nil { if err != nil {
@ -356,6 +352,10 @@ func (b *Bslack) editMessage(msg *config.Message, channelInfo *slack.Channel) (b
} }
func (b *Bslack) postMessage(msg *config.Message, messageParameters *slack.PostMessageParameters, channelInfo *slack.Channel) (string, error) { func (b *Bslack) postMessage(msg *config.Message, messageParameters *slack.PostMessageParameters, channelInfo *slack.Channel) (string, error) {
// don't post empty messages
if msg.Text == "" {
return "", nil
}
for { for {
_, id, err := b.rtm.PostMessage(channelInfo.ID, msg.Text, *messageParameters) _, id, err := b.rtm.PostMessage(channelInfo.ID, msg.Text, *messageParameters)
if err == nil { if err == nil {
@ -385,11 +385,16 @@ func (b *Bslack) uploadFile(msg *config.Message, channelID string) {
ts := time.Now() ts := time.Now()
b.Log.Debugf("Adding file %s to cache at %s with timestamp", fi.Name, ts.String()) b.Log.Debugf("Adding file %s to cache at %s with timestamp", fi.Name, ts.String())
b.cache.Add("filename"+fi.Name, ts) b.cache.Add("filename"+fi.Name, ts)
initialComment := fmt.Sprintf("File from %s", msg.Username)
if fi.Comment != "" {
initialComment += fmt.Sprintf("with comment: %s", fi.Comment)
}
res, err := b.sc.UploadFile(slack.FileUploadParameters{ res, err := b.sc.UploadFile(slack.FileUploadParameters{
Reader: bytes.NewReader(*fi.Data), Reader: bytes.NewReader(*fi.Data),
Filename: fi.Name, Filename: fi.Name,
Channels: []string{channelID}, Channels: []string{channelID},
InitialComment: fi.Comment, InitialComment: initialComment,
ThreadTimestamp: msg.ParentID,
}) })
if err != nil { if err != nil {
b.Log.Errorf("uploadfile %#v", err) b.Log.Errorf("uploadfile %#v", err)

View File

@ -1,3 +1,26 @@
# 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
* irc: Fix multiple channel join regression. Closes #639
* slack: Make slack-legacy change less restrictive (#626)
# v1.12.1
## Bugfix
* discord: fix regression on server ID connection #619 #617
* discord: Limit discord username via webhook to 32 chars
* slack: Make sure threaded files stay in thread (slack). Fixes #590
* slack: Do not post empty messages (slack). Fixes #574
* slack: Handle deleted/edited thread starting messages (slack). Fixes #600 (#605)
* irc: Rework connection logic (irc)
* irc: Fix Nickserv logic (irc) #602
# v1.12.0 # v1.12.0
## Breaking changes ## Breaking changes

View File

@ -14,7 +14,7 @@ import (
) )
var ( var (
version = "1.12.1-dev" version = "1.12.3"
githash string githash string
) )

View File

@ -1389,7 +1389,7 @@ enable=true
#OPTIONAL - webhookurl only works for discord (it needs a different URL for each cahnnel) #OPTIONAL - webhookurl only works for discord (it needs a different URL for each cahnnel)
[gateway.inout.options] [gateway.inout.options]
webhookurl=""https://discordapp.com/api/webhooks/123456789123456789/C9WPqExYWONPDZabcdef-def1434FGFjstasJX9pYht73y" webhookurl="https://discordapp.com/api/webhooks/123456789123456789/C9WPqExYWONPDZabcdef-def1434FGFjstasJX9pYht73y"
#API example #API example
#[[gateway.inout]] #[[gateway.inout]]