forked from lug/matterbridge
		
	Compare commits
	
		
			16 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					35736bbbfe | ||
| 
						 | 
					85fa4df39d | ||
| 
						 | 
					859b084814 | ||
| 
						 | 
					315a038e00 | ||
| 
						 | 
					b3999b6e71 | ||
| 
						 | 
					6bef998bb3 | ||
| 
						 | 
					919a0309ad | ||
| 
						 | 
					95bcca7335 | ||
| 
						 | 
					c78bd24c61 | ||
| 
						 | 
					d2cfd235ef | ||
| 
						 | 
					f8bf7f8d76 | ||
| 
						 | 
					8432330cb2 | ||
| 
						 | 
					02577a2b5c | ||
| 
						 | 
					73501739d5 | ||
| 
						 | 
					ba674af5d4 | ||
| 
						 | 
					3c85d937c6 | 
@@ -76,9 +76,10 @@ func (b *Bdiscord) Connect() error {
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	serverName := strings.Replace(b.GetString("Server"), "ID:", "", -1)
 | 
			
		||||
	b.Nick = userinfo.Username
 | 
			
		||||
	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.guildID = guild.ID
 | 
			
		||||
			if err != nil {
 | 
			
		||||
 
 | 
			
		||||
@@ -172,7 +172,6 @@ func (b *Birc) JoinChannel(channel config.ChannelInfo) error {
 | 
			
		||||
	} else {
 | 
			
		||||
		b.i.Cmd.Join(channel.Name)
 | 
			
		||||
	}
 | 
			
		||||
	b.authDone = false
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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,13 +83,16 @@ 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:
 | 
			
		||||
			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)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
@@ -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 {
 | 
			
		||||
	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
 | 
			
		||||
@@ -202,6 +205,13 @@ func (b *Bslack) handleStatusEvent(ev *slack.MessageEvent, rmsg *config.Message)
 | 
			
		||||
		rmsg.Event = config.EventJoinLeave
 | 
			
		||||
	case sChannelTopic, sChannelPurpose:
 | 
			
		||||
		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:
 | 
			
		||||
		rmsg.Text = config.EventMsgDelete
 | 
			
		||||
		rmsg.Event = config.EventMsgDelete
 | 
			
		||||
 
 | 
			
		||||
@@ -65,15 +65,38 @@ func (b *Bslack) getChannelByID(ID string) (*slack.Channel, error) {
 | 
			
		||||
 | 
			
		||||
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()
 | 
			
		||||
	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()
 | 
			
		||||
 | 
			
		||||
@@ -109,14 +132,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()
 | 
			
		||||
 | 
			
		||||
@@ -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
 | 
			
		||||
		if ev.Username != "" {
 | 
			
		||||
			rmsg.Username = ev.Username
 | 
			
		||||
 
 | 
			
		||||
@@ -48,6 +48,7 @@ const (
 | 
			
		||||
	sChannelLeave    = "channel_leave"
 | 
			
		||||
	sChannelJoined   = "channel_joined"
 | 
			
		||||
	sMemberJoined    = "member_joined_channel"
 | 
			
		||||
	sMessageChanged  = "message_changed"
 | 
			
		||||
	sMessageDeleted  = "message_deleted"
 | 
			
		||||
	sSlackAttachment = "slack_attachment"
 | 
			
		||||
	sPinnedItem      = "pinned_item"
 | 
			
		||||
@@ -76,14 +77,9 @@ func New(cfg *bridge.Config) bridge.Bridger {
 | 
			
		||||
	// Print a deprecation warning for legacy non-bot tokens (#527).
 | 
			
		||||
	token := cfg.GetString(tokenConfig)
 | 
			
		||||
	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.Error("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.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)
 | 
			
		||||
		cfg.Log.Warn("Non-bot token detected. It is STRONGLY recommended to use a proper bot-token instead.")
 | 
			
		||||
		cfg.Log.Warn("Legacy tokens may be deprecated by Slack at short notice. See the Matterbridge GitHub wiki for a migration guide.")
 | 
			
		||||
		cfg.Log.Warn("See https://github.com/42wim/matterbridge/wiki/Slack-bot-setup")
 | 
			
		||||
		return NewLegacy(cfg)
 | 
			
		||||
	}
 | 
			
		||||
	return newBridge(cfg)
 | 
			
		||||
@@ -164,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 {
 | 
			
		||||
@@ -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) {
 | 
			
		||||
	// don't post empty messages
 | 
			
		||||
	if msg.Text == "" {
 | 
			
		||||
		return "", nil
 | 
			
		||||
	}
 | 
			
		||||
	for {
 | 
			
		||||
		_, id, err := b.rtm.PostMessage(channelInfo.ID, msg.Text, *messageParameters)
 | 
			
		||||
		if err == nil {
 | 
			
		||||
@@ -385,11 +385,16 @@ func (b *Bslack) uploadFile(msg *config.Message, channelID string) {
 | 
			
		||||
		ts := time.Now()
 | 
			
		||||
		b.Log.Debugf("Adding file %s to cache at %s with timestamp", fi.Name, ts.String())
 | 
			
		||||
		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{
 | 
			
		||||
			Reader:          bytes.NewReader(*fi.Data),
 | 
			
		||||
			Filename:        fi.Name,
 | 
			
		||||
			Channels:        []string{channelID},
 | 
			
		||||
			InitialComment: fi.Comment,
 | 
			
		||||
			InitialComment:  initialComment,
 | 
			
		||||
			ThreadTimestamp: msg.ParentID,
 | 
			
		||||
		})
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			b.Log.Errorf("uploadfile %#v", err)
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										23
									
								
								changelog.md
									
									
									
									
									
								
							
							
						
						
									
										23
									
								
								changelog.md
									
									
									
									
									
								
							@@ -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
 | 
			
		||||
 | 
			
		||||
## Breaking changes
 | 
			
		||||
 
 | 
			
		||||
@@ -14,7 +14,7 @@ import (
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	version = "1.12.1-dev"
 | 
			
		||||
	version = "1.12.3"
 | 
			
		||||
	githash string
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1389,7 +1389,7 @@ enable=true
 | 
			
		||||
 | 
			
		||||
        #OPTIONAL - webhookurl only works for discord (it needs a different URL for each cahnnel)
 | 
			
		||||
        [gateway.inout.options]
 | 
			
		||||
        webhookurl=""https://discordapp.com/api/webhooks/123456789123456789/C9WPqExYWONPDZabcdef-def1434FGFjstasJX9pYht73y"
 | 
			
		||||
        webhookurl="https://discordapp.com/api/webhooks/123456789123456789/C9WPqExYWONPDZabcdef-def1434FGFjstasJX9pYht73y"
 | 
			
		||||
 | 
			
		||||
    #API example
 | 
			
		||||
    #[[gateway.inout]]
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user