matterbridge/bridge/telegram/telegram.go

177 lines
4.3 KiB
Go
Raw Normal View History

2016-11-15 14:15:57 -08:00
package btelegram
import (
"html"
"strconv"
"strings"
2018-02-26 15:33:21 -08:00
"github.com/42wim/matterbridge/bridge"
2016-11-15 14:15:57 -08:00
"github.com/42wim/matterbridge/bridge/config"
"github.com/42wim/matterbridge/bridge/helper"
2016-11-15 14:15:57 -08:00
"github.com/go-telegram-bot-api/telegram-bot-api"
)
2018-11-08 13:20:03 -08:00
const (
unknownUser = "unknown"
HTMLFormat = "HTML"
HTMLNick = "htmlnick"
)
2016-11-15 14:15:57 -08:00
type Btelegram struct {
c *tgbotapi.BotAPI
*bridge.Config
avatarMap map[string]string // keep cache of userid and avatar sha
2016-11-15 14:15:57 -08:00
}
func New(cfg *bridge.Config) bridge.Bridger {
return &Btelegram{Config: cfg, avatarMap: make(map[string]string)}
2016-11-15 14:15:57 -08:00
}
func (b *Btelegram) Connect() error {
var err error
2018-02-26 15:33:21 -08:00
b.Log.Info("Connecting")
b.c, err = tgbotapi.NewBotAPI(b.GetString("Token"))
2016-11-15 14:15:57 -08:00
if err != nil {
2018-02-26 15:33:21 -08:00
b.Log.Debugf("%#v", err)
2016-11-15 14:15:57 -08:00
return err
}
u := tgbotapi.NewUpdate(0)
u.Timeout = 60
updates, err := b.c.GetUpdatesChan(u)
2016-11-15 14:15:57 -08:00
if err != nil {
2018-02-26 15:33:21 -08:00
b.Log.Debugf("%#v", err)
2016-11-15 14:15:57 -08:00
return err
}
2018-02-26 15:33:21 -08:00
b.Log.Info("Connection succeeded")
2016-11-15 14:15:57 -08:00
go b.handleRecv(updates)
return nil
}
func (b *Btelegram) Disconnect() error {
return nil
}
func (b *Btelegram) JoinChannel(channel config.ChannelInfo) error {
2016-11-15 14:15:57 -08:00
return nil
}
func (b *Btelegram) Send(msg config.Message) (string, error) {
2018-02-28 13:23:29 -08:00
b.Log.Debugf("=> Receiving %#v", msg)
2018-02-25 14:54:20 -08:00
// get the chatid
2016-11-15 14:15:57 -08:00
chatid, err := strconv.ParseInt(msg.Channel, 10, 64)
if err != nil {
return "", err
2016-11-15 14:15:57 -08:00
}
// map the file SHA to our user (caches the avatar)
if msg.Event == config.EventAvatarDownload {
2018-02-25 14:54:20 -08:00
return b.cacheAvatar(&msg)
}
2018-11-08 13:20:03 -08:00
if b.GetString("MessageFormat") == HTMLFormat {
msg.Text = makeHTML(msg.Text)
}
2018-02-25 14:54:20 -08:00
// Delete message
if msg.Event == config.EventMsgDelete {
if msg.ID == "" {
return "", nil
}
msgid, err := strconv.Atoi(msg.ID)
if err != nil {
return "", err
}
_, err = b.c.DeleteMessage(tgbotapi.DeleteMessageConfig{ChatID: chatid, MessageID: msgid})
return "", err
}
2018-02-25 14:54:20 -08:00
// Upload a file if it exists
if msg.Extra != nil {
for _, rmsg := range helper.HandleExtra(&msg, b.General) {
if _, err := b.sendMessage(chatid, rmsg.Username, rmsg.Text); err != nil {
b.Log.Errorf("sendMessage failed: %s", err)
}
2018-02-25 14:54:20 -08:00
}
// check if we have files to upload (from slack, telegram or mattermost)
if len(msg.Extra["file"]) > 0 {
b.handleUploadFile(&msg, chatid)
}
}
// edit the message if we have a msg ID
if msg.ID != "" {
msgid, err := strconv.Atoi(msg.ID)
if err != nil {
return "", err
}
2018-11-08 13:20:03 -08:00
if strings.ToLower(b.GetString("MessageFormat")) == HTMLNick {
b.Log.Debug("Using mode HTML - nick only")
msg.Text = html.EscapeString(msg.Text)
}
m := tgbotapi.NewEditMessageText(chatid, msgid, msg.Username+msg.Text)
2018-11-08 13:20:03 -08:00
if b.GetString("MessageFormat") == HTMLFormat {
2018-02-26 15:33:21 -08:00
b.Log.Debug("Using mode HTML")
m.ParseMode = tgbotapi.ModeHTML
}
if b.GetString("MessageFormat") == "Markdown" {
2018-02-26 15:33:21 -08:00
b.Log.Debug("Using mode markdown")
2018-02-03 14:31:21 -08:00
m.ParseMode = tgbotapi.ModeMarkdown
}
2018-11-08 13:20:03 -08:00
if strings.ToLower(b.GetString("MessageFormat")) == HTMLNick {
2018-06-18 14:49:28 -07:00
b.Log.Debug("Using mode HTML - nick only")
m.ParseMode = tgbotapi.ModeHTML
}
_, err = b.c.Send(m)
if err != nil {
return "", err
}
return "", nil
}
2018-02-25 14:54:20 -08:00
// Post normal message
return b.sendMessage(chatid, msg.Username, msg.Text)
2016-11-15 14:15:57 -08:00
}
func (b *Btelegram) getFileDirectURL(id string) string {
res, err := b.c.GetFileDirectURL(id)
if err != nil {
return ""
}
return res
}
func (b *Btelegram) sendMessage(chatid int64, username, text string) (string, error) {
m := tgbotapi.NewMessage(chatid, "")
m.Text = username + text
2018-11-08 13:20:03 -08:00
if b.GetString("MessageFormat") == HTMLFormat {
2018-02-26 15:33:21 -08:00
b.Log.Debug("Using mode HTML")
m.ParseMode = tgbotapi.ModeHTML
}
if b.GetString("MessageFormat") == "Markdown" {
2018-02-26 15:33:21 -08:00
b.Log.Debug("Using mode markdown")
2018-02-03 14:31:21 -08:00
m.ParseMode = tgbotapi.ModeMarkdown
}
2018-11-08 13:20:03 -08:00
if strings.ToLower(b.GetString("MessageFormat")) == HTMLNick {
b.Log.Debug("Using mode HTML - nick only")
m.Text = username + html.EscapeString(text)
m.ParseMode = tgbotapi.ModeHTML
}
res, err := b.c.Send(m)
if err != nil {
return "", err
}
return strconv.Itoa(res.MessageID), nil
}
2018-02-25 14:54:20 -08:00
func (b *Btelegram) cacheAvatar(msg *config.Message) (string, error) {
fi := msg.Extra["file"][0].(config.FileInfo)
/* if we have a sha we have successfully uploaded the file to the media server,
so we can now cache the sha */
if fi.SHA != "" {
2018-02-26 15:33:21 -08:00
b.Log.Debugf("Added %s to %s in avatarMap", fi.SHA, msg.UserID)
2018-02-25 14:54:20 -08:00
b.avatarMap[msg.UserID] = fi.SHA
}
return "", nil
}