Spaces:
Running
Running
| from random import choice | |
| from traceback import format_exc | |
| from pyrogram import filters | |
| from pyrogram.errors import (PeerIdInvalid, ShortnameOccupyFailed, | |
| StickerEmojiInvalid, StickerPngDimensions, | |
| StickerPngNopng, StickerTgsNotgs, | |
| StickerVideoNowebm, UserIsBlocked) | |
| from pyrogram.types import CallbackQuery | |
| from pyrogram.types import InlineKeyboardButton as IKB | |
| from pyrogram.types import InlineKeyboardMarkup as IKM | |
| from pyrogram.types import Message | |
| from Powers import LOGGER | |
| from Powers.utils.custom_filters import command | |
| from Powers.utils.sticker_help import * | |
| from Powers.utils.string import encode_decode | |
| from Powers.utils.web_helpers import get_file_size | |
| async def give_st_info(c: Gojo, m: Message): | |
| if not m.reply_to_message or not m.reply_to_message.sticker: | |
| await m.reply_text("Reply to a sticker") | |
| return | |
| st_in = m.reply_to_message.sticker | |
| st_type = "Normal" | |
| if st_in.is_animated: | |
| st_type = "Animated" | |
| elif st_in.is_video: | |
| st_type = "Video" | |
| st_to_gib = f"""[Sticker]({m.reply_to_message.link}) info: | |
| File ID : `{st_in.file_id}` | |
| File name : {st_in.file_name} | |
| File unique ID : `{st_in.file_unique_id}` | |
| Date and time sticker created : `{st_in.date}` | |
| Sticker type : `{st_type}` | |
| Emoji : {st_in.emoji} | |
| Pack name : {st_in.set_name} | |
| """ | |
| kb = IKM([[IKB("โ Add sticker to pack", url=f"https://t.me/addstickers/{st_in.set_name}")]]) | |
| await m.reply_text(st_to_gib, reply_markup=kb) | |
| return | |
| async def sticker_id_gib(c: Gojo, m: Message): | |
| if not m.reply_to_message or not m.reply_to_message.sticker: | |
| await m.reply_text("Reply to a sticker") | |
| return | |
| st_in = m.reply_to_message.sticker | |
| await m.reply_text(f"Sticker id: `{st_in.file_id}`\nSticker unique ID : `{st_in.file_unique_id}`") | |
| return | |
| async def kang(c: Gojo, m: Message): | |
| if not m.reply_to_message: | |
| return await m.reply_text("Reply to a sticker or image to kang it.") | |
| elif not (m.reply_to_message.animation or m.reply_to_message.sticker or m.reply_to_message.photo or ( | |
| m.reply_to_message.document and m.reply_to_message.document.mime_type.split("/")[0] in ["image", "video"])): | |
| return await m.reply_text("Reply to a sticker or image to kang it.") | |
| if not m.from_user: | |
| return await m.reply_text("You are anon admin, kang stickers in my pm.") | |
| msg = await m.reply_text("Kanging Sticker..") | |
| is_requ = bool( | |
| m.reply_to_message.sticker | |
| and ( | |
| m.reply_to_message.sticker.is_animated | |
| or m.reply_to_message.sticker.is_video | |
| ) | |
| ) | |
| # Find the proper emoji | |
| args = m.text.split() | |
| if len(args) > 1: | |
| sticker_emoji = str(args[1]) | |
| elif m.reply_to_message.sticker: | |
| try: | |
| sticker_emoji = m.reply_to_message.sticker.emoji | |
| if not sticker_emoji: | |
| ran = ["๐คฃ", "๐", "๐", "๐", "๐ฅ", "๐", "๐", "๐", "๐", "๐ฑ", "โบ๏ธ", "๐", "๐", "๐คง", "๐", "๐ฌ", "๐คฉ", "๐", "๐", | |
| "๐ฅน", "๐ฅบ", "๐ซฅ", "๐", "๐ซก", "๐ซ ", "๐คซ", "๐", "๐ฅต", "๐ฅถ", "๐ค", "๐ก", "๐คฌ", "๐คฏ", "๐ฅด", "๐คข", "๐คฎ", "๐", "๐ฟ", | |
| "๐ฉ", "๐คก", "๐ซถ", "๐", "๐", "โ", "๐", "๐ซฐ", "๐ค", "๐", "๐", "๐", "๐บ", "๐ฉโโค๏ธโ๐โ๐ฉ", "๐ฉโโค๏ธโ๐โ๐จ", | |
| "๐จโโค๏ธโ๐จ", "๐", "๐ฉโโค๏ธโ๐ฉ", "๐ฉโโค๏ธโ๐จ", "๐", "๐จโโค๏ธโ๐โ๐จ", "๐ช", "๐ด", "๐ญ", "๐ฅธ", "๐ค", "๐ซค", "๐ฎ", "๐ง", "๐ฒ", | |
| "๐ฅฑ", "๐", "๐ฟ", "๐ค", "๐พ", "๐", "๐ฅด", "๐ฅฐ", "๐", "๐คฃ", "๐", "๐", "๐"] | |
| sticker_emoji = choice(ran) | |
| except Exception: | |
| ran = ["๐คฃ", "๐", "๐", "๐", "๐ฅ", "๐", "๐", "๐", "๐", "๐ฑ", "โบ๏ธ", "๐", "๐", "๐คง", "๐", "๐ฌ", "๐คฉ", "๐", "๐", "๐ฅน", | |
| "๐ฅบ", "๐ซฅ", "๐", "๐ซก", "๐ซ ", "๐คซ", "๐", "๐ฅต", "๐ฅถ", "๐ค", "๐ก", "๐คฌ", "๐คฏ", "๐ฅด", "๐คข", "๐คฎ", "๐", "๐ฟ", "๐ฉ", "๐คก", | |
| "๐ซถ", "๐", "๐", "โ", "๐", "๐ซฐ", "๐ค", "๐", "๐", "๐", "๐บ", "๐ฉโโค๏ธโ๐โ๐ฉ", "๐ฉโโค๏ธโ๐โ๐จ", "๐จโโค๏ธโ๐จ", "๐", | |
| "๐ฉโโค๏ธโ๐ฉ", "๐ฉโโค๏ธโ๐จ", "๐", "๐จโโค๏ธโ๐โ๐จ", "๐ช", "๐ด", "๐ญ", "๐ฅธ", "๐ค", "๐ซค", "๐ฎ", "๐ง", "๐ฒ", "๐ฅฑ", "๐", "๐ฟ", "๐ค", | |
| "๐พ", "๐", "๐ฅด", "๐ฅฐ", "๐", "๐คฃ", "๐", "๐", "๐"] | |
| sticker_emoji = choice(ran) | |
| else: | |
| edit = await msg.reply_text("No emoji provided choosing a random emoji") | |
| ran = ["๐คฃ", "๐", "๐", "๐", "๐ฅ", "๐", "๐", "๐", "๐", "๐ฑ", "โบ๏ธ", "๐", "๐", "๐คง", "๐", "๐ฌ", "๐คฉ", "๐", "๐", "๐ฅน", "๐ฅบ", | |
| "๐ซฅ", "๐", "๐ซก", "๐ซ ", "๐คซ", "๐", "๐ฅต", "๐ฅถ", "๐ค", "๐ก", "๐คฌ", "๐คฏ", "๐ฅด", "๐คข", "๐คฎ", "๐", "๐ฟ", "๐ฉ", "๐คก", "๐ซถ", "๐", | |
| "๐", "โ", "๐", "๐ซฐ", "๐ค", "๐", "๐", "๐", "๐บ", "๐ฉโโค๏ธโ๐โ๐ฉ", "๐ฉโโค๏ธโ๐โ๐จ", "๐จโโค๏ธโ๐จ", "๐", "๐ฉโโค๏ธโ๐ฉ", "๐ฉโโค๏ธโ๐จ", | |
| "๐", "๐จโโค๏ธโ๐โ๐จ", "๐ช", "๐ด", "๐ญ", "๐ฅธ", "๐ค", "๐ซค", "๐ฎ", "๐ง", "๐ฒ", "๐ฅฑ", "๐", "๐ฟ", "๐ค", "๐พ", "๐", "๐ฅด", "๐ฅฐ", | |
| "๐", "๐คฃ", "๐", "๐", "๐"] | |
| sticker_emoji = choice(ran) | |
| await edit.delete() | |
| await msg.edit_text(f"Makeing a sticker with {sticker_emoji} emoji") | |
| # Get the corresponding fileid, resize the file if necessary | |
| try: | |
| if is_requ or m.reply_to_message.animation or m.reply_to_message.video or m.reply_to_message.photo or ( | |
| m.reply_to_message.document and m.reply_to_message.document.mime_type.split("/")[0] in ["video", | |
| "image"]): | |
| # telegram doesn't allow animated and video sticker to be kanged as we do for normal stickers | |
| if m.reply_to_message.animation or m.reply_to_message.video or ( | |
| m.reply_to_message.document and m.reply_to_message.document.mime_type.split("/")[0] == "video"): | |
| path = await Vsticker(c, m.reply_to_message) | |
| SIZE = os.path.getsize(path) | |
| if SIZE > 261120: | |
| await m.reply_text("File is too big") | |
| os.remove(path) | |
| return | |
| elif is_requ: | |
| path = await m.reply_to_message.download() | |
| else: | |
| sizee = (await get_file_size(m.reply_to_message)).split() | |
| if (sizee[1] == "mb" and int(sizee[0]) > 10) or sizee[1] == "gb": | |
| await m.reply_text("File size is too big") | |
| return | |
| path = await m.reply_to_message.download() | |
| path = await resize_file_to_sticker_size(path) | |
| sticker = await create_sticker( | |
| await upload_document( | |
| c, path, m.chat.id | |
| ), | |
| sticker_emoji | |
| ) | |
| os.remove(path) | |
| elif m.reply_to_message.sticker: | |
| sticker = await create_sticker( | |
| await get_document_from_file_id( | |
| m.reply_to_message.sticker.file_id | |
| ), | |
| sticker_emoji | |
| ) | |
| else: | |
| await m.reply_text("Unsupported media file...") | |
| return | |
| except ShortnameOccupyFailed: | |
| await m.reply_text("Change Your Name Or Username") | |
| return | |
| except Exception as e: | |
| await m.reply_text(str(e)) | |
| e = format_exc() | |
| LOGGER.error(e) | |
| LOGGER.error(format_exc()) | |
| # Find an available pack & add the sticker to the pack; create a new pack if needed | |
| # Would be a good idea to cache the number instead of searching it every single time... | |
| kang_lim = 120 | |
| packnum = 0 | |
| limit = 0 | |
| volume = 0 | |
| packname_found = False | |
| try: | |
| while not packname_found: | |
| packname = f"CE{m.from_user.id}{packnum}_by_{c.me.username}" | |
| kangpack = f"{f'@{m.from_user.username}' if m.from_user.username else m.from_user.first_name[:10]} {f'vOl {str(volume)}' if volume else ''} by @{c.me.username}" | |
| if limit >= 50: # To prevent this loop from running forever | |
| await m.reply_text( | |
| "Failed to kang\nMay be you have made more than 50 sticker packs with me try deleting some") | |
| return | |
| sticker_set = await get_sticker_set_by_name(c, packname) | |
| if not sticker_set: | |
| try: | |
| sticker_set = await create_sticker_set( | |
| client=c, | |
| owner=m.from_user.id, | |
| title=kangpack, | |
| short_name=packname, | |
| stickers=[sticker] | |
| ) | |
| except StickerEmojiInvalid: | |
| return await msg.edit("[ERROR]: INVALID_EMOJI_IN_ARGUMENT") | |
| elif sticker_set.set.count >= kang_lim: | |
| packnum += 1 | |
| limit += 1 | |
| volume += 1 | |
| continue | |
| try: | |
| await add_sticker_to_set(c, sticker_set, sticker) | |
| packname_found = True | |
| except StickerEmojiInvalid: | |
| return await msg.edit("[ERROR]: INVALID_EMOJI_IN_ARGUMENT") | |
| kb = IKM( | |
| [ | |
| [ | |
| IKB("โ Add Pack โ", url=f"t.me/addstickers/{packname}") | |
| ] | |
| ] | |
| ) | |
| await msg.delete() | |
| await m.reply_text( | |
| f"Kanged the sticker\nPack name: `{kangpack}`\nEmoji: {sticker_emoji}", | |
| reply_markup=kb | |
| ) | |
| except (PeerIdInvalid, UserIsBlocked): | |
| keyboard = IKM( | |
| [[IKB("Start me first", url=f"t.me/{c.me.username}")]] | |
| ) | |
| await msg.delete() | |
| await m.reply_text( | |
| "You Need To Start A Private Chat With Me.", | |
| reply_markup=keyboard, | |
| ) | |
| except StickerPngNopng: | |
| await msg.delete() | |
| await m.reply_text( | |
| "Stickers must be png files but the provided image was not a png" | |
| ) | |
| except StickerPngDimensions: | |
| await msg.delete() | |
| await m.reply_text("The sticker png dimensions are invalid.") | |
| except StickerTgsNotgs: | |
| await msg.delete() | |
| await m.reply_text("Sticker must be tgs file but the provided file was not tgs") | |
| except StickerVideoNowebm: | |
| await msg.delete() | |
| await m.reply_text("Sticker must be webm file but the provided file was not webm") | |
| except Exception as e: | |
| await msg.delete() | |
| await m.reply_text(f"Error occured\n{e}") | |
| LOGGER.error(e) | |
| LOGGER.error(format_exc()) | |
| return | |
| async def remove_sticker_from_pack(c: Gojo, m: Message): | |
| if not m.reply_to_message or not m.reply_to_message.sticker: | |
| return await m.reply_text( | |
| "Reply to a sticker to remove it from the pack." | |
| ) | |
| sticker = m.reply_to_message.sticker | |
| to_modify = await m.reply_text("Removing the sticker from your pack") | |
| sticker_set = await get_sticker_set_by_name(c, sticker.set_name) | |
| if not sticker_set: | |
| await to_modify.edit_text("This sticker is not part for your pack") | |
| return | |
| try: | |
| await remove_sticker(c, sticker.file_id) | |
| await to_modify.edit_text( | |
| f"Successfully removed [sticker]({m.reply_to_message.link}) from {sticker_set.set.title}") | |
| except Exception as e: | |
| await to_modify.delete() | |
| await m.reply_text(f"Failed to remove sticker due to:\n{e}\nPlease report this bug using `/bug`") | |
| LOGGER.error(e) | |
| LOGGER.error(format_exc()) | |
| return | |
| async def memify_it(c: Gojo, m: Message): | |
| if not m.reply_to_message: | |
| await m.reply_text("Invalid type.") | |
| return | |
| rep_to = m.reply_to_message | |
| if not (rep_to.sticker or rep_to.photo or (rep_to.document and "image" in rep_to.document.mime_type.split("/"))): | |
| await m.reply_text("I only support memifying of normal sticker and photos for now") | |
| return | |
| if rep_to.sticker and (rep_to.sticker.is_animated or rep_to.sticker.is_video): | |
| await m.reply_text("I only support memifying of normal sticker and photos for now") | |
| return | |
| kb = IKM( | |
| [ | |
| [ | |
| IKB("You might like", url="https://t.me/me_and_ghost") | |
| ] | |
| ] | |
| ) | |
| if len(m.command) == 1: | |
| await m.reply_text("Give me something to write") | |
| return | |
| filll = m.command[0][-1] | |
| fiil = "black" if filll == "b" else "white" | |
| x = await m.reply_text("Memifying...") | |
| meme = m.text.split(None, 1)[1].strip() | |
| name = f"@memesofdank_{m.id}.png" | |
| path = await rep_to.download(name) | |
| is_sticker = bool(rep_to.sticker) | |
| output = await draw_meme(path, meme, is_sticker, fiil) | |
| await x.delete() | |
| xNx = await m.reply_photo(output[0], reply_markup=kb) | |
| await xNx.reply_sticker(output[1], reply_markup=kb) | |
| try: | |
| os.remove(output[0]) | |
| os.remove(output[1]) | |
| except Exception as e: | |
| LOGGER.error(e) | |
| LOGGER.error(format_exc()) | |
| return | |
| async def get_sticker_from_file(c: Gojo, m: Message): | |
| Caption = f"Converted by:\n@{c.me.username}" | |
| repl = m.reply_to_message | |
| if not repl: | |
| await m.reply_text("Reply to a sticker or file") | |
| return | |
| if ( | |
| not repl.animation | |
| and not repl.video | |
| and not repl.sticker | |
| and not repl.photo | |
| and ( | |
| not repl.document | |
| or repl.document.mime_type.split("/")[0] not in ["image", "video"] | |
| ) | |
| ): | |
| await m.reply_text("I only support conversion of plain stickers, images, videos and animation for now") | |
| return | |
| to_vid = bool( | |
| repl.animation | |
| or repl.video | |
| or (repl.document and repl.document.mime_type.split("/")[0] == "video") | |
| ) | |
| x = await m.reply_text("Converting...") | |
| if repl.sticker: | |
| if repl.sticker.is_animated: | |
| upp = await repl.download() | |
| up = await tgs_to_gif(upp, True) | |
| await x.delete() | |
| await m.reply_animation(up, caption=Caption) | |
| elif repl.sticker.is_video: | |
| upp = await repl.download() | |
| up = await webm_to_gif(upp) | |
| await x.delete() | |
| await m.reply_animation(up, caption=Caption) | |
| else: | |
| upp = await repl.download() | |
| up = toimage(upp, is_direc=True) | |
| await x.delete() | |
| await m.reply_document(up, caption=Caption) | |
| os.remove(up) | |
| return | |
| elif repl.photo: | |
| upp = await repl.download() | |
| up = tosticker(upp, is_direc=True) | |
| await x.delete() | |
| await m.reply_sticker(up) | |
| os.remove(up) | |
| return | |
| elif to_vid: | |
| up = await Vsticker(c, repl) | |
| await x.delete() | |
| await m.reply_sticker(up) | |
| os.remove(up) | |
| return | |
| async def remove_from_MY_pack(c: Gojo, m: Message): | |
| if not m.reply_to_message or not m.reply_to_message.sticker: | |
| await m.reply_text("Please reply to a sticker to remove it from your pack") | |
| return | |
| sticker = m.reply_to_message.sticker | |
| sticker_set = await get_sticker_set_by_name(c, sticker.set_name) | |
| if not sticker_set: | |
| await m.reply_text("This sticker is not part of your pack") | |
| return | |
| try: | |
| await remove_sticker(c, sticker.file_id) | |
| await m.reply_text(f"Deleted [this]({m.reply_to_message.link}) from pack: {sticker_set.et.title}") | |
| return | |
| except Exception as e: | |
| await m.reply_text(f"Error\n{e}\nReport it using /bug") | |
| LOGGER.error(e) | |
| LOGGER.error(format_exc(e)) | |
| return | |
| async def get_my_sticker_sets(c: Gojo, m: Message): | |
| to_del = await m.reply_text("Please wait while I fetch all the sticker set I have created for you.") | |
| txt, kb = await get_all_sticker_packs(c, m.from_user.id) | |
| await to_del.delete() | |
| if not txt: | |
| await m.reply_text("Looks like you haven't made any sticker using me...") | |
| return | |
| await m.reply_text(txt, reply_markup=kb) | |
| async def quote_the_msg(_, m: Message): | |
| if not m.reply_to_message: | |
| await m.reply_text("Reply to a message to quote it") | |
| return | |
| to_edit = await m.reply_text("Genrating quote...") | |
| if len(m.command) > 1 and m.command[1].lower() == "r": | |
| reply_msg = m.reply_to_message.reply_to_message | |
| if not reply_msg or not reply_msg.text: | |
| reply_message = {} | |
| else: | |
| to_edit = await to_edit.edit_text("Genrating quote with reply to the message...") | |
| replied_name = reply_msg.from_user.first_name | |
| if reply_msg.from_user.last_name: | |
| replied_name += f" {reply_msg.from_user.last_name}" | |
| reply_message = { | |
| "chatId": reply_msg.from_user.id, | |
| "entities": get_msg_entities(reply_msg), | |
| "name": replied_name, | |
| "text": reply_msg.text, | |
| } | |
| else: | |
| reply_message = {} | |
| name = m.reply_to_message.from_user.first_name | |
| if m.reply_to_message.from_user.last_name: | |
| name += f" {m.reply_to_message.from_user.last_name}" | |
| emoji_status = None | |
| if m.reply_to_message.from_user.emoji_status: | |
| emoji_status = str(m.reply_to_message.from_user.emoji_status.custom_emoji_id) | |
| msg_data = [ | |
| { | |
| "entities": get_msg_entities(m.reply_to_message), | |
| "avatar": True, | |
| "from": { | |
| "id": m.reply_to_message.from_user.id, | |
| "name": name, | |
| "emoji_status": emoji_status, | |
| }, | |
| "text": m.reply_to_message.text, | |
| "replyMessage": reply_message, | |
| } | |
| ] | |
| status, path = quotify(msg_data) | |
| if not status: | |
| await to_edit.edit_text(path) | |
| return | |
| await m.reply_sticker(path) | |
| await to_edit.delete() | |
| os.remove(path) | |
| async def sticker_callbacks(c: Gojo, q: CallbackQuery): | |
| data = q.data.split("_") | |
| decoded = await encode_decode(data[-1], "decode") | |
| user = int(decoded.split("_")[-1]) | |
| if q.from_user.id != user: | |
| await q.answer("This is not for you") | |
| else: | |
| offset = int(decoded.split("_")[0]) | |
| txt, kb = await get_all_sticker_packs(c, q.from_user.id, offset) | |
| if not txt: | |
| await q.answer("No sticker pack found....") | |
| else: | |
| await q.answer("Showing your sticker set") | |
| await q.edit_message_text(txt, reply_markup=kb) | |
| return | |
| __PLUGIN__ = "sticker" | |
| __alt_name__ = [ | |
| "sticker", | |
| "kang" | |
| ] | |
| __HELP__ = """ | |
| **User Commands:** | |
| โข /kang (/steal) <emoji>: Reply to a sticker or any supported media | |
| โข /stickerinfo (/stinfo) : Reply to any sticker to get it's info | |
| โข /getsticker (/getst) : Get sticker as photo, gif or vice versa. | |
| โข /stickerid (/stid) : Reply to any sticker to get it's id | |
| โข /mypacks : Get all of your current sticker pack you have made via me. | |
| โข /q(/ss) <reply to message> : Will quote the replied message | |
| โข /q(/ss) r <reply to message> : Will quote the replied message and message it was replied to. | |
| โข /mmf <your text>: Reply to a normal sticker or a photo or video file to memify it. If you want to right text at bottom use `;right your message` | |
| โ For e.g. | |
| โ /mmfb <text>: To fill text with black colour | |
| โ /mmfw or /mmf <text>: To fill it with white colour | |
| **Note** | |
| mmf and getsticker only support photo and normal stickers for now. | |
| """ | |