- Added `ca-certificates` installation to Dockerfile for improved network security. - Updated health check command in Dockerfile to include better timeout handling. - Refactored `run_helper.py` to implement proper signal handling and logging during shutdown. - Transitioned database operations to an asynchronous model in `async_db.py`, improving performance and responsiveness. - Updated database schema to support new foreign key relationships and optimized indexing for better query performance. - Enhanced various bot handlers to utilize async database methods, improving overall efficiency and user experience. - Removed obsolete database and fix scripts to streamline the project structure.
74 lines
2.2 KiB
Python
74 lines
2.2 KiB
Python
"""Service classes for group handlers"""
|
||
|
||
# Standard library imports
|
||
from typing import Protocol, Optional
|
||
|
||
# Third-party imports
|
||
from aiogram import types
|
||
|
||
# Local imports
|
||
from helper_bot.utils.helper_func import send_text_message
|
||
from .exceptions import NoReplyToMessageError, UserNotFoundError
|
||
from logs.custom_logger import logger
|
||
|
||
# Local imports - metrics
|
||
from helper_bot.utils.metrics import (
|
||
metrics,
|
||
track_time,
|
||
track_errors,
|
||
db_query_time
|
||
)
|
||
|
||
|
||
class DatabaseProtocol(Protocol):
|
||
"""Protocol for database operations"""
|
||
async def get_user_by_message_id(self, message_id: int) -> Optional[int]: ...
|
||
async def add_message(self, message_text: str, user_id: int, message_id: int, date: int = None): ...
|
||
|
||
|
||
class AdminReplyService:
|
||
"""Service for admin reply operations"""
|
||
|
||
def __init__(self, db: DatabaseProtocol) -> None:
|
||
self.db = db
|
||
|
||
async def get_user_id_for_reply(self, message_id: int) -> int:
|
||
"""
|
||
Get user ID for reply by message ID.
|
||
|
||
Args:
|
||
message_id: ID of the message to reply to
|
||
|
||
Returns:
|
||
User ID for the reply
|
||
|
||
Raises:
|
||
UserNotFoundError: If user is not found in database
|
||
"""
|
||
user_id = await self.db.get_user_by_message_id(message_id)
|
||
if user_id is None:
|
||
raise UserNotFoundError(f"User not found for message_id: {message_id}")
|
||
return user_id
|
||
|
||
async def send_reply_to_user(
|
||
self,
|
||
chat_id: int,
|
||
message: types.Message,
|
||
reply_text: str,
|
||
markup: types.ReplyKeyboardMarkup
|
||
) -> None:
|
||
"""
|
||
Send reply to user.
|
||
|
||
Args:
|
||
chat_id: User's chat ID
|
||
message: Original message from admin
|
||
reply_text: Text to send to user
|
||
markup: Reply keyboard markup
|
||
"""
|
||
await send_text_message(chat_id, message, reply_text, markup)
|
||
logger.info(
|
||
f'Ответ админа "{reply_text}" отправлен пользователю с ID: {chat_id} '
|
||
f'на сообщение {message.reply_to_message.message_id if message.reply_to_message else "N/A"}'
|
||
)
|