forked from jshiffer/matterbridge
8e6ddadba2
This pull request properly sets the events EventJoinLeave and EventTopicChange for messages from the RocketChat bridge and drops messages which are neither one of those events nor plain messages.
182 lines
4.4 KiB
Go
182 lines
4.4 KiB
Go
package brocketchat
|
|
|
|
import (
|
|
"errors"
|
|
"strings"
|
|
"sync"
|
|
|
|
"github.com/42wim/matterbridge/bridge"
|
|
"github.com/42wim/matterbridge/bridge/config"
|
|
"github.com/42wim/matterbridge/bridge/helper"
|
|
"github.com/42wim/matterbridge/hook/rockethook"
|
|
"github.com/42wim/matterbridge/matterhook"
|
|
lru "github.com/hashicorp/golang-lru"
|
|
"github.com/matterbridge/Rocket.Chat.Go.SDK/models"
|
|
"github.com/matterbridge/Rocket.Chat.Go.SDK/realtime"
|
|
"github.com/matterbridge/Rocket.Chat.Go.SDK/rest"
|
|
)
|
|
|
|
type Brocketchat struct {
|
|
mh *matterhook.Client
|
|
rh *rockethook.Client
|
|
c *realtime.Client
|
|
r *rest.Client
|
|
cache *lru.Cache
|
|
*bridge.Config
|
|
messageChan chan models.Message
|
|
channelMap map[string]string
|
|
user *models.User
|
|
sync.RWMutex
|
|
}
|
|
|
|
const (
|
|
sUserJoined = "uj"
|
|
sUserLeft = "ul"
|
|
sRoomChangedTopic = "room_changed_topic"
|
|
)
|
|
|
|
func New(cfg *bridge.Config) bridge.Bridger {
|
|
newCache, err := lru.New(100)
|
|
if err != nil {
|
|
cfg.Log.Fatalf("Could not create LRU cache for rocketchat bridge: %v", err)
|
|
}
|
|
b := &Brocketchat{
|
|
Config: cfg,
|
|
messageChan: make(chan models.Message),
|
|
channelMap: make(map[string]string),
|
|
cache: newCache,
|
|
}
|
|
b.Log.Debugf("enabling rocketchat")
|
|
return b
|
|
}
|
|
|
|
func (b *Brocketchat) Command(cmd string) string {
|
|
return ""
|
|
}
|
|
|
|
func (b *Brocketchat) Connect() error {
|
|
if b.GetString("WebhookBindAddress") != "" {
|
|
if err := b.doConnectWebhookBind(); err != nil {
|
|
return err
|
|
}
|
|
go b.handleRocket()
|
|
return nil
|
|
}
|
|
switch {
|
|
case b.GetString("WebhookURL") != "":
|
|
if err := b.doConnectWebhookURL(); err != nil {
|
|
return err
|
|
}
|
|
go b.handleRocket()
|
|
return nil
|
|
case b.GetString("Login") != "":
|
|
b.Log.Info("Connecting using login/password (sending and receiving)")
|
|
err := b.apiLogin()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
go b.handleRocket()
|
|
}
|
|
if b.GetString("WebhookBindAddress") == "" && b.GetString("WebhookURL") == "" &&
|
|
b.GetString("Login") == "" {
|
|
return errors.New("no connection method found. See that you have WebhookBindAddress, WebhookURL or Login/Password/Server configured")
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (b *Brocketchat) Disconnect() error {
|
|
return nil
|
|
}
|
|
|
|
func (b *Brocketchat) JoinChannel(channel config.ChannelInfo) error {
|
|
if b.c == nil {
|
|
return nil
|
|
}
|
|
id, err := b.c.GetChannelId(strings.TrimPrefix(channel.Name, "#"))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
b.Lock()
|
|
b.channelMap[id] = channel.Name
|
|
b.Unlock()
|
|
mychannel := &models.Channel{ID: id, Name: strings.TrimPrefix(channel.Name, "#")}
|
|
if err := b.c.JoinChannel(id); err != nil {
|
|
return err
|
|
}
|
|
if err := b.c.SubscribeToMessageStream(mychannel, b.messageChan); err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (b *Brocketchat) Send(msg config.Message) (string, error) {
|
|
// strip the # if people has set this
|
|
msg.Channel = strings.TrimPrefix(msg.Channel, "#")
|
|
channel := &models.Channel{ID: b.getChannelID(msg.Channel), Name: msg.Channel}
|
|
|
|
// Make a action /me of the message
|
|
if msg.Event == config.EventUserAction {
|
|
msg.Text = "_" + msg.Text + "_"
|
|
}
|
|
|
|
// Delete message
|
|
if msg.Event == config.EventMsgDelete {
|
|
if msg.ID == "" {
|
|
return "", nil
|
|
}
|
|
return msg.ID, b.c.DeleteMessage(&models.Message{ID: msg.ID})
|
|
}
|
|
|
|
// Use webhook to send the message
|
|
if b.GetString("WebhookURL") != "" {
|
|
return "", b.sendWebhook(&msg)
|
|
}
|
|
|
|
// Prepend nick if configured
|
|
if b.GetBool("PrefixMessagesWithNick") {
|
|
msg.Text = msg.Username + msg.Text
|
|
}
|
|
|
|
// Edit message if we have an ID
|
|
if msg.ID != "" {
|
|
return msg.ID, b.c.EditMessage(&models.Message{ID: msg.ID, Msg: msg.Text, RoomID: b.getChannelID(msg.Channel)})
|
|
}
|
|
|
|
// Upload a file if it exists
|
|
if msg.Extra != nil {
|
|
for _, rmsg := range helper.HandleExtra(&msg, b.General) {
|
|
// strip the # if people has set this
|
|
rmsg.Channel = strings.TrimPrefix(rmsg.Channel, "#")
|
|
smsg := &models.Message{
|
|
RoomID: b.getChannelID(rmsg.Channel),
|
|
Msg: rmsg.Username + rmsg.Text,
|
|
PostMessage: models.PostMessage{
|
|
Avatar: rmsg.Avatar,
|
|
Alias: rmsg.Username,
|
|
},
|
|
}
|
|
if _, err := b.c.SendMessage(smsg); err != nil {
|
|
b.Log.Errorf("SendMessage failed: %s", err)
|
|
}
|
|
}
|
|
if len(msg.Extra["file"]) > 0 {
|
|
return "", b.handleUploadFile(&msg)
|
|
}
|
|
}
|
|
|
|
smsg := &models.Message{
|
|
RoomID: channel.ID,
|
|
Msg: msg.Text,
|
|
PostMessage: models.PostMessage{
|
|
Avatar: msg.Avatar,
|
|
Alias: msg.Username,
|
|
},
|
|
}
|
|
|
|
rmsg, err := b.c.SendMessage(smsg)
|
|
if rmsg == nil {
|
|
return "", err
|
|
}
|
|
return rmsg.ID, err
|
|
}
|