forked from lug/matterbridge
		
	For an unknown reason we get duplicate messages (from the same channel) using the realtime API when we have > 1 channel subscribed on. Solution for now is caching the message ID in a LRU cache and ignoring the duplicates. This should be reviewed when we have actual editing support from the realtime API
		
			
				
	
	
		
			75 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			75 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package brocketchat
 | 
						|
 | 
						|
import (
 | 
						|
	"github.com/42wim/matterbridge/bridge/config"
 | 
						|
)
 | 
						|
 | 
						|
func (b *Brocketchat) handleRocket() {
 | 
						|
	messages := make(chan *config.Message)
 | 
						|
	if b.GetString("WebhookBindAddress") != "" {
 | 
						|
		b.Log.Debugf("Choosing webhooks based receiving")
 | 
						|
		go b.handleRocketHook(messages)
 | 
						|
	} else {
 | 
						|
		b.Log.Debugf("Choosing login/password based receiving")
 | 
						|
		go b.handleRocketClient(messages)
 | 
						|
	}
 | 
						|
	for message := range messages {
 | 
						|
		message.Account = b.Account
 | 
						|
		b.Log.Debugf("<= Sending message from %s on %s to gateway", message.Username, b.Account)
 | 
						|
		b.Log.Debugf("<= Message is %#v", message)
 | 
						|
		b.Remote <- *message
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func (b *Brocketchat) handleRocketHook(messages chan *config.Message) {
 | 
						|
	for {
 | 
						|
		message := b.rh.Receive()
 | 
						|
		b.Log.Debugf("Receiving from rockethook %#v", message)
 | 
						|
		// do not loop
 | 
						|
		if message.UserName == b.GetString("Nick") {
 | 
						|
			continue
 | 
						|
		}
 | 
						|
		messages <- &config.Message{
 | 
						|
			UserID:   message.UserID,
 | 
						|
			Username: message.UserName,
 | 
						|
			Text:     message.Text,
 | 
						|
			Channel:  message.ChannelName,
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func (b *Brocketchat) handleRocketClient(messages chan *config.Message) {
 | 
						|
	for message := range b.messageChan {
 | 
						|
		// skip messages with same ID, apparently messages get duplicated for an unknown reason
 | 
						|
		if _, ok := b.cache.Get(message.ID); ok {
 | 
						|
			continue
 | 
						|
		}
 | 
						|
		b.cache.Add(message.ID, true)
 | 
						|
		b.Log.Debugf("message %#v", message)
 | 
						|
		m := message
 | 
						|
		if b.skipMessage(&m) {
 | 
						|
			b.Log.Debugf("Skipped message: %#v", message)
 | 
						|
			continue
 | 
						|
		}
 | 
						|
 | 
						|
		rmsg := &config.Message{Text: message.Msg,
 | 
						|
			Username: message.User.UserName,
 | 
						|
			Channel:  b.getChannelName(message.RoomID),
 | 
						|
			Account:  b.Account,
 | 
						|
			UserID:   message.User.ID,
 | 
						|
			ID:       message.ID,
 | 
						|
		}
 | 
						|
		messages <- rmsg
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func (b *Brocketchat) handleUploadFile(msg *config.Message) error {
 | 
						|
	for _, f := range msg.Extra["file"] {
 | 
						|
		fi := f.(config.FileInfo)
 | 
						|
		if err := b.uploadFile(&fi, b.getChannelID(msg.Channel)); err != nil {
 | 
						|
			return err
 | 
						|
		}
 | 
						|
	}
 | 
						|
	return nil
 | 
						|
}
 |