From 93067d9a91395c339ce55a111ce4b6e1020f0121 Mon Sep 17 00:00:00 2001 From: Igor Tolmachov Date: Sat, 9 Jul 2022 01:13:20 +0900 Subject: Теперь доступен не только в ананасах! MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit + опрос на вступление человека --- handlers/member.py | 105 +++++++++++++++++++++++++++-------------------------- 1 file changed, 54 insertions(+), 51 deletions(-) (limited to 'handlers/member.py') diff --git a/handlers/member.py b/handlers/member.py index d242779..3704c33 100644 --- a/handlers/member.py +++ b/handlers/member.py @@ -1,66 +1,69 @@ -from asyncio import sleep - from aiogram import types as t from shared.instances import bot, dp from utils import filters as f -unmute = t.ChatPermissions(*[True] * 8) -mute = t.ChatPermissions(*[False] * 8) +request_queue: list[int] = [] -@dp.chat_member_handler(f.user.add_member) -async def запрашиваем_пропуск(upd: t.ChatMemberUpdated): - pass_user_markup = t.InlineKeyboardMarkup().add( - t.InlineKeyboardButton( - "Да", callback_data=f"pass_user@{upd.new_chat_member.user.id}" - ), - t.InlineKeyboardButton( - "Нет", callback_data=f"kick_user@{upd.new_chat_member.user.id}" - ), - ) - await upd.chat.restrict(upd.new_chat_member.user.id, mute) - await bot.send_message( - upd.chat.id, - f'Это наш чел ?', - parse_mode=t.ParseMode.HTML, - reply_markup=pass_user_markup, - ) +@dp.chat_join_request_handler() +async def приём_запроса(cjr: t.ChatJoinRequest): + if cjr.from_user.id not in request_queue: + request_queue.append(cjr.from_user.id) + r = await bot.send_message( + cjr.chat.id, + f'{cjr.from_user.mention} хочет в чат', + parse_mode=t.ParseMode.HTML, + ) + await bot.send_poll( + cjr.chat.id, + "Пускаем ?", + [ + "Да", + "Нет", + ], + False, + reply_to_message_id=r.message_id, + open_period=600, + reply_markup=t.InlineKeyboardMarkup().add( + t.InlineKeyboardButton( + "Проверить опрос", + callback_data=f"check_request_poll:{cjr.from_user.id}", + ) + ), + ) + await bot.send_message( + cjr.from_user.id, "Заявка на вступление в группу будет вскоре рассмотрена" + ) @dp.callback_query_handler( - f.message.is_chat, lambda clb: clb.data.split("@")[0] == "pass_user" + f.message.is_chat, lambda clb: clb.data.split(":")[0] == "check_request_poll" ) -async def пропустить(clb: t.CallbackQuery): - member = await clb.message.chat.get_member(clb.from_user.id) +async def проверить_запрос(clb: t.CallbackQuery): + poll = clb.message.poll + msg = clb.message + data = clb.data.split(":") + user_id = int(data[1]) - if not member.is_chat_admin(): - await clb.answer("Ты не админ") - return + if poll.total_voter_count < 4: + await clb.answer(f"Нужно хотябы 4 голоса, сейчас {poll.total_voter_count}") else: - await clb.message.chat.restrict(int(clb.data.split("@")[1]), unmute) - - await clb.message.delete() - await clb.message.answer( - f'Ананасер добро пожаловать в чат для крутых', - parse_mode=t.ParseMode.HTML, - ) + if not poll.is_closed: + await bot.stop_poll(msg.chat.id, msg.message_id) + request_queue.remove(user_id) + yes = poll.options[0].voter_count + no = poll.options[1].voter_count + win = max(yes, no) -@dp.callback_query_handler( - f.message.is_chat, lambda clb: clb.data.split("@")[0] == "kick_user" -) -async def выкинуть(clb: t.CallbackQuery): - member = await clb.message.chat.get_member(clb.from_user.id) - - if not member.is_chat_admin(): - await clb.answer("Ты не админ") - return - else: - await clb.message.chat.unban(int(clb.data.split("@")[1]), False) - - await clb.message.delete() - await clb.message.answer( - f'Эта группа для крутых', - parse_mode=t.ParseMode.HTML, - ) + if win == yes: + await bot.approve_chat_join_request(msg.chat.id, user_id) + await bot.send_message( + user_id, "Ваша заявка на вступление принята, добро пожаловать в группу" + ) + elif win == no: + await bot.decline_chat_join_request(msg.chat.id, user_id) + await bot.send_message(user_id, "Ваша заявка на вступление НЕ принята") + if not msg.chat.has_protected_content: + await msg.forward(user_id) -- cgit v1.2.3