news: add /top command for most active maintainers

parent a333db40
......@@ -210,3 +210,45 @@ async def pulse_handler(m: Message, days: int | None = None) -> None:
message += f"* статистика за {date_range}"
await m.answer(message)
@dp.message(
Command("top", Argument("days", [int_validator], optional=True))
)
async def top_handler(m: Message, days: int | None = None) -> None:
days = days or 7
if days < 1 or days > 180:
await m.answer("Допустимый диапазон: 1–180 дней.")
return
d_to = datetime.now().date()
d_from = d_to - timedelta(days=days - 1)
await m.answer(f"Сбор статистики за {days} дн...")
packages_data = await altrepo.parser.news.packages_by_range(d_from, d_to)
if not packages_data:
await m.answer("Нет данных за этот период.")
return
from collections import Counter
counter = Counter()
for pkg in (packages_data.added or []):
counter[pkg.maintainer_nick] += 1
for pkg in (packages_data.updated or []):
counter[pkg.maintainer_nick] += 1
if not counter:
await m.answer("Нет данных по мейнтейнерам.")
return
top = counter.most_common(10)
message = _bold("Топ мейнтейнеров\n\n")
for i, (nick, count) in enumerate(top, 1):
message += f"{i}. {nick} — {count}\n"
date_range = f"{d_from.strftime('%d.%m.%Y')} — {d_to.strftime('%d.%m.%Y')}"
message += f"\n* добавлено + обновлено за {date_range}"
await m.answer(message)
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