stickers.py 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. import os
  2. import imghdr
  3. from wbb import app, BOT_USERNAME
  4. from pyrogram import filters
  5. from wbb.core.decorators.errors import capture_err
  6. from wbb.utils.files import resize_file_to_sticker_size, upload_document, get_document_from_file_id
  7. from wbb.utils.stickerset import get_sticker_set_by_name, create_sticker, add_sticker_to_set, create_sticker_set
  8. from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup
  9. from pyrogram.errors.exceptions.bad_request_400 import PeerIdInvalid, StickerPngNopng, UserIsBlocked, StickerPngDimensions
  10. __MODULE__ = "Stickers"
  11. __HELP__ = """/sticker_id - To Get File ID of A Sticker.
  12. /kang - To Kang A Sticker or Image."""
  13. MAX_STICKERS = 120 # would be better if we could fetch this limit directly from telegram
  14. SUPPORTED_TYPES = ['jpeg', 'png', 'webp']
  15. @app.on_message(filters.command("sticker_id") & ~filters.edited)
  16. @capture_err
  17. async def sticker_id(_, message):
  18. if not message.reply_to_message:
  19. await message.reply_text("Reply to a sticker.")
  20. return
  21. if not message.reply_to_message.sticker:
  22. await message.reply_text("Reply to a sticker.")
  23. return
  24. file_id = message.reply_to_message.sticker.file_id
  25. await message.reply_text(f"`{file_id}`")
  26. @app.on_message(filters.command("kang") & ~filters.edited)
  27. @capture_err
  28. async def kang(client, message):
  29. if not message.reply_to_message:
  30. await message.reply_text("Reply to a sticker/image to kang it.")
  31. return
  32. msg = await message.reply_text("Kanging Sticker..")
  33. # Find the proper emoji
  34. args = message.text.split()
  35. if len(args) > 1:
  36. sticker_emoji = str(args[1])
  37. elif message.reply_to_message.sticker and message.reply_to_message.sticker.emoji:
  38. sticker_emoji = message.reply_to_message.sticker.emoji
  39. else:
  40. sticker_emoji = "🤔"
  41. # Get the corresponding fileid, resize the file if necessary
  42. doc = (message.reply_to_message.photo or message.reply_to_message.document)
  43. if message.reply_to_message.sticker:
  44. sticker = await create_sticker(
  45. await get_document_from_file_id(
  46. message.reply_to_message.sticker.file_id
  47. ),
  48. sticker_emoji
  49. )
  50. elif doc:
  51. temp_file_path = await app.download_media(doc)
  52. image_type = imghdr.what(temp_file_path)
  53. if image_type not in SUPPORTED_TYPES:
  54. await msg.edit("Format not supported! ({})".format(image_type))
  55. return
  56. try:
  57. temp_file_path = await resize_file_to_sticker_size(temp_file_path)
  58. except OSError as e:
  59. await msg.edit_text("Something wrong happened.")
  60. raise Exception(
  61. f"Something went wrong while resizing the sticker (at {temp_file_path}); {e}")
  62. return False
  63. sticker = await create_sticker(
  64. await upload_document(
  65. client,
  66. temp_file_path,
  67. message.chat.id
  68. ),
  69. sticker_emoji
  70. )
  71. if os.path.isfile(temp_file_path):
  72. os.remove(temp_file_path)
  73. else:
  74. await msg.edit("Nope, can't kang that.")
  75. return
  76. # Find an available pack & add the sticker to the pack; create a new pack if needed
  77. # Would be a good idea to cache the number instead of searching it every single time...
  78. packnum = 0
  79. packname = "f" + str(message.from_user.id) + "_by_" + BOT_USERNAME
  80. try:
  81. while True:
  82. stickerset = await get_sticker_set_by_name(client, packname)
  83. if not stickerset:
  84. stickerset = await create_sticker_set(
  85. client,
  86. message.from_user.id,
  87. f"{message.from_user.first_name[:32]}'s kang pack",
  88. packname,
  89. [sticker]
  90. )
  91. elif stickerset.set.count >= MAX_STICKERS:
  92. packnum += 1
  93. packname = "f" + str(packnum) + "_" + \
  94. str(message.from_user.id) + "_by_"+BOT_USERNAME
  95. continue
  96. else:
  97. await add_sticker_to_set(client, stickerset, sticker)
  98. break
  99. await msg.edit(
  100. "Sticker Kanged To [Pack](t.me/addstickers/{})\nEmoji: {}".format(
  101. packname,
  102. sticker_emoji
  103. )
  104. )
  105. except (PeerIdInvalid, UserIsBlocked):
  106. keyboard = InlineKeyboardMarkup(
  107. [[InlineKeyboardButton(text="Start", url=f"t.me/{BOT_USERNAME}")]])
  108. await msg.edit("You Need To Start A Private Chat With Me.", reply_markup=keyboard)
  109. except StickerPngNopng:
  110. await message.reply_text("Stickers must be png files but the provided image was not a png")
  111. except StickerPngDimensions:
  112. await message.reply_text("The sticker png dimensions are invalid.")