add news handlers

parent aadc20ed
import asyncio
async def translate_async(text):
process = await asyncio.create_subprocess_exec(
"trans", "-b", "-e", "bing", text,
stdout=asyncio.subprocess.PIPE,
stderr=asyncio.subprocess.PIPE
)
stdout, stderr = await process.communicate()
if process.returncode != 0:
raise RuntimeError(f"Translate error: {stderr.decode().strip()}")
return stdout.decode().strip()
def chunk_list(lst, size):
return [lst[i:i + size] for i in range(0, len(lst), size)]
from telegrinder import Dispatch, Message
from telegrinder.rules import Command, Argument
from altrepo import altrepo
from services.news import format_packages, format_bugs
dp = Dispatch()
@dp.message(Command("news", Argument("news_type", optional=True), Argument("translate", optional=True)))
async def news_handler(m: Message, news_type: str | None, translate: str | None) -> None:
news_type = news_type or "sisyphus"
if news_type == "bugs":
bugs_data = await altrepo.parser.news.bugs()
if not bugs_data:
await m.answer("Новостей пока нет.")
return
bugs = await format_bugs(bugs_data)
await m.answer(bugs)
else:
if news_type == "sisyphus":
packages_data = await altrepo.parser.news.sisyphus()
elif news_type == "p11":
packages_data = await altrepo.parser.news.p11()
if not packages_data:
await m.answer("Новостей пока нет.")
return
added, removed, updated = await format_packages(packages_data, bool(translate))
await m.answer(f"{added}{removed}")
for msg in updated:
res = await m.answer(msg)
from .packages import format_packages
from .bugs import format_bugs
\ No newline at end of file
from telegrinder.tools.formatting import HTMLFormatter, link, bold, block_quote
from altrepo.parser.models import BugsModel, BugsElementModel
from config import BUGS_URL, PACKAGES_URL
repo = PACKAGES_URL.format(repo="sisyphus")
async def format_bugs(bugs: BugsModel):
bug_message = ""
if bugs.quickly_resolved:
bug_message += "Быстрозакрытые:\n"
for bug in bugs.quickly_resolved:
bug_message += await _format_bug(bug)
if bugs.new:
bug_message += "Новые:\n"
for bug in bugs.new:
bug_message += await _format_bug(bug)
if bugs.old:
bug_message += "Устаревшие:\n"
for bug in bugs.old:
bug_message += await _format_bug(bug)
if bugs.resolved:
bug_message += "Закрытые:\n"
for bug in bugs.resolved:
bug_message += await _format_bug(bug)
if bugs.reopened:
bug_message += "Переоткрытые:\n"
for bug in bugs.reopened:
bug_message += await _format_bug(bug)
if bugs.random:
bug_message += "Рандомные:\n"
for bug in bugs.random:
bug_message += await _format_bug(bug)
bug_message += "Сформировано при помощи " + HTMLFormatter(bold(link("https://t.me/altlinux_packages_bot", text="ALT Packages Bot")))
return bug_message
async def _format_bug(bug: BugsElementModel):
message = HTMLFormatter(
bold(link(f"{BUGS_URL}{bug.id}", text=f"#{bug.id}"))) + " | "
message += HTMLFormatter(
bold(link(f"{repo}{bug.component}", text=f"{bug.component}"))) + " | "
message += f"{bug.priority}"
message += f" | {bug.status}\n" if bug.status else "\n"
message += f"{bug.summary}\n\n"
return message
from telegrinder.tools.formatting import HTMLFormatter, link, bold
from altrepo.parser.models import PackagesModel, PackageElementModel, RemovedPackageElementModel
from config import PACKAGES_URL
from extra import translate_async, chunk_list
repo = PACKAGES_URL.format(repo="sisyphus")
async def format_packages(packages: PackagesModel, translate: bool | None = None):
added_message = ""
removed_message = ""
updated_messages = []
if packages.added:
added_message += "Добавлены:\n"
for package in packages.added:
added_message += await _format_package(package, translate)
if packages.removed:
removed_message += "Удалены:\n"
for package in packages.removed:
removed_message += await _format_removed_package(package)
if packages.updated:
for packages in chunk_list(packages.updated, 20):
updated_message = "Обновлены:\n"
for package in packages:
updated_message += await _format_package(package, translate)
updated_messages.append(updated_message)
return added_message, removed_message, updated_messages
async def _format_package(package: PackageElementModel, translate: bool):
message = HTMLFormatter(
bold(link(f"{repo}srpms/{package.name}", text=package.name))
) + f" - {(await translate_async(package.description)) if translate else package.description}\n"
message += f"{(await translate_async(package.maintainer_name)) if translate else package.maintainer_name} ({package.maintainer_nick})\n\n"
return message
async def _format_removed_package(package: RemovedPackageElementModel):
message = HTMLFormatter(
bold(link(f"{repo}srpms/{package.name}", text=package.name))) + "\n\n"
return message
\ No newline at end of file
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