42wim/matterbridge

View on GitHub
bridge/rocketchat/handlers.go

Summary

Maintainability
A
0 mins
Test Coverage
package brocketchat

import (
    "fmt"

    "github.com/42wim/matterbridge/bridge/config"
    "github.com/42wim/matterbridge/bridge/helper"
    "github.com/matterbridge/Rocket.Chat.Go.SDK/models"
)

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) handleStatusEvent(ev models.Message, rmsg *config.Message) bool {
    switch ev.Type {
    case "":
        // this is a normal message, no processing needed
        // return true so the message is not dropped
        return true
    case sUserJoined, sUserLeft:
        rmsg.Event = config.EventJoinLeave
        return true
    case sRoomChangedTopic:
        rmsg.Event = config.EventTopicChange
        return true
    }
    b.Log.Debugf("Dropping message with unknown type: %s", ev.Type)
    return false
}

func (b *Brocketchat) handleRocketClient(messages chan *config.Message) {
    for message := range b.messageChan {
        message := message
        // 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,
            Extra:    make(map[string][]interface{}),
        }

        b.handleAttachments(&message, rmsg)

        // handleStatusEvent returns false if the message should be dropped
        // in that case it is probably some modification to the channel we do not want to relay
        if b.handleStatusEvent(m, rmsg) {
            messages <- rmsg
        }
    }
}

func (b *Brocketchat) handleAttachments(message *models.Message, rmsg *config.Message) {
    if rmsg.Text == "" {
        for _, attachment := range message.Attachments {
            if attachment.Title != "" {
                rmsg.Text = attachment.Title + "\n"
            }
            if attachment.Title != "" && attachment.Text != "" {
                rmsg.Text += "\n"
            }
            if attachment.Text != "" {
                rmsg.Text += attachment.Text
            }
        }
    }

    for i := range message.Attachments {
        if err := b.handleDownloadFile(rmsg, &message.Attachments[i]); err != nil {
            b.Log.Errorf("Could not download incoming file: %#v", err)
        }
    }
}

func (b *Brocketchat) handleDownloadFile(rmsg *config.Message, file *models.Attachment) error {
    downloadURL := b.GetString("server") + file.TitleLink
    data, err := helper.DownloadFileAuthRocket(downloadURL, b.user.Token, b.user.ID)
    if err != nil {
        return fmt.Errorf("download %s failed %#v", downloadURL, err)
    }
    helper.HandleDownloadData(b.Log, rmsg, file.Title, rmsg.Text, downloadURL, data, b.General)
    return nil
}

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
}