aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--handlers/generate.py80
-rw-r--r--shared/instances.py1
-rw-r--r--utils/filters.py137
3 files changed, 51 insertions, 167 deletions
diff --git a/handlers/generate.py b/handlers/generate.py
index 6d0ee3d..7f58185 100644
--- a/handlers/generate.py
+++ b/handlers/generate.py
@@ -4,8 +4,11 @@ import mc
4from shared.instances import dp, bot 4from shared.instances import dp, bot
5from aiogram import types as t 5from aiogram import types as t
6from utils import filters as f 6from utils import filters as f
7from shared import instances as ins
7 8
8poll_ids = {} 9pin_reply_markup = t.InlineKeyboardMarkup().add(
10 t.InlineKeyboardButton("Проверить сейчас", callback_data="chek")
11)
9 12
10 13
11@dp.message_handler(f.message.is_chat, commands=['gen']) 14@dp.message_handler(f.message.is_chat, commands=['gen'])
@@ -30,55 +33,60 @@ async def удалить_хуету(msg: t.Message):
30@dp.message_handler(f.message.is_chat, commands=["pin"]) 33@dp.message_handler(f.message.is_chat, commands=["pin"])
31async def закрепить_хуету(msg: t.Message): 34async def закрепить_хуету(msg: t.Message):
32 await msg.delete() 35 await msg.delete()
33
34 btns = t.InlineKeyboardMarkup().add(
35 t.InlineKeyboardButton("Проверить сейчас", callback_data="chek")
36 )
37
38 if msg.reply_to_message: 36 if msg.reply_to_message:
39 if msg.reply_to_message.from_user.id == bot.id: 37 await msg.reply_to_message.reply_poll(
40 poll = await msg.reply_to_message.reply_poll( 38 "Закрепить ?",
41 "Закрепить ?", 39 [
42 [ 40 "Да",
43 "Да", 41 "УДАЛИ НАХУЙ",
44 "УДАЛИ НАХУЙ", 42 "Нет"
45 "Нет" 43 ],
46 ], 44 close_date=datetime.now() + timedelta(minutes=10),
47 close_date=datetime.now() + timedelta(minutes=10), 45 reply_markup=pin_reply_markup
48 reply_markup=btns 46 )
49 )
50
51 poll_ids[poll.poll.id] = msg.reply_to_message
52
53 else:
54 await msg.answer("Ты умник, можно только мои закреплять")
55 else: 47 else:
56 await msg.answer("Ты умник, ответь на сообщение") 48 await msg.answer("Ты умник, ответь на сообщение")
57 49
58 50
59@dp.message_handler(f.message.chance(10), f.message.is_chat, content_types=[t.ContentType.ANY]) 51@dp.message_handler(commands=["chance"])
52async def закрепить_хуту(msg: t.Message):
53 if msg.get_args():
54 try:
55 chance = int(msg.get_args().split()[0])
56 if 0 <= chance <= 100:
57 ins.gen_chance = chance
58 else:
59 raise RuntimeError()
60
61 await msg.answer(f"Теперь я сру с шансом в: {chance}%")
62 except Exception:
63 await msg.answer("Я хз что не так, но я знаю что ты дебил \n /chance <ЧИСЛО ОТ 0 ДО 100>")
64 else:
65 await msg.answer(f"Я сру с шансом в: {ins.gen_chance}%")
66
67
68@dp.message_handler(f.message.chance, f.message.is_chat, content_types=[t.ContentType.ANY])
60async def срать_сообщение_с_шансом(msg: t.Message): 69async def срать_сообщение_с_шансом(msg: t.Message):
61 await сгенерировать_хуету(msg) 70 await сгенерировать_хуету(msg)
62 71
63 72
64@dp.poll_handler() 73@dp.callback_query_handler(f.message.is_chat, lambda clb: clb.data == "chek")
65async def время_вышло(poll: t.Poll): 74async def проверить_опрос(clb: t.CallbackQuery):
66 if poll.is_closed and poll.total_voter_count > 0: 75 poll = clb.message.poll
76 msg = clb.message
77
78 if poll.total_voter_count <= 0:
79 await clb.answer("Видишь голоса? Вот и я невижу")
80 else:
81 if not poll.is_closed:
82 await bot.stop_poll(msg.chat.id, msg.message_id)
83 await msg.delete_reply_markup()
84
67 yes = poll.options[0].voter_count 85 yes = poll.options[0].voter_count
68 delete = poll.options[1].voter_count 86 delete = poll.options[1].voter_count
69 win = max(yes, delete) 87 win = max(yes, delete)
70 88
71 try:
72 msg: t.Message = poll_ids.pop(poll.id)
73 except KeyError:
74 return
75
76 if win == yes: 89 if win == yes:
77 await msg.pin() 90 await msg.pin()
78 elif win == delete: 91 elif win == delete:
79 await msg.delete() 92 await msg.delete()
80
81
82@dp.callback_query_handler(f.message.is_chat, lambda clb: clb.data == "chek")
83async def проверить_опрос(clb: t.CallbackQuery):
84 await bot.stop_poll(clb.message.chat.id, clb.message.message_id)
diff --git a/shared/instances.py b/shared/instances.py
index 0a6153d..25de59f 100644
--- a/shared/instances.py
+++ b/shared/instances.py
@@ -3,3 +3,4 @@ from .config import token
3 3
4bot = Bot(token=token) 4bot = Bot(token=token)
5dp = Dispatcher(bot) 5dp = Dispatcher(bot)
6gen_chance = 10
diff --git a/utils/filters.py b/utils/filters.py
index b6ddec5..c8a1fb5 100644
--- a/utils/filters.py
+++ b/utils/filters.py
@@ -1,94 +1,20 @@
1import re 1from __future__ import annotations
2import typing as p
3from random import random
4from aiogram import types as t, filters as f, Bot
5
6from shared.instances import bot
7# from libs.classes import Errors as e
8# from libs.objects import Database
9# from libs.system import regex as r
10
11objType = p.Union[t.Message, t.CallbackQuery, t.ChatMemberUpdated]
12
13
14class _helper:
15 @staticmethod
16 def get_user_and_chat(obj: objType):
17 if isinstance(obj, t.Message):
18 chat = obj.chat
19 user = obj.from_user
20 elif isinstance(obj, t.CallbackQuery):
21 chat = obj.message.chat
22 user = obj.from_user
23 elif isinstance(obj, t.ChatMemberUpdated):
24 chat = obj.chat
25 user = obj.from_user
26 else:
27 raise TypeError()
28
29 return user, chat
30
31 @staticmethod
32 def has_permission(admin: t.ChatMember, permission: str):
33 if t.ChatMemberStatus.is_chat_creator(admin.status):
34 return True
35 elif t.ChatMemberStatus.is_chat_admin(admin.status):
36 return getattr(admin, permission)
37 else:
38 return False
39
40 2
41class AdminFilter(f.BoundFilter): 3from random import random
42 def __init__(self, user_id: int = None):
43 self._user_id = user_id
44
45 async def check(self, obj: objType):
46 user, chat = _helper.get_user_and_chat(obj)
47
48 admin = await chat.get_member(self._user_id or user.id)
49 if t.ChatMemberStatus.is_chat_admin(admin.status):
50 return True
51 else:
52 return False
53
54
55class AliasFilter(f.BoundFilter):
56 def __init__(self):
57 pass
58
59 async def check(self, msg: objType) -> bool:
60 if not isinstance(msg, t.Message):
61 raise TypeError()
62 if await message.is_private.check(msg):
63 return False
64 chat = Database.get_chat(msg.chat.id)
65
66 if msg.sticker:
67 aliases = list(chat.settings.sticker_alias.keys())
68 text = msg.sticker.file_unique_id
69 elif msg.text:
70 aliases = list(chat.settings.text_alias.keys())
71 text = msg.text
72 4
73 for alias in aliases: 5from aiogram import types as t, filters as f
74 pattern = re.compile(r.alias(alias), re.IGNORECASE)
75 if pattern.match(text):
76 return True
77 6
78 return False 7from shared import instances as ins
79 8
80 9
81class message: 10class message:
82 is_chat = f.ChatTypeFilter((t.ChatType.GROUP, t.ChatType.SUPERGROUP)) 11 is_chat = f.ChatTypeFilter((t.ChatType.GROUP, t.ChatType.SUPERGROUP))
83 is_private = f.ChatTypeFilter(t.ChatType.PRIVATE) 12 is_private = f.ChatTypeFilter(t.ChatType.PRIVATE)
84 is_reply = f.IsReplyFilter(True) 13 is_reply = f.IsReplyFilter(True)
85 is_alias = AliasFilter()
86 14
87 @staticmethod 15 @staticmethod
88 def chance(percent: int): 16 def chance(msg: t.Message):
89 def filter(msg: t.Message): 17 return random() <= (ins.gen_chance / 100)
90 return random() <= (percent / 100)
91 return filter
92 18
93 @staticmethod 19 @staticmethod
94 def has_text(msg: t.Message): 20 def has_text(msg: t.Message):
@@ -96,60 +22,9 @@ class message:
96 return True 22 return True
97 23
98 24
99class bot:
100 is_admin = AdminFilter(bot.id)
101
102 @staticmethod
103 def has_permission(permissions: p.List[str]):
104 permissions = permissions
105
106 async def filter(obj: objType):
107 bot = Bot.get_current()
108 user, chat = _helper.get_user_and_chat(obj)
109 admin = await chat.get_member(bot.id)
110 if not _helper.has_permission(admin, permissions):
111 raise e.BotHasNotPermission()
112 return True
113
114 return filter
115
116
117class user: 25class user:
118 is_admin = AdminFilter()
119
120 @staticmethod
121 def has_permission(permissions: p.List[str]):
122 permissions = permissions
123
124 async def filter(obj: objType):
125 user, chat = _helper.get_user_and_chat(obj)
126 admin = await chat.get_member(user.id)
127 if not _helper.has_permission(admin, permissions):
128 raise e.HasNotPermission()
129 return True
130
131 return filter
132
133 @staticmethod 26 @staticmethod
134 def add_member(upd: t.ChatMemberUpdated): 27 def add_member(upd: t.ChatMemberUpdated):
135 old = upd.old_chat_member 28 old = upd.old_chat_member
136 new = upd.new_chat_member 29 new = upd.new_chat_member
137 return not t.ChatMemberStatus.is_chat_member(old.status) and t.ChatMemberStatus.is_chat_member(new.status) 30 return not t.ChatMemberStatus.is_chat_member(old.status) and t.ChatMemberStatus.is_chat_member(new.status)
138
139 @staticmethod
140 def removed_member(upd: t.ChatMemberUpdated):
141 old = upd.old_chat_member
142 new = upd.new_chat_member
143 return t.ChatMemberStatus.is_chat_member(old.status) and not t.ChatMemberStatus.is_chat_member(new.status)
144
145 @staticmethod
146 def promote_admin(upd: t.ChatMemberUpdated):
147 old = upd.old_chat_member
148 new = upd.new_chat_member
149 return not t.ChatMemberStatus.is_chat_admin(old.status) and t.ChatMemberStatus.is_chat_admin(new.status)
150
151 @staticmethod
152 def restrict_admin(upd: t.ChatMemberUpdated):
153 old = upd.old_chat_member
154 new = upd.new_chat_member
155 return t.ChatMemberStatus.is_chat_admin(old.status) and not t.ChatMemberStatus.is_chat_admin(new.status)