dump-mirrorbot/bot/modules/stickers.py

434 lines
17 KiB
Python

import math
import os
import urllib.request as urllib
from PIL import Image
from html import escape
from bot.helper.telegram_helper.filters import CustomFilters
from telegram import ParseMode, InlineKeyboardMarkup, InlineKeyboardButton
from telegram import TelegramError
from telegram.ext import CommandHandler
from telegram.utils.helpers import mention_html
from bot import dispatcher, IMAGE_URL
def stickerid(update, context):
msg = update.effective_message
if msg.reply_to_message and msg.reply_to_message.sticker:
update.effective_message.reply_text(
"Hello " +
f"{mention_html(msg.from_user.id, msg.from_user.first_name)}" +
", The sticker id you are replying is :\n <code>" +
escape(msg.reply_to_message.sticker.file_id) + "</code>",
parse_mode=ParseMode.HTML,
)
else:
update.effective_message.reply_text(
"Hello " +
f"{mention_html(msg.from_user.id, msg.from_user.first_name)}" +
", Please reply to sticker message to get id sticker",
parse_mode=ParseMode.HTML,
)
def getsticker(update, context):
bot = context.bot
msg = update.effective_message
chat_id = update.effective_chat.id
if msg.reply_to_message and msg.reply_to_message.sticker:
file_id = msg.reply_to_message.sticker.file_id
new_file = bot.get_file(file_id)
new_file.download("sticker.png")
bot.send_document(chat_id, document=open("sticker.png", "rb"))
os.remove("sticker.png")
else:
update.effective_message.reply_text(
"Please reply to a sticker for me to upload its PNG.")
def kang(update, context):
msg = update.effective_message
user = update.effective_user
args = context.args
packnum = 0
packname = "a" + str(user.id) + "_by_" + context.bot.username
packname_found = 0
max_stickers = 120
while packname_found == 0:
try:
stickerset = context.bot.get_sticker_set(packname)
if len(stickerset.stickers) >= max_stickers:
packnum += 1
packname = ("a" + str(packnum) + "_" + str(user.id) + "_by_" +
context.bot.username)
else:
packname_found = 1
except TelegramError as e:
if e.message == "Stickerset_invalid":
packname_found = 1
kangsticker = "kangsticker.png"
is_animated = False
file_id = ""
if msg.reply_to_message:
if msg.reply_to_message.sticker:
if msg.reply_to_message.sticker.is_animated:
is_animated = True
file_id = msg.reply_to_message.sticker.file_id
elif msg.reply_to_message.photo:
file_id = msg.reply_to_message.photo[-1].file_id
elif msg.reply_to_message.document:
file_id = msg.reply_to_message.document.file_id
else:
msg.reply_text("Yea, I can't kang that.")
kang_file = context.bot.get_file(file_id)
if not is_animated:
kang_file.download("kangsticker.png")
else:
kang_file.download("kangsticker.tgs")
if args:
sticker_emoji = str(args[0])
elif msg.reply_to_message.sticker and msg.reply_to_message.sticker.emoji:
sticker_emoji = msg.reply_to_message.sticker.emoji
else:
sticker_emoji = "🤔"
if not is_animated:
try:
im = Image.open(kangsticker)
maxsize = (512, 512)
if (im.width and im.height) < 512:
size1 = im.width
size2 = im.height
if im.width > im.height:
scale = 512 / size1
size1new = 512
size2new = size2 * scale
else:
scale = 512 / size2
size1new = size1 * scale
size2new = 512
size1new = math.floor(size1new)
size2new = math.floor(size2new)
sizenew = (size1new, size2new)
im = im.resize(sizenew)
else:
im.thumbnail(maxsize)
if not msg.reply_to_message.sticker:
im.save(kangsticker, "PNG")
context.bot.add_sticker_to_set(
user_id=user.id,
name=packname,
png_sticker=open("kangsticker.png", "rb"),
emojis=sticker_emoji,
)
msg.reply_text(
f"Sticker successfully added to [pack](t.me/addstickers/{packname})"
+ f"\nEmoji is: {sticker_emoji}",
parse_mode=ParseMode.MARKDOWN,
)
except OSError as e:
msg.reply_text("I can only kang images m8.")
print(e)
return
except TelegramError as e:
if e.message == "Stickerset_invalid":
makepack_internal(
update,
context,
msg,
user,
sticker_emoji,
packname,
packnum,
png_sticker=open("kangsticker.png", "rb"),
)
elif e.message == "Sticker_png_dimensions":
im.save(kangsticker, "PNG")
context.bot.add_sticker_to_set(
user_id=user.id,
name=packname,
png_sticker=open("kangsticker.png", "rb"),
emojis=sticker_emoji,
)
msg.reply_text(
f"Sticker successfully added to [pack](t.me/addstickers/{packname})"
+ f"\nEmoji is: {sticker_emoji}",
parse_mode=ParseMode.MARKDOWN,
)
elif e.message == "Invalid sticker emojis":
msg.reply_text("Invalid emoji(s).")
elif e.message == "Stickers_too_much":
msg.reply_text(
"Max packsize reached. Press F to pay respecc.")
elif e.message == "Internal Server Error: sticker set not found (500)":
msg.reply_text(
"Sticker successfully added to [pack](t.me/addstickers/%s)"
% packname + "\n"
"Emoji is:" + " " + sticker_emoji,
parse_mode=ParseMode.MARKDOWN,
)
print(e)
else:
packname = "animated" + str(user.id) + "_by_" + context.bot.username
packname_found = 0
max_stickers = 50
while packname_found == 0:
try:
stickerset = context.bot.get_sticker_set(packname)
if len(stickerset.stickers) >= max_stickers:
packnum += 1
packname = ("animated" + str(packnum) + "_" +
str(user.id) + "_by_" +
context.bot.username)
else:
packname_found = 1
except TelegramError as e:
if e.message == "Stickerset_invalid":
packname_found = 1
try:
context.bot.add_sticker_to_set(
user_id=user.id,
name=packname,
tgs_sticker=open("kangsticker.tgs", "rb"),
emojis=sticker_emoji,
)
msg.reply_text(
f"Sticker successfully added to [pack](t.me/addstickers/{packname})"
+ f"\nEmoji is: {sticker_emoji}",
parse_mode=ParseMode.MARKDOWN,
)
except TelegramError as e:
if e.message == "Stickerset_invalid":
makepack_internal(
update,
context,
msg,
user,
sticker_emoji,
packname,
packnum,
tgs_sticker=open("kangsticker.tgs", "rb"),
)
elif e.message == "Invalid sticker emojis":
msg.reply_text("Invalid emoji(s).")
elif e.message == "Internal Server Error: sticker set not found (500)":
msg.reply_text(
"Sticker successfully added to [pack](t.me/addstickers/%s)"
% packname + "\n"
"Emoji is:" + " " + sticker_emoji,
parse_mode=ParseMode.MARKDOWN,
)
print(e)
elif args:
try:
try:
urlemoji = msg.text.split(" ")
png_sticker = urlemoji[1]
sticker_emoji = urlemoji[2]
except IndexError:
sticker_emoji = "🤔"
urllib.urlretrieve(png_sticker, kangsticker)
im = Image.open(kangsticker)
maxsize = (512, 512)
if (im.width and im.height) < 512:
size1 = im.width
size2 = im.height
if im.width > im.height:
scale = 512 / size1
size1new = 512
size2new = size2 * scale
else:
scale = 512 / size2
size1new = size1 * scale
size2new = 512
size1new = math.floor(size1new)
size2new = math.floor(size2new)
sizenew = (size1new, size2new)
im = im.resize(sizenew)
else:
im.thumbnail(maxsize)
im.save(kangsticker, "PNG")
msg.reply_photo(photo=open("kangsticker.png", "rb"))
context.bot.add_sticker_to_set(
user_id=user.id,
name=packname,
png_sticker=open("kangsticker.png", "rb"),
emojis=sticker_emoji,
)
msg.reply_text(
f"Sticker successfully added to [pack](t.me/addstickers/{packname})"
+ f"\nEmoji is: {sticker_emoji}",
parse_mode=ParseMode.MARKDOWN,
)
except OSError as e:
msg.reply_text("I can only kang images m8.")
print(e)
return
except TelegramError as e:
if e.message == "Stickerset_invalid":
makepack_internal(
update,
context,
msg,
user,
sticker_emoji,
packname,
packnum,
png_sticker=open("kangsticker.png", "rb"),
)
elif e.message == "Sticker_png_dimensions":
im.save(kangsticker, "PNG")
context.bot.add_sticker_to_set(
user_id=user.id,
name=packname,
png_sticker=open("kangsticker.png", "rb"),
emojis=sticker_emoji,
)
msg.reply_text(
"Sticker successfully added to [pack](t.me/addstickers/%s)"
% packname + "\n" + "Emoji is:" + " " + sticker_emoji,
parse_mode=ParseMode.MARKDOWN,
)
elif e.message == "Invalid sticker emojis":
msg.reply_text("Invalid emoji(s).")
elif e.message == "Stickers_too_much":
msg.reply_text("Max packsize reached. Press F to pay respecc.")
elif e.message == "Internal Server Error: sticker set not found (500)":
msg.reply_text(
"Sticker successfully added to [pack](t.me/addstickers/%s)"
% packname + "\n"
"Emoji is:" + " " + sticker_emoji,
parse_mode=ParseMode.MARKDOWN,
)
print(e)
else:
packs = "Please reply to a sticker, or image to kang it!\nOh, by the way. here are your packs:\n"
if packnum > 0:
firstpackname = "a" + str(user.id) + "_by_" + context.bot.username
for i in range(0, packnum + 1):
if i == 0:
packs += f"[pack](t.me/addstickers/{firstpackname})\n"
else:
packs += f"[pack{i}](t.me/addstickers/{packname})\n"
else:
packs += f"[pack](t.me/addstickers/{packname})"
msg.reply_text(packs, parse_mode=ParseMode.MARKDOWN)
if os.path.isfile("kangsticker.png"):
os.remove("kangsticker.png")
elif os.path.isfile("kangsticker.tgs"):
os.remove("kangsticker.tgs")
def makepack_internal(
update,
context,
msg,
user,
emoji,
packname,
packnum,
png_sticker=None,
tgs_sticker=None,
):
name = user.first_name
name = name[:50]
try:
extra_version = ""
if packnum > 0:
extra_version = " " + str(packnum)
if png_sticker:
success = context.bot.create_new_sticker_set(
user.id,
packname,
f"{name}s kang pack" + extra_version,
png_sticker=png_sticker,
emojis=emoji,
)
if tgs_sticker:
success = context.bot.create_new_sticker_set(
user.id,
packname,
f"{name}s animated kang pack" + extra_version,
tgs_sticker=tgs_sticker,
emojis=emoji,
)
except TelegramError as e:
print(e)
if e.message == "Sticker set name is already occupied":
msg.reply_text(
"Your pack can be found [here](t.me/addstickers/%s)" % packname,
parse_mode=ParseMode.MARKDOWN,
)
elif e.message in ("Peer_id_invalid", "bot was blocked by the user"):
msg.reply_text(
"Contact me in PM first.",
reply_markup=InlineKeyboardMarkup([[
InlineKeyboardButton(
text="Start", url=f"t.me/{context.bot.username}")
]]),
)
elif e.message == "Internal Server Error: created sticker set not found (500)":
msg.reply_text(
"Sticker pack successfully created. Get it [here](t.me/addstickers/%s)"
% packname,
parse_mode=ParseMode.MARKDOWN,
)
return
if success:
msg.reply_text(
"Sticker pack successfully created. Get it [here](t.me/addstickers/%s)"
% packname,
parse_mode=ParseMode.MARKDOWN,
)
else:
msg.reply_text(
"Failed to create sticker pack. Possibly due to blek mejik.")
def delsticker(update, context):
msg = update.effective_message
if msg.reply_to_message and msg.reply_to_message.sticker:
file_id = msg.reply_to_message.sticker.file_id
context.bot.delete_sticker_from_set(file_id)
msg.reply_text(
"Sticker deleted!"
)
else:
update.effective_message.reply_text(
"Please reply to sticker message to del sticker"
)
def stickhelp(update, context):
help_string = '''
• `/stickerid`*:* Reply to a Sticker to me to tell you its file ID.
• `/getsticker`*:* Reply to a Sticker to me to upload its raw PNG file.
• `/kang`*:* Reply to a Sticker to add it to your pack.
• `/remove`*:* Replay to a Sticker to remove Sticker from an existing pack.
'''
update.effective_message.reply_photo(IMAGE_URL, help_string, parse_mode=ParseMode.MARKDOWN)
STICKERID_HANDLER = CommandHandler("stickerid", stickerid, filters=CustomFilters.authorized_chat | CustomFilters.authorized_user, run_async=True)
GETSTICKER_HANDLER = CommandHandler("getsticker", getsticker, filters=CustomFilters.authorized_chat | CustomFilters.authorized_user, run_async=True)
KANG_HANDLER = CommandHandler("kang", kang, filters=CustomFilters.authorized_chat | CustomFilters.authorized_user, run_async=True)
DEL_HANDLER = CommandHandler("remove", delsticker, filters=CustomFilters.authorized_chat | CustomFilters.authorized_user, run_async=True)
STICKHELP_HANDLER = CommandHandler("stickerhelp", stickhelp, filters=CustomFilters.authorized_chat | CustomFilters.authorized_user, run_async=True)
dispatcher.add_handler(STICKERID_HANDLER)
dispatcher.add_handler(GETSTICKER_HANDLER)
dispatcher.add_handler(KANG_HANDLER)
dispatcher.add_handler(DEL_HANDLER)
dispatcher.add_handler(STICKHELP_HANDLER)