diff options
| author | Igor Tolmachov <me@igorek.dev> | 2022-12-05 22:29:41 +0900 |
|---|---|---|
| committer | Igor Tolmachov <me@igorek.dev> | 2022-12-05 22:29:41 +0900 |
| commit | 0de7969d30e3e57d681afdfcadd245f6988a0342 (patch) | |
| tree | bc0957e9208f51354aa2330dc20a090b7f680823 /handlers | |
| parent | 0d5cab62b0d077ad7946b64a534e3914f1cc79dd (diff) | |
| download | karpov_ai_bot-0de7969d30e3e57d681afdfcadd245f6988a0342.tar.gz karpov_ai_bot-0de7969d30e3e57d681afdfcadd245f6988a0342.zip | |
2.1
Diffstat (limited to 'handlers')
| -rw-r--r-- | handlers/config.py | 23 | ||||
| -rw-r--r-- | handlers/gen.py | 59 | ||||
| -rw-r--r-- | handlers/member.py | 23 | ||||
| -rw-r--r-- | handlers/middleware.py | 5 | ||||
| -rw-r--r-- | handlers/pin.py | 6 |
5 files changed, 50 insertions, 66 deletions
diff --git a/handlers/config.py b/handlers/config.py index 7628805..2865694 100644 --- a/handlers/config.py +++ b/handlers/config.py | |||
| @@ -1,3 +1,4 @@ | |||
| 1 | from copy import deepcopy | ||
| 1 | from json import JSONDecodeError, dumps, loads | 2 | from json import JSONDecodeError, dumps, loads |
| 2 | from logging import info | 3 | from logging import info |
| 3 | 4 | ||
| @@ -5,7 +6,8 @@ from aiogram import types as t | |||
| 5 | from pydantic import BaseModel, ValidationError | 6 | from pydantic import BaseModel, ValidationError |
| 6 | 7 | ||
| 7 | from shared.database import Message | 8 | from shared.database import Message |
| 8 | from shared.instances import config, dp, session | 9 | from shared.instances import chats, dp, session |
| 10 | from shared.samples import samples | ||
| 9 | from shared.settings import Config | 11 | from shared.settings import Config |
| 10 | from utils import filters as f | 12 | from utils import filters as f |
| 11 | 13 | ||
| @@ -13,9 +15,19 @@ from utils import filters as f | |||
| 13 | @dp.message_handler(f.user.is_admin, commands=["void"]) | 15 | @dp.message_handler(f.user.is_admin, commands=["void"]) |
| 14 | async def void_command(msg: t.Message) -> None: | 16 | async def void_command(msg: t.Message) -> None: |
| 15 | if msg.get_args() == "Я знаю что делаю": | 17 | if msg.get_args() == "Я знаю что делаю": |
| 18 | samples.delete(msg.chat.id) | ||
| 16 | with session.begin() as s: | 19 | with session.begin() as s: |
| 17 | s.query(Message).filter(Message.chat_id == msg.chat.id).delete() | 20 | query = s.query(Message).filter(Message.chat_id == msg.chat.id) |
| 18 | await msg.answer("Лоботомия проведена успешно") | 21 | if msg.reply_to_message is not None: |
| 22 | query = query.filter(Message.user_id == msg.reply_to_message.from_user.id) | ||
| 23 | query.delete() | ||
| 24 | if msg.reply_to_message is not None: | ||
| 25 | await msg.answer( | ||
| 26 | f'Связи пользователя <a href="tg://user?id={msg.reply_to_message.from_user.id}">{msg.reply_to_message.from_user.mention}</a> были очищены', | ||
| 27 | parse_mode=t.ParseMode.HTML, | ||
| 28 | ) | ||
| 29 | else: | ||
| 30 | await msg.answer("Связи были очищены") | ||
| 19 | else: | 31 | else: |
| 20 | await msg.answer( | 32 | await msg.answer( |
| 21 | "Напишите <code>/void Я знаю что делаю</code>", | 33 | "Напишите <code>/void Я знаю что делаю</code>", |
| @@ -79,7 +91,7 @@ async def settings_command(msg: t.Message) -> None: | |||
| 79 | 91 | ||
| 80 | return text | 92 | return text |
| 81 | 93 | ||
| 82 | chat_config = config.get_config(msg.chat.id) | 94 | chat_config = deepcopy(chats.get(msg.chat.id)) |
| 83 | args = msg.get_args().split() | 95 | args = msg.get_args().split() |
| 84 | if len(args) == 0: | 96 | if len(args) == 0: |
| 85 | text = f"<code>/config</code>{get_fields(chat_config)}" | 97 | text = f"<code>/config</code>{get_fields(chat_config)}" |
| @@ -88,8 +100,7 @@ async def settings_command(msg: t.Message) -> None: | |||
| 88 | elif len(args) == 2: | 100 | elif len(args) == 2: |
| 89 | try: | 101 | try: |
| 90 | text = set_filed(chat_config, args[0].split("."), args[1]) | 102 | text = set_filed(chat_config, args[0].split("."), args[1]) |
| 91 | config.set_config(msg.chat.id, Config.parse_obj(chat_config.dict())) | 103 | chats.set(msg.chat.id, Config.parse_obj(chat_config.dict())) |
| 92 | config.save("data/config.json") | ||
| 93 | except (JSONDecodeError, ValidationError): | 104 | except (JSONDecodeError, ValidationError): |
| 94 | text = "Неверное значение" | 105 | text = "Неверное значение" |
| 95 | else: | 106 | else: |
diff --git a/handlers/gen.py b/handlers/gen.py index 72afb79..ef397db 100644 --- a/handlers/gen.py +++ b/handlers/gen.py | |||
| @@ -1,60 +1,15 @@ | |||
| 1 | import random | ||
| 2 | |||
| 3 | import mc | ||
| 4 | from aiogram import types as t | 1 | from aiogram import types as t |
| 5 | 2 | ||
| 6 | from shared.database import Message | 3 | from shared.instances import chats, dp |
| 7 | from shared.instances import bot, config, dp, session | 4 | from shared.samples import samples |
| 8 | from utils import filters as f | 5 | from utils import filters as f |
| 9 | 6 | ||
| 10 | 7 | ||
| 11 | def get_text(chat_id: int) -> str: | ||
| 12 | with session() as s: | ||
| 13 | samples = [ | ||
| 14 | m.tuple()[0] | ||
| 15 | for m in s.query(Message.message).filter(Message.chat_id == chat_id).all() | ||
| 16 | ] | ||
| 17 | |||
| 18 | assert ( | ||
| 19 | len(samples) != 0 | ||
| 20 | ), "Нету данных на основе которых можно сгенерировать сообщение" | ||
| 21 | |||
| 22 | generator = mc.PhraseGenerator(samples) | ||
| 23 | gen_config = config.get_config(chat_id).gen | ||
| 24 | validators = [] | ||
| 25 | |||
| 26 | if gen_config.max_word_count is not None or gen_config.min_word_count is not None: | ||
| 27 | validators.append( | ||
| 28 | mc.builtin.validators.words_count( | ||
| 29 | minimal=gen_config.min_word_count, | ||
| 30 | maximal=gen_config.max_word_count, | ||
| 31 | ) | ||
| 32 | ) | ||
| 33 | |||
| 34 | while True: | ||
| 35 | message = generator.generate_phrase_or_none(1, validators=validators) | ||
| 36 | if message is not None: | ||
| 37 | return message | ||
| 38 | |||
| 39 | |||
| 40 | @dp.message_handler(commands=["gen"]) | 8 | @dp.message_handler(commands=["gen"]) |
| 41 | async def gen_command(msg: t.Message) -> None: | 9 | async def gen_command(msg: t.Message) -> None: |
| 42 | if config.get_config(msg.chat.id).gen.delete_command: | 10 | if chats.get(msg.chat.id).gen.delete_command: |
| 43 | await msg.delete() | 11 | await msg.delete() |
| 44 | await msg.answer(get_text(msg.chat.id)) | 12 | await msg.answer(samples.get(msg.chat.id).generate()) |
| 45 | |||
| 46 | |||
| 47 | @dp.message_handler(commands=["del"]) | ||
| 48 | async def del_command(msg: t.Message) -> None: | ||
| 49 | await msg.delete() | ||
| 50 | |||
| 51 | if msg.reply_to_message: | ||
| 52 | if msg.reply_to_message.from_user.id == bot.id: | ||
| 53 | await msg.reply_to_message.delete() | ||
| 54 | else: | ||
| 55 | await msg.reply("Можно удалять только сообщения бота") | ||
| 56 | else: | ||
| 57 | await msg.reply("Вы не ответили на сообщение") | ||
| 58 | 13 | ||
| 59 | 14 | ||
| 60 | @dp.message_handler( | 15 | @dp.message_handler( |
| @@ -63,7 +18,7 @@ async def del_command(msg: t.Message) -> None: | |||
| 63 | content_types=[t.ContentType.ANY], | 18 | content_types=[t.ContentType.ANY], |
| 64 | ) | 19 | ) |
| 65 | async def chance_message(msg: t.Message) -> None: | 20 | async def chance_message(msg: t.Message) -> None: |
| 66 | if config.get_config(msg.chat.id).gen.reply: | 21 | if chats.get(msg.chat.id).gen.reply: |
| 67 | await msg.reply(get_text(msg.chat.id)) | 22 | await msg.reply(samples.get(msg.chat.id).generate()) |
| 68 | else: | 23 | else: |
| 69 | await msg.answer(get_text(msg.chat.id)) | 24 | await msg.answer(samples.get(msg.chat.id).generate()) |
diff --git a/handlers/member.py b/handlers/member.py index 830351d..b228f6c 100644 --- a/handlers/member.py +++ b/handlers/member.py | |||
| @@ -1,17 +1,22 @@ | |||
| 1 | from aiogram import types as t | 1 | from aiogram import types as t |
| 2 | 2 | ||
| 3 | from shared.instances import bot, config, dp | 3 | from shared.instances import bot, chats, dp |
| 4 | from utils import filters as f | 4 | from utils import filters as f |
| 5 | 5 | ||
| 6 | polls: dict[int, int] = {} | ||
| 7 | |||
| 6 | 8 | ||
| 7 | @dp.chat_join_request_handler() | 9 | @dp.chat_join_request_handler() |
| 8 | async def new_member(cjr: t.ChatJoinRequest) -> None: | 10 | async def new_member(cjr: t.ChatJoinRequest) -> None: |
| 11 | if cjr.from_user.id in polls: | ||
| 12 | return | ||
| 13 | |||
| 9 | reply = await bot.send_message( | 14 | reply = await bot.send_message( |
| 10 | cjr.chat.id, | 15 | cjr.chat.id, |
| 11 | f'<a href="tg://user?id={cjr.from_user.id}">{cjr.from_user.mention}</a> хочет в чат', | 16 | f'<a href="tg://user?id={cjr.from_user.id}">{cjr.from_user.mention}</a> хочет в чат', |
| 12 | parse_mode=t.ParseMode.HTML, | 17 | parse_mode=t.ParseMode.HTML, |
| 13 | ) | 18 | ) |
| 14 | await reply.reply_poll( | 19 | poll = await reply.reply_poll( |
| 15 | "Пускаем ?", | 20 | "Пускаем ?", |
| 16 | [ | 21 | [ |
| 17 | "Да", | 22 | "Да", |
| @@ -28,6 +33,18 @@ async def new_member(cjr: t.ChatJoinRequest) -> None: | |||
| 28 | await bot.send_message( | 33 | await bot.send_message( |
| 29 | cjr.from_user.id, "Заявка на вступление в группу будет вскоре рассмотрена" | 34 | cjr.from_user.id, "Заявка на вступление в группу будет вскоре рассмотрена" |
| 30 | ) | 35 | ) |
| 36 | polls[cjr.from_user.id] = poll.message_id | ||
| 37 | |||
| 38 | |||
| 39 | @dp.chat_member_handler(f.user.new_user) | ||
| 40 | async def admin_accept_member(cmu: t.ChatMemberUpdated) -> None: | ||
| 41 | user_id = cmu.new_chat_member.user.id | ||
| 42 | if user_id in polls: | ||
| 43 | polls.pop(user_id) | ||
| 44 | await bot.send_message( | ||
| 45 | user_id, | ||
| 46 | "Ваша заявка на вступление принята, добро пожаловать в группу", | ||
| 47 | ) | ||
| 31 | 48 | ||
| 32 | 49 | ||
| 33 | @dp.callback_query_handler( | 50 | @dp.callback_query_handler( |
| @@ -38,7 +55,7 @@ async def check_poll(clb: t.CallbackQuery) -> None: | |||
| 38 | msg = clb.message | 55 | msg = clb.message |
| 39 | data = clb.data.split(":") | 56 | data = clb.data.split(":") |
| 40 | user_id = int(data[1]) | 57 | user_id = int(data[1]) |
| 41 | min_answers = config.get_config(msg.chat.id).members.answer_count | 58 | min_answers = chats.get(msg.chat.id).members.answer_count |
| 42 | 59 | ||
| 43 | if poll.total_voter_count < min_answers: | 60 | if poll.total_voter_count < min_answers: |
| 44 | await clb.answer( | 61 | await clb.answer( |
diff --git a/handlers/middleware.py b/handlers/middleware.py index 6cf39b6..046037d 100644 --- a/handlers/middleware.py +++ b/handlers/middleware.py | |||
| @@ -1,10 +1,9 @@ | |||
| 1 | from logging import info | ||
| 2 | |||
| 3 | from aiogram import types as t | 1 | from aiogram import types as t |
| 4 | from aiogram.dispatcher.middlewares import BaseMiddleware | 2 | from aiogram.dispatcher.middlewares import BaseMiddleware |
| 5 | 3 | ||
| 6 | from shared.database import Message | 4 | from shared.database import Message |
| 7 | from shared.instances import session | 5 | from shared.instances import session |
| 6 | from shared.samples import samples | ||
| 8 | 7 | ||
| 9 | 8 | ||
| 10 | class MessageMiddleware(BaseMiddleware): | 9 | class MessageMiddleware(BaseMiddleware): |
| @@ -16,6 +15,8 @@ class MessageMiddleware(BaseMiddleware): | |||
| 16 | Message( | 15 | Message( |
| 17 | chat_id=msg.chat.id, | 16 | chat_id=msg.chat.id, |
| 18 | message_id=msg.message_id, | 17 | message_id=msg.message_id, |
| 18 | user_id=msg.from_user.id, | ||
| 19 | message=text, | 19 | message=text, |
| 20 | ) | 20 | ) |
| 21 | ) | 21 | ) |
| 22 | samples.get(msg.chat.id).feed(text) | ||
diff --git a/handlers/pin.py b/handlers/pin.py index 17995ee..e4d21db 100644 --- a/handlers/pin.py +++ b/handlers/pin.py | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | from aiogram import types as t | 1 | from aiogram import types as t |
| 2 | 2 | ||
| 3 | from shared.instances import bot, config, dp | 3 | from shared.instances import bot, chats, dp |
| 4 | from utils import filters as f | 4 | from utils import filters as f |
| 5 | 5 | ||
| 6 | 6 | ||
| @@ -18,7 +18,7 @@ async def pin_command(msg: t.Message) -> None: | |||
| 18 | "Да", | 18 | "Да", |
| 19 | "Нет", | 19 | "Нет", |
| 20 | ], | 20 | ], |
| 21 | config.get_config(msg.chat.id).pin.anonym, | 21 | chats.get(msg.chat.id).pin.anonym, |
| 22 | reply_markup=t.InlineKeyboardMarkup().add( | 22 | reply_markup=t.InlineKeyboardMarkup().add( |
| 23 | t.InlineKeyboardButton( | 23 | t.InlineKeyboardButton( |
| 24 | "Проверить опрос", | 24 | "Проверить опрос", |
| @@ -37,7 +37,7 @@ async def check_poll(clb: t.CallbackQuery) -> None: | |||
| 37 | poll = clb.message.poll | 37 | poll = clb.message.poll |
| 38 | msg = clb.message | 38 | msg = clb.message |
| 39 | pin = int(clb.data.split(":")[1]) | 39 | pin = int(clb.data.split(":")[1]) |
| 40 | min_answers = config.get_config(msg.chat.id).pin.answer_count | 40 | min_answers = chats.get(msg.chat.id).pin.answer_count |
| 41 | 41 | ||
| 42 | if poll.total_voter_count < min_answers: | 42 | if poll.total_voter_count < min_answers: |
| 43 | await clb.answer( | 43 | await clb.answer( |
