mirror of
https://github.com/koloideal/DutyLog.git
synced 2026-08-08 10:01:14 +03:00
refactor: move MediaGroupCollector to dishka DI instead of module-level dicts
This commit is contained in:
@@ -11,10 +11,6 @@ from aiogram_dialog.widgets.input import MessageInput
|
|||||||
from dishka import FromDishka
|
from dishka import FromDishka
|
||||||
from dishka.integrations.aiogram_dialog import inject
|
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.application.bot.user_dialogs.states import AdminMenuSG
|
||||||
from dutylog.infrastructure.database.repositories.residents_repository import (
|
from dutylog.infrastructure.database.repositories.residents_repository import (
|
||||||
ResidentsRepository,
|
ResidentsRepository,
|
||||||
@@ -25,6 +21,7 @@ from dutylog.infrastructure.database.repositories.hours_transactions_repository
|
|||||||
from dutylog.infrastructure.database.repositories.users_repository import (
|
from dutylog.infrastructure.database.repositories.users_repository import (
|
||||||
UsersRepository,
|
UsersRepository,
|
||||||
)
|
)
|
||||||
|
from dutylog.infrastructure.ioc import MediaGroupCollector
|
||||||
|
|
||||||
|
|
||||||
async def on_add_hours_click(
|
async def on_add_hours_click(
|
||||||
@@ -103,25 +100,22 @@ async def on_custom_hours_input(
|
|||||||
await message.answer("⚠️ Пожалуйста, введите корректное число")
|
await message.answer("⚠️ Пожалуйста, введите корректное число")
|
||||||
|
|
||||||
|
|
||||||
|
@inject
|
||||||
async def on_add_hours_remark_input(
|
async def on_add_hours_remark_input(
|
||||||
message: Message,
|
message: Message,
|
||||||
widget: MessageInput,
|
widget: MessageInput,
|
||||||
dialog_manager: DialogManager,
|
dialog_manager: DialogManager,
|
||||||
|
media_group_collector: FromDishka[MediaGroupCollector],
|
||||||
):
|
):
|
||||||
if message.media_group_id:
|
if message.media_group_id:
|
||||||
chat_id = message.chat.id
|
chat_id = message.chat.id
|
||||||
mgid = message.media_group_id
|
mgid = message.media_group_id
|
||||||
key = (chat_id, mgid)
|
my_count = media_group_collector.add_photo(chat_id, mgid, message.photo[-1].file_id)
|
||||||
_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)
|
|
||||||
if message.caption and message.caption.strip():
|
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)
|
await asyncio.sleep(2.0)
|
||||||
if _media_group_counters.get(key, 0) == my_count:
|
if media_group_collector.is_last(chat_id, mgid, my_count):
|
||||||
remark = _media_group_remarks.pop(key, None)
|
file_ids, remark = media_group_collector.pop(chat_id, mgid)
|
||||||
file_ids = _media_group_photos.pop(key, [])
|
|
||||||
_media_group_counters.pop(key, None)
|
|
||||||
dialog_manager.dialog_data["hours_remark"] = remark
|
dialog_manager.dialog_data["hours_remark"] = remark
|
||||||
dialog_manager.dialog_data["photo_file_ids"] = file_ids
|
dialog_manager.dialog_data["photo_file_ids"] = file_ids
|
||||||
await dialog_manager.switch_to(AdminMenuSG.add_hours_confirm)
|
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)
|
await dialog_manager.switch_to(AdminMenuSG.add_hours_confirm)
|
||||||
|
|
||||||
|
|
||||||
|
@inject
|
||||||
async def on_remove_hours_remark_input(
|
async def on_remove_hours_remark_input(
|
||||||
message: Message,
|
message: Message,
|
||||||
widget: MessageInput,
|
widget: MessageInput,
|
||||||
dialog_manager: DialogManager,
|
dialog_manager: DialogManager,
|
||||||
|
media_group_collector: FromDishka[MediaGroupCollector],
|
||||||
):
|
):
|
||||||
if message.media_group_id:
|
if message.media_group_id:
|
||||||
chat_id = message.chat.id
|
chat_id = message.chat.id
|
||||||
mgid = message.media_group_id
|
mgid = message.media_group_id
|
||||||
key = (chat_id, mgid)
|
my_count = media_group_collector.add_photo(chat_id, mgid, message.photo[-1].file_id)
|
||||||
_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)
|
|
||||||
if message.caption and message.caption.strip():
|
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)
|
await asyncio.sleep(2.0)
|
||||||
if _media_group_counters.get(key, 0) == my_count:
|
if media_group_collector.is_last(chat_id, mgid, my_count):
|
||||||
remark = _media_group_remarks.pop(key, None)
|
file_ids, remark = media_group_collector.pop(chat_id, mgid)
|
||||||
file_ids = _media_group_photos.pop(key, [])
|
|
||||||
_media_group_counters.pop(key, None)
|
|
||||||
dialog_manager.dialog_data["hours_remark"] = remark
|
dialog_manager.dialog_data["hours_remark"] = remark
|
||||||
dialog_manager.dialog_data["photo_file_ids"] = file_ids
|
dialog_manager.dialog_data["photo_file_ids"] = file_ids
|
||||||
await dialog_manager.switch_to(AdminMenuSG.remove_hours_confirm)
|
await dialog_manager.switch_to(AdminMenuSG.remove_hours_confirm)
|
||||||
|
|||||||
@@ -36,11 +36,41 @@ from dutylog.infrastructure.utils.config import Config, load_config
|
|||||||
from dutylog.services.report_service import ReportService
|
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):
|
class ConfigProvider(Provider):
|
||||||
@provide(scope=Scope.APP)
|
@provide(scope=Scope.APP)
|
||||||
def get_config(self) -> Config:
|
def get_config(self) -> Config:
|
||||||
return load_config()
|
return load_config()
|
||||||
|
|
||||||
|
@provide(scope=Scope.APP)
|
||||||
|
def get_media_group_collector(self) -> MediaGroupCollector:
|
||||||
|
return MediaGroupCollector()
|
||||||
|
|
||||||
|
|
||||||
class DatabaseProvider(Provider):
|
class DatabaseProvider(Provider):
|
||||||
@provide(scope=Scope.APP)
|
@provide(scope=Scope.APP)
|
||||||
|
|||||||
Reference in New Issue
Block a user