diff --git a/src/dutylog/application/bot/admin_dialogs/hours_management.py b/src/dutylog/application/bot/admin_dialogs/hours_management.py index dd8a0b5..9f245d7 100644 --- a/src/dutylog/application/bot/admin_dialogs/hours_management.py +++ b/src/dutylog/application/bot/admin_dialogs/hours_management.py @@ -11,10 +11,6 @@ from aiogram_dialog.widgets.input import MessageInput from dishka import FromDishka from dishka.integrations.aiogram_dialog import inject -_media_group_photos: dict[tuple[int, str], list[str]] = {} -_media_group_remarks: dict[tuple[int, str], str] = {} -_media_group_counters: dict[tuple[int, str], int] = {} - from dutylog.application.bot.user_dialogs.states import AdminMenuSG from dutylog.infrastructure.database.repositories.residents_repository import ( ResidentsRepository, @@ -25,6 +21,7 @@ from dutylog.infrastructure.database.repositories.hours_transactions_repository from dutylog.infrastructure.database.repositories.users_repository import ( UsersRepository, ) +from dutylog.infrastructure.ioc import MediaGroupCollector async def on_add_hours_click( @@ -103,25 +100,22 @@ async def on_custom_hours_input( await message.answer("⚠️ Пожалуйста, введите корректное число") +@inject async def on_add_hours_remark_input( message: Message, widget: MessageInput, dialog_manager: DialogManager, + media_group_collector: FromDishka[MediaGroupCollector], ): if message.media_group_id: chat_id = message.chat.id mgid = message.media_group_id - key = (chat_id, mgid) - _media_group_counters[key] = _media_group_counters.get(key, 0) + 1 - my_count = _media_group_counters[key] - _media_group_photos.setdefault(key, []).append(message.photo[-1].file_id) + my_count = media_group_collector.add_photo(chat_id, mgid, message.photo[-1].file_id) if message.caption and message.caption.strip(): - _media_group_remarks[key] = message.caption.strip() + media_group_collector.set_remark(chat_id, mgid, message.caption.strip()) await asyncio.sleep(2.0) - if _media_group_counters.get(key, 0) == my_count: - remark = _media_group_remarks.pop(key, None) - file_ids = _media_group_photos.pop(key, []) - _media_group_counters.pop(key, None) + if media_group_collector.is_last(chat_id, mgid, my_count): + file_ids, remark = media_group_collector.pop(chat_id, mgid) dialog_manager.dialog_data["hours_remark"] = remark dialog_manager.dialog_data["photo_file_ids"] = file_ids await dialog_manager.switch_to(AdminMenuSG.add_hours_confirm) @@ -145,25 +139,22 @@ async def on_add_hours_remark_input( await dialog_manager.switch_to(AdminMenuSG.add_hours_confirm) +@inject async def on_remove_hours_remark_input( message: Message, widget: MessageInput, dialog_manager: DialogManager, + media_group_collector: FromDishka[MediaGroupCollector], ): if message.media_group_id: chat_id = message.chat.id mgid = message.media_group_id - key = (chat_id, mgid) - _media_group_counters[key] = _media_group_counters.get(key, 0) + 1 - my_count = _media_group_counters[key] - _media_group_photos.setdefault(key, []).append(message.photo[-1].file_id) + my_count = media_group_collector.add_photo(chat_id, mgid, message.photo[-1].file_id) if message.caption and message.caption.strip(): - _media_group_remarks[key] = message.caption.strip() + media_group_collector.set_remark(chat_id, mgid, message.caption.strip()) await asyncio.sleep(2.0) - if _media_group_counters.get(key, 0) == my_count: - remark = _media_group_remarks.pop(key, None) - file_ids = _media_group_photos.pop(key, []) - _media_group_counters.pop(key, None) + if media_group_collector.is_last(chat_id, mgid, my_count): + file_ids, remark = media_group_collector.pop(chat_id, mgid) dialog_manager.dialog_data["hours_remark"] = remark dialog_manager.dialog_data["photo_file_ids"] = file_ids await dialog_manager.switch_to(AdminMenuSG.remove_hours_confirm) diff --git a/src/dutylog/infrastructure/ioc.py b/src/dutylog/infrastructure/ioc.py index 8c6661f..2090816 100644 --- a/src/dutylog/infrastructure/ioc.py +++ b/src/dutylog/infrastructure/ioc.py @@ -36,11 +36,41 @@ from dutylog.infrastructure.utils.config import Config, load_config from dutylog.services.report_service import ReportService +class MediaGroupCollector: + def __init__(self) -> None: + self._photos: dict[tuple[int, str], list[str]] = {} + self._remarks: dict[tuple[int, str], str] = {} + self._counters: dict[tuple[int, str], int] = {} + + def add_photo(self, chat_id: int, media_group_id: str, file_id: str) -> int: + key = (chat_id, media_group_id) + self._counters[key] = self._counters.get(key, 0) + 1 + self._photos.setdefault(key, []).append(file_id) + return self._counters[key] + + def set_remark(self, chat_id: int, media_group_id: str, remark: str) -> None: + self._remarks[(chat_id, media_group_id)] = remark + + def is_last(self, chat_id: int, media_group_id: str, my_count: int) -> bool: + return self._counters.get((chat_id, media_group_id), 0) == my_count + + def pop(self, chat_id: int, media_group_id: str) -> tuple[list[str], str | None]: + key = (chat_id, media_group_id) + file_ids = self._photos.pop(key, []) + remark = self._remarks.pop(key, None) + self._counters.pop(key, None) + return file_ids, remark + + class ConfigProvider(Provider): @provide(scope=Scope.APP) def get_config(self) -> Config: return load_config() + @provide(scope=Scope.APP) + def get_media_group_collector(self) -> MediaGroupCollector: + return MediaGroupCollector() + class DatabaseProvider(Provider): @provide(scope=Scope.APP)