From b5c86fb6cda71334cd3ac7ca4347686982ee1f24 Mon Sep 17 00:00:00 2001 From: Mootfrost777 Date: Wed, 24 Aug 2022 16:49:58 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B5=D0=BF=D0=BE=D1=80=D1=82=D1=8B,=20?= =?UTF-8?q?=D0=B8=D1=81=D0=BA=D0=BB=D1=8E=D1=87=D0=B5=D0=BD=D0=B8=D1=8F,?= =?UTF-8?q?=20=D0=B1=D0=B0=D0=BD=20=D1=81=D1=82=D0=B8=D0=BA=D0=B5=D1=80?= =?UTF-8?q?=D0=BE=D0=B2,=20=D0=B2=D1=81=D0=B5=20=D0=B2=20=D0=BE=D0=B1?= =?UTF-8?q?=D1=89=D0=B5=D0=BC.=20=D0=AF=20=D1=82=D0=B0=D0=BA=20=D0=B8=20?= =?UTF-8?q?=D0=BD=D0=B5=20=D0=BA=D0=BE=D0=BC=D0=B8=D1=87=D1=83=20=D1=87?= =?UTF-8?q?=D0=B0=D1=89=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db.py | 12 ++------- df_utils.py | 2 +- main.py | 72 ++++++++++++++++++++++++++++++++--------------------- 3 files changed, 46 insertions(+), 40 deletions(-) diff --git a/db.py b/db.py index 97151fb..67dfcdd 100644 --- a/db.py +++ b/db.py @@ -33,25 +33,17 @@ async def create_table(): conn = await aiosqlite.connect('db.sqlite') cursor = await conn.cursor() - await cursor.execute('''CREATE TABLE IF NOT EXISTS chats ( - id INTEGER PRIMARY KEY, - chat_id INTEGER NOT NULL - )''') - await cursor.execute("""CREATE TABLE IF NOT EXISTS user_exceptions ( id INTEGER PRIMARY KEY, user_id INTEGER NOT NULL, - chat_id INTEGER NOT NULL, - FOREIGN KEY(chat_id) REFERENCES chats(chat_id) + chat_id INTEGER NOT NULL )""") await cursor.execute("""CREATE TABLE IF NOT EXISTS banned_stickerpacks ( id INTEGER PRIMARY KEY, pack_id INTEGER NOT NULL, - chat_id INTEGER NOT NULL, - FOREIGN KEY(chat_id) REFERENCES chats(chat_id) + chat_id INTEGER NOT NULL )""") await cursor.close() await conn.close() - diff --git a/df_utils.py b/df_utils.py index cd7ed97..173069e 100644 --- a/df_utils.py +++ b/df_utils.py @@ -2,7 +2,7 @@ from google.cloud import dialogflow_v2beta1 as dialogflow from dotenv import load_dotenv -load_dotenv() +load_dotenv('.env') async def detect_intent_text(project_id, session_id, text, language_code): diff --git a/main.py b/main.py index 5817046..2b3669d 100644 --- a/main.py +++ b/main.py @@ -1,8 +1,10 @@ from telethon import TelegramClient, events -from telethon import functions, types +from telethon import types from datetime import timedelta from db import DBAction, db_action, create_table +import aiosqlite + from df_utils import detect_intent_text import random @@ -11,29 +13,12 @@ import asyncio import os from dotenv import load_dotenv +load_dotenv() bot = TelegramClient(os.environ['SESSION_NAME'], int(os.environ['API_ID']), os.environ['API_HASH']).start(bot_token=os.environ['BOT_TOKEN']) -async def check_admin(msg): - """Checks if a user is an admin in the chat""" - return any([user.id == msg.sender_id async for user in bot.iter_participants(msg.chat_id, - filter=types.ChannelParticipantsAdmins)]) - - -@bot.on(events.NewMessage()) -async def on_message(msg): - """Handle DM and add chat id to database if not exists""" - if msg.is_private: - await msg.respond('Я не работаю в личных сообщениях. Добавь меня в группу, для начала работы') - raise events.StopPropagation - - chats = await db_action('SELECT chat_id FROM chats', (), DBAction.fetchall) - 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) - - @bot.on(events.NewMessage(pattern='/help')) async def on_help(msg): """Send detailed help message""" @@ -41,10 +26,34 @@ async def on_help(msg): '/help - помощь\n' '/bs [add/rm] - запретить, разрешить стикерпак в группе, можно написать в ответ на стикер из нужного стикерпака\n' '/exc [add/rm] [id пользователя/@упомянуть пользователя/"me"] - сделать пользователя неприкасаемым для бота, можно написать в ответ на любое сообщение нужного пользователя\n' - '/report в ответ на сообщение бота отправляет отчет об ошибке распознавания запрещенных слов разработчику, если отправил администратор, размучивает пользователя') + '/report в ответ на сообщение, отправляет отчет об ошибке распознавания запрещенных слов разработчику, если отправил администратор, размучивает пользователя') raise events.StopPropagation +@bot.on(events.NewMessage()) +async def check_dm(msg): + if msg.is_private: + await msg.reply('Привет!, я не работаю в личных сообщениях. Добавь меня в группу и мы будем избавляться от вагонов вместе!') + raise events.StopPropagation + + +async def check_admin(msg): + """Checks if a user is an admin in the chat""" + return any([user.id == msg.sender_id async for user in bot.iter_participants(msg.chat_id, + filter=types.ChannelParticipantsAdmins)]) + + +@bot.on(events.NewMessage(pattern='/report')) +async def on_report(msg): + """Send detection error report""" + if msg.is_reply: + reply_message = await msg.get_reply_message() + await bot.edit_permissions(msg.chat_id, reply_message.sender_id, send_messages=True) + await bot.send_message(msg.chat_id, 'пользователь размучен.') + else: + await msg.reply('Ответь командой на сообщение, которое было неправильно распознано, чтобы отправить отчет об ошибке и размутить пользователя') + + async def check_user_in_exceptions(user_id, chat_id): """Checks if a user is in the exceptions list""" return await db_action('SELECT id FROM user_exceptions WHERE user_id = ? AND chat_id = ?', (user_id, chat_id), @@ -133,7 +142,7 @@ async def manage_stickerpack(msg): elif msg.is_reply and len(args) > 1: reply_message = await msg.get_reply_message() if not reply_message.sticker: - await msg.reply('Ответь сообщением с командой именно на стикер, не на медиафайл или текст') + await msg.reply('Ответьте сообщением с командой именно на стикер, не на медиафайл или текст') raise events.StopPropagation for attr in reply_message.media.document.attributes: @@ -141,7 +150,7 @@ async def manage_stickerpack(msg): stickerpack_id = attr.stickerset.id break else: - await msg.reply('Неверный синтаксисю Вы можете использовать: /bs [add/rm] [stickerpack_id], или ответить сообщением с командой на стикер') + await msg.reply('Неверный синтаксис. Вы можете использовать: /bs [add/rm] [stickerpack_id] или ответить сообщением с командой на стикер') raise events.StopPropagation match args[1]: @@ -172,26 +181,31 @@ 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.message: - resp = await detect_intent_text(os.environ['GOOGLE_PROJECT_ID'], msg.chat_id, msg.raw_text, os.environ['GOOGLE_MODEL_LANGUAGE']) + if msg.text: + 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) + await msg.reply(random.choice(['Харе уже свои вагоны слать', + 'Вагончиками балуемся?', + 'Вагоны тут не приветствуются', + 'Надоел уже со своими вагонами'])) + await msg.respond('Бот работает в режиме обучения, напишите /report в ответ на сообщение, если оно не было распознано или распознано по ошибке') + await bot.edit_permissions(msg.chat_id, msg.sender_id, timedelta(minutes=10), send_messages=False) + raise events.StopPropagation 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, types.DocumentAttributeSticker)]): + await bot.edit_permissions(msg.chat_id, msg.sender_id, timedelta(minutes=10), send_messages=False) await msg.reply(random.choice(['Ай-ай-ай, стикеры с вагончиками, не хорошо', 'Стикерами с вагонами балуемся? Негоже так делать', 'Надоел уже со своими вагонами', - 'Щас высажу с поезда, будете тут бегать и про номерные свои кричать!'])) - await bot.edit_permissions(msg.chat_id, msg.sender_id, timedelta(minutes=5), send_messages=False) + 'Щас высажу с поезда, будете тут про номерные свои кричать!'])) async def main(): - load_dotenv() await create_table() await bot.run_until_disconnected()