diff options
| author | Igor Tolmachov <me@igorek.dev> | 2022-12-03 17:35:55 +0900 |
|---|---|---|
| committer | Igor Tolmachov <me@igorek.dev> | 2022-12-03 17:35:55 +0900 |
| commit | d717c4e08245196b0d528716f9d269c71749365a (patch) | |
| tree | 72effa0c24f35f428558137f855f52b42e69f988 | |
| parent | 9432f267ee0b98272fb830d2bff56f23fe9766f4 (diff) | |
| download | karpov_ai_bot-d717c4e08245196b0d528716f9d269c71749365a.tar.gz karpov_ai_bot-d717c4e08245196b0d528716f9d269c71749365a.zip | |
2.0
| -rw-r--r-- | handlers/config.py | 111 | ||||
| -rw-r--r-- | handlers/gen.py | 2 | ||||
| -rw-r--r-- | handlers/member.py | 2 | ||||
| -rw-r--r-- | handlers/msg.py | 18 | ||||
| -rw-r--r-- | handlers/pin.py | 5 | ||||
| -rw-r--r-- | shared/settings.py | 22 |
6 files changed, 83 insertions, 77 deletions
diff --git a/handlers/config.py b/handlers/config.py index 7eaf9eb..21d556b 100644 --- a/handlers/config.py +++ b/handlers/config.py | |||
| @@ -1,7 +1,4 @@ | |||
| 1 | from ast import literal_eval | 1 | from json import JSONDecodeError, dumps, loads |
| 2 | from copy import deepcopy | ||
| 3 | from logging import info | ||
| 4 | from typing import Any, get_args | ||
| 5 | 2 | ||
| 6 | from aiogram import types as t | 3 | from aiogram import types as t |
| 7 | from pydantic import BaseModel, ValidationError | 4 | from pydantic import BaseModel, ValidationError |
| @@ -29,49 +26,71 @@ async def void_command(msg: t.Message) -> None: | |||
| 29 | async def settings_command(msg: t.Message) -> None: | 26 | async def settings_command(msg: t.Message) -> None: |
| 30 | def get_fields(config: BaseModel, level: int = 1) -> str: | 27 | def get_fields(config: BaseModel, level: int = 1) -> str: |
| 31 | text = "" | 28 | text = "" |
| 32 | for name in config.__fields__: | 29 | for field_name in config.__fields__: |
| 33 | value = getattr(config, name) | 30 | field = getattr(config, field_name) |
| 34 | if isinstance(value, BaseModel): | 31 | field_info = config.__fields__[field_name].field_info |
| 35 | text += f"\n{' '*level*4}<code>{name}.</code>" | 32 | |
| 36 | text += get_fields(value, level + 1) | 33 | text += "\n" + " " * level |
| 34 | if isinstance(field, BaseModel): | ||
| 35 | text += f"<code>{field_name}.</code> {field_info.description}" | ||
| 36 | text += get_fields(field, level + 1) | ||
| 37 | else: | 37 | else: |
| 38 | text += f"\n{' '*level*4}<code>{name}</code> = {value!r}" | 38 | text += f"<code>{field_name}</code> = {dumps(field)}" |
| 39 | return text | 39 | return text |
| 40 | 40 | ||
| 41 | args = msg.get_args().split() | 41 | def get_field(config: BaseModel, path: list[str]) -> str: |
| 42 | chat_config = deepcopy(config.get_config(msg.chat.id)) | 42 | text = "" |
| 43 | try: | 43 | for field_name in path: |
| 44 | if len(args) == 0: | 44 | assert ( |
| 45 | text = f"<code>/config</code>{get_fields(chat_config)}\n\n" | 45 | isinstance(config, BaseModel) and f in config.__fields__ |
| 46 | await msg.reply(text, parse_mode=t.ParseMode.HTML) | 46 | ), "Параметр не найден" |
| 47 | field_info = config.__fields__[field_name].field_info | ||
| 48 | config = getattr(config, field_name) | ||
| 49 | |||
| 50 | text += field_info.description | ||
| 51 | text += "\n\n" | ||
| 52 | if isinstance(config, BaseModel): | ||
| 53 | text += f"<code>/config {'.'.join(path)}.</code>" | ||
| 54 | text += get_fields(config, 1) | ||
| 47 | else: | 55 | else: |
| 48 | conf = chat_config | 56 | text += f"<code>/config {'.'.join(path)}</code> {dumps(config)}" |
| 49 | *path, field = args[0].split(".") | 57 | return text |
| 50 | for f in path: | 58 | |
| 51 | conf = getattr(conf, f) | 59 | def set_filed(config: BaseModel, path: list[str], value: str) -> str: |
| 52 | if not isinstance(conf, BaseModel): | 60 | text = "" |
| 53 | raise KeyError() | 61 | field_name = path[-1] |
| 54 | 62 | ||
| 55 | if len(args) == 2: | 63 | for f in path[:-1]: |
| 56 | if isinstance(getattr(conf, field), BaseModel): | 64 | assert ( |
| 57 | raise KeyError() | 65 | isinstance(config, BaseModel) and f in config.__fields__ |
| 58 | value = args[1] | 66 | ), "Параметр не найден" |
| 59 | setattr(conf, field, literal_eval(value)) | 67 | config = getattr(config, f) |
| 60 | 68 | ||
| 61 | config.set_config(msg.chat.id, Config.parse_obj(chat_config.dict())) | 69 | assert not isinstance( |
| 62 | config.save("data/config.json") | 70 | getattr(config, field_name), BaseModel |
| 63 | 71 | ), "Нельзя установить значение для группы параметров" | |
| 64 | await msg.reply( | 72 | |
| 65 | f"<code>/config {args[0]}</code> = {getattr(conf, field)!r}", | 73 | setattr(config, field_name, loads(value)) |
| 66 | parse_mode=t.ParseMode.HTML, | 74 | |
| 67 | ) | 75 | text += ( |
| 68 | else: | 76 | f"Значение <code>{'.'.join(path)}</code> установлено на <code>{value}</code>" |
| 69 | field_info = conf.__fields__[field].field_info | 77 | ) |
| 70 | await msg.reply( | 78 | |
| 71 | f"<code>/config {args[0]}</code> = {getattr(conf, field)!r}\n{field_info.description}", | 79 | return text |
| 72 | parse_mode=t.ParseMode.HTML, | 80 | |
| 73 | ) | 81 | chat_config = config.get_config(msg.chat.id) |
| 74 | except (ValidationError, ValueError, SyntaxError): | 82 | args = msg.get_args().split() |
| 75 | await msg.reply("Неверное значение") | 83 | if len(args) == 0: |
| 76 | except (KeyError, AttributeError): | 84 | text = f"<code>/config</code>{get_fields(chat_config)}" |
| 77 | await msg.reply("Параметр не найден") | 85 | elif len(args) == 1: |
| 86 | text = get_field(chat_config, args[0].split(".")) | ||
| 87 | elif len(args) == 2: | ||
| 88 | try: | ||
| 89 | text = set_filed(chat_config, args[0].split("."), args[1]) | ||
| 90 | config.set_config(msg.chat.id, Config.parse_obj(chat_config.dict())) | ||
| 91 | config.save("data/config.json") | ||
| 92 | except (JSONDecodeError, ValidationError): | ||
| 93 | text = "Неверное значение" | ||
| 94 | else: | ||
| 95 | text = "Слишком много аргументов" | ||
| 96 | await msg.answer(text, parse_mode=t.ParseMode.HTML) | ||
diff --git a/handlers/gen.py b/handlers/gen.py index 8f19e96..e4398bd 100644 --- a/handlers/gen.py +++ b/handlers/gen.py | |||
| @@ -17,7 +17,7 @@ def get_text(chat_id: int) -> str: | |||
| 17 | 17 | ||
| 18 | assert ( | 18 | assert ( |
| 19 | len(samples) != 0 | 19 | len(samples) != 0 |
| 20 | ), "Нету сщей на основе которых можно сгенерировать сообщение" | 20 | ), "Нету ных на основе которых можно сгенерировать сообщение" |
| 21 | 21 | ||
| 22 | generator = mc.PhraseGenerator(samples) | 22 | generator = mc.PhraseGenerator(samples) |
| 23 | gen_config = config.get_config(chat_id).gen | 23 | gen_config = config.get_config(chat_id).gen |
diff --git a/handlers/member.py b/handlers/member.py index a4fc4cc..830351d 100644 --- a/handlers/member.py +++ b/handlers/member.py | |||
| @@ -38,7 +38,7 @@ async def check_poll(clb: t.CallbackQuery) -> None: | |||
| 38 | msg = clb.message | 38 | msg = clb.message |
| 39 | data = clb.data.split(":") | 39 | data = clb.data.split(":") |
| 40 | user_id = int(data[1]) | 40 | user_id = int(data[1]) |
| 41 | min_answers = config.get_config(msg.chat.id).commands.accept_member_answers_count | 41 | min_answers = config.get_config(msg.chat.id).members.answer_count |
| 42 | 42 | ||
| 43 | if poll.total_voter_count < min_answers: | 43 | if poll.total_voter_count < min_answers: |
| 44 | await clb.answer( | 44 | await clb.answer( |
diff --git a/handlers/msg.py b/handlers/msg.py deleted file mode 100644 index a57885b..0000000 --- a/handlers/msg.py +++ /dev/null | |||
| @@ -1,18 +0,0 @@ | |||
| 1 | from aiogram import types as t | ||
| 2 | |||
| 3 | from shared.instances import dp | ||
| 4 | from utils import filters as f | ||
| 5 | |||
| 6 | |||
| 7 | async def сосалка(msg: t.Message): | ||
| 8 | text = msg.text or msg.caption | ||
| 9 | if text.startswith("/"): | ||
| 10 | return False | ||
| 11 | with open(f"data/{msg.chat.id}", "a+") as file: | ||
| 12 | file.write(text.replace("§", "") + "§") | ||
| 13 | return False | ||
| 14 | |||
| 15 | |||
| 16 | @dp.message_handler(f.message.has_text, сосалка, content_types=[t.ContentType.ANY]) | ||
| 17 | async def ХУЙ(): | ||
| 18 | pass | ||
diff --git a/handlers/pin.py b/handlers/pin.py index 9eb91a4..17995ee 100644 --- a/handlers/pin.py +++ b/handlers/pin.py | |||
| @@ -18,6 +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 | reply_markup=t.InlineKeyboardMarkup().add( | 22 | reply_markup=t.InlineKeyboardMarkup().add( |
| 22 | t.InlineKeyboardButton( | 23 | t.InlineKeyboardButton( |
| 23 | "Проверить опрос", | 24 | "Проверить опрос", |
| @@ -26,7 +27,7 @@ async def pin_command(msg: t.Message) -> None: | |||
| 26 | ), | 27 | ), |
| 27 | ) | 28 | ) |
| 28 | else: | 29 | else: |
| 29 | await msg.answer("ы ук, ответь на сообщение") | 30 | await msg.answer("ы н ответили на сообщение") |
| 30 | 31 | ||
| 31 | 32 | ||
| 32 | @dp.callback_query_handler( | 33 | @dp.callback_query_handler( |
| @@ -36,7 +37,7 @@ async def check_poll(clb: t.CallbackQuery) -> None: | |||
| 36 | poll = clb.message.poll | 37 | poll = clb.message.poll |
| 37 | msg = clb.message | 38 | msg = clb.message |
| 38 | pin = int(clb.data.split(":")[1]) | 39 | pin = int(clb.data.split(":")[1]) |
| 39 | min_answers = config.get_config(msg.chat.id).commands.pin_answers_count | 40 | min_answers = config.get_config(msg.chat.id).pin.answer_count |
| 40 | 41 | ||
| 41 | if poll.total_voter_count < min_answers: | 42 | if poll.total_voter_count < min_answers: |
| 42 | await clb.answer( | 43 | await clb.answer( |
diff --git a/shared/settings.py b/shared/settings.py index 20f3f76..731fade 100644 --- a/shared/settings.py +++ b/shared/settings.py | |||
| @@ -26,14 +26,14 @@ class GenConfig(BaseModel): | |||
| 26 | ) | 26 | ) |
| 27 | 27 | ||
| 28 | 28 | ||
| 29 | class CommandsConfig(BaseModel): | 29 | class PollConfig(BaseModel): |
| 30 | pin_answers_count: int = Field( | 30 | answer_count: int = Field( |
| 31 | 4, | 31 | 4, |
| 32 | description="Минимальное количество голосов для проверки опроса на закрепление сообщения", | 32 | description="Минимальное количество голосов для проверки опроса", |
| 33 | ) | 33 | ) |
| 34 | accept_member_answers_count: int = Field( | 34 | anonym: bool = Field( |
| 35 | 5, | 35 | False, |
| 36 | description="Минимальное количество голосов для проверки опроса на принятия человека в группу", | 36 | description="Включить/Выключить анонимный опрос", |
| 37 | ) | 37 | ) |
| 38 | 38 | ||
| 39 | 39 | ||
| @@ -42,9 +42,13 @@ class Config(BaseModel): | |||
| 42 | GenConfig(), | 42 | GenConfig(), |
| 43 | description="Настройки генерации сообщений", | 43 | description="Настройки генерации сообщений", |
| 44 | ) | 44 | ) |
| 45 | commands: CommandsConfig = Field( | 45 | pin: PollConfig = Field( |
| 46 | CommandsConfig(), | 46 | PollConfig(), |
| 47 | description="Настройки команд бота", | 47 | description="Настройки закрепления сообщений", |
| 48 | ) | ||
| 49 | members: PollConfig = Field( | ||
| 50 | PollConfig(), | ||
| 51 | description="Настройки принятия людей в группу", | ||
| 48 | ) | 52 | ) |
| 49 | 53 | ||
| 50 | 54 | ||
