diff --git a/go.mod b/go.mod index ad6f6752..5f709e19 100644 --- a/go.mod +++ b/go.mod @@ -42,7 +42,7 @@ require ( golang.org/x/sync v0.20.0 golang.org/x/tools v0.44.0 gopkg.in/yaml.v3 v3.0.1 - maunium.net/go/mautrix v0.27.1-0.20260429060852-d7aad0e862c7 + maunium.net/go/mautrix v0.27.1-0.20260429145330-5201144fcbc0 rsc.io/qr v0.2.0 ) diff --git a/go.sum b/go.sum index 05fa431e..bab7a139 100644 --- a/go.sum +++ b/go.sum @@ -236,7 +236,7 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= maunium.net/go/mauflag v1.0.0 h1:YiaRc0tEI3toYtJMRIfjP+jklH45uDHtT80nUamyD4M= maunium.net/go/mauflag v1.0.0/go.mod h1:nLivPOpTpHnpzEh8jEdSL9UqO9+/KBJFmNRlwKfkPeA= -maunium.net/go/mautrix v0.27.1-0.20260429060852-d7aad0e862c7 h1:ZL/dTgBuj7ZzH543brFUvxZo2lJGsCMBvnfKIvjdHC4= -maunium.net/go/mautrix v0.27.1-0.20260429060852-d7aad0e862c7/go.mod h1:4fZ0M0xB5ZtueQI65RilX28J/3794BeK+LaCg4U61Jk= +maunium.net/go/mautrix v0.27.1-0.20260429145330-5201144fcbc0 h1:nCQvGjNdu08WXrbDK5BuFoue7vdBXrQtOmyoDCPvWdo= +maunium.net/go/mautrix v0.27.1-0.20260429145330-5201144fcbc0/go.mod h1:4fZ0M0xB5ZtueQI65RilX28J/3794BeK+LaCg4U61Jk= rsc.io/qr v0.2.0 h1:6vBLea5/NRMVTz8V66gipeLycZMl/+UlFmk8DvqQ6WY= rsc.io/qr v0.2.0/go.mod h1:IF+uZjkb9fqyeF/4tlBoynqmQxUoPfWEKh921coOuXs= diff --git a/pkg/connector/commands.go b/pkg/connector/commands.go index 417d68b4..509aea5f 100644 --- a/pkg/connector/commands.go +++ b/pkg/connector/commands.go @@ -222,7 +222,7 @@ var cmdEmojiPack = &commands.FullHandler{ Name: "emoji-pack", Aliases: []string{"pack", "sticker-pack", "emojipack", "stickerpack"}, Help: commands.HelpMeta{ - Section: commands.HelpSectionChats, + Section: commands.HelpSectionMisc, Description: "Bridge emoji packs between Matrix and Telegram.", Args: " [args...]", }, diff --git a/pkg/connector/imagepack.go b/pkg/connector/imagepack.go index 53e3abd1..148a0c6c 100644 --- a/pkg/connector/imagepack.go +++ b/pkg/connector/imagepack.go @@ -450,24 +450,46 @@ func (tc *TelegramClient) fnDownloadEmojiPack(ce *commands.Event) { ce.Reply("Can't bridge image packs if personal filtering spaces are disabled") return } - var shortName string - if match := addStickersRegex.FindStringSubmatch(ce.Args[0]); match != nil { - shortName = match[1] - } else if packShortcodeRegex.MatchString(ce.Args[0]) { - shortName = ce.Args[0] - } else { - ce.Reply("Invalid pack shortcode or link") + evtID := ce.React("\u23f3\ufe0f") + defer redactReaction(ce, evtID) + pack, err := tc.DownloadImagePack(ce.Ctx, ce.Args[0]) + if err != nil { + ce.Reply("Failed to import pack: %v", err) return } - rawSet, err := tc.client.API().MessagesGetStickerSet(ce.Ctx, &tg.MessagesGetStickerSetRequest{Stickerset: &tg.InputStickerSetShortName{ShortName: shortName}}) + if pack.Shortcode == "" && pack.Content.Metadata.BridgedPack != nil { + pack.Shortcode = pack.Content.Metadata.BridgedPack.URL + } + _, err = tc.main.Bridge.Bot.SendState(ce.Ctx, spaceRoom, event.StateUnstableImagePack, pack.Shortcode, &event.Content{ + Parsed: pack.Content, + Raw: pack.Extra, + }, time.Now()) if err != nil { - ce.Reply("Failed to get sticker set: %v", err) - return + ce.Reply("Failed to send image pack to space: %v", err) + } else { + ce.Reply( + "Successfully bridged image pack to %s", + format.MarkdownLink("your personal filtering space", + spaceRoom.URI(tc.main.Bridge.Matrix.ServerName()).MatrixToURL())) + } +} + +func (tc *TelegramClient) DownloadImagePack(ctx context.Context, url string) (*bridgev2.ImportedImagePack, error) { + var shortName string + if match := addStickersRegex.FindStringSubmatch(url); match != nil { + shortName = match[1] + } else if packShortcodeRegex.MatchString(url) { + shortName = url + } else { + return nil, fmt.Errorf("invalid pack shortcode or link: %s", url) + } + rawSet, err := tc.client.API().MessagesGetStickerSet(ctx, &tg.MessagesGetStickerSetRequest{Stickerset: &tg.InputStickerSetShortName{ShortName: shortName}}) + if err != nil { + return nil, err } set, ok := rawSet.(*tg.MessagesStickerSet) if !ok { - ce.Reply("Unexpected response type: %T", rawSet) - return + return nil, fmt.Errorf("unexpected response type: %T", rawSet) } tc.addStickerPackToCache(set, true) linkType := "addstickers" @@ -508,19 +530,16 @@ func (tc *TelegramClient) fnDownloadEmojiPack(ce *commands.Event) { emojiLists[doc] = append(emojiLists[doc], emoji) } } - evtID := ce.React("\u23f3\ufe0f") - defer redactReaction(ce, evtID) for i, rawDoc := range set.Documents { // TODO use direct media mxc, _, info, err := media.NewTransferer(tc.client.API()). WithStickerConfig(tc.main.Config.AnimatedSticker). WithForceWebmStickerConvert(set.Set.Emojis). WithDocument(rawDoc, false). - Transfer(ce.Ctx, tc.main.Store, tc.main.Bridge.Bot) + Transfer(ctx, tc.main.Store, tc.main.Bridge.Bot) if err != nil { - ce.Log.Err(err).Msg("Failed to transfer image in pack") - ce.Reply("Failed to transfer document `%d`: %v", rawDoc.GetID(), err) - return + zerolog.Ctx(ctx).Err(err).Msg("Failed to transfer image in pack") + return nil, fmt.Errorf("failed to transfer document %d: %w", rawDoc.GetID(), err) } kws := keywords[rawDoc.GetID()] imageEmojis := emojiLists[rawDoc.GetID()] @@ -585,18 +604,11 @@ func (tc *TelegramClient) fnDownloadEmojiPack(ce *commands.Event) { Info: info, } } - _, err = tc.main.Bridge.Bot.SendState(ce.Ctx, spaceRoom, event.StateUnstableImagePack, set.Set.ShortName, &event.Content{ - Parsed: pack, - Raw: topLevelExtra, - }, time.Now()) - if err != nil { - ce.Reply("Failed to send image pack to space: %v", err) - } else { - ce.Reply( - "Successfully bridged image pack to %s", - format.MarkdownLink("your personal filtering space", - spaceRoom.URI(tc.main.Bridge.Matrix.ServerName()).MatrixToURL())) - } + return &bridgev2.ImportedImagePack{ + Content: pack, + Extra: topLevelExtra, + Shortcode: set.Set.ShortName, + }, nil } const StickerSourceID = "telegram"