generated from geekiot/python-template
feature/localization #13
4 changed files with 26 additions and 9 deletions
|
|
@ -1,8 +1,11 @@
|
||||||
__all__ = ["start_bot"]
|
__all__ = ["start_bot"]
|
||||||
|
|
||||||
|
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
from aiogram import Bot, Dispatcher
|
from aiogram import Bot, Dispatcher
|
||||||
from aiogram.fsm.storage.redis import RedisStorage
|
from aiogram.fsm.storage.redis import RedisStorage
|
||||||
|
from aiogram.utils.i18n import I18n
|
||||||
from loguru import logger as loguru_logger
|
from loguru import logger as loguru_logger
|
||||||
from redis.asyncio.client import Redis
|
from redis.asyncio.client import Redis
|
||||||
from sqlalchemy.ext.asyncio import async_sessionmaker
|
from sqlalchemy.ext.asyncio import async_sessionmaker
|
||||||
|
|
@ -16,6 +19,7 @@ async def start_bot(
|
||||||
bot_token: str,
|
bot_token: str,
|
||||||
redis_protocol: Redis,
|
redis_protocol: Redis,
|
||||||
session_maker: async_sessionmaker,
|
session_maker: async_sessionmaker,
|
||||||
|
i18n_domain: str,
|
||||||
) -> None:
|
) -> None:
|
||||||
"""
|
"""
|
||||||
Start Telegram bot.
|
Start Telegram bot.
|
||||||
|
|
@ -24,6 +28,7 @@ async def start_bot(
|
||||||
bot_token (str): Telegram API bot token.
|
bot_token (str): Telegram API bot token.
|
||||||
redis_client (Redis): async configured client for redis.
|
redis_client (Redis): async configured client for redis.
|
||||||
session_maker (AsyncSession): async database session maker.
|
session_maker (AsyncSession): async database session maker.
|
||||||
|
i18n_domain (str): the bot locales domain.
|
||||||
"""
|
"""
|
||||||
bot = Bot(bot_token)
|
bot = Bot(bot_token)
|
||||||
|
|
||||||
|
|
@ -31,13 +36,15 @@ async def start_bot(
|
||||||
storage=RedisStorage(redis=redis_protocol),
|
storage=RedisStorage(redis=redis_protocol),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
locales_dir = Path(".") / "src" / "locales"
|
||||||
|
i18n = I18n(path=locales_dir, default_locale="ru", domain=i18n_domain)
|
||||||
|
|
||||||
connect_middlewares(
|
connect_middlewares(
|
||||||
dispatcher=dispatcher,
|
dispatcher=dispatcher,
|
||||||
session_maker=session_maker,
|
session_maker=session_maker,
|
||||||
|
i18n=i18n,
|
||||||
)
|
)
|
||||||
loguru_logger.debug(
|
loguru_logger.debug("Middlewares have been successfully connected.")
|
||||||
"Middlewares have been successfully connected."
|
|
||||||
)
|
|
||||||
|
|
||||||
include_routers(dispatcher)
|
include_routers(dispatcher)
|
||||||
loguru_logger.debug("Routers have been successfully included.")
|
loguru_logger.debug("Routers have been successfully included.")
|
||||||
|
|
|
||||||
|
|
@ -2,9 +2,11 @@ __all__ = ["connect_middlewares"]
|
||||||
|
|
||||||
|
|
||||||
from aiogram import Dispatcher
|
from aiogram import Dispatcher
|
||||||
|
from aiogram.utils.i18n import I18n
|
||||||
from sqlalchemy.ext.asyncio import async_sessionmaker
|
from sqlalchemy.ext.asyncio import async_sessionmaker
|
||||||
|
|
||||||
from .database import DatabaseSessionMiddleware
|
from .database import DatabaseSessionMiddleware
|
||||||
|
from .i18n import I18nMiddleware
|
||||||
from .registration import RegistrationMiddleware
|
from .registration import RegistrationMiddleware
|
||||||
from .telegram_user import TelegramUserMiddleware
|
from .telegram_user import TelegramUserMiddleware
|
||||||
|
|
||||||
|
|
@ -12,6 +14,7 @@ from .telegram_user import TelegramUserMiddleware
|
||||||
def connect_middlewares(
|
def connect_middlewares(
|
||||||
dispatcher: Dispatcher,
|
dispatcher: Dispatcher,
|
||||||
session_maker: async_sessionmaker,
|
session_maker: async_sessionmaker,
|
||||||
|
i18n: I18n,
|
||||||
) -> None:
|
) -> None:
|
||||||
"""
|
"""
|
||||||
Connecting all middleware for the dispatcher.
|
Connecting all middleware for the dispatcher.
|
||||||
|
|
@ -19,10 +22,12 @@ def connect_middlewares(
|
||||||
1. DatabaseSessionMiddleware (outer): provides a session.
|
1. DatabaseSessionMiddleware (outer): provides a session.
|
||||||
2. TelegramUserMiddleware (outer): uses session to get a user.
|
2. TelegramUserMiddleware (outer): uses session to get a user.
|
||||||
3. RegistrationMiddleware (outer): uses user to check status.
|
3. RegistrationMiddleware (outer): uses user to check status.
|
||||||
|
4. I18nMiddleware (inter): uses session to get user's locale code.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
dispatcher (Dispatcher): bot dispatcher.
|
dispatcher (Dispatcher): bot dispatcher.
|
||||||
session_maker (async_sessionmaker): database sessionmaker.
|
session_maker (async_sessionmaker): database sessionmaker.
|
||||||
|
i18n (I18n): aiogram bot i18n object.
|
||||||
"""
|
"""
|
||||||
dispatcher.update.outer_middleware(
|
dispatcher.update.outer_middleware(
|
||||||
DatabaseSessionMiddleware(session_maker=session_maker)
|
DatabaseSessionMiddleware(session_maker=session_maker)
|
||||||
|
|
@ -31,3 +36,5 @@ def connect_middlewares(
|
||||||
dispatcher.update.outer_middleware(TelegramUserMiddleware())
|
dispatcher.update.outer_middleware(TelegramUserMiddleware())
|
||||||
|
|
||||||
dispatcher.update.outer_middleware(RegistrationMiddleware())
|
dispatcher.update.outer_middleware(RegistrationMiddleware())
|
||||||
|
|
||||||
|
dispatcher.update.middleware(I18nMiddleware(i18n=i18n))
|
||||||
|
|
|
||||||
|
|
@ -31,6 +31,10 @@ class Settings(BaseSettings):
|
||||||
Enable SQLAlchemy engine echo.
|
Enable SQLAlchemy engine echo.
|
||||||
Defaults to True.
|
Defaults to True.
|
||||||
|
|
||||||
|
bot_i18n_domain (str):
|
||||||
|
The bot locales i18n domain.
|
||||||
|
Defaults to "messages".
|
||||||
|
|
||||||
redis_host (str):
|
redis_host (str):
|
||||||
Redis host name.
|
Redis host name.
|
||||||
Defaults to "redis"
|
Defaults to "redis"
|
||||||
|
|
@ -70,6 +74,8 @@ class Settings(BaseSettings):
|
||||||
f"{self.postgres_port}/{self.postgres_name}"
|
f"{self.postgres_port}/{self.postgres_name}"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
bot_i18n_domain: str = Field(frozen=True, default="messages")
|
||||||
|
|
||||||
redis_host: str = Field(frozen=True, default="redis")
|
redis_host: str = Field(frozen=True, default="redis")
|
||||||
redis_port: int = Field(frozen=True, default=6379)
|
redis_port: int = Field(frozen=True, default=6379)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -34,9 +34,7 @@ async def process_args() -> None:
|
||||||
|
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
|
|
||||||
loguru_logger.debug(
|
loguru_logger.debug(f"List of arguments passed to the program: {args}")
|
||||||
f"List of arguments passed to the program: {args}"
|
|
||||||
)
|
|
||||||
|
|
||||||
match args.db:
|
match args.db:
|
||||||
case "create":
|
case "create":
|
||||||
|
|
@ -48,9 +46,7 @@ async def process_args() -> None:
|
||||||
await drop_db(engine)
|
await drop_db(engine)
|
||||||
exit(0)
|
exit(0)
|
||||||
case "migrate":
|
case "migrate":
|
||||||
loguru_logger.debug(
|
loguru_logger.debug("Attempt to make database migrations...")
|
||||||
"Attempt to make database migrations..."
|
|
||||||
)
|
|
||||||
exit(0)
|
exit(0)
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -71,6 +67,7 @@ async def main() -> None:
|
||||||
bot_token=settings.bot_token,
|
bot_token=settings.bot_token,
|
||||||
redis_protocol=redis_protocol,
|
redis_protocol=redis_protocol,
|
||||||
session_maker=session_maker,
|
session_maker=session_maker,
|
||||||
|
i18n_domain=settings.bot_i18n_domain,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue