diff --git a/src/modules/standard/moderation/__init__.py b/src/modules/standard/moderation/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/modules/standard/moderation/info.json b/src/modules/standard/moderation/info.json new file mode 100644 index 0000000..ae7e52a --- /dev/null +++ b/src/modules/standard/moderation/info.json @@ -0,0 +1,6 @@ +{ + "name": "Moderation", + "description": "Moderation commands for OCAB", + "author": "OCAB Team", + "version": "1.0" +} \ No newline at end of file diff --git a/src/modules/standard/moderation/moderation.py b/src/modules/standard/moderation/moderation.py new file mode 100644 index 0000000..1cba35e --- /dev/null +++ b/src/modules/standard/moderation/moderation.py @@ -0,0 +1,113 @@ +import asyncio +import aiohttp +import aiogram +import time +from ...standard.config.config import * +from ...standard.roles.roles import * + + + +class Moderation: + def __init__(self): + access_rights = get_access_rights() + bot_check_message = bool(self.access_rights["BOT_CHECK_MESSAGE"]) + bot_ban_user = bool(self.access_rights["BOT_BAN_USER"]) + bot_mute_user = bool(self.access_rights["BOT_MUTE_USER"]) + moderator_rights = self.access_rights["MODERATOR_RIGHTS"] + ai_check_message = bool(self.access_rights["AI_CHECK_MESSAGE"]) + beta_ai_check_message = bool(self.access_rights["BETA_AI_CHECK_MESSAGE"]) + + async def time_to_seconds(time): + # Конвертация текстового указания времени по типу 3h, 5m, 10s в минуты + if time[-1] == 'd': + return int(time[:-1]) * 86400 + elif time[-1] == 'h': + return int(time[:-1]) * 3600 + elif time[-1] == 'm': + return int(time[:-1]) * 60 + elif time[-1] == 's': + return int(time[:-1]) + + async def short_time_to_time(self, time): + # Конвертация времени в длинное название + if time[-1] == 'd': + return str(f"{time[0:-1]} дней") + elif time[-1] == 'h': + return str(f"{time[0:-1]} часов") + elif time[-1] == 'm': + return str(f"{time[0:-1]} минут") + elif time[-1] == 's': + return str(f"{time[0:-1]} секунд") + + async def delete_message(self, chat_id, message_id, bot: aiogram.Bot): + await bot.delete_message(chat_id, message_id) + + async def ban_user(self, chat_id, user_id, bot: aiogram.Bot): + await bot.ban_chat_member(chat_id, user_id) + + async def mute_user(self, message, chat_id, user_id, bot: aiogram.Bot, time=0): + # Проверка что отправитель является администратором чата + # Проверяем мин + try: + if check_admin_permission(message.from_user.id): + # Проверка отвечает ли сообщение на другое сообщение + if message.reply_to_message is not None: + time = message.text.split(' ')[1] + # получаем id отправителя сообщение на которое отвечает message + target_id = message.reply_to_message.from_user.id + target_name = \ + cursor.execute("SELECT user_name FROM user_list WHERE user_id = ?", (target_id,)).fetchone()[0] + # Проверка, что человек пользователь + if cursor.execute("SELECT user_role FROM user_list WHERE user_id = ?", (target_id,)).fetchone()[ + 0] == 0: + # ограничения прав пользователя по отправке сообщений на time секунд + time_sec = await time_to_seconds(message.text.split(' ')[1]) + if time_sec <= 30 or time_sec >= 31536000: + await message.reply("Время мута должно быть больше 30 секунд и меньше 365 дней") + return + date_string = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") + date_time = datetime.datetime.strptime(date_string, "%Y-%m-%d %H:%M:%S") + unix_time = int(mktime(date_time.timetuple())) + await bot.restrict_chat_member(message.chat.id, target_id, until_date=unix_time + time_sec, + permissions=types.ChatPermissions(can_send_messages=False)) + await message.reply( + f"Пользователь {target_name} замьючен на {await short_time_to_time(time)}") + else: + await message.reply( + f"Пользователь [{target_name}](tg://user?id={target_id}) является {await get_role(target_id)} и не может быть замьючен", + parse_mode='Markdown') + return + else: + target_tag = message.text.split(' ')[1] + target_tag = target_tag[1:] + target_id = int( + cursor.execute("SELECT user_id FROM user_list WHERE user_name = ?", (target_tag,)).fetchone()[ + 0]) + target_name = \ + cursor.execute("SELECT user_name FROM user_list WHERE user_id = ?", (target_id,)).fetchone()[0] + # ограничения прав пользователя по отправке сообщений на time секунд + time_mute = message.text.split(' ')[2] + + if cursor.execute("SELECT user_role FROM user_list WHERE user_id = ?", (target_id,)).fetchone()[ + 0] == 0: + # ограничения прав пользователя по отправке сообщений на time секунд + time_sec = await time_to_seconds(message.text.split(' ')[2]) + if time_sec <= 30 or time_sec >= 31536000: + await message.reply("Время мута должно быть больше 30 секунд и меньше 365 дней") + return + date_string = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") + date_time = datetime.datetime.strptime(date_string, "%Y-%m-%d %H:%M:%S") + unix_time = int(mktime(date_time.timetuple())) + await bot.restrict_chat_member(message.chat.id, target_id, until_date=unix_time + time_sec, + permissions=types.ChatPermissions(can_send_messages=False)) + await message.reply( + f"Пользователь {target_name} замьючен на {await short_time_to_time(time_mute)}.") + else: + await message.reply( + f"Пользователь [{target_name}](tg://user?id={target_id}) является {await get_role(target_id)} и не может быть замьючен", + parse_mode="Markdown") + return + except: + await message.reply("Ошибка данных. Возможно пользователь ещё ничего не написал.") + +