This commit closes #9

This commit is contained in:
Profitroll 2023-08-14 12:34:52 +02:00
parent de00687cbf
commit 569b0d51e5
Signed by: profitroll
GPG Key ID: FA35CAB49DACD3B2
7 changed files with 171 additions and 7 deletions

View File

@ -16,13 +16,23 @@ logger = logging.getLogger(__name__)
class PyroGroup: class PyroGroup:
"""Dataclass of DB entry of a group""" """Dataclass of DB entry of a group"""
__slots__ = ("_id", "id", "locale", "locale_auto") __slots__ = (
"_id",
"id",
"locale",
"locale_auto",
"ban_failed",
"timeout_join",
"timeout_verify",
)
_id: ObjectId _id: ObjectId
id: int id: int
locale: Union[str, None] locale: Union[str, None]
locale_auto: bool locale_auto: bool
ban_failed: bool ban_failed: bool
timeout_join: int
timeout_verify: int
@classmethod @classmethod
async def create_if_not_exists( async def create_if_not_exists(
@ -31,6 +41,8 @@ class PyroGroup:
locale: Union[str, None] = sync.config_get("locale", "defaults", "group"), locale: Union[str, None] = sync.config_get("locale", "defaults", "group"),
locale_auto: bool = sync.config_get("locale_auto", "defaults", "group"), locale_auto: bool = sync.config_get("locale_auto", "defaults", "group"),
ban_failed: bool = sync.config_get("ban_failed", "defaults", "group"), ban_failed: bool = sync.config_get("ban_failed", "defaults", "group"),
timeout_join: int = sync.config_get("timeout_join", "defaults", "group"),
timeout_verify: int = sync.config_get("timeout_verify", "defaults", "group"),
): ):
db_entry = await col_groups.find_one( db_entry = await col_groups.find_one(
{ {
@ -45,6 +57,8 @@ class PyroGroup:
"locale": locale, "locale": locale,
"locale_auto": locale_auto, "locale_auto": locale_auto,
"ban_failed": ban_failed, "ban_failed": ban_failed,
"timeout_join": timeout_join,
"timeout_verify": timeout_verify,
} }
) )
db_entry = await col_groups.find_one({"_id": inserted.inserted_id}) db_entry = await col_groups.find_one({"_id": inserted.inserted_id})
@ -78,6 +92,26 @@ class PyroGroup:
{"_id": self._id}, {"$set": {"ban_failed": enabled}} {"_id": self._id}, {"$set": {"ban_failed": enabled}}
) )
async def set_timeout_join(self, timeout: int) -> None:
logger.debug(
"Join timeout in group %s has been set to %s",
self.id,
timeout,
)
await col_groups.update_one(
{"_id": self._id}, {"$set": {"timeout_join": timeout}}
)
async def set_timeout_verify(self, timeout: int) -> None:
logger.debug(
"Verification timeout in group %s has been set to %s",
self.id,
timeout,
)
await col_groups.update_one(
{"_id": self._id}, {"$set": {"timeout_verify": timeout}}
)
# Group settings # Group settings
# User locale # User locale
def select_locale( def select_locale(

View File

@ -16,7 +16,9 @@
"help": "Nützliche Informationen anzeigen", "help": "Nützliche Informationen anzeigen",
"ban_failed": "Umschaltverbot bei fehlender Verifizierung", "ban_failed": "Umschaltverbot bei fehlender Verifizierung",
"language": "Sprache des Bots in dieser Gruppe einstellen", "language": "Sprache des Bots in dieser Gruppe einstellen",
"language_auto": "Automatische Sprachwahl umschalten" "language_auto": "Automatische Sprachwahl umschalten",
"timeout_join": "Zeitlimit für die Anmeldung festlegen",
"timeout_verify": "Zeitlimit für die Überprüfung festlegen"
}, },
"messages": { "messages": {
"help": "Hallo! Dieser Bot kann Ihnen helfen, sich gegen nervige Bots zu schützen, indem er Emoji-Captchas beim Beitritt erzwingt.\n\nFügen Sie diesen Bot zu Ihrer gewünschten Gruppe hinzu und geben Sie ihm die Berechtigungen **Nachrichten löschen** und **Benutzer sperren**.\n\nVerfügbare Kommandos:\n• /ban_failed - Bannen bei Zeitüberschreitung oder fehlgeschlagenem Captcha umschalten\n• /language - Sprache des Bots ändern\n• /language_auto - automatische Sprache pro Benutzer umschalten\n\nKommandos, die oben aufgelistet sind, müssen in der Gruppe von ihren Admins oder dem Besitzer ausgeführt werden.\n\nDieser Bot ist Open Source, also können Sie ihn selbst hosten oder nach Ihren Wünschen verändern: https://git.end-play.xyz/profitroll/EmojiCaptchaBot\n\nWenn Sie einen Fehler melden oder einen Vorschlag machen möchten besuchen Sie die [Problemseite](https://git.end-play.xyz/profitroll/EmojiCaptchaBot/issues) des Bots auf git.\n\nEinen schönen Tag noch :)", "help": "Hallo! Dieser Bot kann Ihnen helfen, sich gegen nervige Bots zu schützen, indem er Emoji-Captchas beim Beitritt erzwingt.\n\nFügen Sie diesen Bot zu Ihrer gewünschten Gruppe hinzu und geben Sie ihm die Berechtigungen **Nachrichten löschen** und **Benutzer sperren**.\n\nVerfügbare Kommandos:\n• /ban_failed - Bannen bei Zeitüberschreitung oder fehlgeschlagenem Captcha umschalten\n• /language - Sprache des Bots ändern\n• /language_auto - automatische Sprache pro Benutzer umschalten\n\nKommandos, die oben aufgelistet sind, müssen in der Gruppe von ihren Admins oder dem Besitzer ausgeführt werden.\n\nDieser Bot ist Open Source, also können Sie ihn selbst hosten oder nach Ihren Wünschen verändern: https://git.end-play.xyz/profitroll/EmojiCaptchaBot\n\nWenn Sie einen Fehler melden oder einen Vorschlag machen möchten besuchen Sie die [Problemseite](https://git.end-play.xyz/profitroll/EmojiCaptchaBot/issues) des Bots auf git.\n\nEinen schönen Tag noch :)",
@ -26,6 +28,11 @@
"locale_auto_enabled": "Die automatische Sprachauswahl auf individueller Basis wurde **aktiviert**. Bitte beachten Sie, dass die Standardsprache der Gruppe oder des Bots verwendet wird, wenn der Bot kein Sprachpaket für den Benutzer hat. Sie können die Sprache der Gruppe mit /language ändern. Wenn \"Standard\" als Sprache eingestellt ist, wird die Standardsprache des Bots ({default_locale}) verwendet.", "locale_auto_enabled": "Die automatische Sprachauswahl auf individueller Basis wurde **aktiviert**. Bitte beachten Sie, dass die Standardsprache der Gruppe oder des Bots verwendet wird, wenn der Bot kein Sprachpaket für den Benutzer hat. Sie können die Sprache der Gruppe mit /language ändern. Wenn \"Standard\" als Sprache eingestellt ist, wird die Standardsprache des Bots ({default_locale}) verwendet.",
"locale_choice": "Okay. Bitte wählen Sie die Sprache mit der Tastatur unten aus.\n\nBitte beachten Sie, dass Sie auch die automatische Sprachauswahl für jeden Benutzer mit dem Befehl /language_auto", "locale_choice": "Okay. Bitte wählen Sie die Sprache mit der Tastatur unten aus.\n\nBitte beachten Sie, dass Sie auch die automatische Sprachauswahl für jeden Benutzer mit dem Befehl /language_auto",
"permission_denied": "Dies ist Ihnen nicht erlaubt.", "permission_denied": "Dies ist Ihnen nicht erlaubt.",
"timeout_invalid_number": "Timeout muss ein ganzzahliger Wert im zwischen 10 und 600 (Sekunden) sein.",
"timeout_join_invalid": "Falsche Verwendung! Richtiges Beispiel:\n`/timeout_join SEKUNDEN`",
"timeout_join_set": "Join-Timeout wurde eingestellt: {timeout} Sek.",
"timeout_verify_invalid": "Falsche Verwendung! Richtiges Beispiel:\n`/timeout_verify SEKUNDEN`",
"timeout_verify_set": "Zeitüberschreitung für die Verifizierung wurde eingestellt: {timeout} Sek.",
"verify": "Bitte benutzen Sie die unten stehenden Tasten, um das Captcha auszufüllen. Tippen Sie auf die Tasten mit den Emojis, die Sie auf diesem Bild sehen.", "verify": "Bitte benutzen Sie die unten stehenden Tasten, um das Captcha auszufüllen. Tippen Sie auf die Tasten mit den Emojis, die Sie auf diesem Bild sehen.",
"welcome_verify": "Willkommen, {mention}! Um hier chatten zu können, müssen wir verifizieren, dass Sie ein Mensch sind. Bitte klicke auf die untenstehende Taste, um die Verifizierung zu starten.", "welcome_verify": "Willkommen, {mention}! Um hier chatten zu können, müssen wir verifizieren, dass Sie ein Mensch sind. Bitte klicke auf die untenstehende Taste, um die Verifizierung zu starten.",
"welcome": "Willkommen zum Chat, {mention}!" "welcome": "Willkommen zum Chat, {mention}!"

View File

@ -13,16 +13,23 @@
"help": "Show some helpful info", "help": "Show some helpful info",
"ban_failed": "Toggle ban on verification fail", "ban_failed": "Toggle ban on verification fail",
"language_auto": "Toggle automatic language selection", "language_auto": "Toggle automatic language selection",
"language": "Set bot's language in this group" "language": "Set bot's language in this group",
"timeout_join": "Set join timeout",
"timeout_verify": "Set verification timeout"
}, },
"messages": { "messages": {
"help": "Hi! This bot can help you protect against annoying bots by enforcing emoji captcha on join.\n\nIn order to it, add this bot to your desired group and provide it with **Delete Messages** and **Ban Users** permissions.\n\nAvailable commands:\n• /ban_failed - toggle banning on timeout or captcha fail\n• /language - change bot's language\n• /language_auto - toggle automatic per-user language\n\nCommands listed above must be executes in group by its admins or owner.\n\nThis bot is open source, so feel free to host it yourself or modify to your liking: https://git.end-play.xyz/profitroll/EmojiCaptchaBot\n\nIf you want to file an issue or make a suggestion visit bot's [issues page](https://git.end-play.xyz/profitroll/EmojiCaptchaBot/issues) on bot's git.\n\nHave a nice day :)", "help": "Hi! This bot can help you protect against annoying bots by enforcing emoji captcha on join.\n\nIn order to it, add this bot to your desired group and provide it with **Delete Messages** and **Ban Users** permissions.\n\nAvailable commands:\n• /ban_failed - toggle banning on timeout or captcha fail\n• /language - change bot's language\n• /language_auto - toggle automatic per-user language\n• /timeout_join - set timeout time on join (in seconds)\n• /timeout_verify - set timeout for verification (in seconds)\n\nCommands listed above must be executes in group by its admins or owner.\n\nThis bot is open source, so feel free to host it yourself or modify to your liking: https://git.end-play.xyz/profitroll/EmojiCaptchaBot\n\nIf you want to file an issue or make a suggestion visit bot's [issues page](https://git.end-play.xyz/profitroll/EmojiCaptchaBot/issues) on bot's git.\n\nHave a nice day :)",
"ban_failed_disabled": "Ban on fail has been **disabled**. If users ignore verification or fail it, they will remain read-only in the group.", "ban_failed_disabled": "Ban on fail has been **disabled**. If users ignore verification or fail it, they will remain read-only in the group.",
"ban_failed_enabled": "Ban on fail has been **enabled**. If users ignore verification or fail it, they will be immediately kicked from the group and banned.", "ban_failed_enabled": "Ban on fail has been **enabled**. If users ignore verification or fail it, they will be immediately kicked from the group and banned.",
"locale_auto_disabled": "Automatic language selection on per-user basis has been **disabled**. Please note that group's language will now be used. You can change it using /language. If \"Default\" language is set bot's default language ({default_locale}) will be used.", "locale_auto_disabled": "Automatic language selection on per-user basis has been **disabled**. Please note that group's language will now be used. You can change it using /language. If \"Default\" language is set bot's default language ({default_locale}) will be used.",
"locale_auto_enabled": "Automatic language selection on per-user basis has been **enabled**. Please note that if bot does not have a language pack for user group's or bot's default language will be used. You can change group's language using /language. If \"Default\" language is set bot's default language ({default_locale}) will be used.", "locale_auto_enabled": "Automatic language selection on per-user basis has been **enabled**. Please note that if bot does not have a language pack for user group's or bot's default language will be used. You can change group's language using /language. If \"Default\" language is set bot's default language ({default_locale}) will be used.",
"locale_choice": "Alright. Please choose the language using keyboard below.\n\nNote, that you can also enable automatic language selection on per-user basis using command /language_auto", "locale_choice": "Alright. Please choose the language using keyboard below.\n\nNote, that you can also enable automatic language selection on per-user basis using command /language_auto",
"permission_denied": "You are not allowed to do so.", "permission_denied": "You are not allowed to do so.",
"timeout_invalid_number": "Timeout must be an integer value in range 10 to 600 (seconds).",
"timeout_join_invalid": "Wrong usage! Correct example:\n`/timeout_join SECONDS`",
"timeout_join_set": "Join timeout has been set: {timeout} sec.",
"timeout_verify_invalid": "Wrong usage! Correct example:\n`/timeout_verify SECONDS`",
"timeout_verify_set": "Verification timeout has been set: {timeout} sec.",
"verify": "Please, use the buttons below to complete the captcha. Tap on the buttons with emojis you see on this image.", "verify": "Please, use the buttons below to complete the captcha. Tap on the buttons with emojis you see on this image.",
"welcome_verify": "Welcome, {mention}! In order to chat here, we need to verify you're a human. Please, press the button below to start the verification.", "welcome_verify": "Welcome, {mention}! In order to chat here, we need to verify you're a human. Please, press the button below to start the verification.",
"welcome": "Welcome to the chat, {mention}!" "welcome": "Welcome to the chat, {mention}!"

View File

@ -12,7 +12,9 @@
"help": "Показати корисну інформацію", "help": "Показати корисну інформацію",
"ban_failed": "Переключити бан при невдалій верифікації", "ban_failed": "Переключити бан при невдалій верифікації",
"language": "Встановити мову бота в цій групі", "language": "Встановити мову бота в цій групі",
"language_auto": "Переключити автоматичний вибір мови" "language_auto": "Переключити автоматичний вибір мови",
"timeout_join": "Встановити таймаут приєднання",
"timeout_verify": "Встановити таймаут перевірки"
}, },
"messages": { "messages": {
"help": "Привіт! Цей бот допоможе вам захиститися від настирливих ботів, запровадивши емодзі-капчу при вході в групу.\n\nДля цього додайте цього бота в потрібну вам групу і надайте йому права **Видаляти повідомлення** та **Банити користувачів**.\n\nДоступні команди:\n• /ban_failed - увімкнути заборону після таймауту або невдалого введення капчі\n• /language - змінити мову бота\n• /language_auto - перемкнути автоматичну мову для кожного користувача\n\nКоманди, перераховані вище, повинні виконуватися в групі її адміністраторами або власником.\n\nЦей бот має відкритий вихідний код, тому ви можете хостити його самостійно або модифікувати під себе: https://git.end-play.xyz/profitroll/EmojiCaptchaBot\n\nЯкщо ви хочете повідомити про проблему або внести пропозицію відвідайте [сторінку підтримки бота](https://git.end-play.xyz/profitroll/EmojiCaptchaBot/issues) на гіті бота.\n\nГарного дня :)", "help": "Привіт! Цей бот допоможе вам захиститися від настирливих ботів, запровадивши емодзі-капчу при вході в групу.\n\nДля цього додайте цього бота в потрібну вам групу і надайте йому права **Видаляти повідомлення** та **Банити користувачів**.\n\nДоступні команди:\n• /ban_failed - увімкнути заборону після таймауту або невдалого введення капчі\n• /language - змінити мову бота\n• /language_auto - перемкнути автоматичну мову для кожного користувача\n\nКоманди, перераховані вище, повинні виконуватися в групі її адміністраторами або власником.\n\nЦей бот має відкритий вихідний код, тому ви можете хостити його самостійно або модифікувати під себе: https://git.end-play.xyz/profitroll/EmojiCaptchaBot\n\nЯкщо ви хочете повідомити про проблему або внести пропозицію відвідайте [сторінку підтримки бота](https://git.end-play.xyz/profitroll/EmojiCaptchaBot/issues) на гіті бота.\n\nГарного дня :)",
@ -22,6 +24,11 @@
"locale_auto_enabled": "Автоматичний вибір мови для кожного користувача був **увімкнений**. Зверніть увагу, що якщо бот не має мовного пакета для користувача буде використовуватися мова групи або бота за замовчуванням. Ви можете змінити мову групи за допомогою /language. Якщо встановлено мову \"За замовчуванням\" буде використовуватися мова бота за замовчуванням ({default_locale}).", "locale_auto_enabled": "Автоматичний вибір мови для кожного користувача був **увімкнений**. Зверніть увагу, що якщо бот не має мовного пакета для користувача буде використовуватися мова групи або бота за замовчуванням. Ви можете змінити мову групи за допомогою /language. Якщо встановлено мову \"За замовчуванням\" буде використовуватися мова бота за замовчуванням ({default_locale}).",
"locale_choice": "Гаразд. Будь ласка, оберіть мову за допомогою клавіатури нижче.\n\nЗауважте, що ви також можете увімкнути автоматичний вибір мови для кожного користувача за допомогою команди /language_auto", "locale_choice": "Гаразд. Будь ласка, оберіть мову за допомогою клавіатури нижче.\n\nЗауважте, що ви також можете увімкнути автоматичний вибір мови для кожного користувача за допомогою команди /language_auto",
"permission_denied": "Вам не дозволено робити це.", "permission_denied": "Вам не дозволено робити це.",
"timeout_invalid_number": "Таймаут має бути цілим числом у діапазоні від 10 до 600 (секунд).",
"timeout_join_invalid": "Неправильне використання! Правильний приклад:\n`/timeout_join СЕКУНДИ`",
"timeout_join_set": "Встановлено тайм-аут приєднання: {timeout} сек.",
"timeout_verify_invalid": "Неправильне використання! Правильний приклад:\n`/timeout_verify СЕКУНДИ`",
"timeout_verify_set": "Встановлено таймаут перевірки: {timeout} сек.",
"verify": "Будь ласка, використовуйте кнопки нижче, щоб заповнити капчу. Натисніть на кнопки зі смайликами, які ви бачите на цьому зображенні.", "verify": "Будь ласка, використовуйте кнопки нижче, щоб заповнити капчу. Натисніть на кнопки зі смайликами, які ви бачите на цьому зображенні.",
"welcome_verify": "Ласкаво просимо, {mention}! Для того, щоб спілкуватися в чаті, ми повинні переконатися, що ви людина. Будь ласка, натисніть кнопку нижче, щоб почати перевірку.", "welcome_verify": "Ласкаво просимо, {mention}! Для того, щоб спілкуватися в чаті, ми повинні переконатися, що ви людина. Будь ласка, натисніть кнопку нижче, щоб почати перевірку.",
"welcome": "Ласкаво просимо до чату, {mention}!" "welcome": "Ласкаво просимо до чату, {mention}!"

View File

@ -72,6 +72,5 @@ async def callback_verify(app: PyroClient, callback: CallbackQuery):
kick_unverified, kick_unverified,
"date", "date",
[app, user.id, group.id, captcha_message.id], [app, user.id, group.id, captcha_message.id],
run_date=datetime.now() run_date=datetime.now() + timedelta(seconds=group.timeout_verify),
+ timedelta(seconds=app.config["timeouts"]["verify"]),
) )

