From 522e45a4ae0766aeeaa7c16f45f7d563026da84e Mon Sep 17 00:00:00 2001
From: Tulir Asokan <tulir@maunium.net>
Date: Sun, 6 Sep 2020 16:59:25 +0300
Subject: [PATCH] Store IDs as strings and keep all emoticons. Fixes #12

---
 import.py | 35 +++++++++++++++++++++--------------
 1 file changed, 21 insertions(+), 14 deletions(-)

diff --git a/import.py b/import.py
index 7f80cfa..4291066 100644
--- a/import.py
+++ b/import.py
@@ -18,7 +18,7 @@ from PIL import Image
 from telethon import TelegramClient
 from telethon.tl.functions.messages import GetAllStickersRequest, GetStickerSetRequest
 from telethon.tl.types.messages import AllStickers
-from telethon.tl.types import InputStickerSetShortName, Document
+from telethon.tl.types import InputStickerSetShortName, Document, DocumentAttributeSticker
 from telethon.tl.types.messages import StickerSet as StickerSetFull
 
 parser = argparse.ArgumentParser()
@@ -71,6 +71,9 @@ async def upload(data: bytes, mimetype: str, filename: str) -> str:
 
 
 if TYPE_CHECKING:
+    from typing import TypedDict
+
+
     class MatrixMediaInfo(TypedDict):
         w: int
         h: int
@@ -110,8 +113,12 @@ async def reupload_document(client: TelegramClient, document: Document) -> 'Matr
         else:
             width = int(width / (height / 256))
             height = 256
+    body = ""
+    for attr in document.attributes:
+        if isinstance(attr, DocumentAttributeSticker):
+            body = attr.alt
     return {
-        "body": "",
+        "body": body,
         "url": mxc,
         "info": {
             "w": width,
@@ -163,7 +170,7 @@ async def reupload_pack(client: TelegramClient, pack: StickerSetFull) -> None:
     try:
         with open(pack_path) as pack_file:
             existing_pack = json.load(pack_file)
-            already_uploaded = {sticker["net.maunium.telegram.sticker"]["id"]: sticker
+            already_uploaded = {int(sticker["net.maunium.telegram.sticker"]["id"]): sticker
                                 for sticker in existing_pack["stickers"]}
             print(f"Found {len(already_uploaded)} already reuploaded stickers")
     except FileNotFoundError:
@@ -176,26 +183,26 @@ async def reupload_pack(client: TelegramClient, pack: StickerSetFull) -> None:
             print(f"Skipped reuploading {document.id}")
         except KeyError:
             reuploaded_documents[document.id] = await reupload_document(client, document)
+        reuploaded_documents[document.id]["net.maunium.telegram.sticker"] = {
+            "pack": {
+                "id": str(pack.set.id),
+                "short_name": pack.set.short_name,
+            },
+            "id": str(document.id),
+            "emoticons": [],
+        }
 
     for sticker in pack.packs:
         for document_id in sticker.documents:
             doc = reuploaded_documents[document_id]
-            doc["body"] = sticker.emoticon
-            doc["net.maunium.telegram.sticker"] = {
-                "pack": {
-                    "id": pack.set.id,
-                    "short_name": pack.set.short_name,
-                },
-                "id": document_id,
-                "emoticon": sticker.emoticon,
-            }
+            doc["net.maunium.telegram.sticker"]["emoticons"].append(sticker.emoticon)
 
     with open(pack_path, "w") as pack_file:
         json.dump({
             "title": pack.set.title,
             "short_name": pack.set.short_name,
-            "id": pack.set.id,
-            "hash": pack.set.hash,
+            "id": str(pack.set.id),
+            "hash": str(pack.set.hash),
             "stickers": list(reuploaded_documents.values()),
         }, pack_file, ensure_ascii=False)
     print(f"Saved {pack.set.title} as {pack.set.short_name}.json")
-- 
GitLab