news module: add news menu

parent 6d1ebf42
from . import admin as admin_keyboards from . import admin as admin_keyboards
from . import start as start_keyboards from . import start as start_keyboards
from . import menu as menu_keyboards from . import menu as menu_keyboards
from . import news as news_keyboards
from . import profile as profile_keyboards from . import profile as profile_keyboards
from . import watch as watch_keyboards from . import watch as watch_keyboards
from . import bugs as bugs_keyboards from . import bugs as bugs_keyboards
from telegrinder import InlineKeyboard, InlineButton
news_type_kb = (
InlineKeyboard()
.add(InlineButton("Sisyphus", callback_data="news/sisyphus/0"))
.add(InlineButton("Sisyphus (ru)", callback_data="news/sisyphus/1"))
.row()
.add(InlineButton("p11", callback_data="news/p11/0"))
.add(InlineButton("p11 (ru)", callback_data="news/p11/1"))
.row()
.add(InlineButton("Bugs", callback_data="news/bugs/0"))
.add(InlineButton("FTBFS", callback_data="news/ftbfs/0"))
.row()
).get_markup()
from telegrinder import Dispatch, Message from telegrinder import Dispatch, Message, CallbackQuery
from telegrinder.rules import Command, Argument from telegrinder.rules import Command, Argument, CallbackDataMarkup, Text, IsPrivate
from altrepo import altrepo from altrepo import altrepo
from services.news import format_packages, format_bugs from services.news import format_packages, format_bugs
from data.keyboards import news_keyboards
dp = Dispatch() 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: @dp.message(Text(["новости", "news"], ignore_case=True), IsPrivate())
news_type = news_type or "sisyphus" @dp.message(
Command(
"news",
Argument("news_type", optional=True),
Argument("translate", optional=True),
)
)
@dp.callback_query(CallbackDataMarkup("news/<news_type>/<translate:int>"))
async def news_handler(
m: Message | CallbackQuery,
news_type: str | None = None,
translate: int | None = None,
) -> None:
if not news_type:
text = (
"Выберите тип новостей.\n\n"
"Внимание: Sisyphus (ru) и p11 (ru) могут работать нестабильно."
)
await m.ctx_api.send_message(
chat_id=m.from_user.id, text=text, reply_markup=news_keyboards.news_type_kb
)
if news_type == "bugs": if news_type == "bugs":
bugs_data = await altrepo.parser.news.bugs() bugs_data = await altrepo.parser.news.bugs()
if not bugs_data: if not bugs_data:
await m.answer("Новостей пока нет.") await m.ctx_api.send_message(
chat_id=m.from_user.id, text="Новостей пока нет."
)
return return
bugs = await format_bugs(bugs_data) bugs = await format_bugs(bugs_data)
await m.answer(bugs) await m.ctx_api.send_message(chat_id=m.from_user.id, text=bugs)
elif news_type == "ftbfs": elif news_type == "ftbfs":
ftbfs_data = await altrepo.parser.packages.ftbfs() ftbfs_data = await altrepo.parser.packages.ftbfs()
if not ftbfs_data: if not ftbfs_data:
await m.answer("ftbfs нет.") await m.ctx_api.send_message(chat_id=m.from_user.id, text="ftbfs нет.")
return return
message = "" message = ""
for package in ftbfs_data: for package in ftbfs_data:
message += f"{package.name} | {package.ftbfs_weeks}\n" message += f"{package.name} | {package.ftbfs_weeks}\n"
await m.answer(message) await m.ctx_api.send_message(chat_id=m.from_user.id, text=message)
else: else:
if news_type == "sisyphus": if news_type == "sisyphus":
packages_data = await altrepo.parser.news.sisyphus() packages_data = await altrepo.parser.news.sisyphus()
...@@ -34,20 +59,31 @@ async def news_handler(m: Message, news_type: str | None, translate: str | None) ...@@ -34,20 +59,31 @@ async def news_handler(m: Message, news_type: str | None, translate: str | None)
packages_data = await altrepo.parser.news.p11() packages_data = await altrepo.parser.news.p11()
else: else:
return return
if not packages_data: if not packages_data:
await m.answer("Новостей пока нет.") await m.ctx_api.send_message(
chat_id=m.from_user.id, text="Новостей пока нет."
)
return return
if bool(translate): if bool(translate):
await m.answer("Начался перевод, это может занять до 10 минут.") await m.ctx_api.send_message(
chat_id=m.from_user.id,
text="Начался перевод, это может занять до 10 минут.",
)
try: try:
added, removed, updated, info_message = await format_packages(packages_data, bool(translate)) added, removed, updated, info_message = await format_packages(
packages_data, bool(translate)
)
except: except:
await m.answer("перевод не удался :(") await m.ctx_api.send_message(
chat_id=m.from_user.id, text="Перевод не удался :("
)
return return
await m.answer(f"{added}{removed}{info_message}") await m.ctx_api.send_message(
chat_id=m.from_user.id, text=f"{added}{removed}{info_message}"
)
for msg in updated: for msg in updated:
await m.answer(msg) await m.ctx_api.send_message(chat_id=m.from_user.id, text=msg)
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