mirror of
https://github.com/42wim/matterbridge.git
synced 2024-11-24 19:52:03 -08:00
Multiple media in one message (telegram) (#1779)
* Send multiple images/video/documents as media group * Fix media caption quotting * Fix errors handling * Refactor parent id detection * Try to reduce cognitive complexity of code * Remove unused conditional
This commit is contained in:
parent
d7b7ff7bb4
commit
30aae8e257
@ -111,7 +111,11 @@ func (b *Btelegram) handleQuoting(rmsg *config.Message, message *tgbotapi.Messag
|
|||||||
usernameReply = unknownUser
|
usernameReply = unknownUser
|
||||||
}
|
}
|
||||||
if !b.GetBool("QuoteDisable") {
|
if !b.GetBool("QuoteDisable") {
|
||||||
rmsg.Text = b.handleQuote(rmsg.Text, usernameReply, message.ReplyToMessage.Text)
|
quote := message.ReplyToMessage.Text
|
||||||
|
if quote == "" {
|
||||||
|
quote = message.ReplyToMessage.Caption
|
||||||
|
}
|
||||||
|
rmsg.Text = b.handleQuote(rmsg.Text, usernameReply, quote)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -439,8 +443,8 @@ func (b *Btelegram) handleEdit(msg *config.Message, chatid int64) (string, error
|
|||||||
}
|
}
|
||||||
|
|
||||||
// handleUploadFile handles native upload of files
|
// handleUploadFile handles native upload of files
|
||||||
func (b *Btelegram) handleUploadFile(msg *config.Message, chatid int64) string {
|
func (b *Btelegram) handleUploadFile(msg *config.Message, chatid int64, parentID int) (string, error) {
|
||||||
var c tgbotapi.Chattable
|
var media []interface{}
|
||||||
for _, f := range msg.Extra["file"] {
|
for _, f := range msg.Extra["file"] {
|
||||||
fi := f.(config.FileInfo)
|
fi := f.(config.FileInfo)
|
||||||
file := tgbotapi.FileBytes{
|
file := tgbotapi.FileBytes{
|
||||||
@ -449,32 +453,42 @@ func (b *Btelegram) handleUploadFile(msg *config.Message, chatid int64) string {
|
|||||||
}
|
}
|
||||||
switch filepath.Ext(fi.Name) {
|
switch filepath.Ext(fi.Name) {
|
||||||
case ".jpg", ".jpe", ".png":
|
case ".jpg", ".jpe", ".png":
|
||||||
pc := tgbotapi.NewPhoto(chatid, file)
|
pc := tgbotapi.NewInputMediaPhoto(file)
|
||||||
pc.Caption, pc.ParseMode = TGGetParseMode(b, msg.Username, fi.Comment)
|
if fi.Comment != "" {
|
||||||
c = pc
|
pc.Caption, pc.ParseMode = TGGetParseMode(b, msg.Username, fi.Comment)
|
||||||
|
}
|
||||||
|
media = append(media, pc)
|
||||||
case ".mp4", ".m4v":
|
case ".mp4", ".m4v":
|
||||||
vc := tgbotapi.NewVideo(chatid, file)
|
vc := tgbotapi.NewInputMediaVideo(file)
|
||||||
vc.Caption, vc.ParseMode = TGGetParseMode(b, msg.Username, fi.Comment)
|
if fi.Comment != "" {
|
||||||
c = vc
|
vc.Caption, vc.ParseMode = TGGetParseMode(b, msg.Username, fi.Comment)
|
||||||
|
}
|
||||||
|
media = append(media, vc)
|
||||||
case ".mp3", ".oga":
|
case ".mp3", ".oga":
|
||||||
ac := tgbotapi.NewAudio(chatid, file)
|
ac := tgbotapi.NewInputMediaAudio(file)
|
||||||
ac.Caption, ac.ParseMode = TGGetParseMode(b, msg.Username, fi.Comment)
|
if fi.Comment != "" {
|
||||||
c = ac
|
ac.Caption, ac.ParseMode = TGGetParseMode(b, msg.Username, fi.Comment)
|
||||||
|
}
|
||||||
|
media = append(media, ac)
|
||||||
case ".ogg":
|
case ".ogg":
|
||||||
voc := tgbotapi.NewVoice(chatid, file)
|
voc := tgbotapi.NewVoice(chatid, file)
|
||||||
voc.Caption, voc.ParseMode = TGGetParseMode(b, msg.Username, fi.Comment)
|
voc.Caption, voc.ParseMode = TGGetParseMode(b, msg.Username, fi.Comment)
|
||||||
c = voc
|
voc.ReplyToMessageID = parentID
|
||||||
|
res, err := b.c.Send(voc)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
return strconv.Itoa(res.MessageID), nil
|
||||||
default:
|
default:
|
||||||
dc := tgbotapi.NewDocument(chatid, file)
|
dc := tgbotapi.NewInputMediaDocument(file)
|
||||||
dc.Caption, dc.ParseMode = TGGetParseMode(b, msg.Username, fi.Comment)
|
if fi.Comment != "" {
|
||||||
c = dc
|
dc.Caption, dc.ParseMode = TGGetParseMode(b, msg.Username, fi.Comment)
|
||||||
}
|
}
|
||||||
_, err := b.c.Send(c)
|
media = append(media, dc)
|
||||||
if err != nil {
|
|
||||||
b.Log.Errorf("file upload failed: %#v", err)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return ""
|
|
||||||
|
return b.sendMediaFiles(msg, chatid, parentID, media)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b *Btelegram) handleQuote(message, quoteNick, quoteMessage string) string {
|
func (b *Btelegram) handleQuote(message, quoteNick, quoteMessage string) string {
|
||||||
|
@ -115,16 +115,21 @@ func (b *Btelegram) Send(msg config.Message) (string, error) {
|
|||||||
msg.Text = fmt.Sprintf("[reply]: %s", msg.Text)
|
msg.Text = fmt.Sprintf("[reply]: %s", msg.Text)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var parentID int
|
||||||
|
if msg.ParentID != "" {
|
||||||
|
parentID, _ = b.intParentID(msg.ParentID)
|
||||||
|
}
|
||||||
|
|
||||||
// Upload a file if it exists
|
// Upload a file if it exists
|
||||||
if msg.Extra != nil {
|
if msg.Extra != nil {
|
||||||
for _, rmsg := range helper.HandleExtra(&msg, b.General) {
|
for _, rmsg := range helper.HandleExtra(&msg, b.General) {
|
||||||
if _, msgErr := b.sendMessage(chatid, rmsg.Username, rmsg.Text, msg.ParentID); msgErr != nil {
|
if _, msgErr := b.sendMessage(chatid, rmsg.Username, rmsg.Text, parentID); msgErr != nil {
|
||||||
b.Log.Errorf("sendMessage failed: %s", msgErr)
|
b.Log.Errorf("sendMessage failed: %s", msgErr)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// check if we have files to upload (from slack, telegram or mattermost)
|
// check if we have files to upload (from slack, telegram or mattermost)
|
||||||
if len(msg.Extra["file"]) > 0 {
|
if len(msg.Extra["file"]) > 0 {
|
||||||
b.handleUploadFile(&msg, chatid)
|
return b.handleUploadFile(&msg, chatid, parentID)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -138,7 +143,7 @@ func (b *Btelegram) Send(msg config.Message) (string, error) {
|
|||||||
// Ignore empty text field needs for prevent double messages from whatsapp to telegram
|
// Ignore empty text field needs for prevent double messages from whatsapp to telegram
|
||||||
// when sending media with text caption
|
// when sending media with text caption
|
||||||
if msg.Text != "" {
|
if msg.Text != "" {
|
||||||
return b.sendMessage(chatid, msg.Username, msg.Text, msg.ParentID)
|
return b.sendMessage(chatid, msg.Username, msg.Text, parentID)
|
||||||
}
|
}
|
||||||
|
|
||||||
return "", nil
|
return "", nil
|
||||||
@ -152,16 +157,10 @@ func (b *Btelegram) getFileDirectURL(id string) string {
|
|||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b *Btelegram) sendMessage(chatid int64, username, text, parentID string) (string, error) {
|
func (b *Btelegram) sendMessage(chatid int64, username, text string, parentID int) (string, error) {
|
||||||
m := tgbotapi.NewMessage(chatid, "")
|
m := tgbotapi.NewMessage(chatid, "")
|
||||||
m.Text, m.ParseMode = TGGetParseMode(b, username, text)
|
m.Text, m.ParseMode = TGGetParseMode(b, username, text)
|
||||||
if parentID != "" {
|
m.ReplyToMessageID = parentID
|
||||||
rmid, err := strconv.Atoi(parentID)
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
m.ReplyToMessageID = rmid
|
|
||||||
}
|
|
||||||
m.DisableWebPagePreview = b.GetBool("DisableWebPagePreview")
|
m.DisableWebPagePreview = b.GetBool("DisableWebPagePreview")
|
||||||
|
|
||||||
res, err := b.c.Send(m)
|
res, err := b.c.Send(m)
|
||||||
@ -171,6 +170,29 @@ func (b *Btelegram) sendMessage(chatid int64, username, text, parentID string) (
|
|||||||
return strconv.Itoa(res.MessageID), nil
|
return strconv.Itoa(res.MessageID), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// sendMediaFiles native upload media files via media group
|
||||||
|
func (b *Btelegram) sendMediaFiles(msg *config.Message, chatid int64, parentID int, media []interface{}) (string, error) {
|
||||||
|
if len(media) == 0 {
|
||||||
|
return "", nil
|
||||||
|
}
|
||||||
|
mg := tgbotapi.MediaGroupConfig{ChatID: chatid, ChannelUsername: msg.Username, Media: media, ReplyToMessageID: parentID}
|
||||||
|
messages, err := b.c.SendMediaGroup(mg)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
// return first message id
|
||||||
|
return strconv.Itoa(messages[0].MessageID), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// intParentID return integer parent id for telegram message
|
||||||
|
func (b *Btelegram) intParentID(parentID string) (int, error) {
|
||||||
|
pid, err := strconv.Atoi(parentID)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
return pid, nil
|
||||||
|
}
|
||||||
|
|
||||||
func (b *Btelegram) cacheAvatar(msg *config.Message) (string, error) {
|
func (b *Btelegram) cacheAvatar(msg *config.Message) (string, error) {
|
||||||
fi := msg.Extra["file"][0].(config.FileInfo)
|
fi := msg.Extra["file"][0].(config.FileInfo)
|
||||||
/* if we have a sha we have successfully uploaded the file to the media server,
|
/* if we have a sha we have successfully uploaded the file to the media server,
|
||||||
|
Loading…
Reference in New Issue
Block a user