"""
█▄▀ █ █░█░█ █ █▄░█ █ █▀▀ █▀▀ █▀█
█░█ █ ▀▄▀▄▀ █ █░▀█ █ █▄▄ ██▄ █▀▄
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)
)