View File

@ -0,0 +1,55 @@
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(["timeout_join"], prefixes=["/"]) # type: ignore
)
async def command_timeout_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 (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 len(message.command) < 2 or not message.command[1].isdigit():
await message.reply_text(
app._("timeout_join_invalid", "messages", locale=locale), quote=True
)
return
timeout = int(message.command[1])
if timeout < 10 or timeout > 600:
await message.reply_text(
app._("timeout_invalid_number", "messages", locale=locale), quote=True
)
return
await message.reply_text(
app._("timeout_join_set", "messages", locale=locale).format(timeout=timeout)
)
logger.info(
"Timeout on join in group %s has been set to %s",
group.id,
timeout,
)
await group.set_timeout_join(timeout)

View File

@ -0,0 +1,55 @@
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(["timeout_verify"], prefixes=["/"]) # type: ignore
)
async def command_timeout_verify(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 len(message.command) < 2 or not message.command[1].isdigit():
await message.reply_text(
app._("timeout_verify_invalid", "messages", locale=locale), quote=True
)
return
timeout = int(message.command[1])
if timeout < 10 or timeout > 600:
await message.reply_text(
app._("timeout_invalid_number", "messages", locale=locale), quote=True
)
return
await message.reply_text(
app._("timeout_verify_set", "messages", locale=locale).format(timeout=timeout)
)
logger.info(
"Verification timeout in group %s has been set to %s",
group.id,
timeout,
)
await group.set_timeout_verify(timeout)