""" █▄▀ █ █░█░█ █ █▄░█ █ █▀▀ █▀▀ █▀█ █░█ █ ▀▄▀▄▀ █ █░▀█ █ █▄▄ ██▄ █▀▄ Copyleft 2022 t.me/KiwiNicer This program is free software; you can redistribute it and/or modify """ __version__ = (1, 1, 0) # requires: aiohttp # meta pic: https://img.icons8.com/clouds/512/000000/linux-client.png # meta developer: @KiwiNicer import aiohttp import logging import asyncio from aiogram.types import CallbackQuery from typing import Union from .. import loader, utils logger = logging.getLogger(__name__) # From Hikka https://github.com/hikariatama/Hikka/blob/master/hikka/utils.py#L459-L461 def chunks(_list: Union[list, tuple, set], n: int, /) -> list: """Split provided `_list` into chunks of `n`""" return [_list[i : i + n] for i in range(0, len(_list), n)] @loader.tds class LinuxPackagesMod(loader.Module): """Search package for Linux by name""" strings = { "name": "Packages", "no_name": "Pls give me name", "general_error": "Unknown error .-.", "string_list": "List of packages in the {}\n\n", "info_about": "Info about {}\n\n", "ver": "Version: {}\n", "description": "Description: {}\n", "maintainer": "Maintainer: {}\n", "no_packages": "No packages...", } strings_ru = { "no_name": "Пожалуйста, дайте мне имя пакета", "general_error": "Неизвестная ошибка .-.", "string_list": "Список пакетов в {}\n\n", "info_about": "Информация о {}\n\n", "ver": "Версия: {}\n", "description": "Описание: {}\n", "maintainer": "Сопровождающий: {}\n", "no_packages": "Нет пакетов...", } async def aurcmd(self, message): """Arch User Repository""" args = utils.get_args_raw(message) if not args: await utils.answer(message, self.strings["no_name"]) return await asyncio.sleep(5) async with aiohttp.ClientSession() as session: async with session.get( f"https://aur.archlinux.org/rpc/?v=5&type=search&arg={args}" ) as get: if get.ok: packages = await get.json() if packages["resultcount"] == 0: return await utils.answer(message, self.strings["no_packages"]) i = 1 reply_markup = [] string = self.strings["string_list"].format("AUR") for package in packages["results"]: string += f"{i}. {package['Name']}(v{package['Version']})\n" reply_markup.append( { "text": str(i), "callback": self.inline__get_package, "args": [package["Name"], "AUR", args], } ) if i >= 10: break i = i + 1 await self.inline.form( text=string, message=message, reply_markup=chunks(reply_markup, 5), force_me=False, # optional: Allow other users to access form (all) ) else: await utils.answer(message, self.strings["general_error"]) return await asyncio.sleep(5) async def inline__get_package( self, call: CallbackQuery, Name: str, _type: str, search_arg: str ) -> None: if _type == "AUR": async with aiohttp.ClientSession() as session: async with session.get( f"https://aur.archlinux.org/rpc/?v=5&type=info&arg[]={Name}" ) as get: if get.ok: package = await get.json() else: await utils.answer(message, self.strings["general_error"]) return await asyncio.sleep(5) string = self.strings["info_about"].format(Name) string += self.strings["ver"].format(package["results"][0]["Version"]) string += self.strings["description"].format( package["results"][0]["Description"] ) string += self.strings["maintainer"].format( package["results"][0]["Maintainer"] ) btn = [ [ { "text": "AUR", "url": f"https://aur.archlinux.org/packages/{Name}", }, { "text": "Download snapshot", "url": "https://aur.archlinux.org" + package["results"][0]["URLPath"], }, ], [ { "text": "Back", "callback": self.inline__back, "args": [search_arg, "AUR"], } ], ] elif _type == "pacman": async with aiohttp.ClientSession() as session: async with session.get( f"https://www.archlinux.org/packages/search/json/?q={Name}" ) as get: if get.ok: package = await get.json() else: await utils.answer(message, self.strings["general_error"]) return await asyncio.sleep(5) string = self.strings["info_about"].format(Name) string += self.strings["ver"].format(package["results"][0]["pkgver"]) string += self.strings["description"].format( package["results"][0]["pkgdesc"] ) string += self.strings["maintainer"].format( package["results"][0]["maintainers"][0] ) btn = [ [ { "text": "Pacman", "url": f"https://archlinux.org/packages/{package['results'][0]['repo']}/{package['results'][0]['arch']}/{package['results'][0]['pkgname']}", }, ], [ { "text": "Back", "callback": self.inline__back, "args": [search_arg, "pacman"], } ], ] await call.edit( text=string, reply_markup=btn, # optional: Change buttons in message. If not specified, buttons will be removed force_me=False, # optional: Change button privacy mode ) async def inline__back(self, call: CallbackQuery, Name: str, _type: str) -> None: if _type == "AUR": async with aiohttp.ClientSession() as session: async with session.get( f"https://aur.archlinux.org/rpc/?v=5&type=search&arg={Name}" ) as get: if get.ok: packages = await get.json() i = 1 reply_markup = [] string = self.strings["string_list"].format("AUR") for package in packages["results"]: string += f"{i}. {package['Name']}(v{package['Version']})\n" reply_markup.append( { "text": str(i), "callback": self.inline__get_package, "args": [package["Name"], "AUR", Name], } ) if i >= 10: break i = i + 1 await call.edit( text=string, reply_markup=chunks(reply_markup, 5), force_me=False, # optional: Allow other users to access form (all) ) else: await utils.answer(message, self.strings["general_error"]) return await asyncio.sleep(5) elif _type == "pacman": async with aiohttp.ClientSession() as session: async with session.get( f"https://www.archlinux.org/packages/search/json/?q={Name}" ) as get: if get.ok: packages = await get.json() if len(packages["results"]) == 0: return await utils.answer(message, self.strings["no_packages"]) i = 1 reply_markup = [] string = self.strings["string_list"].format("pacman") for package in packages["results"]: string += f"{i}. {package['pkgname']}(v{package['pkgver']})\n" reply_markup.append( { "text": str(i), "callback": self.inline__get_package, "args": [package["pkgname"], "pacman", Name], } ) if i >= 10: break i = i + 1 await call.edit( text=string, reply_markup=chunks(reply_markup, 5), force_me=False, # optional: Allow other users to access form (all) ) async def pacmancmd(self, message): """Pacman""" if not (args := utils.get_args_raw(message)): return async with aiohttp.ClientSession() as session: async with session.get( f"https://www.archlinux.org/packages/search/json/?q={args}" ) as get: if get.ok: packages = await get.json() if len(packages["results"]) == 0: return await utils.answer(message, self.strings["no_packages"]) i = 1 reply_markup = [] string = self.strings["string_list"].format("pacman") for package in packages["results"]: string += f"{i}. {package['pkgname']}(v{package['pkgver']})\n" reply_markup.append( { "text": str(i), "callback": self.inline__get_package, "args": [package["pkgname"], "pacman", args], } ) if i >= 10: break i = i + 1 await self.inline.form( text=string, message=message, reply_markup=chunks(reply_markup, 5), force_me=False, # optional: Allow other users to access form (all) )