diff options
| author | Igor <50257429+igorechek06@users.noreply.github.com> | 2021-10-12 21:10:36 +0900 |
|---|---|---|
| committer | Igor <50257429+igorechek06@users.noreply.github.com> | 2021-10-12 21:10:36 +0900 |
| commit | 4e7b5e6493497eb2de0dd40df19fc6492427e446 (patch) | |
| tree | 0071164c777e9bc287d8cd7b62026e0850464bbf | |
| parent | f1dbf92a26490095a45e4a39fd654debc0e5828c (diff) | |
| download | karpov_ai_bot-4e7b5e6493497eb2de0dd40df19fc6492427e446.tar.gz karpov_ai_bot-4e7b5e6493497eb2de0dd40df19fc6492427e446.zip | |
Исправил баги
| -rw-r--r-- | handlers/generate.py | 80 | ||||
| -rw-r--r-- | shared/instances.py | 1 | ||||
| -rw-r--r-- | utils/filters.py | 137 |
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 | |||
| 4 | from shared.instances import dp, bot | 4 | from shared.instances import dp, bot |
| 5 | from aiogram import types as t | 5 | from aiogram import types as t |
| 6 | from utils import filters as f | 6 | from utils import filters as f |
| 7 | from shared import instances as ins | ||
| 7 | 8 | ||
| 8 | poll_ids = {} | 9 | pin_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"]) |
| 31 | async def закрепить_хуету(msg: t.Message): | 34 | async 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"]) |
| 52 | async 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]) | ||
| 60 | async def срать_сообщение_с_шансом(msg: t.Message): | 69 | async 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") |
| 65 | async def время_вышло(poll: t.Poll): | 74 | async 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") | ||
| 83 | async 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 | ||
| 4 | bot = Bot(token=token) | 4 | bot = Bot(token=token) |
| 5 | dp = Dispatcher(bot) | 5 | dp = Dispatcher(bot) |
| 6 | gen_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 @@ | |||
| 1 | import re | 1 | from __future__ import annotations |
| 2 | import typing as p | ||
| 3 | from random import random | ||
| 4 | from aiogram import types as t, filters as f, Bot | ||
| 5 | |||
| 6 | from 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 | |||
| 11 | objType = p.Union[t.Message, t.CallbackQuery, t.ChatMemberUpdated] | ||
| 12 | |||
| 13 | |||
| 14 | class _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 | ||
| 41 | class AdminFilter(f.BoundFilter): | 3 | from 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 | |||
| 55 | class 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: | 5 | from 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 | 7 | from shared import instances as ins |
| 79 | 8 | ||
| 80 | 9 | ||
| 81 | class message: | 10 | class 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 | ||
| 99 | class 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 | |||
| 117 | class user: | 25 | class 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) | ||
