Improved locales, added /language

This commit is contained in:
2023-08-11 15:04:21 +02:00
parent 07963d705c
commit 370bcd0653
17 changed files with 465 additions and 104 deletions

View File

@@ -4,22 +4,30 @@ from pyrogram import filters
from pyrogram.enums.chat_member_status import ChatMemberStatus
from pyrogram.types import CallbackQuery, Message
from classes.callbacks import CallbackBan
from classes.pyroclient import PyroClient
from classes.pyrogroup import PyroGroup
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)
group = await PyroGroup.create_if_not_exists(callback.message.chat.id, None, True)
locale = group.select_locale(app, callback.message.from_user)
if (await app.get_chat_member(group.id, callback.from_user.id)).status not in [
ChatMemberStatus.ADMINISTRATOR,
ChatMemberStatus.OWNER,
]:
await callback.answer(
app._("wrong_user", "callbacks", locale=locale), show_alert=True
)
return
user = await app.find_user(
int(str(callback.data).split(";")[1]), callback.message.chat.id
)
parsed = CallbackBan.from_callback(callback)
user = await app.find_user(parsed.user_id, group.id)
logger.info(
"User %s has been marked as failed the captcha by %s",
@@ -27,14 +35,16 @@ async def callback_ban(app: PyroClient, callback: CallbackQuery):
callback.from_user.id,
)
user.set_mistakes(3)
user.set_failed(True)
await user.set_mistakes(3)
await user.set_failed(True)
await callback.answer(
app._("captcha_failed_force", "callbacks").format(user_id=user.id),
app._("captcha_failed_force", "callbacks", locale=locale).format(
user_id=user.id
),
show_alert=True,
)
banned = await app.ban_chat_member(callback.message.chat.id, user.id)
banned = await app.ban_chat_member(group.id, user.id)
if isinstance(banned, Message):
await banned.delete()

View File

@@ -9,52 +9,58 @@ from pyrogram.types import (
Message,
)
from classes.callbacks import CallbackEmoji
from classes.pyroclient import PyroClient
from classes.pyrogroup import PyroGroup
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]
parsed = CallbackEmoji.from_callback(callback)
group = await PyroGroup.create_if_not_exists(callback.message.chat.id, None, True)
locale = group.select_locale(app, callback.message.from_user)
if callback.from_user.id != user_id:
await callback.answer(app._("wrong_user", "callbacks"), show_alert=True)
if callback.from_user.id != parsed.user_id:
await callback.answer(
app._("wrong_user", "callbacks", locale=locale), show_alert=True
)
return
user = await app.find_user(callback.from_user, callback.message.chat.id)
user = await app.find_user(callback.from_user, group.id)
logger.debug(
"User %s has pressed the %s emoji '%s'",
user.id,
"correct" if emoji in user.emojis else "wrong",
emoji,
"correct" if parsed.emoji in user.emojis else "wrong",
parsed.emoji,
)
if emoji in user.selected:
if parsed.emoji in user.selected:
await callback.answer()
return
user.update_selected(emoji)
await user.update_selected(parsed.emoji)
if emoji in user.emojis:
user.update_score(1)
if parsed.emoji in user.emojis:
await 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 callback.answer(
app._("captcha_passed", "callbacks", locale=locale), show_alert=True
)
await app.send_message(
callback.message.chat.id,
app._(
"welcome",
"messages",
).format(mention=callback.from_user.mention),
group.id,
app._("welcome", "messages", locale=locale).format(
mention=callback.from_user.mention
),
)
await app.restrict_chat_member(
chat_id=callback.message.chat.id,
chat_id=group.id,
user_id=callback.from_user.id,
permissions=ChatPermissions(can_send_messages=True),
)
@@ -71,20 +77,20 @@ async def callback_emoji_button(app: PyroClient, callback: CallbackQuery):
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
await user.set_failed(True)
await callback.answer(
app._("captcha_failed", "callbacks", locale=locale), show_alert=True
)
banned = await app.ban_chat_member(group.id, callback.from_user.id)
if isinstance(banned, Message):
await banned.delete()
await callback.message.delete()
return
user.update_mistakes(1)
await user.update_mistakes(1)
logger.info(
"User %s has made a mistake and has %s attempt(s) left",
user.id,
@@ -92,7 +98,9 @@ async def callback_emoji_button(app: PyroClient, callback: CallbackQuery):
)
await callback.answer(
app._("captcha_mistake", "callbacks").format(remaining=2 - user.mistakes),
app._("captcha_mistake", "callbacks", locale=locale).format(
remaining=2 - user.mistakes
),
show_alert=True,
)
@@ -102,7 +110,7 @@ async def callback_emoji_button(app: PyroClient, callback: CallbackQuery):
for row_index, row in enumerate(callback.message.reply_markup.inline_keyboard):
for button_index, button in enumerate(row):
if button.text == emoji:
if button.text == parsed.emoji:
button_replace = (row_index, button_index)
new_keyboard = callback.message.reply_markup.inline_keyboard

