Репорты, исключения, бан стикеров, все в общем. Я так и не комичу чаще

This commit is contained in:
Mootfrost777 2022-08-24 16:49:58 +03:00
parent 9460100295
commit b5c86fb6cd
3 changed files with 46 additions and 40 deletions

12
db.py
View file

@ -33,25 +33,17 @@ async def create_table():
conn = await aiosqlite.connect('db.sqlite') conn = await aiosqlite.connect('db.sqlite')
cursor = await conn.cursor() 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 ( await cursor.execute("""CREATE TABLE IF NOT EXISTS user_exceptions (
id INTEGER PRIMARY KEY, id INTEGER PRIMARY KEY,
user_id INTEGER NOT NULL, user_id INTEGER NOT NULL,
chat_id INTEGER NOT NULL, chat_id INTEGER NOT NULL
FOREIGN KEY(chat_id) REFERENCES chats(chat_id)
)""") )""")
await cursor.execute("""CREATE TABLE IF NOT EXISTS banned_stickerpacks ( await cursor.execute("""CREATE TABLE IF NOT EXISTS banned_stickerpacks (
id INTEGER PRIMARY KEY, id INTEGER PRIMARY KEY,
pack_id INTEGER NOT NULL, pack_id INTEGER NOT NULL,
chat_id INTEGER NOT NULL, chat_id INTEGER NOT NULL
FOREIGN KEY(chat_id) REFERENCES chats(chat_id)
)""") )""")
await cursor.close() await cursor.close()
await conn.close() await conn.close()

View file

@ -2,7 +2,7 @@ from google.cloud import dialogflow_v2beta1 as dialogflow
from dotenv import load_dotenv from dotenv import load_dotenv
load_dotenv() load_dotenv('.env')
async def detect_intent_text(project_id, session_id, text, language_code): async def detect_intent_text(project_id, session_id, text, language_code):

72
main.py
View file

@ -1,8 +1,10 @@
from telethon import TelegramClient, events from telethon import TelegramClient, events
from telethon import functions, types from telethon import types
from datetime import timedelta from datetime import timedelta
from db import DBAction, db_action, create_table from db import DBAction, db_action, create_table
import aiosqlite
from df_utils import detect_intent_text from df_utils import detect_intent_text
import random import random
@ -11,29 +13,12 @@ import asyncio
import os import os
from dotenv import load_dotenv from dotenv import load_dotenv
load_dotenv()
bot = TelegramClient(os.environ['SESSION_NAME'], int(os.environ['API_ID']), bot = TelegramClient(os.environ['SESSION_NAME'], int(os.environ['API_ID']),
os.environ['API_HASH']).start(bot_token=os.environ['BOT_TOKEN']) 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')) @bot.on(events.NewMessage(pattern='/help'))
async def on_help(msg): async def on_help(msg):
"""Send detailed help message""" """Send detailed help message"""
@ -41,10 +26,34 @@ async def on_help(msg):
'/help - помощь\n' '/help - помощь\n'
'/bs [add/rm] <id стикерапка> - запретить, разрешить стикерпак в группе, можно написать в ответ на стикер из нужного стикерпака\n' '/bs [add/rm] <id стикерапка> - запретить, разрешить стикерпак в группе, можно написать в ответ на стикер из нужного стикерпака\n'
'/exc [add/rm] [id пользователя/@упомянуть пользователя/"me"] - сделать пользователя неприкасаемым для бота, можно написать в ответ на любое сообщение нужного пользователя\n' '/exc [add/rm] [id пользователя/@упомянуть пользователя/"me"] - сделать пользователя неприкасаемым для бота, можно написать в ответ на любое сообщение нужного пользователя\n'
'/report в ответ на сообщение бота отправляет отчет об ошибке распознавания запрещенных слов разработчику, если отправил администратор, размучивает пользователя') '/report в ответ на сообщение, отправляет отчет об ошибке распознавания запрещенных слов разработчику, если отправил администратор, размучивает пользователя')
raise events.StopPropagation 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): async def check_user_in_exceptions(user_id, chat_id):
"""Checks if a user is in the exceptions list""" """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), 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: elif msg.is_reply and len(args) > 1:
reply_message = await msg.get_reply_message() reply_message = await msg.get_reply_message()
if not reply_message.sticker: if not reply_message.sticker:
await msg.reply('Ответь сообщением с командой именно на стикер, не на медиафайл или текст') await msg.reply('Ответьте сообщением с командой именно на стикер, не на медиафайл или текст')
raise events.StopPropagation raise events.StopPropagation
for attr in reply_message.media.document.attributes: for attr in reply_message.media.document.attributes:
@ -141,7 +150,7 @@ async def manage_stickerpack(msg):
stickerpack_id = attr.stickerset.id stickerpack_id = attr.stickerset.id
break break
else: else:
await msg.reply('Неверный синтаксисю Вы можете использовать: /bs [add/rm] [stickerpack_id], или ответить сообщением с командой на стикер') await msg.reply('Неверный синтаксис. Вы можете использовать: /bs [add/rm] [stickerpack_id] или ответить сообщением с командой на стикер')
raise events.StopPropagation raise events.StopPropagation
match args[1]: 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): """if await check_admin(msg) or await check_user_in_exceptions(msg.sender_id, msg.chat_id):
return""" return"""
if msg.message: if msg.text:
resp = await detect_intent_text(os.environ['GOOGLE_PROJECT_ID'], msg.chat_id, msg.raw_text, os.environ['GOOGLE_MODEL_LANGUAGE']) resp = await detect_intent_text(os.environ['GOOGLE_PROJECT_ID'], msg.chat_id, msg.raw_text,
os.environ['GOOGLE_MODEL_LANGUAGE'])
if resp: if resp:
await msg.reply(resp) await msg.reply(random.choice(['Харе уже свои вагоны слать',
await bot.edit_permissions(msg.chat_id, msg.sender_id, timedelta(minutes=5), send_messages=False) 'Вагончиками балуемся?',
'Вагоны тут не приветствуются',
'Надоел уже со своими вагонами']))
await msg.respond('Бот работает в режиме обучения, напишите /report в ответ на сообщение, если оно не было распознано или распознано по ошибке')
await bot.edit_permissions(msg.chat_id, msg.sender_id, timedelta(minutes=10), send_messages=False)
raise events.StopPropagation raise events.StopPropagation
if msg.sticker: if msg.sticker:
banstickerpacks = [stickerpack[0] for stickerpack in await db_action('SELECT pack_id FROM banned_stickerpacks WHERE chat_id = ?', banstickerpacks = [stickerpack[0] for stickerpack in await db_action('SELECT pack_id FROM banned_stickerpacks WHERE chat_id = ?',
(msg.chat_id,), DBAction.fetchall)] (msg.chat_id,), DBAction.fetchall)]
if any([x.stickerset.id in banstickerpacks for x in msg.sticker.attributes if isinstance(x, types.DocumentAttributeSticker)]): 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 msg.reply(random.choice(['Ай-ай-ай, стикеры с вагончиками, не хорошо',
'Стикерами с вагонами балуемся? Негоже так делать', 'Стикерами с вагонами балуемся? Негоже так делать',
'Надоел уже со своими вагонами', 'Надоел уже со своими вагонами',
'Щас высажу с поезда, будете тут бегать и про номерные свои кричать!'])) 'Щас высажу с поезда, будете тут про номерные свои кричать!']))
await bot.edit_permissions(msg.chat_id, msg.sender_id, timedelta(minutes=5), send_messages=False)
async def main(): async def main():
load_dotenv()
await create_table() await create_table()
await bot.run_until_disconnected() await bot.run_until_disconnected()