From 4e7b5e6493497eb2de0dd40df19fc6492427e446 Mon Sep 17 00:00:00 2001 From: Igor <50257429+igorechek06@users.noreply.github.com> Date: Tue, 12 Oct 2021 21:10:36 +0900 Subject: Исправил баги MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- handlers/generate.py | 80 ++++++++++++++++-------------- shared/instances.py | 1 + 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 from shared.instances import dp, bot from aiogram import types as t from utils import filters as f +from shared import instances as ins -poll_ids = {} +pin_reply_markup = t.InlineKeyboardMarkup().add( + t.InlineKeyboardButton("Проверить сейчас", callback_data="chek") +) @dp.message_handler(f.message.is_chat, commands=['gen']) @@ -30,55 +33,60 @@ async def удалить_хуету(msg: t.Message): @dp.message_handler(f.message.is_chat, commands=["pin"]) async def закрепить_хуету(msg: t.Message): await msg.delete() - - btns = t.InlineKeyboardMarkup().add( - t.InlineKeyboardButton("Проверить сейчас", callback_data="chek") - ) - if msg.reply_to_message: - if msg.reply_to_message.from_user.id == bot.id: - poll = await msg.reply_to_message.reply_poll( - "Закрепить ?", - [ - "Да", - "УДАЛИ НАХУЙ", - "Нет" - ], - close_date=datetime.now() + timedelta(minutes=10), - reply_markup=btns - ) - - poll_ids[poll.poll.id] = msg.reply_to_message - - else: - await msg.answer("Ты умник, можно только мои закреплять") + await msg.reply_to_message.reply_poll( + "Закрепить ?", + [ + "Да", + "УДАЛИ НАХУЙ", + "Нет" + ], + close_date=datetime.now() + timedelta(minutes=10), + reply_markup=pin_reply_markup + ) else: await msg.answer("Ты умник, ответь на сообщение") -@dp.message_handler(f.message.chance(10), f.message.is_chat, content_types=[t.ContentType.ANY]) +@dp.message_handler(commands=["chance"]) +async def закрепить_хуту(msg: t.Message): + if msg.get_args(): + try: + chance = int(msg.get_args().split()[0]) + if 0 <= chance <= 100: + ins.gen_chance = chance + else: + raise RuntimeError() + + await msg.answer(f"Теперь я сру с шансом в: {chance}%") + except Exception: + await msg.answer("Я хз что не так, но я знаю что ты дебил \n /chance <ЧИСЛО ОТ 0 ДО 100>") + else: + await msg.answer(f"Я сру с шансом в: {ins.gen_chance}%") + + +@dp.message_handler(f.message.chance, f.message.is_chat, content_types=[t.ContentType.ANY]) async def срать_сообщение_с_шансом(msg: t.Message): await сгенерировать_хуету(msg) -@dp.poll_handler() -async def время_вышло(poll: t.Poll): - if poll.is_closed and poll.total_voter_count > 0: +@dp.callback_query_handler(f.message.is_chat, lambda clb: clb.data == "chek") +async def проверить_опрос(clb: t.CallbackQuery): + poll = clb.message.poll + msg = clb.message + + if poll.total_voter_count <= 0: + await clb.answer("Видишь голоса? Вот и я невижу") + else: + if not poll.is_closed: + await bot.stop_poll(msg.chat.id, msg.message_id) + await msg.delete_reply_markup() + yes = poll.options[0].voter_count delete = poll.options[1].voter_count win = max(yes, delete) - try: - msg: t.Message = poll_ids.pop(poll.id) - except KeyError: - return - if win == yes: await msg.pin() elif win == delete: await msg.delete() - - -@dp.callback_query_handler(f.message.is_chat, lambda clb: clb.data == "chek") -async def проверить_опрос(clb: t.CallbackQuery): - 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 bot = Bot(token=token) dp = Dispatcher(bot) +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 @@ -import re -import typing as p -from random import random -from aiogram import types as t, filters as f, Bot - -from shared.instances import bot -# from libs.classes import Errors as e -# from libs.objects import Database -# from libs.system import regex as r - -objType = p.Union[t.Message, t.CallbackQuery, t.ChatMemberUpdated] - - -class _helper: - @staticmethod - def get_user_and_chat(obj: objType): - if isinstance(obj, t.Message): - chat = obj.chat - user = obj.from_user - elif isinstance(obj, t.CallbackQuery): - chat = obj.message.chat - user = obj.from_user - elif isinstance(obj, t.ChatMemberUpdated): - chat = obj.chat - user = obj.from_user - else: - raise TypeError() - - return user, chat - - @staticmethod - def has_permission(admin: t.ChatMember, permission: str): - if t.ChatMemberStatus.is_chat_creator(admin.status): - return True - elif t.ChatMemberStatus.is_chat_admin(admin.status): - return getattr(admin, permission) - else: - return False - +from __future__ import annotations -class AdminFilter(f.BoundFilter): - def __init__(self, user_id: int = None): - self._user_id = user_id - - async def check(self, obj: objType): - user, chat = _helper.get_user_and_chat(obj) - - admin = await chat.get_member(self._user_id or user.id) - if t.ChatMemberStatus.is_chat_admin(admin.status): - return True - else: - return False - - -class AliasFilter(f.BoundFilter): - def __init__(self): - pass - - async def check(self, msg: objType) -> bool: - if not isinstance(msg, t.Message): - raise TypeError() - if await message.is_private.check(msg): - return False - chat = Database.get_chat(msg.chat.id) - - if msg.sticker: - aliases = list(chat.settings.sticker_alias.keys()) - text = msg.sticker.file_unique_id - elif msg.text: - aliases = list(chat.settings.text_alias.keys()) - text = msg.text +from random import random - for alias in aliases: - pattern = re.compile(r.alias(alias), re.IGNORECASE) - if pattern.match(text): - return True +from aiogram import types as t, filters as f - return False +from shared import instances as ins class message: is_chat = f.ChatTypeFilter((t.ChatType.GROUP, t.ChatType.SUPERGROUP)) is_private = f.ChatTypeFilter(t.ChatType.PRIVATE) is_reply = f.IsReplyFilter(True) - is_alias = AliasFilter() @staticmethod - def chance(percent: int): - def filter(msg: t.Message): - return random() <= (percent / 100) - return filter + def chance(msg: t.Message): + return random() <= (ins.gen_chance / 100) @staticmethod def has_text(msg: t.Message): @@ -96,60 +22,9 @@ class message: return True -class bot: - is_admin = AdminFilter(bot.id) - - @staticmethod - def has_permission(permissions: p.List[str]): - permissions = permissions - - async def filter(obj: objType): - bot = Bot.get_current() - user, chat = _helper.get_user_and_chat(obj) - admin = await chat.get_member(bot.id) - if not _helper.has_permission(admin, permissions): - raise e.BotHasNotPermission() - return True - - return filter - - class user: - is_admin = AdminFilter() - - @staticmethod - def has_permission(permissions: p.List[str]): - permissions = permissions - - async def filter(obj: objType): - user, chat = _helper.get_user_and_chat(obj) - admin = await chat.get_member(user.id) - if not _helper.has_permission(admin, permissions): - raise e.HasNotPermission() - return True - - return filter - @staticmethod def add_member(upd: t.ChatMemberUpdated): old = upd.old_chat_member new = upd.new_chat_member return not t.ChatMemberStatus.is_chat_member(old.status) and t.ChatMemberStatus.is_chat_member(new.status) - - @staticmethod - def removed_member(upd: t.ChatMemberUpdated): - old = upd.old_chat_member - new = upd.new_chat_member - return t.ChatMemberStatus.is_chat_member(old.status) and not t.ChatMemberStatus.is_chat_member(new.status) - - @staticmethod - def promote_admin(upd: t.ChatMemberUpdated): - old = upd.old_chat_member - new = upd.new_chat_member - return not t.ChatMemberStatus.is_chat_admin(old.status) and t.ChatMemberStatus.is_chat_admin(new.status) - - @staticmethod - def restrict_admin(upd: t.ChatMemberUpdated): - old = upd.old_chat_member - new = upd.new_chat_member - return t.ChatMemberStatus.is_chat_admin(old.status) and not t.ChatMemberStatus.is_chat_admin(new.status) -- cgit v1.3