Paginate update list output
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
from aiogram import F
|
||||
from aiogram.types import Message
|
||||
from aiogram.types import Message, CallbackQuery
|
||||
from app import dp
|
||||
from auth import is_admin_msg
|
||||
from keyboards import system_kb
|
||||
@@ -9,6 +9,8 @@ from services.http_checks import get_url_checks, check_url
|
||||
import asyncio
|
||||
from services.queue import enqueue
|
||||
from services.updates import list_updates, apply_updates
|
||||
from state import UPDATES_CACHE
|
||||
from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton
|
||||
|
||||
|
||||
@dp.message(F.text == "💽 Disks")
|
||||
@@ -60,8 +62,13 @@ async def updates_list(msg: Message):
|
||||
return
|
||||
|
||||
async def job():
|
||||
text = await list_updates()
|
||||
await msg.answer(text, reply_markup=system_kb, parse_mode="Markdown")
|
||||
title, lines = await list_updates()
|
||||
UPDATES_CACHE[msg.from_user.id] = {
|
||||
"title": title,
|
||||
"lines": lines,
|
||||
"page_size": 20,
|
||||
}
|
||||
await send_updates_page(msg, 0)
|
||||
|
||||
pos = await enqueue("pkg-updates", job)
|
||||
await msg.answer(f"🕓 Updates queued (#{pos})", reply_markup=system_kb)
|
||||
@@ -78,3 +85,48 @@ async def updates_apply(msg: Message):
|
||||
|
||||
pos = await enqueue("pkg-upgrade", job)
|
||||
await msg.answer(f"🕓 Upgrade queued (#{pos})", reply_markup=system_kb)
|
||||
|
||||
|
||||
def _updates_kb(page: int, total_pages: int) -> InlineKeyboardMarkup:
|
||||
buttons = []
|
||||
if total_pages > 1:
|
||||
row = []
|
||||
if page > 0:
|
||||
row.append(InlineKeyboardButton(text="⬅️ Prev", callback_data=f"updpage:{page-1}"))
|
||||
if page < total_pages - 1:
|
||||
row.append(InlineKeyboardButton(text="Next ➡️", callback_data=f"updpage:{page+1}"))
|
||||
if row:
|
||||
buttons.append(row)
|
||||
return InlineKeyboardMarkup(inline_keyboard=buttons)
|
||||
|
||||
|
||||
async def send_updates_page(msg: Message, page: int):
|
||||
data = UPDATES_CACHE.get(msg.from_user.id)
|
||||
if not data:
|
||||
await msg.answer("⚠️ Updates cache empty", reply_markup=system_kb)
|
||||
return
|
||||
|
||||
lines = data["lines"]
|
||||
page_size = data["page_size"]
|
||||
total_pages = max(1, (len(lines) + page_size - 1) // page_size)
|
||||
page = max(0, min(page, total_pages - 1))
|
||||
start = page * page_size
|
||||
end = start + page_size
|
||||
body = "\n".join(lines[start:end])
|
||||
|
||||
text = f"{data['title']} (page {page+1}/{total_pages})\n```{body}```"
|
||||
await msg.answer(text, reply_markup=_updates_kb(page, total_pages), parse_mode="Markdown")
|
||||
|
||||
|
||||
@dp.callback_query(F.data.startswith("updpage:"))
|
||||
async def updates_page(cb: CallbackQuery):
|
||||
if cb.from_user.id not in UPDATES_CACHE:
|
||||
await cb.answer("No cached updates")
|
||||
return
|
||||
try:
|
||||
page = int(cb.data.split(":", 1)[1])
|
||||
except ValueError:
|
||||
await cb.answer("Bad page")
|
||||
return
|
||||
await cb.answer()
|
||||
await send_updates_page(cb.message, page)
|
||||
|
||||
Reference in New Issue
Block a user