From dcc86898352f8eea05c694ab0e7912126405c5d4 Mon Sep 17 00:00:00 2001 From: Sumner Evans Date: Tue, 4 Mar 2025 11:27:09 -0700 Subject: [PATCH] emojis: properly handle inline emojis on local Signed-off-by: Sumner Evans --- pkg/connector/emojis/emojis.go | 13 ++++++++++--- pkg/connector/reactions.go | 10 +++++++--- pkg/connector/telegram.go | 4 ++-- pkg/connector/telegramfmt/convert.go | 21 ++++----------------- pkg/connector/telegramfmt/html.go | 6 +++--- pkg/connector/telegramfmt/tags.go | 10 ++++------ 6 files changed, 30 insertions(+), 34 deletions(-) diff --git a/pkg/connector/emojis/emojis.go b/pkg/connector/emojis/emojis.go index cc54ae65..a947358e 100644 --- a/pkg/connector/emojis/emojis.go +++ b/pkg/connector/emojis/emojis.go @@ -5,6 +5,7 @@ import ( "encoding/json" "maunium.net/go/mautrix/bridgev2/networkid" + "maunium.net/go/mautrix/id" "go.mau.fi/mautrix-telegram/pkg/connector/ids" ) @@ -27,11 +28,11 @@ func init() { // ConvertKnownEmojis converts known document IDs from the unicode emoji pack // to the corresponding unicode string and returns the remaining IDs. -func ConvertKnownEmojis(emojiIDs []int64) (result map[networkid.EmojiID]string, remaining []int64) { - result = map[networkid.EmojiID]string{} +func ConvertKnownEmojis(emojiIDs []int64) (result map[networkid.EmojiID]EmojiInfo, remaining []int64) { + result = map[networkid.EmojiID]EmojiInfo{} for _, e := range emojiIDs { if v, ok := reverseUnicodemojiPack[e]; ok { - result[ids.MakeEmojiIDFromDocumentID(e)] = v + result[ids.MakeEmojiIDFromDocumentID(e)] = EmojiInfo{Emoji: v} } else { remaining = append(remaining, e) } @@ -43,3 +44,9 @@ func GetEmojiDocumentID(emoji string) (int64, bool) { id, ok := unicodemojiPack[emoji] return id, ok } + +// EmojiInfo contains information about an emoji. +type EmojiInfo struct { + Emoji string + EmojiURI id.ContentURIString +} diff --git a/pkg/connector/reactions.go b/pkg/connector/reactions.go index 57c6bcf7..b9a1517c 100644 --- a/pkg/connector/reactions.go +++ b/pkg/connector/reactions.go @@ -11,10 +11,11 @@ import ( "maunium.net/go/mautrix/bridgev2/networkid" "maunium.net/go/mautrix/bridgev2/simplevent" + "go.mau.fi/mautrix-telegram/pkg/connector/emojis" "go.mau.fi/mautrix-telegram/pkg/connector/ids" ) -func (t *TelegramClient) computeReactionsList(ctx context.Context, peer tg.PeerClass, msgID int, msgReactions tg.MessageReactions) (reactions []tg.MessagePeerReaction, isFull bool, customEmojis map[networkid.EmojiID]string, err error) { +func (t *TelegramClient) computeReactionsList(ctx context.Context, peer tg.PeerClass, msgID int, msgReactions tg.MessageReactions) (reactions []tg.MessagePeerReaction, isFull bool, customEmojis map[networkid.EmojiID]emojis.EmojiInfo, err error) { log := zerolog.Ctx(ctx).With().Str("fn", "computeReactionsList").Logger() var totalCount int for _, r := range msgReactions.Results { @@ -72,10 +73,13 @@ func (t *TelegramClient) computeReactionsList(ctx context.Context, peer tg.PeerC return reactionsList, len(reactionsList) == totalCount, customEmojis, err } -func computeEmojiAndID(reaction tg.ReactionClass, customEmojis map[networkid.EmojiID]string) (emojiID networkid.EmojiID, emoji string, err error) { +func computeEmojiAndID(reaction tg.ReactionClass, customEmojis map[networkid.EmojiID]emojis.EmojiInfo) (emojiID networkid.EmojiID, emoji string, err error) { if r, ok := reaction.(*tg.ReactionCustomEmoji); ok { emojiID = ids.MakeEmojiIDFromDocumentID(r.DocumentID) - emoji = customEmojis[emojiID] + emoji = customEmojis[emojiID].Emoji + if emoji == "" { + emoji = string(customEmojis[emojiID].EmojiURI) + } } else if r, ok := reaction.(*tg.ReactionEmoji); ok { emojiID = ids.MakeEmojiIDFromEmoticon(r.Emoticon) emoji = r.Emoticon diff --git a/pkg/connector/telegram.go b/pkg/connector/telegram.go index e76f3ecc..340d710a 100644 --- a/pkg/connector/telegram.go +++ b/pkg/connector/telegram.go @@ -960,7 +960,7 @@ func (t *TelegramClient) getAvailableReactions(ctx context.Context) (map[string] return t.availableReactions, nil } -func (t *TelegramClient) transferEmojisToMatrix(ctx context.Context, customEmojiIDs []int64) (result map[networkid.EmojiID]string, err error) { +func (t *TelegramClient) transferEmojisToMatrix(ctx context.Context, customEmojiIDs []int64) (result map[networkid.EmojiID]emojis.EmojiInfo, err error) { result, customEmojiIDs = emojis.ConvertKnownEmojis(customEmojiIDs) if len(customEmojiIDs) == 0 { @@ -980,7 +980,7 @@ func (t *TelegramClient) transferEmojisToMatrix(ctx context.Context, customEmoji if err != nil { return nil, err } - result[ids.MakeEmojiIDFromDocumentID(customEmojiDocument.GetID())] = string(mxcURI) + result[ids.MakeEmojiIDFromDocumentID(customEmojiDocument.GetID())] = emojis.EmojiInfo{EmojiURI: mxcURI} } return } diff --git a/pkg/connector/telegramfmt/convert.go b/pkg/connector/telegramfmt/convert.go index be122cbe..f0c02e20 100644 --- a/pkg/connector/telegramfmt/convert.go +++ b/pkg/connector/telegramfmt/convert.go @@ -19,7 +19,6 @@ package telegramfmt import ( "context" "html" - "strings" "github.com/gotd/td/tg" "github.com/rs/zerolog" @@ -28,6 +27,7 @@ import ( "maunium.net/go/mautrix/event" "maunium.net/go/mautrix/id" + "go.mau.fi/mautrix-telegram/pkg/connector/emojis" "go.mau.fi/mautrix-telegram/pkg/connector/ids" ) @@ -37,21 +37,13 @@ type UserInfo struct { } type FormatParams struct { - CustomEmojis map[networkid.EmojiID]string + CustomEmojis map[networkid.EmojiID]emojis.EmojiInfo GetUserInfoByUsername func(ctx context.Context, username string) (UserInfo, error) GetUserInfoByID func(ctx context.Context, id int64) (UserInfo, error) NormalizeURL func(ctx context.Context, url string) string } -func (fp FormatParams) GetCustomEmoji(emojiID networkid.EmojiID) (string, id.ContentURIString) { - if strings.HasPrefix(fp.CustomEmojis[emojiID], "mxc://") { - return "", id.ContentURIString(fp.CustomEmojis[emojiID]) - } else { - return fp.CustomEmojis[emojiID], "" - } -} - -func (fp FormatParams) WithCustomEmojis(emojis map[networkid.EmojiID]string) FormatParams { +func (fp FormatParams) WithCustomEmojis(emojis map[networkid.EmojiID]emojis.EmojiInfo) FormatParams { return FormatParams{ CustomEmojis: emojis, GetUserInfoByUsername: fp.GetUserInfoByUsername, @@ -140,12 +132,7 @@ func Parse(ctx context.Context, message string, entities []tg.MessageEntityClass case *tg.MessageEntitySpoiler: br.Value = Style{Type: StyleSpoiler} case *tg.MessageEntityCustomEmoji: - emoji, contentURI := params.GetCustomEmoji(ids.MakeEmojiIDFromDocumentID(entity.DocumentID)) - if emoji != "" { - br.Value = Style{Type: StyleCustomEmoji, Emoji: emoji} - } else { - br.Value = Style{Type: StyleCustomEmoji, EmojiURI: contentURI} - } + br.Value = Style{Type: StyleCustomEmoji, EmojiInfo: params.CustomEmojis[ids.MakeEmojiIDFromDocumentID(entity.DocumentID)]} case *tg.MessageEntityBlockquote: br.Value = Style{Type: StyleBlockquote} } diff --git a/pkg/connector/telegramfmt/html.go b/pkg/connector/telegramfmt/html.go index 354b9df9..68d9908c 100644 --- a/pkg/connector/telegramfmt/html.go +++ b/pkg/connector/telegramfmt/html.go @@ -69,12 +69,12 @@ func (s Style) Format(message string) string { } return fmt.Sprintf(`%s`, s.URL, message) case StyleCustomEmoji: - if s.Emoji != "" { - return s.Emoji + if s.EmojiInfo.Emoji != "" { + return s.EmojiInfo.Emoji } else { return fmt.Sprintf( `%s`, - s.EmojiURI, message, message, + s.EmojiInfo.EmojiURI, message, message, ) } case StyleBotCommand: diff --git a/pkg/connector/telegramfmt/tags.go b/pkg/connector/telegramfmt/tags.go index 7d969713..802c16c0 100644 --- a/pkg/connector/telegramfmt/tags.go +++ b/pkg/connector/telegramfmt/tags.go @@ -20,7 +20,8 @@ import ( "fmt" "maunium.net/go/mautrix/bridgev2/networkid" - "maunium.net/go/mautrix/id" + + "go.mau.fi/mautrix-telegram/pkg/connector/emojis" ) type BodyRangeValue interface { @@ -125,11 +126,8 @@ type Style struct { // URL is the URL to link to, if applicable. URL string - // Emoji is the emoji to display, if applicable. - Emoji string - - // EmojiURI is the URI to the emoji, if applicable. - EmojiURI id.ContentURIString + // EmojiInfo is the emoji to display, if applicable. + EmojiInfo emojis.EmojiInfo } func (s Style) String() string {