news.packages: update format

parent f8199342
...@@ -86,9 +86,17 @@ async def news_handler( ...@@ -86,9 +86,17 @@ async def news_handler(
chat_id=m.from_user.id, text="Перевод не удался :(" chat_id=m.from_user.id, text="Перевод не удался :("
) )
return return
print(len(added))
for msg in added:
await m.ctx_api.send_message( await m.ctx_api.send_message(
chat_id=m.from_user.id, text=f"{added}{removed}{info_message}" chat_id=m.from_user.id, text=f"{msg}"
)
await m.ctx_api.send_message(
chat_id=m.from_user.id, text=f"{removed}"
) )
for msg in updated: for msg in updated:
await m.ctx_api.send_message(chat_id=m.from_user.id, text=msg) await m.ctx_api.send_message(chat_id=m.from_user.id, text=msg)
await m.ctx_api.send_message(
chat_id=m.from_user.id, text=f"{info_message}"
)
...@@ -3,7 +3,7 @@ from telegrinder.tools.formatting import HTMLFormatter, link, bold ...@@ -3,7 +3,7 @@ from telegrinder.tools.formatting import HTMLFormatter, link, bold
import random import random
from collections import defaultdict from collections import defaultdict
from altrepo.parser.models import PackagesModel, PackageElementModel, RemovedPackageElementModel from altrepo.parser.models import PackagesModel, RemovedPackageElementModel
from config import PACKAGES_URL from config import PACKAGES_URL
from services.utils import translate_package, translate_maintainer, chunk_list from services.utils import translate_package, translate_maintainer, chunk_list
...@@ -12,25 +12,20 @@ from services.utils import translate_package, translate_maintainer, chunk_list ...@@ -12,25 +12,20 @@ from services.utils import translate_package, translate_maintainer, chunk_list
repo = PACKAGES_URL.format(repo="sisyphus") repo = PACKAGES_URL.format(repo="sisyphus")
async def format_packages(packages: PackagesModel, translate: bool | None = None): async def format_packages(packages: PackagesModel, translate: bool = False):
added_message = "" added_messages = []
removed_message = "" removed_message = ""
updated_messages = [] updated_messages = []
if packages.added: if packages.added:
added_message += f"Добавлены: {len(packages.added)}\n" added_messages = await _format_package_group(packages, translate, "added")
for package in packages.added:
added_message += await _format_package(package, translate)
if packages.removed: if packages.removed:
removed_message += f"Удалены: {len(packages.removed)}\n" removed_message = await _format_removed(packages)
for package in packages.removed:
removed_message += await _format_removed_package(package)
removed_message += "\n"
if packages.updated: if packages.updated:
updated_messages = await _format_updated_packages(packages, translate) updated_messages = await _format_package_group(packages, translate, "updated")
info_message = ( info_message = (
f"Всего исходных пакетов: {packages.total}\n\n" f"Всего исходных пакетов: {packages.total}\n\n"
...@@ -41,40 +36,39 @@ async def format_packages(packages: PackagesModel, translate: bool | None = None ...@@ -41,40 +36,39 @@ async def format_packages(packages: PackagesModel, translate: bool | None = None
HTMLFormatter(bold(link("https://t.me/altlinux_packages_bot", text="ALT Packages Bot"))) HTMLFormatter(bold(link("https://t.me/altlinux_packages_bot", text="ALT Packages Bot")))
) )
return added_message, removed_message, updated_messages, info_message return added_messages, removed_message, updated_messages, info_message
async def _format_package(package: PackageElementModel, translate: bool): async def _format_removed(packages_model: PackagesModel) -> str:
message = HTMLFormatter( removed = packages_model.removed
bold(link(f"{repo}srpms/{package.name}", text=package.name)) lines = [f"Удалены: {len(removed)}"]
) + f" - {(await translate_package(package.name, package.description)) if translate else package.description}\n" for pkg in removed:
message += f"{(await translate_maintainer(package.maintainer_nick)) if translate else package.maintainer_name} ({package.maintainer_nick})\n\n" pkg_link = link(f"{repo}srpms/{pkg.name}", text=pkg.name)
lines.append(HTMLFormatter(bold(pkg_link)))
return message return "\n".join(lines) + "\n"
async def _format_removed_package(package: RemovedPackageElementModel):
message = HTMLFormatter( async def _format_package_group(packages_model: PackagesModel, translate: bool, pkg_type: str):
bold(link(f"{repo}srpms/{package.name}", text=package.name))) + "\n"
return message
pkg_types = {
"added": (packages_model.added or [], "Добавлено"),
"updated": (packages_model.updated or [], "Обновлено"),
}
async def _format_updated_packages(packages_model: PackagesModel, translate: bool): _pkgs, title = pkg_types.get(pkg_type, ([], ""))
updated = packages_model.updated or [] total = len(_pkgs)
total_updated = len(updated)
grouped = defaultdict(list) grouped = defaultdict(list)
for pkg in updated: for pkg in _pkgs:
grouped[(pkg.maintainer_nick, pkg.maintainer_name)].append(pkg) grouped[(pkg.maintainer_nick, pkg.maintainer_name)].append(pkg)
sorted_groups = sorted(grouped.items(), key=lambda x: x[0][0]) sorted_groups = sorted(grouped.items(), key=lambda x: x[0][0])
result_pages = [] result_pages = []
for chunk in chunk_list(sorted_groups, 8): for chunk in chunk_list(sorted_groups, 8):
lines = [f"Обновлено {total_updated} пакетов, в том числе:"] lines = [f"{title} {total} пакетов, в том числе:"]
for (nick, name), pkgs in chunk: for (nick, name), maintainer_pkgs in chunk:
selected_pkgs = random.sample(pkgs, min(8, len(pkgs))) selected_pkgs = random.sample(maintainer_pkgs, min(15, len(maintainer_pkgs)))
maintainer_display = ( maintainer_display = (
await translate_maintainer(nick) if translate else name await translate_maintainer(nick) if translate else name
......
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