aboutsummaryrefslogtreecommitdiff
path: root/handlers
diff options
context:
space:
mode:
authorIgor Tolmachov <me@igorek.dev>2022-12-05 22:29:41 +0900
committerIgor Tolmachov <me@igorek.dev>2022-12-05 22:29:41 +0900
commit0de7969d30e3e57d681afdfcadd245f6988a0342 (patch)
treebc0957e9208f51354aa2330dc20a090b7f680823 /handlers
parent0d5cab62b0d077ad7946b64a534e3914f1cc79dd (diff)
downloadkarpov_ai_bot-0de7969d30e3e57d681afdfcadd245f6988a0342.tar.gz
karpov_ai_bot-0de7969d30e3e57d681afdfcadd245f6988a0342.zip
2.1
Diffstat (limited to 'handlers')
-rw-r--r--handlers/config.py23
-rw-r--r--handlers/gen.py59
-rw-r--r--handlers/member.py23
-rw-r--r--handlers/middleware.py5
-rw-r--r--handlers/pin.py6
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 @@
1from copy import deepcopy
1from json import JSONDecodeError, dumps, loads 2from json import JSONDecodeError, dumps, loads
2from logging import info 3from logging import info
3 4
@@ -5,7 +6,8 @@ from aiogram import types as t
5from pydantic import BaseModel, ValidationError 6from pydantic import BaseModel, ValidationError
6 7
7from shared.database import Message 8from shared.database import Message
8from shared.instances import config, dp, session 9from shared.instances import chats, dp, session
10from shared.samples import samples
9from shared.settings import Config 11from shared.settings import Config
10from utils import filters as f 12from 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"])
14async def void_command(msg: t.Message) -> None: 16async 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 @@
1import random
2
3import mc
4from aiogram import types as t 1from aiogram import types as t
5 2
6from shared.database import Message 3from shared.instances import chats, dp
7from shared.instances import bot, config, dp, session 4from shared.samples import samples
8from utils import filters as f 5from utils import filters as f
9 6
10 7
11def 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"])
41async def gen_command(msg: t.Message) -> None: 9async 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"])
48async 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)
65async def chance_message(msg: t.Message) -> None: 20async 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 @@
1from aiogram import types as t 1from aiogram import types as t
2 2
3from shared.instances import bot, config, dp 3from shared.instances import bot, chats, dp
4from utils import filters as f 4from utils import filters as f
5 5
6polls: dict[int, int] = {}
7
6 8
7@dp.chat_join_request_handler() 9@dp.chat_join_request_handler()
8async def new_member(cjr: t.ChatJoinRequest) -> None: 10async 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)
40async 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 @@
1from logging import info
2
3from aiogram import types as t 1from aiogram import types as t
4from aiogram.dispatcher.middlewares import BaseMiddleware 2from aiogram.dispatcher.middlewares import BaseMiddleware
5 3
6from shared.database import Message 4from shared.database import Message
7from shared.instances import session 5from shared.instances import session
6from shared.samples import samples
8 7
9 8
10class MessageMiddleware(BaseMiddleware): 9class 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 @@
1from aiogram import types as t 1from aiogram import types as t
2 2
3from shared.instances import bot, config, dp 3from shared.instances import bot, chats, dp
4from utils import filters as f 4from 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(