diff --git a/main.py b/main.py index 4cd2b2d..d215c07 100644 --- a/main.py +++ b/main.py @@ -5,6 +5,8 @@ import signal import sys import aiohttp +from aiogram.fsm.storage.redis import RedisStorage +from redis import asyncio as redis from handlers.admin_commands import AdminCommands from handlers.user_commands import UserCommands @@ -13,18 +15,20 @@ from neuroapi.types import NeuroApiBot async def delay_bot()->None: - if Config().token is None: + config = Config() + if config.token is None: logging.warning('Delay bot needs token in environment') return - bot = NeuroApiBot(Config().token) + bot = NeuroApiBot(config.token, storage=RedisStorage(redis.from_url(config.redis_url))) bot.include_router(AdminCommands, UserCommands) await bot.start() async def proxy_bot()->None: - if Config().proxy_token is None: + config = Config() + if config.proxy_token is None: logging.warning('Proxy bot needs token in environment') return - bot = NeuroApiBot(Config().proxy_token) + bot = NeuroApiBot(config.proxy_token) bot.include_router() await bot.start() diff --git a/neuroapi/config.py b/neuroapi/config.py index 3ddba4f..219cc6d 100644 --- a/neuroapi/config.py +++ b/neuroapi/config.py @@ -6,5 +6,20 @@ from pydantic_settings import BaseSettings class GlobalConfig(BaseSettings): api_url: str = Field("http://localhost:3000", alias='API_URL') + + # Redis config + redis_host: str = Field("localhost", alias="REDIS_HOST") + redis_port: int = Field(6379, alias="REDIS_PORT") + redis_password: str = Field('', alias="REDIS_PASSWORD") + redis_db: int = Field(0, alias='REDIS_DB') + + # Bot tokens token: Optional[str] = Field(None, alias='TOKEN') - proxy_token: Optional[str] = Field(None, alias='PROXY_TOKEN') \ No newline at end of file + proxy_token: Optional[str] = Field(None, alias='PROXY_TOKEN') + + @property + def redis_url(self): + return f'redis://:{self.redis_password}@{self.redis_host}:{self.redis_port}/{self.redis_db}' + + class Config: + env_file = '.env' \ No newline at end of file diff --git a/neuroapi/types/_bot.py b/neuroapi/types/_bot.py index ffce593..5e823b1 100644 --- a/neuroapi/types/_bot.py +++ b/neuroapi/types/_bot.py @@ -1,4 +1,5 @@ from aiogram import Bot, Dispatcher +from aiogram.fsm.storage.redis import RedisStorage from pydantic import BaseModel from handlers.handler import Handler @@ -13,12 +14,12 @@ class NeuroApiBot: _instances = {} - def __init__(self, token: str) -> None: + def __init__(self, token: str, storage: RedisStorage | None = None) -> None: token_data = Token(token=token) self.bot = Bot(token_data.token) - self.dp = Dispatcher() + self.dp = Dispatcher(storage=storage) - def __new__(cls, token: str) -> 'NeuroApiBot': + def __new__(cls, token: str, storage: RedisStorage | None = None) -> 'NeuroApiBot': token_data = Token(token=token) if token_data.token not in cls._instances: cls._instances[token_data.token] = super(NeuroApiBot, cls).__new__(cls) diff --git a/requirements.txt b/requirements.txt index a1d1092..1753e4d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,8 +1,9 @@ -aiogram==3.1.1 +aiogram==3.3.0 aioschedule @ https://github.com/AleksHeller/python-aioschedule/archive/refs/heads/master.zip requests==2.31.0 python-dateutil==2.8.2 -aiohttp==3.8.6 -pydantic==2.3.0 +aiohttp==3.9.3 +pydantic==2.5.3 pydantic-settings==2.1.0 -uvloop==0.19.0; sys.platform == 'linux' \ No newline at end of file +uvloop==0.19.0; sys.platform == 'linux' +aioredis==2.0.1 \ No newline at end of file