From cb988335908c8a62edda1e742874f859b0d7b060 Mon Sep 17 00:00:00 2001 From: Toni Spets Date: Wed, 25 Jun 2025 11:19:58 +0300 Subject: [PATCH] directmedia: handle custom emojis --- pkg/connector/directdownload.go | 15 +++++++++++++-- pkg/connector/ids/ids.go | 6 ++++++ pkg/connector/telegram.go | 20 ++++++++++++++++++++ 3 files changed, 39 insertions(+), 2 deletions(-) diff --git a/pkg/connector/directdownload.go b/pkg/connector/directdownload.go index 1a6dd0f9..5b9f9b00 100644 --- a/pkg/connector/directdownload.go +++ b/pkg/connector/directdownload.go @@ -27,10 +27,9 @@ import ( "maunium.net/go/mautrix/bridgev2/networkid" "maunium.net/go/mautrix/mediaproxy" - "go.mau.fi/mautrix-telegram/pkg/gotd/tg" - "go.mau.fi/mautrix-telegram/pkg/connector/ids" "go.mau.fi/mautrix-telegram/pkg/connector/media" + "go.mau.fi/mautrix-telegram/pkg/gotd/tg" ) var _ bridgev2.DirectMediableNetwork = (*TelegramConnector)(nil) @@ -207,6 +206,18 @@ func (tc *TelegramConnector) Download(ctx context.Context, mediaID networkid.Med } readyTransferer = transferer.WithChannelPhoto(info.PeerID, accessHash, info.ID) + } else if info.PeerType == ids.FakePeerTypeEmoji { + customEmojiDocuments, err := client.client.API().MessagesGetCustomEmojiDocuments(ctx, []int64{info.ID}) + if err != nil { + return nil, fmt.Errorf("failed to get custom emoji documents: %w", err) + } + if len(customEmojiDocuments) == 0 { + return nil, fmt.Errorf("emoji id did not result in a document") + } + + readyTransferer = media.NewTransferer(client.client.API()). + WithStickerConfig(tc.Config.AnimatedSticker). + WithDocument(customEmojiDocuments[0], false) } if readyTransferer == nil { diff --git a/pkg/connector/ids/ids.go b/pkg/connector/ids/ids.go index 10165804..09a2d51a 100644 --- a/pkg/connector/ids/ids.go +++ b/pkg/connector/ids/ids.go @@ -120,6 +120,8 @@ const ( PeerTypeUser PeerType = "user" PeerTypeChat PeerType = "chat" PeerTypeChannel PeerType = "channel" + + FakePeerTypeEmoji PeerType = "emoji" ) func PeerTypeFromByte(pt byte) (PeerType, error) { @@ -130,6 +132,8 @@ func PeerTypeFromByte(pt byte) (PeerType, error) { return PeerTypeChat, nil case 0x03: return PeerTypeChannel, nil + case 0x04: + return FakePeerTypeEmoji, nil default: return "", fmt.Errorf("unknown peer type %d", pt) } @@ -143,6 +147,8 @@ func (pt PeerType) AsByte() byte { return 0x02 case PeerTypeChannel: return 0x03 + case FakePeerTypeEmoji: + return 0x04 default: panic(fmt.Errorf("unknown peer type %s", pt)) } diff --git a/pkg/connector/telegram.go b/pkg/connector/telegram.go index 0fb07126..9e9ef0ae 100644 --- a/pkg/connector/telegram.go +++ b/pkg/connector/telegram.go @@ -1069,6 +1069,26 @@ func (t *TelegramClient) transferEmojisToMatrix(ctx context.Context, customEmoji return } + if t.main.useDirectMedia { + for _, emojiID := range customEmojiIDs { + mediaID, err := ids.DirectMediaInfo{ + PeerType: ids.FakePeerTypeEmoji, + UserID: t.telegramUserID, + ID: emojiID, + }.AsMediaID() + if err != nil { + return nil, err + } + if mxcURI, err := t.main.Bridge.Matrix.GenerateContentURI(ctx, mediaID); err != nil { + return nil, err + } else { + result[ids.MakeEmojiIDFromDocumentID(emojiID)] = emojis.EmojiInfo{EmojiURI: mxcURI} + } + } + + return result, nil + } + customEmojiDocuments, err := t.client.API().MessagesGetCustomEmojiDocuments(ctx, customEmojiIDs) if err != nil { return nil, err