aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIgor Tolmachov <me@igorek.dev>2022-12-03 17:35:55 +0900
committerIgor Tolmachov <me@igorek.dev>2022-12-03 17:35:55 +0900
commitd717c4e08245196b0d528716f9d269c71749365a (patch)
tree72effa0c24f35f428558137f855f52b42e69f988
parent9432f267ee0b98272fb830d2bff56f23fe9766f4 (diff)
downloadkarpov_ai_bot-d717c4e08245196b0d528716f9d269c71749365a.tar.gz
karpov_ai_bot-d717c4e08245196b0d528716f9d269c71749365a.zip
2.0
-rw-r--r--handlers/config.py111
-rw-r--r--handlers/gen.py2
-rw-r--r--handlers/member.py2
-rw-r--r--handlers/msg.py18
-rw-r--r--handlers/pin.py5
-rw-r--r--shared/settings.py22
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 @@
1from ast import literal_eval 1from json import JSONDecodeError, dumps, loads
2from copy import deepcopy
3from logging import info
4from typing import Any, get_args
5 2
6from aiogram import types as t 3from aiogram import types as t
7from pydantic import BaseModel, ValidationError 4from pydantic import BaseModel, ValidationError
@@ -29,49 +26,71 @@ async def void_command(msg: t.Message) -> None:
29async def settings_command(msg: t.Message) -> None: 26async 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 @@
1from aiogram import types as t
2
3from shared.instances import dp
4from utils import filters as f
5
6
7async 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])
17async 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
29class CommandsConfig(BaseModel): 29class 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