Репорты, исключения, бан стикеров, все в общем. Я так и не комичу чаще
This commit is contained in:
parent
9460100295
commit
b5c86fb6cd
3 changed files with 46 additions and 40 deletions
12
db.py
12
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()
|
||||
|
||||
|
|
|
@ -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):
|
||||
|
|
72
main.py
72
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] <id стикерапка> - запретить, разрешить стикерпак в группе, можно написать в ответ на стикер из нужного стикерпака\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()
|
||||
|
|
Loading…
Add table
Reference in a new issue