diff --git a/fiksofficial/python-modules/createavatarspack.py b/fiksofficial/python-modules/createavatarspack.py new file mode 100644 index 0000000..afcb4db --- /dev/null +++ b/fiksofficial/python-modules/createavatarspack.py @@ -0,0 +1,147 @@ +# ______ ___ ___ _ _ +# ____ | ___ \ | \/ | | | | | +# / __ \| |_/ / _| . . | ___ __| |_ _| | ___ +# / / _` | __/ | | | |\/| |/ _ \ / _` | | | | |/ _ \ +# | | (_| | | | |_| | | | | (_) | (_| | |_| | | __/ +# \ \__,_\_| \__, \_| |_/\___/ \__,_|\__,_|_|\___| +# \____/ __/ | +# |___/ + +# На модуль распространяется лицензия "GNU General Public License v3.0" +# https://github.com/all-licenses/GNU-General-Public-License-v3.0 + +# meta developer: @pymodule +# requires: opencv-python + +import os, shutil, cv2 +from PIL import Image, UnidentifiedImageError +from telethon.tl.functions.stickers import CreateStickerSetRequest +from telethon.tl.types import InputStickerSetItem, InputDocument +from telethon.errors.rpcerrorlist import PackShortNameOccupiedError +from .. import loader +from telethon.tl.functions.photos import GetUserPhotosRequest + +import asyncio +import random +import string + +try: + resample = Image.Resampling.LANCZOS +except: + resample = Image.LANCZOS + +@loader.tds +class CreateAvatarsPack(loader.Module): + """Creates a sticker pack from photos and video avatars of participants""" + strings = { + "name": "CreateAvatarsPack", + "processing": "📥 I'm collecting avatars of participants...", + "no_avatars": "❌ No members with avatars", + "no_valid": "❌ Could not process any avatars", + "done": "✅ The sticker pack is ready:\n👉 Open", + "already": "⚠️ A sticker pack with this name already exists.", + } + + strings_ru = { + "processing": "📥 Собираю аватарки участников...", + "no_avatars": "❌ Нет участников с аватарками", + "no_valid": "❌ Не удалось обработать ни одну аватарку", + "done": "✅ Стикерпак готов:\n👉 Открыть", + "already": "⚠️ Стикерпак с таким именем уже существует", + } + + @loader.command(doc="- Create a sticker pack from the avatars of users in the group", ru_doc="- Создать стикерпак из аватаров пользователей группы", only_groups=True) + async def createavatars(self, message): + """- Create a sticker pack from the avatars of users in the group""" + chat = await message.get_chat() + cid = abs(message.chat_id) + await message.edit(self.strings["processing"]) + + users = [] + async for u in self._client.iter_participants(chat.id): + if u.photo: + users.append(u) + if len(users) >= 100: + break + + if not users: + return await message.edit(self.strings["no_avatars"]) + + tmp_dir = f"/tmp/avatars_{cid}" + os.makedirs(tmp_dir, exist_ok=True) + sticker_files = [] + + for u in users: + try: + photos = await self._client(GetUserPhotosRequest(u.id, 0, 0, 1)) + if not photos.photos: + continue + + raw = await self._client.download_media(photos.photos[0]) + data = raw if isinstance(raw, (bytes, bytearray)) else open(raw, "rb").read() + + path_raw = os.path.join(tmp_dir, f"{u.id}_raw") + with open(path_raw, "wb") as f: + f.write(data) + + if b"ftyp" in data[:32] or path_raw.endswith((".mp4", ".webm", ".mov")): + cap = cv2.VideoCapture(path_raw) + success, frame = cap.read() + cap.release() + if not success: + continue + img = Image.fromarray(cv2.cvtColor(frame, cv2.COLOR_BGR2RGBA)) + else: + try: + img = Image.open(path_raw).convert("RGBA") + except UnidentifiedImageError: + continue + + img.thumbnail((512, 512), resample) + w, h = img.size + final = Image.new("RGBA", (512, 512), (0, 0, 0, 0)) + final.paste(img, ((512 - w)//2, (512 - h)//2)) + + out = os.path.join(tmp_dir, f"{u.id}.webp") + final.save(out, "WEBP") + sticker_files.append(out) + + except: + continue + + if not sticker_files: + shutil.rmtree(tmp_dir, ignore_errors=True) + return await message.edit(self.strings["no_valid"]) + + tag = ''.join(random.choices(string.ascii_lowercase + string.digits, k=4)) + short = f"f{cid}_{tag}_by_fcreateavatars" + title = f"AvaPack {tag}" + + stickers = [] + for p in sticker_files: + await asyncio.sleep(0.3) + file = await self._client.upload_file(p) + msg = await self._client.send_file("me", file, force_document=True) + doc = msg.document + await self._client.delete_messages("me", msg.id) + stickers.append(InputStickerSetItem( + document=InputDocument(doc.id, doc.access_hash, doc.file_reference), + emoji="🖼️" + )) + + try: + await self._client(CreateStickerSetRequest( + user_id="me", + title=title, + short_name=short, + stickers=stickers + )) + except PackShortNameOccupiedError: + shutil.rmtree(tmp_dir, ignore_errors=True) + return await message.edit(self.strings["already"]) + except Exception as e: + shutil.rmtree(tmp_dir, ignore_errors=True) + return await message.edit(f"❌ Error: {e}") + + shutil.rmtree(tmp_dir, ignore_errors=True) + await message.edit(self.strings["done"].format(short)) diff --git a/fiksofficial/python-modules/full.txt b/fiksofficial/python-modules/full.txt index d51155a..cfdb2b6 100644 --- a/fiksofficial/python-modules/full.txt +++ b/fiksofficial/python-modules/full.txt @@ -15,4 +15,5 @@ calc githubinfo qrgen wiki -checkhost \ No newline at end of file +checkhost +createavatarspack \ No newline at end of file diff --git a/fiksofficial/python-modules/index.html b/fiksofficial/python-modules/index.html index a86fdac..8cd8597 100644 --- a/fiksofficial/python-modules/index.html +++ b/fiksofficial/python-modules/index.html @@ -1,3 +1,3 @@ diff --git a/unneyon/hikka-mods/yamusic.py b/unneyon/hikka-mods/yamusic.py index eec3b92..e012df2 100644 --- a/unneyon/hikka-mods/yamusic.py +++ b/unneyon/hikka-mods/yamusic.py @@ -334,7 +334,7 @@ class YaMusicMod(loader.Module): else: now['entity_type'] = "RADIO" - device_eid, volume, device = "6039404727542747508", "Unknown Device", "❓" + device_eid, device, volume = "6039404727542747508", "Unknown Device", "❓" if now['device']: device=now['device']['info']['title'] volume=round(now['device']['volume']*100, 2) @@ -357,8 +357,9 @@ class YaMusicMod(loader.Module): audio = io.BytesIO((await utils.run_sync(requests.get, now['track']['download_link'])).content) audio.name = "audio.mp3" - await utils.answer_file( - message=message, file=audio, caption=out, + await utils.answer( + message=message, response=out, + file=audio, attributes=([ telethon.types.DocumentAttributeAudio( duration=now['track']['duration'], @@ -397,7 +398,7 @@ class YaMusicMod(loader.Module): else: now['entity_type'] = "RADIO" - device_eid, volume, device = "6039404727542747508", "Unknown Device", "❓" + device_eid, device, volume = "6039404727542747508", "Unknown Device", "❓" if now['device']: device=now['device']['info']['title'] volume=round(now['device']['volume']*100, 2) @@ -422,8 +423,8 @@ class YaMusicMod(loader.Module): now['duration_ms'], now['progress_ms'], requests.get(now['track']['img']).content ) - await utils.answer_file( - message=message, file=file, caption=out + await utils.answer( + message=message, response=out, file=file ) @@ -561,8 +562,9 @@ class YaMusicMod(loader.Module): audio = io.BytesIO((await utils.run_sync(requests.get, link)).content) audio.name = "audio.mp3" - await utils.answer_file( - message=message, file=audio, caption=out, + await utils.answer( + message=message, response=out, + file=audio, attributes=([ telethon.types.DocumentAttributeAudio( duration=int(search.tracks.results[0].duration_ms / 1000),