news module: add news menu

parent 6d1ebf42
from . import admin as admin_keyboards
from . import start as start_keyboards
from . import menu as menu_keyboards
from . import news as news_keyboards
from . import profile as profile_keyboards
from . import watch as watch_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.rules import Command, Argument
from telegrinder import Dispatch, Message, CallbackQuery
from telegrinder.rules import Command, Argument, CallbackDataMarkup, Text, IsPrivate
from altrepo import altrepo
from services.news import format_packages, format_bugs
from data.keyboards import news_keyboards
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"
@dp.message(Text(["новости", "news"], ignore_case=True), IsPrivate())
@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":
bugs_data = await altrepo.parser.news.bugs()
if not bugs_data:
await m.answer("Новостей пока нет.")
await m.ctx_api.send_message(
chat_id=m.from_user.id, text="Новостей пока нет."
)
return
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":
ftbfs_data = await altrepo.parser.packages.ftbfs()
if not ftbfs_data:
await m.answer("ftbfs нет.")
await m.ctx_api.send_message(chat_id=m.from_user.id, text="ftbfs нет.")
return
message = ""
for package in ftbfs_data:
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:
if news_type == "sisyphus":
packages_data = await altrepo.parser.news.sisyphus()
......@@ -36,18 +61,29 @@ async def news_handler(m: Message, news_type: str | None, translate: str | None)
return
if not packages_data:
await m.answer("Новостей пока нет.")
await m.ctx_api.send_message(
chat_id=m.from_user.id, text="Новостей пока нет."
)
return
if bool(translate):
await m.answer("Начался перевод, это может занять до 10 минут.")
await m.ctx_api.send_message(
chat_id=m.from_user.id,
text="Начался перевод, это может занять до 10 минут.",
)
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:
await m.answer("перевод не удался :(")
await m.ctx_api.send_message(
chat_id=m.from_user.id, text="Перевод не удался :("
)
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:
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