Improved locales, added /language
This commit is contained in:
@@ -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()
|
||||
|
@@ -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
|
||||
|
@@ -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))
|
||||
|
@@ -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"]),
|
||||
)
|
||||
|
51
plugins/commands/language_auto.py
Normal file
51
plugins/commands/language_auto.py
Normal file
@@ -0,0 +1,51 @@
|
||||
import logging
|
||||
|
||||
from pyrogram import filters
|
||||
from pyrogram.enums.chat_member_status import ChatMemberStatus
|
||||
from pyrogram.types import Message
|
||||
|
||||
from classes.pyroclient import PyroClient
|
||||
from classes.pyrogroup import PyroGroup
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
@PyroClient.on_message(
|
||||
~filters.scheduled
|
||||
& filters.group
|
||||
& filters.command(["language_auto"], prefixes=["/"]) # type: ignore
|
||||
)
|
||||
async def command_language(app: PyroClient, message: Message):
|
||||
group = await PyroGroup.create_if_not_exists(message.chat.id, None, True)
|
||||
locale = group.select_locale(app, message.from_user)
|
||||
|
||||
if (await app.get_chat_member(group.id, message.from_user.id)).status not in [
|
||||
ChatMemberStatus.ADMINISTRATOR,
|
||||
ChatMemberStatus.OWNER,
|
||||
]:
|
||||
await message.reply_text(
|
||||
app._("permission_denied", "messages", locale=locale), quote=True
|
||||
)
|
||||
return
|
||||
|
||||
if group.locale_auto:
|
||||
await message.reply_text(
|
||||
app._("locale_auto_disabled", "messages", locale=locale).format(
|
||||
default_locale=f"{app._('flag', 'metadata', locale=app.default_locale)} {app._('name', 'metadata', locale=app.default_locale)}"
|
||||
)
|
||||
)
|
||||
else:
|
||||
await message.reply_text(
|
||||
app._("locale_auto_enabled", "messages", locale=locale).format(
|
||||
default_locale=f"{app._('flag', 'metadata', locale=app.default_locale)} {app._('name', 'metadata', locale=app.default_locale)}"
|
||||
)
|
||||
)
|
||||
|
||||
logger.info(
|
||||
"Automatic locale selection of group %s has been set to %s (group: %s)",
|
||||
group.id,
|
||||
not group.locale_auto,
|
||||
group.locale,
|
||||
)
|
||||
|
||||
await group.set_locale_auto(not group.locale_auto)
|
15
plugins/handlers/bot_join.py
Normal file
15
plugins/handlers/bot_join.py
Normal file
@@ -0,0 +1,15 @@
|
||||
import logging
|
||||
|
||||
from pyrogram import filters
|
||||
from pyrogram.types import Message
|
||||
|
||||
from classes.pyroclient import PyroClient
|
||||
from classes.pyrogroup import PyroGroup
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
@PyroClient.on_message(filters.new_chat_members & filters.group & filters.me)
|
||||
async def handler_bot_join(app: PyroClient, message: Message):
|
||||
logger.info("Bot has joined the group %s")
|
||||
await PyroGroup.create_if_not_exists(message.chat.id, None, True)
|
@@ -12,6 +12,7 @@ from pyrogram.types import (
|
||||
)
|
||||
|
||||
from classes.pyroclient import PyroClient
|
||||
from classes.pyrogroup import PyroGroup
|
||||
from classes.pyrouser import PyroUser
|
||||
from modules.database import col_schedule
|
||||
from modules.kicker import kick_unstarted
|
||||
@@ -19,34 +20,37 @@ from modules.kicker import kick_unstarted
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
@PyroClient.on_message(filters.new_chat_members & ~filters.me)
|
||||
@PyroClient.on_message(
|
||||
filters.new_chat_members & filters.group & ~filters.me & ~filters.bot
|
||||
)
|
||||
async def handler_user_join(app: PyroClient, message: Message):
|
||||
group = await PyroGroup.create_if_not_exists(message.chat.id, None, True)
|
||||
locale = group.select_locale(app, message.from_user)
|
||||
|
||||
if (
|
||||
app.config["whitelist"]["enabled"]
|
||||
and message.chat.id not in app.config["whitelist"]["groups"]
|
||||
and group.id not in app.config["whitelist"]["groups"]
|
||||
):
|
||||
logger.info(
|
||||
"User %s has joined the group %s, but it's not whitelisted, ignoring.",
|
||||
message.from_user.id,
|
||||
message.chat.id,
|
||||
group.id,
|
||||
)
|
||||
return
|
||||
|
||||
logger.info(
|
||||
"User %s has joined the group %s", message.from_user.id, message.chat.id
|
||||
)
|
||||
logger.info("User %s has joined the group %s", message.from_user.id, group.id)
|
||||
|
||||
await message.delete()
|
||||
|
||||
# If user has already failed the test and joined once more
|
||||
with contextlib.suppress(KeyError):
|
||||
user = await app.find_user(message.from_user, message.chat.id)
|
||||
user = await app.find_user(message.from_user, group.id)
|
||||
if user.failed is True:
|
||||
logger.info(
|
||||
"User %s has previously failed the captcha, kicking and banning him",
|
||||
user.id,
|
||||
)
|
||||
banned = await app.ban_chat_member(message.chat.id, user.id)
|
||||
banned = await app.ban_chat_member(group.id, user.id)
|
||||
|
||||
if isinstance(banned, Message):
|
||||
await banned.delete()
|
||||
@@ -54,42 +58,35 @@ async def handler_user_join(app: PyroClient, message: Message):
|
||||
return
|
||||
|
||||
await app.restrict_chat_member(
|
||||
chat_id=message.chat.id,
|
||||
chat_id=group.id,
|
||||
user_id=message.from_user.id,
|
||||
permissions=ChatPermissions(can_send_messages=False),
|
||||
)
|
||||
|
||||
user = PyroUser.create_if_not_exists(message.from_user.id, message.chat.id)
|
||||
user = await PyroUser.create_if_not_exists(message.from_user.id, group.id)
|
||||
|
||||
if user.mistakes > 0 or user.score > 0:
|
||||
user.set_score(0)
|
||||
user.set_mistakes(0)
|
||||
await user.set_score(0)
|
||||
await user.set_mistakes(0)
|
||||
|
||||
await asyncio.sleep(2)
|
||||
verification_request = await app.send_message(
|
||||
chat_id=message.chat.id,
|
||||
text=app._(
|
||||
"welcome",
|
||||
"messages",
|
||||
).format(mention=message.from_user.mention),
|
||||
chat_id=group.id,
|
||||
text=app._("welcome", "messages", locale=locale).format(
|
||||
mention=message.from_user.mention
|
||||
),
|
||||
reply_markup=InlineKeyboardMarkup(
|
||||
[
|
||||
[
|
||||
InlineKeyboardButton(
|
||||
app._(
|
||||
"verify",
|
||||
"buttons",
|
||||
),
|
||||
callback_data=f"verify;{message.from_user.id}",
|
||||
app._("verify", "buttons", locale=locale),
|
||||
callback_data=f"verify;{user.id}",
|
||||
)
|
||||
],
|
||||
[
|
||||
InlineKeyboardButton(
|
||||
app._(
|
||||
"ban",
|
||||
"buttons",
|
||||
),
|
||||
callback_data=f"ban;{message.from_user.id}",
|
||||
app._("ban", "buttons", locale=locale),
|
||||
callback_data=f"ban;{user.id}",
|
||||
)
|
||||
],
|
||||
],
|
||||
@@ -103,6 +100,6 @@ async def handler_user_join(app: PyroClient, message: Message):
|
||||
[app, user.id, verification_request.chat.id, verification_request.id],
|
||||
run_date=datetime.now() + timedelta(seconds=app.config["timeouts"]["join"]),
|
||||
)
|
||||
col_schedule.insert_one(
|
||||
{"user": message.from_user.id, "group": message.chat.id, "job_id": job.id}
|
||||
await col_schedule.insert_one(
|
||||
{"user": user.id, "group": group.id, "job_id": job.id}
|
||||
)
|
||||
|
93
plugins/language.py
Normal file
93
plugins/language.py
Normal file
@@ -0,0 +1,93 @@
|
||||
import logging
|
||||
|
||||
from pykeyboard import InlineButton, InlineKeyboard
|
||||
from pyrogram import filters
|
||||
from pyrogram.client import Client
|
||||
from pyrogram.enums.chat_member_status import ChatMemberStatus
|
||||
from pyrogram.types import CallbackQuery, Message
|
||||
|
||||
from classes.callbacks import CallbackLanguage
|
||||
from classes.pyroclient import PyroClient
|
||||
from classes.pyrogroup import PyroGroup
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
@PyroClient.on_message(
|
||||
~filters.scheduled & filters.group & filters.command(["language"], prefixes=["/"]) # type: ignore
|
||||
)
|
||||
async def command_language(app: PyroClient, message: Message):
|
||||
group = await PyroGroup.create_if_not_exists(message.chat.id, None, True)
|
||||
locale = group.select_locale(app, message.from_user)
|
||||
|
||||
if (await app.get_chat_member(group.id, message.from_user.id)).status not in [
|
||||
ChatMemberStatus.ADMINISTRATOR,
|
||||
ChatMemberStatus.OWNER,
|
||||
]:
|
||||
await message.reply_text(
|
||||
app._("permission_denied", "messages", locale=locale), quote=True
|
||||
)
|
||||
return
|
||||
|
||||
keyboard = InlineKeyboard(row_width=2)
|
||||
buttons = []
|
||||
|
||||
for language, data in app.in_every_locale("metadata").items():
|
||||
buttons.append(
|
||||
InlineButton(f"{data['flag']} {data['name']}", f"language;{language}")
|
||||
)
|
||||
|
||||
buttons.append(
|
||||
InlineButton(
|
||||
f"🤖 {app._('locale_default', 'buttons', locale=locale)}", "language;default"
|
||||
)
|
||||
)
|
||||
|
||||
keyboard.add(*buttons)
|
||||
|
||||
await message.reply_text(
|
||||
app._("locale_choice", "messages", locale=locale),
|
||||
reply_markup=keyboard,
|
||||
)
|
||||
|
||||
|
||||
@Client.on_callback_query(filters.regex(r"language;[\s\S]*")) # type: ignore
|
||||
async def callback_language(app: PyroClient, callback: CallbackQuery):
|
||||
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
|
||||
|
||||
parsed = CallbackLanguage.from_callback(callback)
|
||||
|
||||
logger.info(
|
||||
"Locale of group %s has been set to %s (auto: %s)",
|
||||
group.id,
|
||||
parsed.language,
|
||||
group.locale_auto,
|
||||
)
|
||||
|
||||
if parsed.language == "default":
|
||||
await group.set_locale(None)
|
||||
await callback.answer(
|
||||
app._("locale_set", "callbacks", locale=app.default_locale).format(
|
||||
locale=app._("locale_default", "buttons", locale=locale)
|
||||
),
|
||||
show_alert=True,
|
||||
)
|
||||
return
|
||||
|
||||
await group.set_locale(parsed.language)
|
||||
await callback.answer(
|
||||
app._("locale_set", "callbacks", locale=parsed.language).format(
|
||||
locale=app._("name", "metadata", locale=parsed.language)
|
||||
),
|
||||
show_alert=True,
|
||||
)
|
Reference in New Issue
Block a user