11import asyncio
2- from collections .abc import Sequence
32from typing import assert_never
43
54from aiogram import Bot , F , Router , html
65from aiogram .fsm .context import FSMContext
7- from aiogram .fsm .state import State
86from aiogram .types import (
97 CallbackQuery ,
108 InlineKeyboardButton ,
1917 MenuCallback ,
2018 PrinterCallback ,
2119 discard_job_settings_message ,
22- format_draft_message ,
20+ format_configure_message ,
2321 format_printer_status ,
2422)
23+ from src .bot .routers .tools import ensure_same_structural_message
2524from src .config_schema import Printer
2625from src .modules .printing .entity_models import PrinterStatus
2726
@@ -39,17 +38,46 @@ async def start_printer_setup(callback_or_message: CallbackQuery | Message, stat
3938
4039 asyncio .create_task (
4140 update_printer_statuses (
42- message .chat .id ,
43- message .chat .id ,
44- msg .message_id ,
41+ msg ,
4542 printers ,
4643 state ,
47- bot ,
48- checkable_state = PrintWork .setup_printer ,
4944 )
5045 )
5146
5247
48+ async def update_printer_statuses (job_settings_message : Message , printers : list [Printer ], state : FSMContext ):
49+ printers_or_statuses = dict ()
50+ for elem in printers :
51+ printers_or_statuses [elem .cups_name ] = elem
52+ tasks = [api_client .get_printer_status (job_settings_message .chat .id , printer .cups_name ) for printer in printers ]
53+ for task in asyncio .as_completed (tasks ):
54+ await ensure_same_structural_message (job_settings_message , "job_settings_message_id" , state )
55+ status = await task
56+ printers_or_statuses [status .printer .cups_name ] = status
57+ new_reply_markup = printers_keyboard (list (printers_or_statuses .values ()))
58+ await ensure_same_structural_message (job_settings_message , "job_settings_message_id" , state )
59+ await job_settings_message .edit_reply_markup (reply_markup = new_reply_markup )
60+
61+
62+ def printers_keyboard (statuses_and_printers : list [PrinterStatus | Printer ]) -> InlineKeyboardMarkup :
63+ keyboard = InlineKeyboardBuilder ()
64+ for status_or_printer in statuses_and_printers :
65+ if isinstance (status_or_printer , PrinterStatus ):
66+ button = InlineKeyboardButton (
67+ text = format_printer_status (status_or_printer ),
68+ callback_data = PrinterCallback (cups_name = status_or_printer .printer .cups_name ).pack (),
69+ )
70+ elif isinstance (status_or_printer , Printer ):
71+ button = InlineKeyboardButton (
72+ text = status_or_printer .display_name ,
73+ callback_data = PrinterCallback (cups_name = status_or_printer .cups_name ).pack (),
74+ )
75+ else :
76+ assert_never (status_or_printer )
77+ keyboard .row (button )
78+ return keyboard .as_markup ()
79+
80+
5381@router .callback_query (PrintWork .settings_menu , MenuCallback .filter (F .menu == "printer" ))
5482async def job_settings_printer (callback : CallbackQuery , state : FSMContext , bot : Bot ):
5583 await callback .answer ()
@@ -69,65 +97,11 @@ async def apply_settings_printer(callback: CallbackQuery, callback_data: Printer
6997 assert "printer" in data
7098 assert "confirmation_message_id" in data
7199 printer_status = await api_client .get_printer_status (callback .message .chat .id , data .get ("printer" ))
72- caption , markup = format_draft_message (data , printer_status )
100+ caption , markup = format_configure_message (data , printer_status )
73101 await state .set_state (PrintWork .settings_menu )
74102 await bot .edit_message_caption (
75103 caption = caption ,
76104 chat_id = callback .message .chat .id ,
77105 message_id = data ["confirmation_message_id" ],
78106 reply_markup = markup ,
79107 )
80-
81-
82- def printers_keyboard (printers : Sequence [PrinterStatus | Printer ]) -> InlineKeyboardMarkup :
83- keyboard = InlineKeyboardBuilder ()
84-
85- for status_or_printer in printers :
86- if isinstance (status_or_printer , PrinterStatus ):
87- printer = status_or_printer .printer
88- show_text = format_printer_status (status_or_printer )
89- elif isinstance (status_or_printer , Printer ):
90- printer = status_or_printer
91- show_text = printer .display_name
92- else :
93- assert_never (status_or_printer )
94- keyboard .row (
95- InlineKeyboardButton (
96- text = show_text ,
97- callback_data = PrinterCallback (cups_name = printer .cups_name ).pack (),
98- )
99- )
100- return keyboard .as_markup ()
101-
102-
103- async def update_printer_statuses (
104- from_user_id : int ,
105- chat_id : int ,
106- message_id : int ,
107- printers : list ,
108- state : FSMContext ,
109- bot : Bot ,
110- checkable_state : State ,
111- ):
112- tasks = [
113- api_client .get_printer_status (from_user_id , printer .cups_name )
114- for printer in printers
115- if isinstance (printer , Printer )
116- ]
117- for t in asyncio .as_completed (tasks ):
118- if await state .get_state () != checkable_state :
119- return
120- result = await t
121- if isinstance (result , PrinterStatus ):
122- for i , p in enumerate (printers ):
123- if isinstance (p , Printer ) and p .cups_name == result .printer .cups_name :
124- printers [i ] = result # type: ignore
125-
126- new_reply_markup = printers_keyboard (printers )
127- if await state .get_state () != checkable_state :
128- return
129- await bot .edit_message_reply_markup (
130- chat_id = chat_id ,
131- message_id = message_id ,
132- reply_markup = new_reply_markup ,
133- )
0 commit comments