aboutsummaryrefslogtreecommitdiff
path: root/handlers
diff options
context:
space:
mode:
Diffstat (limited to 'handlers')
-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
5 files changed, 70 insertions, 68 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(