Фиксы всего, асинхронность

This commit is contained in:
Mootfrost777 2022-08-23 21:31:30 +03:00
parent 747f0bf64b
commit 031696ea3c
3 changed files with 58 additions and 42 deletions

2
db.py
View file

@ -19,7 +19,7 @@ async def db_action(sql: str, args: tuple, action: DBAction):
elif action == DBAction.fetchall: elif action == DBAction.fetchall:
result = await cursor.fetchall() result = await cursor.fetchall()
elif action == DBAction.commit: elif action == DBAction.commit:
conn.commit() await conn.commit()
result = cursor.lastrowid result = cursor.lastrowid
await cursor.close() await cursor.close()

93
main.py
View file

@ -15,48 +15,47 @@ from dotenv import 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'])
load_dotenv() load_dotenv()
asyncio.get_event_loop().run_until_complete(create_table()) asyncio.get_event_loop().run_until_complete(create_table())
async def check_admin(msg): async def check_admin(msg):
if not any([user.id == msg.sender_id async for user in bot.iter_participants(msg.chat_id, return any([user.id == msg.sender_id async for user in bot.iter_participants(msg.chat_id,
filter=ChannelParticipantsAdmins)]): filter=ChannelParticipantsAdmins)])
await msg.reply('Эту команду может только администратор использовать')
raise events.StopPropagation
@bot.on(events.NewMessage()) @bot.on(events.NewMessage())
async def on_message(msg): async def on_message(msg):
chats = await db_action('SELECT chat_id FROM chats', (), DBAction.fetchall) 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) await db_action('INSERT INTO chats (chat_id) VALUES (?)', (msg.chat_id,), DBAction.commit)
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 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),
DBAction.fetchone) is not None DBAction.fetchone) is not None
@bot.on(events.NewMessage(pattern='/exception')) @bot.on(events.NewMessage(pattern='/exception'))
async def on_exception(msg): async def on_exception(msg):
await check_admin(msg) if not await check_admin(msg):
await msg.reply('Добавлять пользователей в исключения может только админ')
args = msg.message.text.split(' ')
if len(args) < 4:
await msg.reply('Неверный формат')
raise events.StopPropagation raise events.StopPropagation
if args[2]: args = msg.message.text.split(' ')
if len(args) > 2:
if args[2] == 'me': if args[2] == 'me':
user_id = msg.sender_id user_id = msg.sender_id
else: else:
user_id = args[2] user_id = args[2]
elif msg.reply_to_message: elif msg.is_reply:
user_id = msg.reply_to_message.sender_id reply_message = await msg.get_reply_message()
user_id = reply_message.sender_id
else: else:
await msg.reply('Допиши к команде айди пользователя, "me", чтобы добавить себя, или ответь командой на сообщение нужного пользователя') await msg.reply('Допиши к команде: айди пользователя, "me", чтобы добавить себя, или ответь командой на сообщение нужного пользователя')
raise events.StopPropagation raise events.StopPropagation
match args[1]: match args[1]:
@ -65,61 +64,79 @@ async def on_exception(msg):
await msg.reply('Пользователь уже есть в списке исключений') await msg.reply('Пользователь уже есть в списке исключений')
raise events.StopPropagation 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('Пользователь добавлен в исключения, теперь его сообщения не будут проверяться ботом') await msg.reply('Пользователь добавлен в исключения, теперь его сообщения не будут проверяться ботом')
case 'remove': case 'remove':
if not await check_user_in_exceptions(user_id, msg.chat_id): if not await check_user_in_exceptions(user_id, msg.chat_id):
await msg.reply('Пользователя пока нет в исключениях') await msg.reply('Пользователя пока нет в исключениях')
raise events.StopPropagation 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('Пользователь удален из списка исключений') await msg.reply('Пользователь удален из списка исключений')
@bot.on(events.NewMessage(pattern='/addstickerpack')) @bot.on(events.NewMessage(pattern='/bansticker'))
async def add_stickerpack(msg): 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() args = msg.text.split()
if args[1]: if len(args) > 1:
stickerpack_id = args[1] stickerpack_id = args[1]
elif msg.reply_to_message.sticker: elif msg.is_reply:
for attr in msg.sticker.attributes: 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): if isinstance(attr, DocumentAttributeSticker):
stickerpack_id = attr.stickerset.id stickerpack_id = attr.stickerset.id
break break
else: else:
msg.reply('Допиши к команде айди набора стикеров или ответь командой на стикер из набора') await msg.reply('Допиши к команде айди набора стикеров или ответь командой на стикер из набора')
raise events.StopPropagation raise events.StopPropagation
if await db_action("SELECT * FROM banned_stickerpacks WHERE pack_id = ? AND chat_id = ?", if await db_action("SELECT * FROM banned_stickerpacks WHERE pack_id = ? AND chat_id = ?",
(stickerpack_id, msg.chat_id,), DBAction.fetchone) is None: (stickerpack_id, msg.chat_id,), DBAction.fetchone) is None:
await db_action("INSERT INTO banned_stickerpacks (pack_id, chat_id) VALUES (?, ?)", await db_action("INSERT INTO banned_stickerpacks (pack_id, chat_id) VALUES (?, ?)",
(stickerpack_id, msg.chat_id,), DBAction.commit) (stickerpack_id, msg.chat_id,), DBAction.commit)
await msg.reply(f"Стикерпак с айди {msg.text.split(' ')[1]} добавлен в банлист") await msg.reply(f"Стикерпак с айди {stickerpack_id} добавлен в банлист")
else: else:
await msg.reply(f"Стикерпак с айди {msg.text.split(' ')[1]} уже в банлисте") await msg.reply(f"Стикерпак с айди {stickerpack_id} уже в банлисте")
raise events.StopPropagation 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()) @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: if msg.is_private:
await msg.respond('Hello! Add me to a group to start using me!') await msg.respond('Я не работаю в личных сообщениях. Добавь меня в группу, пожалуйста')
return 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:
banstickerpacks = [stickerpack[0] for stickerpack in await db_action('SELECT pack_id FROM banned_stickerpacks WHERE chat_id = ?',
if msg.sticker and any([x.stickerset.id in banstickerpacks for x in msg.sticker.attributes if isinstance(x, DocumentAttributeSticker)]): (msg.chat_id,), DBAction.fetchall)]
await on_banword(msg) 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() bot.run_until_disconnected()

View file

@ -1,5 +1,4 @@
telethon telethon
pymorphy2 aiosqlite
pyenchant
google-cloud-dialogflow google-cloud-dialogflow
python-dotenv python-dotenv