watch module: api -> parser

parent 7715ffe5
import aiohttp
from typing import List
from typing import List, Literal
from . import models
from .news import urls_parser, packages_parser, bugs_parser
from .packages import ftbfs_parser
from .packages import ftbfs_parser, watch_parser
class BaseParser:
......@@ -56,6 +56,18 @@ class PackagesInfo:
text = await self.client.get(url)
return await ftbfs_parser(text)
async def watch_by_maintainer(
self,
maintainer_nickname: str,
by_acl: Literal["by-acl", "by-expanded-acl", "by-expanded-leader", "by-leader"],
) -> List[models.WatchByMaintainerModel]:
url = f"https://watch.altlinux.org/pub/watch/{by_acl}/{maintainer_nickname}.txt"
try:
text = await self.client.get(url)
return await watch_parser(text)
except:
return []
class ALTRepoParser:
def __init__(self, session: aiohttp.ClientSession):
......
from pydantic import BaseModel
from typing import List, Dict, Any
from typing import List
class NewsURL(BaseModel):
......@@ -51,3 +51,10 @@ class FTBFSModel(BaseModel):
version: str
ftbfs_weeks: int
maintainers: List[str]
class WatchByMaintainerModel(BaseModel):
pkg_name: str
old_version: str
new_version: str
url: str
from .ftbfs import ftbfs_parser
from .watch import watch_parser
from .. import models
async def watch_parser(text: str):
return [
models.WatchByMaintainerModel(
pkg_name=parts[0],
old_version=parts[1],
new_version=parts[2],
url=parts[3],
)
for parts in (line.split("\t") for line in text.strip().splitlines())
if len(parts) == 4
]
......@@ -10,9 +10,15 @@ from data.keyboards import watch_keyboards
dp = Dispatch()
@dp.message(Command("watch", Argument("maintainer", optional=True)))
@dp.message(
Command("watch",
Argument("maintainer", optional=True),
Argument("acl", optional=True))
)
@dp.message(Text(["watch", "отслеживание"], ignore_case=True), IsUser())
async def watch_handler(m: Message, user: User | None, maintainer: str | None = None) -> None:
async def watch_test_handler(
m: Message, user: User | None, maintainer: str | None = None, acl: str | None = None
) -> None:
if maintainer:
maintainer = maintainer.lower()
......@@ -27,16 +33,17 @@ async def watch_handler(m: Message, user: User | None, maintainer: str | None =
else:
return
watch_data = await altrepo.api.site.watch_by_maintainer(maintainer)
watch_packages = watch_data.packages if watch_data else []
if not len(watch_packages):
acl = acl or "by-acl"
watch_data = await altrepo.parser.packages.watch_by_maintainer(maintainer, acl)
if not len(watch_data):
await m.answer("Нет устаревших пакетов")
return
watch_message = "Отслеживание:\n\n"
packages = {}
for package in watch_packages:
for package in watch_data:
name = package.pkg_name
if name not in packages or "src.rpm" in packages[name].url:
packages[name] = package
......@@ -57,5 +64,5 @@ async def watch_handler(m: Message, user: User | None, maintainer: str | None =
if len(packages) > 30:
watch_message += "\n..."
markup = watch_keyboards.watch_more_kb(maintainer)
await m.answer(watch_message, reply_markup=markup)
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