View File

@@ -2,8 +2,12 @@ from pyrogram import filters
from pyrogram.types import CallbackQuery
from classes.pyroclient import PyroClient
from classes.pyrogroup import PyroGroup
@PyroClient.on_callback_query(filters.regex(r"nothing"))
async def callback_nothing(app: PyroClient, callback: CallbackQuery):
await callback.answer(app._("nothing", "callbacks"))
group = await PyroGroup.create_if_not_exists(callback.message.chat.id, None, True)
locale = group.select_locale(app, callback.message.from_user)
await callback.answer(app._("nothing", "callbacks", locale=locale))

View File

@@ -7,7 +7,9 @@ from pykeyboard import InlineButton, InlineKeyboard
from pyrogram import filters
from pyrogram.types import CallbackQuery
from classes.callbacks import CallbackVerify
from classes.pyroclient import PyroClient
from classes.pyrogroup import PyroGroup
from modules.database import col_schedule
from modules.kicker import kick_unverified
from modules.utils import get_captcha_image
@@ -17,13 +19,17 @@ 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])
parsed = CallbackVerify.from_callback(callback)
group = await PyroGroup.create_if_not_exists(callback.message.chat.id, None, True)
locale = group.select_locale(app, callback.message.from_user)
if callback.from_user.id != user_id:
await callback.answer(app._("wrong_user", "callbacks"), show_alert=True)
if callback.from_user.id != parsed.user_id:
await callback.answer(
app._("wrong_user", "callbacks", locale=locale), show_alert=True
)
return
user = await app.find_user(callback.from_user, callback.message.chat.id)
user = await app.find_user(callback.from_user, group.id)
captcha = get_captcha_image(app.config["emojis"])
logger.info(
@@ -33,15 +39,15 @@ async def callback_verify(app: PyroClient, callback: CallbackQuery):
captcha.emojis_correct,
)
scheduled_job = col_schedule.find_one_and_delete(
{"user": user_id, "group": callback.message.chat.id}
scheduled_job = await col_schedule.find_one_and_delete(
{"user": parsed.user_id, "group": group.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)
await user.set_emojis(captcha.emojis_correct)
buttons = [
InlineButton(emoji, f"emoji;{user.id};{emoji}") for emoji in captcha.emojis_all
@@ -53,9 +59,9 @@ async def callback_verify(app: PyroClient, callback: CallbackQuery):
await callback.message.delete()
captcha_message = await app.send_photo(
callback.message.chat.id,
group.id,
captcha.image,
caption=app._("verify", "messages"),
caption=app._("verify", "messages", locale=locale),
reply_markup=keyboard,
)
@@ -65,7 +71,7 @@ async def callback_verify(app: PyroClient, callback: CallbackQuery):
app.scheduler.add_job(
kick_unverified,
"date",
[app, user.id, callback.message.chat.id, captcha_message.id],
[app, user.id, group.id, captcha_message.id],
run_date=datetime.now()
+ timedelta(seconds=app.config["timeouts"]["verify"]),
)