changelog: add /changelog command

parent 086002bc
......@@ -7,3 +7,4 @@ from . import package as package_keyboards
from . import profile as profile_keyboards
from . import watch as watch_keyboards
from . import bugs as bugs_keyboards
from . import changelog as changelog_keyboards
from telegrinder import InlineKeyboard, InlineButton
def changelog_nav_kb(pkghash: str, branch: str, offset: int, total: int, per_page: int = 5):
kb = InlineKeyboard()
buttons = []
if offset > 0:
buttons.append(InlineButton(
text="← Назад",
callback_data=f"changelog/{pkghash}/{branch}/{offset - per_page}",
))
if offset + per_page < total:
buttons.append(InlineButton(
text="Вперёд →",
callback_data=f"changelog/{pkghash}/{branch}/{offset + per_page}",
))
if buttons:
for btn in buttons:
kb.add(btn)
kb.row()
return kb.get_markup() if buttons else None
from telegrinder import Dispatch, Message, CallbackQuery
from telegrinder.rules import Command, Argument, CallbackDataMarkup
from altrepo import altrepo
from altrepo.api.errors import DataNotFoundError, RequestValidationError
from database.models import User
from data.keyboards import changelog_keyboards
from services.utils import _bold
PER_PAGE = 5
dp = Dispatch()
def format_changelog_page(name: str, branch: str, changelog, offset: int, total: int):
message = _bold(f"Changelog: {name} ({branch})\n\n")
for entry in changelog:
date = entry.date[:10]
message += f"{entry.evr} | {date} | {entry.nick}\n"
message += f"{entry.message}\n\n"
message += f"Записи {offset + 1}–{offset + len(changelog)} из {total}"
return message
@dp.message(
Command(
"changelog",
Argument("name", optional=True),
Argument("branch", optional=True),
)
)
async def changelog_handler(
m: Message, user: User | None = None,
name: str | None = None, branch: str | None = None,
) -> None:
if name is None:
await m.answer("Не указано имя пакета")
return
user_branch = user.default_branch if user else None
branch = branch or user_branch or "sisyphus"
try:
pkghash = (await altrepo.api.site.pkghash_by_name(branch, name)).pkghash
data = await altrepo.api.site.package_changelog(pkghash, changelog_last=999)
except DataNotFoundError:
await m.answer("Пакет не найден.")
return
except RequestValidationError:
await m.answer("Ошибка обработки параметров.")
return
if not data.changelog:
await m.answer("Changelog пуст.")
return
total = len(data.changelog)
page = data.changelog[:PER_PAGE]
await m.answer(
format_changelog_page(name, branch, page, 0, total),
reply_markup=changelog_keyboards.changelog_nav_kb(pkghash, branch, 0, total, PER_PAGE),
)
@dp.callback_query(CallbackDataMarkup("changelog/<pkghash>/<branch>/<offset:int>"))
async def changelog_page_handler(
cb: CallbackQuery, pkghash: str, branch: str, offset: int,
) -> None:
data = await altrepo.api.site.package_changelog(pkghash, changelog_last=999)
if not data.changelog:
await cb.answer("Changelog пуст.")
return
total = len(data.changelog)
page = data.changelog[offset:offset + PER_PAGE]
name_data = await altrepo.api.site.package_nvr_by_hash(pkghash)
name = name_data.name
await cb.edit_text(
format_changelog_page(name, branch, page, offset, total),
reply_markup=changelog_keyboards.changelog_nav_kb(pkghash, branch, offset, total, PER_PAGE),
)
await cb.answer()
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment