greetings.py 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. """
  2. Thanks to @dashezup for this module
  3. Repo - https://github.com/dashezup/tgbot
  4. """
  5. import asyncio
  6. from datetime import datetime
  7. from pyrogram import filters
  8. from wbb import app, WELCOME_DELAY_KICK_SEC
  9. from pyrogram.types import Message, InlineKeyboardMarkup, InlineKeyboardButton, ChatPermissions, User
  10. from pyrogram.errors.exceptions.bad_request_400 import UserNotParticipant, ChatAdminRequired
  11. from wbb.utils.errors import capture_err
  12. from wbb.utils.filter_groups import welcome_captcha_group
  13. from wbb.utils.dbfunctions import is_gbanned_user
  14. from random import randint, shuffle
  15. answers = []
  16. @app.on_message(filters.new_chat_members, group=welcome_captcha_group)
  17. @capture_err
  18. async def welcome(_, message: Message):
  19. global answers
  20. """Mute new member and send message with button"""
  21. for member in message.new_chat_members:
  22. n1 = str(randint(1, 99))
  23. n2 = str(randint(1, 99))
  24. r1 = str(randint(1, 99))
  25. r2 = str(randint(1, 99))
  26. r3 = str(randint(1, 99))
  27. correct_answer = str(int(n1) + int(n2))
  28. answers.append(
  29. {
  30. "user_id": member.id,
  31. "correct_answer": correct_answer
  32. }
  33. )
  34. try:
  35. if await is_gbanned_user(member.id):
  36. await message.chat.kick_member(member.id)
  37. continue
  38. if member.is_bot:
  39. continue # ignore bots
  40. text = (f"**Welcome**, {(member.mention())}\n**Are you human?**\n"
  41. f"Solve this expression in less than {WELCOME_DELAY_KICK_SEC} seconds.\n"
  42. f"**Expression:** __{n1} + {n2}__")
  43. await message.chat.restrict_member(member.id, ChatPermissions())
  44. except ChatAdminRequired:
  45. continue
  46. keyboard = [
  47. InlineKeyboardButton(
  48. f"{r1}",
  49. callback_data=f"pressed_button {r1} {member.id}"
  50. ),
  51. InlineKeyboardButton(
  52. f"{r2}",
  53. callback_data=f"pressed_button {r2} {member.id}"
  54. ),
  55. InlineKeyboardButton(
  56. f"{r3}",
  57. callback_data=f"pressed_button {r3} {member.id}"
  58. ),
  59. InlineKeyboardButton(
  60. f"{correct_answer}",
  61. callback_data=f"pressed_button {correct_answer} {member.id}"
  62. )
  63. ]
  64. shuffle(keyboard)
  65. keyb = InlineKeyboardMarkup([keyboard])
  66. button_message = await message.reply(
  67. text,
  68. reply_markup=keyb,
  69. quote=True
  70. )
  71. asyncio.create_task(kick_restricted_after_delay(
  72. WELCOME_DELAY_KICK_SEC, button_message, member))
  73. await asyncio.sleep(0.5)
  74. @app.on_callback_query(filters.regex("pressed_button"))
  75. async def callback_query_welcome_button(client, callback_query):
  76. global answers
  77. """After the new member presses the button, set his permissions to
  78. chat permissions, delete button message and join message
  79. """
  80. button_message = callback_query.message
  81. data = callback_query.data
  82. answer = data.split(None, 2)[1]
  83. pending_user = await app.get_users(int(data.split(None, 2)[2]))
  84. pressed_user_id = callback_query.from_user.id
  85. pending_user_id = pending_user.id
  86. for user in answers:
  87. if user['user_id'] == pending_user_id:
  88. if user['correct_answer'] != answer:
  89. await callback_query.answer("That's Wrong, Learn Maths.")
  90. return
  91. break
  92. if pending_user_id == pressed_user_id:
  93. await callback_query.answer("Captcha passed!, Have a nice stay.")
  94. await button_message.chat.unban_member(pending_user_id)
  95. await button_message.delete()
  96. else:
  97. await callback_query.answer("This is not for you")
  98. async def kick_restricted_after_delay(delay, button_message: Message, user: User):
  99. """If the new member is still restricted after the delay, delete
  100. button message and join message and then kick him
  101. """
  102. await asyncio.sleep(delay)
  103. join_message = button_message.reply_to_message
  104. group_chat = button_message.chat
  105. user_id = user.id
  106. await join_message.delete()
  107. await button_message.delete()
  108. await _ban_restricted_user_until_date(group_chat, user_id, duration=delay)
  109. @app.on_message(filters.left_chat_member)
  110. @capture_err
  111. async def left_chat_member(_, message: Message):
  112. """When a restricted member left the chat, ban him for a while"""
  113. group_chat = message.chat
  114. user_id = message.left_chat_member.id
  115. await _ban_restricted_user_until_date(group_chat, user_id,
  116. duration=WELCOME_DELAY_KICK_SEC)
  117. async def _ban_restricted_user_until_date(group_chat,
  118. user_id: int,
  119. duration: int):
  120. try:
  121. member = await group_chat.get_member(user_id)
  122. if member.status == "restricted":
  123. until_date = int(datetime.utcnow().timestamp() + duration)
  124. await group_chat.kick_member(user_id, until_date=until_date)
  125. except UserNotParticipant:
  126. pass