5
0
mirror of https://github.com/cwinfo/matterbridge.git synced 2024-11-14 21:10:28 +00:00
matterbridge/bridge/telegram/telegram.go

172 lines
4.3 KiB
Go
Raw Normal View History

2016-11-15 22:15:57 +00:00
package btelegram
import (
"html"
"log"
"strconv"
"strings"
2018-02-26 23:33:21 +00:00
"github.com/42wim/matterbridge/bridge"
2016-11-15 22:15:57 +00:00
"github.com/42wim/matterbridge/bridge/config"
"github.com/42wim/matterbridge/bridge/helper"
tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api"
2016-11-15 22:15:57 +00:00
)
2018-11-08 21:20:03 +00:00
const (
unknownUser = "unknown"
HTMLFormat = "HTML"
HTMLNick = "htmlnick"
MarkdownV2 = "MarkdownV2"
FormatPng = "png"
FormatWebp = "webp"
2018-11-08 21:20:03 +00:00
)
2016-11-15 22:15:57 +00:00
type Btelegram struct {
c *tgbotapi.BotAPI
*bridge.Config
avatarMap map[string]string // keep cache of userid and avatar sha
2016-11-15 22:15:57 +00:00
}
func New(cfg *bridge.Config) bridge.Bridger {
tgsConvertFormat := cfg.GetString("MediaConvertTgs")
if tgsConvertFormat != "" {
err := helper.CanConvertTgsToX()
if err != nil {
log.Fatalf("Telegram bridge configured to convert .tgs files to '%s', but lottie does not appear to work:\n%#v", tgsConvertFormat, err)
}
if tgsConvertFormat != FormatPng && tgsConvertFormat != FormatWebp {
log.Fatalf("Telegram bridge configured to convert .tgs files to '%s', but only '%s' and '%s' are supported.", FormatPng, FormatWebp, tgsConvertFormat)
}
}
return &Btelegram{Config: cfg, avatarMap: make(map[string]string)}
2016-11-15 22:15:57 +00:00
}
func (b *Btelegram) Connect() error {
var err error
2018-02-26 23:33:21 +00:00
b.Log.Info("Connecting")
b.c, err = tgbotapi.NewBotAPI(b.GetString("Token"))
2016-11-15 22:15:57 +00:00
if err != nil {
2018-02-26 23:33:21 +00:00
b.Log.Debugf("%#v", err)
2016-11-15 22:15:57 +00:00
return err
}
u := tgbotapi.NewUpdate(0)
u.Timeout = 60
updates, err := b.c.GetUpdatesChan(u)
2016-11-15 22:15:57 +00:00
if err != nil {
2018-02-26 23:33:21 +00:00
b.Log.Debugf("%#v", err)
2016-11-15 22:15:57 +00:00
return err
}
2018-02-26 23:33:21 +00:00
b.Log.Info("Connection succeeded")
2016-11-15 22:15:57 +00: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 22:15:57 +00:00
return nil
}
func (b *Btelegram) Send(msg config.Message) (string, error) {
2018-02-28 21:23:29 +00:00
b.Log.Debugf("=> Receiving %#v", msg)
2018-02-25 22:54:20 +00:00
// get the chatid
2016-11-15 22:15:57 +00:00
chatid, err := strconv.ParseInt(msg.Channel, 10, 64)
if err != nil {
return "", err
2016-11-15 22:15:57 +00:00
}
// map the file SHA to our user (caches the avatar)
if msg.Event == config.EventAvatarDownload {
2018-02-25 22:54:20 +00:00
return b.cacheAvatar(&msg)
}
2018-11-08 21:20:03 +00:00
if b.GetString("MessageFormat") == HTMLFormat {
msg.Text = makeHTML(msg.Text)
}
2018-02-25 22:54:20 +00:00
// Delete message
if msg.Event == config.EventMsgDelete {
return b.handleDelete(&msg, chatid)
}
2018-02-25 22:54:20 +00:00
// Upload a file if it exists
if msg.Extra != nil {
for _, rmsg := range helper.HandleExtra(&msg, b.General) {
if _, msgErr := b.sendMessage(chatid, rmsg.Username, rmsg.Text); msgErr != nil {
b.Log.Errorf("sendMessage failed: %s", msgErr)
}
2018-02-25 22:54:20 +00: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 != "" {
return b.handleEdit(&msg, chatid)
}
2018-02-25 22:54:20 +00:00
// Post normal message
// TODO: recheck it.
// Ignore empty text field needs for prevent double messages from whatsapp to telegram
// when sending media with text caption
if msg.Text != "" {
return b.sendMessage(chatid, msg.Username, msg.Text)
}
return "", nil
2016-11-15 22:15:57 +00: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 21:20:03 +00:00
if b.GetString("MessageFormat") == HTMLFormat {
2018-02-26 23:33:21 +00:00
b.Log.Debug("Using mode HTML")
m.ParseMode = tgbotapi.ModeHTML
}
if b.GetString("MessageFormat") == "Markdown" {
2018-02-26 23:33:21 +00:00
b.Log.Debug("Using mode markdown")
2018-02-03 22:31:21 +00:00
m.ParseMode = tgbotapi.ModeMarkdown
}
if b.GetString("MessageFormat") == MarkdownV2 {
b.Log.Debug("Using mode MarkdownV2")
m.ParseMode = MarkdownV2
}
2018-11-08 21:20:03 +00: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
}
m.DisableWebPagePreview = b.GetBool("DisableWebPagePreview")
res, err := b.c.Send(m)
if err != nil {
return "", err
}
return strconv.Itoa(res.MessageID), nil
}
2018-02-25 22:54:20 +00: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 23:33:21 +00:00
b.Log.Debugf("Added %s to %s in avatarMap", fi.SHA, msg.UserID)
2018-02-25 22:54:20 +00:00
b.avatarMap[msg.UserID] = fi.SHA
}
return "", nil
}