diff options
Diffstat (limited to 'handlers/member.py')
| -rw-r--r-- | handlers/member.py | 105 |
1 files changed, 54 insertions, 51 deletions
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 @@ | |||
| 1 | from asyncio import sleep | ||
| 2 | |||
| 3 | from aiogram import types as t | 1 | from aiogram import types as t |
| 4 | 2 | ||
| 5 | from shared.instances import bot, dp | 3 | from shared.instances import bot, dp |
| 6 | from utils import filters as f | 4 | from utils import filters as f |
| 7 | 5 | ||
| 8 | unmute = t.ChatPermissions(*[True] * 8) | 6 | request_queue: list[int] = [] |
| 9 | mute = t.ChatPermissions(*[False] * 8) | ||
| 10 | 7 | ||
| 11 | 8 | ||
| 12 | @dp.chat_member_handler(f.user.add_member) | 9 | @dp.chat_join_request_handler() |
| 13 | async def запрашиваем_пропуск(upd: t.ChatMemberUpdated): | 10 | async def приём_запроса(cjr: t.ChatJoinRequest): |
| 14 | pass_user_markup = t.InlineKeyboardMarkup().add( | 11 | if cjr.from_user.id not in request_queue: |
| 15 | t.InlineKeyboardButton( | 12 | request_queue.append(cjr.from_user.id) |
| 16 | "Да", callback_data=f"pass_user@{upd.new_chat_member.user.id}" | 13 | r = await bot.send_message( |
| 17 | ), | 14 | cjr.chat.id, |
| 18 | t.InlineKeyboardButton( | 15 | f'<a href="tg://user?id={cjr.from_user.id}">{cjr.from_user.mention}</a> хочет в чат', |
| 19 | "Нет", callback_data=f"kick_user@{upd.new_chat_member.user.id}" | 16 | parse_mode=t.ParseMode.HTML, |
| 20 | ), | 17 | ) |
| 21 | ) | 18 | await bot.send_poll( |
| 22 | await upd.chat.restrict(upd.new_chat_member.user.id, mute) | 19 | cjr.chat.id, |
| 23 | await bot.send_message( | 20 | "Пускаем ?", |
| 24 | upd.chat.id, | 21 | [ |
| 25 | f'Это наш <a href="tg://user?id={upd.new_chat_member.user.id}">чел</a> ?', | 22 | "Да", |
| 26 | parse_mode=t.ParseMode.HTML, | 23 | "Нет", |
| 27 | reply_markup=pass_user_markup, | 24 | ], |
| 28 | ) | 25 | False, |
| 26 | reply_to_message_id=r.message_id, | ||
| 27 | open_period=600, | ||
| 28 | reply_markup=t.InlineKeyboardMarkup().add( | ||
| 29 | t.InlineKeyboardButton( | ||
| 30 | "Проверить опрос", | ||
| 31 | callback_data=f"check_request_poll:{cjr.from_user.id}", | ||
| 32 | ) | ||
| 33 | ), | ||
| 34 | ) | ||
| 35 | await bot.send_message( | ||
| 36 | cjr.from_user.id, "Заявка на вступление в группу будет вскоре рассмотрена" | ||
| 37 | ) | ||
| 29 | 38 | ||
| 30 | 39 | ||
| 31 | @dp.callback_query_handler( | 40 | @dp.callback_query_handler( |
| 32 | f.message.is_chat, lambda clb: clb.data.split("@")[0] == "pass_user" | 41 | f.message.is_chat, lambda clb: clb.data.split(":")[0] == "check_request_poll" |
| 33 | ) | 42 | ) |
| 34 | async def пропустить(clb: t.CallbackQuery): | 43 | async def проверить_запрос(clb: t.CallbackQuery): |
| 35 | member = await clb.message.chat.get_member(clb.from_user.id) | 44 | poll = clb.message.poll |
| 45 | msg = clb.message | ||
| 46 | data = clb.data.split(":") | ||
| 47 | user_id = int(data[1]) | ||
| 36 | 48 | ||
| 37 | if not member.is_chat_admin(): | 49 | if poll.total_voter_count < 4: |
| 38 | await clb.answer("Ты не админ") | 50 | await clb.answer(f"Нужно хотябы 4 голоса, сейчас {poll.total_voter_count}") |
| 39 | return | ||
| 40 | else: | 51 | else: |
| 41 | await clb.message.chat.restrict(int(clb.data.split("@")[1]), unmute) | 52 | if not poll.is_closed: |
| 42 | 53 | await bot.stop_poll(msg.chat.id, msg.message_id) | |
| 43 | await clb.message.delete() | ||
| 44 | await clb.message.answer( | ||
| 45 | f'<a href="tg://user?id={int(clb.data.split("@")[1])}">Ананасер</a> добро пожаловать в чат для <a href="tg://user?id={clb.from_user.id}">крутых</a>', | ||
| 46 | parse_mode=t.ParseMode.HTML, | ||
| 47 | ) | ||
| 48 | 54 | ||
| 55 | request_queue.remove(user_id) | ||
| 56 | yes = poll.options[0].voter_count | ||
| 57 | no = poll.options[1].voter_count | ||
| 58 | win = max(yes, no) | ||
| 49 | 59 | ||
| 50 | @dp.callback_query_handler( | 60 | if win == yes: |
| 51 | f.message.is_chat, lambda clb: clb.data.split("@")[0] == "kick_user" | 61 | await bot.approve_chat_join_request(msg.chat.id, user_id) |
| 52 | ) | 62 | await bot.send_message( |
| 53 | async def выкинуть(clb: t.CallbackQuery): | 63 | user_id, "Ваша заявка на вступление принята, добро пожаловать в группу" |
| 54 | member = await clb.message.chat.get_member(clb.from_user.id) | 64 | ) |
| 55 | 65 | elif win == no: | |
| 56 | if not member.is_chat_admin(): | 66 | await bot.decline_chat_join_request(msg.chat.id, user_id) |
| 57 | await clb.answer("Ты не админ") | 67 | await bot.send_message(user_id, "Ваша заявка на вступление НЕ принята") |
| 58 | return | 68 | if not msg.chat.has_protected_content: |
| 59 | else: | 69 | await msg.forward(user_id) |
| 60 | await clb.message.chat.unban(int(clb.data.split("@")[1]), False) | ||
| 61 | |||
| 62 | await clb.message.delete() | ||
| 63 | await clb.message.answer( | ||
| 64 | f'Эта группа для <a href="tg://user?id={clb.from_user.id}">крутых</a>', | ||
| 65 | parse_mode=t.ParseMode.HTML, | ||
| 66 | ) | ||
