diff --git a/db.py b/db.py index 2838ac0..97151fb 100644 --- a/db.py +++ b/db.py @@ -19,7 +19,7 @@ async def db_action(sql: str, args: tuple, action: DBAction): elif action == DBAction.fetchall: result = await cursor.fetchall() elif action == DBAction.commit: - conn.commit() + await conn.commit() result = cursor.lastrowid await cursor.close() diff --git a/main.py b/main.py index a500544..ddba604 100644 --- a/main.py +++ b/main.py @@ -15,48 +15,47 @@ from dotenv import load_dotenv bot = TelegramClient(os.environ['SESSION_NAME'], int(os.environ['API_ID']), os.environ['API_HASH']).start(bot_token=os.environ['BOT_TOKEN']) + load_dotenv() asyncio.get_event_loop().run_until_complete(create_table()) async def check_admin(msg): - if not any([user.id == msg.sender_id async for user in bot.iter_participants(msg.chat_id, - filter=ChannelParticipantsAdmins)]): - await msg.reply('Эту команду может только администратор использовать') - raise events.StopPropagation + return any([user.id == msg.sender_id async for user in bot.iter_participants(msg.chat_id, + filter=ChannelParticipantsAdmins)]) @bot.on(events.NewMessage()) async def on_message(msg): chats = await db_action('SELECT chat_id FROM chats', (), DBAction.fetchall) - if msg.chat_id not in chats: + if not any([msg.chat_id == chat[0] for chat in chats]): await db_action('INSERT INTO chats (chat_id) VALUES (?)', (msg.chat_id,), DBAction.commit) async def check_user_in_exceptions(user_id, chat_id): """Checks if a user is in the exceptions list""" - return db_action('SELECT id FROM user_exceptions WHERE user_id = ? AND chat_id = ?', (user_id, chat_id), - DBAction.fetchone) is not None + return await db_action('SELECT id FROM user_exceptions WHERE user_id = ? AND chat_id = ?', (user_id, chat_id), + DBAction.fetchone) is not None @bot.on(events.NewMessage(pattern='/exception')) async def on_exception(msg): - await check_admin(msg) - - args = msg.message.text.split(' ') - if len(args) < 4: - await msg.reply('Неверный формат') + if not await check_admin(msg): + await msg.reply('Добавлять пользователей в исключения может только админ') raise events.StopPropagation - if args[2]: + args = msg.message.text.split(' ') + + if len(args) > 2: if args[2] == 'me': user_id = msg.sender_id else: user_id = args[2] - elif msg.reply_to_message: - user_id = msg.reply_to_message.sender_id + elif msg.is_reply: + reply_message = await msg.get_reply_message() + user_id = reply_message.sender_id else: - await msg.reply('Допиши к команде айди пользователя, "me", чтобы добавить себя, или ответь командой на сообщение нужного пользователя') + await msg.reply('Допиши к команде: айди пользователя, "me", чтобы добавить себя, или ответь командой на сообщение нужного пользователя') raise events.StopPropagation match args[1]: @@ -65,61 +64,79 @@ async def on_exception(msg): await msg.reply('Пользователь уже есть в списке исключений') raise events.StopPropagation - await db_action('INSERT INTO user_exceptions (user_id) VALUES (?)', (user_id,), DBAction.commit) + await db_action('INSERT INTO user_exceptions (user_id, chat_id) VALUES (?, ?)', (user_id, msg.chat_id,), + DBAction.commit) await msg.reply('Пользователь добавлен в исключения, теперь его сообщения не будут проверяться ботом') case 'remove': if not await check_user_in_exceptions(user_id, msg.chat_id): await msg.reply('Пользователя пока нет в исключениях') raise events.StopPropagation - await db_action('DELETE FROM user_exceptions WHERE user_id = ?', (user_id,), DBAction.commit) + await db_action('DELETE FROM user_exceptions WHERE user_id = ? AND chat_id = ?', (user_id, msg.chat_id,), + DBAction.commit) await msg.reply('Пользователь удален из списка исключений') -@bot.on(events.NewMessage(pattern='/addstickerpack')) +@bot.on(events.NewMessage(pattern='/bansticker')) async def add_stickerpack(msg): - await check_admin(msg) + if not await check_admin(msg): + await msg.reply('Добавлять стикеры в банлист может только админ') + raise events.StopPropagation args = msg.text.split() - if args[1]: + if len(args) > 1: stickerpack_id = args[1] - elif msg.reply_to_message.sticker: - for attr in msg.sticker.attributes: + elif msg.is_reply: + reply_message = await msg.get_reply_message() + if not reply_message.sticker: + await msg.reply('Ответь сообщением с командой именно на стикер') + raise events.StopPropagation + + for attr in reply_message.media.document.attributes: if isinstance(attr, DocumentAttributeSticker): stickerpack_id = attr.stickerset.id break else: - msg.reply('Допиши к команде айди набора стикеров или ответь командой на стикер из набора') + await msg.reply('Допиши к команде айди набора стикеров или ответь командой на стикер из набора') raise events.StopPropagation if await db_action("SELECT * FROM banned_stickerpacks WHERE pack_id = ? AND chat_id = ?", (stickerpack_id, msg.chat_id,), DBAction.fetchone) is None: await db_action("INSERT INTO banned_stickerpacks (pack_id, chat_id) VALUES (?, ?)", (stickerpack_id, msg.chat_id,), DBAction.commit) - await msg.reply(f"Стикерпак с айди {msg.text.split(' ')[1]} добавлен в банлист") + await msg.reply(f"Стикерпак с айди {stickerpack_id} добавлен в банлист") else: - await msg.reply(f"Стикерпак с айди {msg.text.split(' ')[1]} уже в банлисте") + await msg.reply(f"Стикерпак с айди {stickerpack_id} уже в банлисте") raise events.StopPropagation -async def on_banword(msg): - await bot.edit_permissions(msg.chat_id, msg.sender_id, timedelta(minutes=5), send_messages=False) - await msg.reply(random.choice(['Харе про вагоны писать', 'Надоел уже со своими номерными', 'Никаких вагонов тут нет'])) - - @bot.on(events.NewMessage()) -async def handler(msg): +async def process_message(msg): + + """if await check_admin(msg) or await check_user_in_exceptions(msg.sender_id, msg.chat_id): + return""" + if msg.is_private: - await msg.respond('Hello! Add me to a group to start using me!') - return + await msg.respond('Я не работаю в личных сообщениях. Добавь меня в группу, пожалуйста') + raise events.StopPropagation - await msg.reply(await detect_intent_text(os.environ['GOOGLE_PROJECT_ID'], msg.chat_id, msg.raw_text, 'ru')) + if msg.message: + resp = await detect_intent_text(os.environ['GOOGLE_PROJECT_ID'], msg.chat_id, msg.raw_text, os.environ['GOOGLE_MODEL_LANGUAGE']) + if resp: + await msg.reply(resp) + await bot.edit_permissions(msg.chat_id, msg.sender_id, timedelta(minutes=5), send_messages=False) + raise events.StopPropagation - banstickerpacks = [stickerpack[0] for stickerpack in db_action('SELECT pack_id FROM banned_stickerpacks', (), DBAction.fetchall)] - - if msg.sticker and any([x.stickerset.id in banstickerpacks for x in msg.sticker.attributes if isinstance(x, DocumentAttributeSticker)]): - await on_banword(msg) + if msg.sticker: + banstickerpacks = [stickerpack[0] for stickerpack in await db_action('SELECT pack_id FROM banned_stickerpacks WHERE chat_id = ?', + (msg.chat_id,), DBAction.fetchall)] + if any([x.stickerset.id in banstickerpacks for x in msg.sticker.attributes if isinstance(x, DocumentAttributeSticker)]): + await msg.reply(random.choice(['Ай-ай-ай, стикеры с вагончиками, не хорошо', + 'Стикерами с вагонами балуемся? Негоже так делать', + 'Надоел уже со своими вагонами', + 'Щас высажу с поезда, будете тут бегать и про номерные свои кричать!'])) + await bot.edit_permissions(msg.chat_id, msg.sender_id, timedelta(minutes=5), send_messages=False) bot.run_until_disconnected() diff --git a/requirements.txt b/requirements.txt index 46eec51..f5055c8 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,4 @@ telethon -pymorphy2 -pyenchant +aiosqlite google-cloud-dialogflow python-dotenv \ No newline at end of file