From 0de7969d30e3e57d681afdfcadd245f6988a0342 Mon Sep 17 00:00:00 2001 From: Igor Tolmachov Date: Mon, 5 Dec 2022 22:29:41 +0900 Subject: 2.1 --- handlers/config.py | 23 +++++++++++++++----- handlers/gen.py | 59 ++++++-------------------------------------------- handlers/member.py | 23 +++++++++++++++++--- handlers/middleware.py | 5 +++-- handlers/pin.py | 6 ++--- 5 files changed, 50 insertions(+), 66 deletions(-) (limited to 'handlers') 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 @@ +from copy import deepcopy from json import JSONDecodeError, dumps, loads from logging import info @@ -5,7 +6,8 @@ from aiogram import types as t from pydantic import BaseModel, ValidationError from shared.database import Message -from shared.instances import config, dp, session +from shared.instances import chats, dp, session +from shared.samples import samples from shared.settings import Config from utils import filters as f @@ -13,9 +15,19 @@ from utils import filters as f @dp.message_handler(f.user.is_admin, commands=["void"]) async def void_command(msg: t.Message) -> None: if msg.get_args() == "Я знаю что делаю": + samples.delete(msg.chat.id) with session.begin() as s: - s.query(Message).filter(Message.chat_id == msg.chat.id).delete() - await msg.answer("Лоботомия проведена успешно") + query = s.query(Message).filter(Message.chat_id == msg.chat.id) + if msg.reply_to_message is not None: + query = query.filter(Message.user_id == msg.reply_to_message.from_user.id) + query.delete() + if msg.reply_to_message is not None: + await msg.answer( + f'Связи пользователя {msg.reply_to_message.from_user.mention} были очищены', + parse_mode=t.ParseMode.HTML, + ) + else: + await msg.answer("Связи были очищены") else: await msg.answer( "Напишите /void Я знаю что делаю", @@ -79,7 +91,7 @@ async def settings_command(msg: t.Message) -> None: return text - chat_config = config.get_config(msg.chat.id) + chat_config = deepcopy(chats.get(msg.chat.id)) args = msg.get_args().split() if len(args) == 0: text = f"/config{get_fields(chat_config)}" @@ -88,8 +100,7 @@ async def settings_command(msg: t.Message) -> None: elif len(args) == 2: try: text = set_filed(chat_config, args[0].split("."), args[1]) - config.set_config(msg.chat.id, Config.parse_obj(chat_config.dict())) - config.save("data/config.json") + chats.set(msg.chat.id, Config.parse_obj(chat_config.dict())) except (JSONDecodeError, ValidationError): text = "Неверное значение" 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 @@ -import random - -import mc from aiogram import types as t -from shared.database import Message -from shared.instances import bot, config, dp, session +from shared.instances import chats, dp +from shared.samples import samples from utils import filters as f -def get_text(chat_id: int) -> str: - with session() as s: - samples = [ - m.tuple()[0] - for m in s.query(Message.message).filter(Message.chat_id == chat_id).all() - ] - - assert ( - len(samples) != 0 - ), "Нету данных на основе которых можно сгенерировать сообщение" - - generator = mc.PhraseGenerator(samples) - gen_config = config.get_config(chat_id).gen - validators = [] - - if gen_config.max_word_count is not None or gen_config.min_word_count is not None: - validators.append( - mc.builtin.validators.words_count( - minimal=gen_config.min_word_count, - maximal=gen_config.max_word_count, - ) - ) - - while True: - message = generator.generate_phrase_or_none(1, validators=validators) - if message is not None: - return message - - @dp.message_handler(commands=["gen"]) async def gen_command(msg: t.Message) -> None: - if config.get_config(msg.chat.id).gen.delete_command: + if chats.get(msg.chat.id).gen.delete_command: await msg.delete() - await msg.answer(get_text(msg.chat.id)) - - -@dp.message_handler(commands=["del"]) -async def del_command(msg: t.Message) -> None: - await msg.delete() - - if msg.reply_to_message: - if msg.reply_to_message.from_user.id == bot.id: - await msg.reply_to_message.delete() - else: - await msg.reply("Можно удалять только сообщения бота") - else: - await msg.reply("Вы не ответили на сообщение") + await msg.answer(samples.get(msg.chat.id).generate()) @dp.message_handler( @@ -63,7 +18,7 @@ async def del_command(msg: t.Message) -> None: content_types=[t.ContentType.ANY], ) async def chance_message(msg: t.Message) -> None: - if config.get_config(msg.chat.id).gen.reply: - await msg.reply(get_text(msg.chat.id)) + if chats.get(msg.chat.id).gen.reply: + await msg.reply(samples.get(msg.chat.id).generate()) else: - await msg.answer(get_text(msg.chat.id)) + 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 @@ from aiogram import types as t -from shared.instances import bot, config, dp +from shared.instances import bot, chats, dp from utils import filters as f +polls: dict[int, int] = {} + @dp.chat_join_request_handler() async def new_member(cjr: t.ChatJoinRequest) -> None: + if cjr.from_user.id in polls: + return + reply = await bot.send_message( cjr.chat.id, f'{cjr.from_user.mention} хочет в чат', parse_mode=t.ParseMode.HTML, ) - await reply.reply_poll( + poll = await reply.reply_poll( "Пускаем ?", [ "Да", @@ -28,6 +33,18 @@ async def new_member(cjr: t.ChatJoinRequest) -> None: await bot.send_message( cjr.from_user.id, "Заявка на вступление в группу будет вскоре рассмотрена" ) + polls[cjr.from_user.id] = poll.message_id + + +@dp.chat_member_handler(f.user.new_user) +async def admin_accept_member(cmu: t.ChatMemberUpdated) -> None: + user_id = cmu.new_chat_member.user.id + if user_id in polls: + polls.pop(user_id) + await bot.send_message( + user_id, + "Ваша заявка на вступление принята, добро пожаловать в группу", + ) @dp.callback_query_handler( @@ -38,7 +55,7 @@ async def check_poll(clb: t.CallbackQuery) -> None: msg = clb.message data = clb.data.split(":") user_id = int(data[1]) - min_answers = config.get_config(msg.chat.id).members.answer_count + min_answers = chats.get(msg.chat.id).members.answer_count if poll.total_voter_count < min_answers: 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 @@ -from logging import info - from aiogram import types as t from aiogram.dispatcher.middlewares import BaseMiddleware from shared.database import Message from shared.instances import session +from shared.samples import samples class MessageMiddleware(BaseMiddleware): @@ -16,6 +15,8 @@ class MessageMiddleware(BaseMiddleware): Message( chat_id=msg.chat.id, message_id=msg.message_id, + user_id=msg.from_user.id, message=text, ) ) + 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 @@ from aiogram import types as t -from shared.instances import bot, config, dp +from shared.instances import bot, chats, dp from utils import filters as f @@ -18,7 +18,7 @@ async def pin_command(msg: t.Message) -> None: "Да", "Нет", ], - config.get_config(msg.chat.id).pin.anonym, + chats.get(msg.chat.id).pin.anonym, reply_markup=t.InlineKeyboardMarkup().add( t.InlineKeyboardButton( "Проверить опрос", @@ -37,7 +37,7 @@ async def check_poll(clb: t.CallbackQuery) -> None: poll = clb.message.poll msg = clb.message pin = int(clb.data.split(":")[1]) - min_answers = config.get_config(msg.chat.id).pin.answer_count + min_answers = chats.get(msg.chat.id).pin.answer_count if poll.total_voter_count < min_answers: await clb.answer( -- cgit v1.2.3