mirror of
				https://github.com/civsocit/olgram.git
				synced 2023-07-22 01:29:12 +03:00 
			
		
		
		
	Возможность ограничивать права на бота
This commit is contained in:
		
							parent
							
								
									5fcb5b8900
								
							
						
					
					
						commit
						1aeec0c9d8
					
				
							
								
								
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@ -6,4 +6,4 @@ __pycache__
 | 
				
			|||||||
*.pyc
 | 
					*.pyc
 | 
				
			||||||
config.json
 | 
					config.json
 | 
				
			||||||
docker-compose-release.yaml
 | 
					docker-compose-release.yaml
 | 
				
			||||||
docs/build
 | 
					docs/build
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										6
									
								
								main.py
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								main.py
									
									
									
									
									
								
							@ -3,7 +3,8 @@ import argparse
 | 
				
			|||||||
from tortoise import Tortoise
 | 
					from tortoise import Tortoise
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from olgram.router import dp
 | 
					from olgram.router import dp
 | 
				
			||||||
from olgram.settings import TORTOISE_ORM
 | 
					from olgram.settings import TORTOISE_ORM, OlgramSettings
 | 
				
			||||||
 | 
					from olgram.utils.permissions import AccessMiddleware
 | 
				
			||||||
from server.custom import init_redis
 | 
					from server.custom import init_redis
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import olgram.commands.bots  # noqa: F401
 | 
					import olgram.commands.bots  # noqa: F401
 | 
				
			||||||
@ -22,7 +23,8 @@ async def init_database():
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
async def init_olgram():
 | 
					async def init_olgram():
 | 
				
			||||||
    from olgram.router import bot
 | 
					    from olgram.router import bot, dp
 | 
				
			||||||
 | 
					    dp.setup_middleware(AccessMiddleware(OlgramSettings.admin_id()))
 | 
				
			||||||
    from aiogram.types import BotCommand
 | 
					    from aiogram.types import BotCommand
 | 
				
			||||||
    await bot.set_my_commands(
 | 
					    await bot.set_my_commands(
 | 
				
			||||||
        [
 | 
					        [
 | 
				
			||||||
 | 
				
			|||||||
@ -6,11 +6,13 @@ from aiogram import types
 | 
				
			|||||||
from aiogram.dispatcher import FSMContext
 | 
					from aiogram.dispatcher import FSMContext
 | 
				
			||||||
from textwrap import dedent
 | 
					from textwrap import dedent
 | 
				
			||||||
from olgram.settings import OlgramSettings
 | 
					from olgram.settings import OlgramSettings
 | 
				
			||||||
 | 
					from olgram.utils.permissions import public
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from olgram.router import dp
 | 
					from olgram.router import dp
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@dp.message_handler(commands=["start"], state="*")
 | 
					@dp.message_handler(commands=["start"], state="*")
 | 
				
			||||||
 | 
					@public()
 | 
				
			||||||
async def start(message: types.Message, state: FSMContext):
 | 
					async def start(message: types.Message, state: FSMContext):
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
    Команда /start
 | 
					    Команда /start
 | 
				
			||||||
@ -33,6 +35,7 @@ async def start(message: types.Message, state: FSMContext):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@dp.message_handler(commands=["help"], state="*")
 | 
					@dp.message_handler(commands=["help"], state="*")
 | 
				
			||||||
 | 
					@public()
 | 
				
			||||||
async def help(message: types.Message, state: FSMContext):
 | 
					async def help(message: types.Message, state: FSMContext):
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
    Команда /help
 | 
					    Команда /help
 | 
				
			||||||
@ -42,3 +45,12 @@ async def help(message: types.Message, state: FSMContext):
 | 
				
			|||||||
    Техническая поддержка: @civsocit_feedback_bot
 | 
					    Техническая поддержка: @civsocit_feedback_bot
 | 
				
			||||||
    Версия {OlgramSettings.version()}
 | 
					    Версия {OlgramSettings.version()}
 | 
				
			||||||
    """))
 | 
					    """))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@dp.message_handler(commands=["chatid"], state="*")
 | 
				
			||||||
 | 
					@public()
 | 
				
			||||||
 | 
					async def chat_id(message: types.Message, state: FSMContext):
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					    Команда /chatid
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					    await message.answer(message.chat.id)
 | 
				
			||||||
 | 
				
			|||||||
@ -32,6 +32,11 @@ class OlgramSettings(AbstractSettings):
 | 
				
			|||||||
    def version(cls):
 | 
					    def version(cls):
 | 
				
			||||||
        return "0.1.0"
 | 
					        return "0.1.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @classmethod
 | 
				
			||||||
 | 
					    @lru_cache
 | 
				
			||||||
 | 
					    def admin_id(cls):
 | 
				
			||||||
 | 
					        return cls._get_env("ADMIN_ID", True)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class ServerSettings(AbstractSettings):
 | 
					class ServerSettings(AbstractSettings):
 | 
				
			||||||
    @classmethod
 | 
					    @classmethod
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										52
									
								
								olgram/utils/permissions.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								olgram/utils/permissions.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,52 @@
 | 
				
			|||||||
 | 
					import aiogram.types as types
 | 
				
			||||||
 | 
					from aiogram.dispatcher.handler import CancelHandler, current_handler
 | 
				
			||||||
 | 
					from aiogram.dispatcher.middlewares import BaseMiddleware
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def public():
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					    Хендлеры с этим декоратором будут обрабатываться даже если пользователь не является владельцем бота
 | 
				
			||||||
 | 
					    (например, команда /help)
 | 
				
			||||||
 | 
					    :return:
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def decorator(func):
 | 
				
			||||||
 | 
					        setattr(func, "access_public", True)
 | 
				
			||||||
 | 
					        return func
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return decorator
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class AccessMiddleware(BaseMiddleware):
 | 
				
			||||||
 | 
					    def __init__(self, access_chat_id: int):
 | 
				
			||||||
 | 
					        self._access_chat_id = access_chat_id
 | 
				
			||||||
 | 
					        super(AccessMiddleware, self).__init__()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @classmethod
 | 
				
			||||||
 | 
					    def _is_public_command(cls) -> bool:
 | 
				
			||||||
 | 
					        handler = current_handler.get()
 | 
				
			||||||
 | 
					        return handler and getattr(handler, "access_public", False)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    async def on_process_message(self, message: types.Message, data: dict):
 | 
				
			||||||
 | 
					        admin_id = self._access_chat_id
 | 
				
			||||||
 | 
					        if not admin_id:
 | 
				
			||||||
 | 
					            return  # Администратор бота вообще не указан
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if self._is_public_command():  # Эта команда разрешена всем пользователям
 | 
				
			||||||
 | 
					            return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if message.chat.id != admin_id:
 | 
				
			||||||
 | 
					            await message.answer("Владелец бота ограничил доступ к этому функционалу 😞")
 | 
				
			||||||
 | 
					            raise CancelHandler()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    async def on_process_callback_query(self, call: types.CallbackQuery, data: dict):
 | 
				
			||||||
 | 
					        admin_id = self._access_chat_id
 | 
				
			||||||
 | 
					        if not admin_id:
 | 
				
			||||||
 | 
					            return  # Администратор бота вообще не указан
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if self._is_public_command():  # Эта команда разрешена всем пользователям
 | 
				
			||||||
 | 
					            return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if call.message.chat.id != admin_id:
 | 
				
			||||||
 | 
					            await call.answer("Владелец бота ограничил доступ к этому функционалу😞")
 | 
				
			||||||
 | 
					            raise CancelHandler()
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user