From e89cb04c0267a24f61a89ab6bbf4bf53c2c127cd Mon Sep 17 00:00:00 2001 From: Sergey Elpashev Date: Fri, 9 Feb 2024 12:52:56 +0300 Subject: [PATCH] Checking user is a member of the channel --- handlers/user_commands.py | 26 +++++++++++++++++++------- neuroapi/types/_bot_settings.py | 11 ++++++++++- 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/handlers/user_commands.py b/handlers/user_commands.py index caf67cb..917502d 100644 --- a/handlers/user_commands.py +++ b/handlers/user_commands.py @@ -1,14 +1,17 @@ from typing import List from aiogram import Bot, F, types -from aiogram.filters import CommandStart +from aiogram.enums import ChatMemberStatus +from aiogram.filters import Command, CommandStart from handlers.handler import Handler from neuroapi import neuroapi from neuroapi.types import Admin as AdminType +from neuroapi.types import BotSettings as BotSettingsType class UserCommands(Handler): + settings: BotSettingsType def __init__(self, bot: Bot) -> None: super().__init__(bot) @@ -16,16 +19,25 @@ class UserCommands(Handler): @self.router.message(CommandStart()) async def start_command(message: types.Message): await message.answer("Добро пожаловать! Данный бот - предложка для канала @neur0w0men. Отправляйте свои пожелания насчет нейрокартинок, а также свои картинки, а админы постараются заняться этим!\nДанный бот принимает текст, картинки, документы и стикеры.") - + @self.router.message(F.chat.type == 'private') async def forward_post(message: types.Message): + self.settings = BotSettingsType.get_active() + user = await bot.get_chat_member(self.settings.channel, message.from_user.id) + if user is None: + await message.reply('Ошибка') + return + user_in_channel = user.status == ChatMemberStatus.LEFT admins: List[AdminType] = await neuroapi.admin.get() canReply = True for admin in admins: await bot.send_message(admin.user_id, f'Вам новое сообщение от пользователя {message.from_user.full_name}. ' + - (f'\nНик: @{message.from_user.username}' if message.from_user.username else f'ID: {message.from_user.id}')) - forwarded_message = await bot.forward_message(admin.user_id, message.chat.id, message.message_id) - if forwarded_message.forward_from is None: - canReply = False + (f'\nНик: @{message.from_user.username}' if message.from_user.username else f'ID: {message.from_user.id}') + + f'\nПользователь{" не " if user_in_channel else " "}состоит в канале') + try: + forwarded_message = await bot.forward_message(admin.user_id, message.chat.id, message.message_id) + if forwarded_message.forward_from is None: + canReply = False + except: + pass await message.reply('Ваше сообщение было отправлено администраторам'+('' if canReply else '\nНо они не смогут вам ответить из-за ваших настроек конфиденциальности.')) - diff --git a/neuroapi/types/_bot_settings.py b/neuroapi/types/_bot_settings.py index f774261..fad43b9 100644 --- a/neuroapi/types/_bot_settings.py +++ b/neuroapi/types/_bot_settings.py @@ -1,11 +1,13 @@ from dataclasses import dataclass +from typing import Optional from uuid import UUID from ._helpers import * +from ._singleton import Singleton @dataclass -class BotSettings: +class BotSettings(Singleton): uuid: UUID message_times: List[str] channel: str @@ -27,3 +29,10 @@ class BotSettings: result["channel"] = from_str(self.channel) result["isActive"] = from_bool(self.is_active) return result + + @staticmethod + def get_active() -> Optional['BotSettings']: + try: + return BotSettings._instances[BotSettings] + except: + return None \ No newline at end of file