diff --git a/src/SqlModels.py b/src/SqlModels.py index 244ae9f..06a36c3 100644 --- a/src/SqlModels.py +++ b/src/SqlModels.py @@ -1,14 +1,7 @@ from peewee import Model, SqliteDatabase, IntegerField, DoubleField, DoesNotExist -conn = SqliteDatabase('sqlite3.db') - -class BaseModel(Model): - class Meta: - database = conn - - -class Users(BaseModel): +class Users(Model): id = IntegerField(null=True) user_id = IntegerField() @@ -18,15 +11,4 @@ class Users(BaseModel): class Meta: table_name = 'users' - - -if __name__ == '__main__': - try: - user = Users.get(Users.id == 1) - except DoesNotExist: - user = Users(user_id=1) - - user.warns += 1 - user.save() - - print("test:", user.warns) + database = SqliteDatabase('sqlite3.db') diff --git a/src/main.py b/src/main.py index 19afc89..4e3a996 100644 --- a/src/main.py +++ b/src/main.py @@ -18,15 +18,16 @@ tools = Tools(config, dp) @dp.message_handler(commands=['admins']) async def bot_admins(msg: types.Message): + log.info(f"New message from {msg.from_user.id}({msg.from_user.username}) in {msg.chat.id}: '{msg.text}'") message = "Администраторы нашего сообщества:\n%(owner)-s" - admin_list = await bot.get_chat_administrators(config.remote_chat) + admins = await tools.admins i = 1 - for admin_object in admin_list: + for admin_object in admins['list']: user = admin_object['user'] status = admin_object['status'].replace("administrator", "Администратор").replace("creator", "Создатель:") if status == "Администратор": if not user['is_bot']: - message += f"`{i}. {status+':'}` `@{user['username']}`\n" + message += f"`{i}. {status + ':'}` `@{user['username']}`\n" i += 1 else: message %= {"owner": f"`0. {status:14}` `@{user['username']}`\n"} @@ -34,6 +35,41 @@ async def bot_admins(msg: types.Message): await msg.reply(message, parse_mode=ParseMode.MARKDOWN) +@dp.message_handler(regexp=r"\A(?:.|\/)(?:warn|пред)", is_chat_admin=True) +async def wanrs(msg: types.Message): + log.info(f"New message from {msg.from_user.id}({msg.from_user.username}) in {msg.chat.id}: '{msg.text}'") + reply_message = msg.reply_to_message + + if reply_message: + warn_user = reply_message.from_user + user_id = warn_user.id + user_username = warn_user.username + + message = await tools.add_warn(user_id, user_username, msg.chat.id) + + else: + message = "Сначала надо выбрать пользователя." + + await msg.reply(message, parse_mode=ParseMode.MARKDOWN) + + +@dp.message_handler(regexp=r"\A(?:.|\/)(?:reset|прости)", is_chat_admin=True) +async def unwarn(msg): + log.info(f"New message from {msg.from_user.id}({msg.from_user.username}) in {msg.chat.id}: '{msg.text}'") + reply_message = msg.reply_to_message + + if reply_message: + warn_user = reply_message.from_user + user_id = warn_user.id + user_username = warn_user.username + + message = await tools.reset_warn(user_id, user_username) + else: + message = "Сначала надо выбрать пользователя." + + await msg.reply(message, parse_mode=ParseMode.MARKDOWN) + + tools.bind_static_messages() if __name__ == '__main__': diff --git a/src/tools.py b/src/tools.py index e87935d..e29e5ef 100644 --- a/src/tools.py +++ b/src/tools.py @@ -1,7 +1,10 @@ import logging +import time import aiogram +from peewee import DoesNotExist +from SqlModels import Users from config import Config static_log = logging.getLogger('static messages') @@ -13,6 +16,7 @@ class Tools: self.log = logging.getLogger("bot tools") self.config = config self.dispatcher = dispatcher + self.__admins: dict = {} @staticmethod async def __message_handler(msg: aiogram.types.Message, **kwargs): @@ -35,3 +39,56 @@ class Tools: __messages_keys__ = list(__messages__.keys()) l = lambda *x: self.__message_handler(*x, __messages__=__messages__) self.dispatcher.register_message_handler(l, commands=__messages_keys__) + + async def _update_admins_list(self): + admins = await self.dispatcher.bot.get_chat_administrators(self.config.remote_chat) + ids = list() + for admin in admins: + ids.append(admin['user']['id']) + self.__admins = { + "time": time.time()+60.0, + "object": {"list": admins, "ids": ids} + } + + @property + async def admins(self): + if not self.__admins: + await self._update_admins_list() + elif time.time() >= self.__admins.get("time"): + await self._update_admins_list() + + return self.__admins['object'] + + async def add_warn(self, user_id, user_username, chat_id): + try: + user = Users.get(Users.user_id == user_id) + except DoesNotExist: + user = Users(user_id=user_id) + user.warns += 1 + user.save() + if user.warns > 3: + try: + await self.dispatcher.bot.kick_chat_member(chat_id, user_id) + message = f"@{user_username} вёл себя плохо, поэтому теперь он иключён!" + except Exception as e: + message = f"Ошибка при исключении @{user_username}.\nException: `{e}`" + else: + message = f"@{user_username}, вы получили {user.warns} из 3 предупреждений.\nВпредь ведите себя лучше!" + + return message + + @classmethod + async def reset_warn(cls, user_id, username): + try: + user = Users.get(Users.user_id == user_id) + except DoesNotExist: + user = Users(user_id=user_id) + + if user.warns == 0: + message = f"У пользователя @{username} нет предупреждений!" + else: + message = f"Извини @{username}...\nТеперь у тебя 0 из 3 предупреждений." + user.warns = 0 + user.save() + + return message