Initial commit

This commit is contained in:
2023-08-10 13:05:40 +02:00
commit 9c9cd96a94
21 changed files with 997 additions and 0 deletions

43
plugins/callbacks/ban.py Normal file
View File

@@ -0,0 +1,43 @@
import logging
from pyrogram import filters
from pyrogram.enums.chat_member_status import ChatMemberStatus
from pyrogram.types import CallbackQuery, Message
from classes.pyroclient import PyroClient
logger = logging.getLogger(__name__)
@PyroClient.on_callback_query(filters.regex(r"ban;[\s\S]*"))
async def callback_ban(app: PyroClient, callback: CallbackQuery):
if (
await app.get_chat_member(callback.message.chat.id, callback.from_user.id)
).status not in [ChatMemberStatus.ADMINISTRATOR, ChatMemberStatus.OWNER]:
await callback.answer(app._("wrong_user", "callbacks"), show_alert=True)
return
user = await app.find_user(
int(str(callback.data).split(";")[1]), callback.message.chat.id
)
logger.info(
"User %s has been marked as failed the captcha by %s",
user.id,
callback.from_user.id,
)
user.set_mistakes(3)
user.set_failed(True)
await callback.answer(
app._("captcha_failed_force", "callbacks").format(user_id=user.id),
show_alert=True,
)
banned = await app.ban_chat_member(callback.message.chat.id, user.id)
if isinstance(banned, Message):
await banned.delete()
await callback.message.delete()
return

View File

@@ -0,0 +1,115 @@
import logging
from pyrogram import filters
from pyrogram.types import (
CallbackQuery,
ChatPermissions,
InlineKeyboardButton,
InlineKeyboardMarkup,
Message,
)
from classes.pyroclient import PyroClient
logger = logging.getLogger(__name__)
@PyroClient.on_callback_query(filters.regex(r"emoji;[\s\S]*"))
async def callback_emoji_button(app: PyroClient, callback: CallbackQuery):
user_id = int(str(callback.data).split(";")[1])
emoji = str(callback.data).split(";")[2]
if callback.from_user.id != user_id:
await callback.answer(app._("wrong_user", "callbacks"), show_alert=True)
return
user = await app.find_user(callback.from_user, callback.message.chat.id)
logger.debug(
"User %s has pressed the %s emoji '%s'",
user.id,
"correct" if emoji in user.emojis else "wrong",
emoji,
)
if emoji in user.selected:
await callback.answer()
return
user.update_selected(emoji)
if emoji in user.emojis:
user.update_score(1)
if user.score >= 5:
logger.info("User %s has passed the captcha", user.id)
await callback.message.delete()
await callback.answer(app._("captcha_passed", "callbacks"), show_alert=True)
await app.send_message(
callback.message.chat.id,
app._(
"welcome",
"messages",
).format(mention=callback.from_user.mention),
)
await app.restrict_chat_member(
chat_id=callback.message.chat.id,
user_id=callback.from_user.id,
permissions=ChatPermissions(can_send_messages=True),
)
return
logger.info(
"User %s has chosen correctly and needs to select %s more emoji(s)",
user.id,
5 - user.score,
)
emoji_placeholder = ""
else:
if user.mistakes >= 2:
logger.info("User %s has failed the captcha", user.id)
user.set_failed(True)
await callback.answer(app._("captcha_failed", "callbacks"), show_alert=True)
banned = await app.ban_chat_member(
callback.message.chat.id, callback.from_user.id
)
if isinstance(banned, Message):
await banned.delete()
await callback.message.delete()
return
user.update_mistakes(1)
logger.info(
"User %s has made a mistake and has %s attempt(s) left",
user.id,
2 - user.mistakes,
)
await callback.answer(
app._("captcha_mistake", "callbacks").format(remaining=2 - user.mistakes),
show_alert=True,
)
emoji_placeholder = "🛑"
button_replace = (0, 0)
for row_index, row in enumerate(callback.message.reply_markup.inline_keyboard):
for button_index, button in enumerate(row):
if button.text == emoji:
button_replace = (row_index, button_index)
new_keyboard = callback.message.reply_markup.inline_keyboard
new_keyboard[button_replace[0]][button_replace[1]] = InlineKeyboardButton(
emoji_placeholder, "nothing"
)
await callback.edit_message_reply_markup(
reply_markup=InlineKeyboardMarkup(new_keyboard)
)

View File

@@ -0,0 +1,9 @@
from pyrogram import filters
from pyrogram.types import CallbackQuery
from classes.pyroclient import PyroClient
@PyroClient.on_callback_query(filters.regex(r"nothing"))
async def callback_nothing(app: PyroClient, callback: CallbackQuery):
await callback.answer(app._("nothing", "callbacks"))

View File

@@ -0,0 +1,71 @@
import contextlib
import logging
from datetime import datetime, timedelta
from apscheduler.jobstores.base import JobLookupError
from pykeyboard import InlineButton, InlineKeyboard
from pyrogram import filters
from pyrogram.types import CallbackQuery
from classes.pyroclient import PyroClient
from modules.database import col_schedule
from modules.kicker import kick_unverified
from modules.utils import get_captcha_image
logger = logging.getLogger(__name__)
@PyroClient.on_callback_query(filters.regex(r"verify;[\s\S]*"))
async def callback_verify(app: PyroClient, callback: CallbackQuery):
user_id = int(str(callback.data).split(";")[1])
if callback.from_user.id != user_id:
await callback.answer(app._("wrong_user", "callbacks"), show_alert=True)
return
user = await app.find_user(callback.from_user, callback.message.chat.id)
captcha = get_captcha_image(app.config["emojis"])
logger.info(
"Captcha for %s has been generated. All: %s, Correct: %s",
user.id,
captcha.emojis_all,
captcha.emojis_correct,
)
scheduled_job = col_schedule.find_one_and_delete(
{"user": user_id, "group": callback.message.chat.id}
)
if scheduled_job is not None and app.scheduler is not None:
with contextlib.suppress(JobLookupError):
app.scheduler.remove_job(scheduled_job["job_id"])
user.set_emojis(captcha.emojis_correct)
buttons = [
InlineButton(emoji, f"emoji;{user.id};{emoji}") for emoji in captcha.emojis_all
]
keyboard = InlineKeyboard(3)
keyboard.add(*buttons)
await callback.message.delete()
captcha_message = await app.send_photo(
callback.message.chat.id,
captcha.image,
caption=app._("verify", "messages"),
reply_markup=keyboard,
)
del captcha
if app.scheduler is not None:
app.scheduler.add_job(
kick_unverified,
"date",
[app, user.id, callback.message.chat.id, captcha_message.id],
run_date=datetime.now()
+ timedelta(seconds=app.config["timeouts"]["verify"]),
)