imagepack: implement listing interface

This commit is contained in:
Tulir Asokan
2026-04-30 14:55:11 +03:00
parent 2ffbde7448
commit 7c2c72bbde
4 changed files with 42 additions and 21 deletions

View File

@@ -36,6 +36,7 @@ func (tc *TelegramConnector) GetCapabilities() *bridgev2.NetworkGeneralCapabilit
return &bridgev2.NetworkGeneralCapabilities{
DisappearingMessages: true,
Provisioning: bridgev2.ProvisioningCapabilities{
ImagePackImport: true,
ResolveIdentifier: bridgev2.ResolveIdentifierCapabilities{
CreateDM: true,
LookupPhone: true,

View File

@@ -474,6 +474,42 @@ func (tc *TelegramClient) fnDownloadEmojiPack(ce *commands.Event) {
}
}
func (tc *TelegramClient) ListImagePacks(ctx context.Context) ([]*event.ImagePackMetadata, error) {
resp, err := tc.client.API().MessagesGetAllStickers(ctx, 0)
if err != nil {
return nil, err
}
casted, ok := resp.(*tg.MessagesAllStickers)
if !ok {
return nil, fmt.Errorf("unexpected response type: %T", resp)
}
packs := make([]*event.ImagePackMetadata, len(casted.Sets))
for i, set := range casted.Sets {
packs[i] = tc.makeImagePackMetadata(ctx, set)
}
return packs, nil
}
func (tc *TelegramClient) makeImagePackMetadata(ctx context.Context, pack tg.StickerSet) *event.ImagePackMetadata {
linkType := "addstickers"
usage := event.ImagePackUsageSticker
if pack.Emojis {
linkType = "addemoji"
usage = event.ImagePackUsageEmoji
}
packURL := fmt.Sprintf("https://t.me/%s/%s", linkType, pack.ShortName)
return &event.ImagePackMetadata{
DisplayName: pack.Title,
AvatarURL: "", // TODO
Usage: []event.ImagePackUsage{usage},
Attribution: fmt.Sprintf("Imported from %s", packURL),
BridgedPack: &event.BridgedStickerPack{
Network: StickerSourceID,
URL: packURL,
},
}
}
func (tc *TelegramClient) DownloadImagePack(ctx context.Context, url string) (*bridgev2.ImportedImagePack, error) {
var shortName string
if match := addStickersRegex.FindStringSubmatch(url); match != nil {
@@ -492,25 +528,9 @@ func (tc *TelegramClient) DownloadImagePack(ctx context.Context, url string) (*b
return nil, fmt.Errorf("unexpected response type: %T", rawSet)
}
tc.addStickerPackToCache(set, true)
linkType := "addstickers"
usage := event.ImagePackUsageSticker
if set.Set.Emojis {
linkType = "addemoji"
usage = event.ImagePackUsageEmoji
}
packURL := fmt.Sprintf("https://t.me/%s/%s", linkType, set.Set.ShortName)
pack := &event.ImagePackEventContent{
Images: make(map[string]*event.ImagePackImage, len(set.Documents)),
Metadata: event.ImagePackMetadata{
DisplayName: set.Set.Title,
AvatarURL: "",
Usage: []event.ImagePackUsage{usage},
Attribution: fmt.Sprintf("Imported from %s", packURL),
BridgedPack: &event.BridgedStickerPack{
Network: StickerSourceID,
URL: packURL,
},
},
Images: make(map[string]*event.ImagePackImage, len(set.Documents)),
Metadata: *tc.makeImagePackMetadata(ctx, set.Set),
}
topLevelExtra := map[string]any{
"fi.mau.telegram.stickerpack": map[string]any{