diff --git a/telegram.go b/telegram.go index 3a94de2afb898c1ce973895aae3ef05bc6b9246a..d2eb7c0cdf73b6ca6087532072e839e7d19a4eb3 100644 --- a/telegram.go +++ b/telegram.go @@ -100,7 +100,7 @@ func respondTelegram(update tgbotapi.Update) { } return } - header, _ := makeHeader(update.EditedMessage, true) + header, _ := telegramMakeHeader(update.EditedMessage, true) content = header + content } if _, err := session.ChannelMessageEdit(reference.ChannelID, reference.MessageID, escape(content)); err != nil { @@ -163,134 +163,33 @@ func respondTelegram(update tgbotapi.Update) { } } - header, has := makeHeader(update.Message, false) + header, has := telegramMakeHeader(update.Message, false) if update.Message.Photo != nil { - var file *discordgo.File p := *update.Message.Photo - info := p[len(p)-1] - - var url string - if u, err := botAPI.GetFileDirectURL(info.FileID); err != nil { - msg := tgbotapi.NewMessage(update.Message.Chat.ID, "error getting URL") - msg.ReplyToMessageID = update.Message.MessageID - log.Printf("error getting URL of %s: %s", info.FileID, err) - _, _ = botAPI.Send(msg) - return - } else { - url = u + if telegramHandleFile(dc, update, p[len(p)-1].FileID, update.Message.Caption, + header, has, reference, + &dMessageID, &dChannelID, &dGuildID) { + log.Printf("T%vM%v -> D%vM%s @%s (%v) [photo]: %s; caption: %s", + tc.ID, update.Message.MessageID, dc.ID, dMessageID, username, id, p[len(p)-1].FileID, update.Message.Caption) } - if resp, err := http.Get(url); err != nil { - msg := tgbotapi.NewMessage(update.Message.Chat.ID, "error getting file") - msg.ReplyToMessageID = update.Message.MessageID - log.Printf("error getting file %s: %s", info.FileID, err) - _, _ = botAPI.Send(msg) - return - } else { - file = &discordgo.File{ - Name: "image.jpg", - ContentType: "image/jpeg", - Reader: resp.Body, - } - defer func() { - if err = resp.Body.Close(); err != nil { - log.Printf("error closing request body: %s", err) - } - }() - } - - if message, err := session.ChannelMessageSendComplex(strconv.Itoa(dc.ID), &discordgo.MessageSend{ - Content: escape(header + update.Message.Caption), - File: file, - Reference: reference, - }); err != nil { - msg := tgbotapi.NewMessage(update.Message.Chat.ID, "error relaying message") - msg.ReplyToMessageID = update.Message.MessageID - log.Printf("error relaying message %v: %s", update.Message.MessageID, err) - _, _ = botAPI.Send(msg) - return - } else { - dMessageID = message.ID - dChannelID = message.ChannelID - dGuildID = message.GuildID - } - - messageReference[update.Message.MessageID] = &discordgo.MessageReference{ - MessageID: dMessageID, - ChannelID: dChannelID, - GuildID: dGuildID, - } - hasHeader[update.Message.MessageID] = has - - log.Printf("T%vM%v -> D%vM%s @%s (%v) [photo]: %s; caption: %s", - tc.ID, update.Message.MessageID, dc.ID, dMessageID, username, id, info.FileID, update.Message.Caption) return } if update.Message.Sticker != nil { - var url string - if u, err := botAPI.GetFileDirectURL(update.Message.Sticker.FileID); err != nil { - msg := tgbotapi.NewMessage(update.Message.Chat.ID, "error getting URL") - msg.ReplyToMessageID = update.Message.MessageID - log.Printf("error getting URL of %s: %s", update.Message.Sticker.FileID, err) - _, _ = botAPI.Send(msg) - return - } else { - url = u - } - - var file *discordgo.File - if resp, err := http.Get(url); err != nil { - msg := tgbotapi.NewMessage(update.Message.Chat.ID, "error getting file") - msg.ReplyToMessageID = update.Message.MessageID - log.Printf("error getting file %s: %s", update.Message.Sticker.FileID, err) - _, _ = botAPI.Send(msg) - return - } else { - file = &discordgo.File{ - Name: "sticker.webp", - ContentType: "image/webp", - Reader: resp.Body, - } - defer func() { - if err = resp.Body.Close(); err != nil { - log.Printf("error closing request body: %s", err) - } - }() - } - content := header if config.Telegram.StickerEmoji { content += update.Message.Sticker.Emoji } - if message, err := session.ChannelMessageSendComplex(strconv.Itoa(dc.ID), &discordgo.MessageSend{ - Content: escape(content), - File: file, - Reference: reference, - }); err != nil { - msg := tgbotapi.NewMessage(update.Message.Chat.ID, "error relaying message") - msg.ReplyToMessageID = update.Message.MessageID - log.Printf("error relaying message %v: %s", update.Message.MessageID, err) - _, _ = botAPI.Send(msg) - return - } else { - dMessageID = message.ID - dChannelID = message.ChannelID - dGuildID = message.GuildID - } - - messageReference[update.Message.MessageID] = &discordgo.MessageReference{ - MessageID: dMessageID, - ChannelID: dChannelID, - GuildID: dGuildID, + if telegramHandleFile(dc, update, update.Message.Sticker.FileID, content, + header, has, reference, + &dMessageID, &dChannelID, &dGuildID) { + log.Printf("T%vM%v -> D%vM%s @%s (%v) [sticker]: %s", + tc.ID, update.Message.MessageID, dc.ID, dMessageID, username, id, update.Message.Sticker.FileID) } - hasHeader[update.Message.MessageID] = has - - log.Printf("T%vM%v -> D%vM%s @%s (%v) [sticker]: %s", - tc.ID, update.Message.MessageID, dc.ID, dMessageID, username, id, update.Message.Sticker.FileID) return } @@ -323,7 +222,7 @@ func respondTelegram(update tgbotapi.Update) { tc.ID, update.Message.MessageID, dc.ID, dMessageID, username, id, update.Message.Text) } -func makeHeader(message *tgbotapi.Message, force bool) (string, bool) { +func telegramMakeHeader(message *tgbotapi.Message, force bool) (string, bool) { if !config.System.DisplaceHeader || force || !setPreviousCaller(message.Chat.ID, message.From.ID) { // TODO: check the discord side for header displace space := "" @@ -348,6 +247,67 @@ func escape(str string) string { "@here", "@\u200bhere") } +func telegramHandleFile(dc bridgePlatformConf, update tgbotapi.Update, fileID string, content string, + header string, has bool, reference *discordgo.MessageReference, + dMessageID, dChannelID, dGuildID *string) bool { + + var file *discordgo.File + var url string + if u, err := botAPI.GetFileDirectURL(fileID); err != nil { + msg := tgbotapi.NewMessage(update.Message.Chat.ID, "error getting URL") + msg.ReplyToMessageID = update.Message.MessageID + log.Printf("error getting URL of %s: %s", fileID, err) + _, _ = botAPI.Send(msg) + return false + } else { + url = u + } + + if resp, err := http.Get(url); err != nil { + msg := tgbotapi.NewMessage(update.Message.Chat.ID, "error getting file") + msg.ReplyToMessageID = update.Message.MessageID + log.Printf("error getting file %s: %s", fileID, err) + _, _ = botAPI.Send(msg) + return false + } else { + file = &discordgo.File{ + Name: "image.jpg", + ContentType: "image/jpeg", + Reader: resp.Body, + } + defer func() { + if err = resp.Body.Close(); err != nil { + log.Printf("error closing request body: %s", err) + } + }() + } + + if message, err := session.ChannelMessageSendComplex(strconv.Itoa(dc.ID), &discordgo.MessageSend{ + Content: escape(header + content), + File: file, + Reference: reference, + }); err != nil { + msg := tgbotapi.NewMessage(update.Message.Chat.ID, "error relaying message") + msg.ReplyToMessageID = update.Message.MessageID + log.Printf("error relaying message %v: %s", update.Message.MessageID, err) + _, _ = botAPI.Send(msg) + return false + } else { + *dMessageID = message.ID + *dChannelID = message.ChannelID + *dGuildID = message.GuildID + } + + messageReference[update.Message.MessageID] = &discordgo.MessageReference{ + MessageID: *dMessageID, + ChannelID: *dChannelID, + GuildID: *dGuildID, + } + hasHeader[update.Message.MessageID] = has + + return true +} + func telegramCommand(update tgbotapi.Update) { message := tgbotapi.NewMessage(update.Message.Chat.ID, "") switch update.Message.Command() {