Исходный код raito.handlers.management.list

from __future__ import annotations

from typing import TYPE_CHECKING, NamedTuple

from aiogram import html

from raito import rt
from raito.plugins.commands import description, hidden
from raito.plugins.roles import DEVELOPER
from raito.utils.ascii import AsciiTree, TreeNode
from raito.utils.configuration import RouterListStyle
from raito.utils.const import ROOT_DIR
from raito.utils.filters import RaitoCommand

if TYPE_CHECKING:
    from aiogram.types import Message

    from raito.core.raito import Raito
    from raito.core.routers.loader import RouterLoader

router = rt.Router(name="raito.management.list", priority=4)


[документация] class Emojis(NamedTuple): """Emojis for router status.""" enabled: str restarting: str disabled: str not_found: str
[документация] @router.message(RaitoCommand("routers"), DEVELOPER) @description("Lists all routers") @hidden async def list_routers(message: Message, raito: Raito) -> None: match raito.configuration.router_list_style: case RouterListStyle.CIRCLES: emojis = Emojis("🟢", "🟡", "🔴", "⚪") case RouterListStyle.DIAMONDS: emojis = Emojis("🔹", "🔸", "🔸", "🔸") case RouterListStyle.DIAMONDS_REVERSED: emojis = Emojis("🔸", "🔹", "🔹", "🔹") case _: emojis = Emojis("🟩", "🟨", "🟥", "⬜") def extract_loader_path(loader: RouterLoader) -> str: return ( loader.path.as_posix() .replace(ROOT_DIR.parent.as_posix(), "") .replace(".py", "") .strip("/") ) paths = { extract_loader_path(loader): loader for loader in raito.router_manager.loaders.values() } def get_status_icon(path: str) -> str: loader = paths.get(path) if loader and loader.is_restarting: return emojis.restarting if loader and loader.is_loaded: return emojis.enabled return emojis.disabled root = TreeNode("routers", is_folder=True) for path in paths: parts = path.split("/") current = root for i, part in enumerate(parts): full_path = "/".join(parts[: i + 1]) is_folder = i != len(parts) - 1 icon = get_status_icon(full_path) if not is_folder else "" current = current.add_child(part, prefix=icon, is_folder=is_folder) tree = AsciiTree().render(root) text = ( html.bold("Here is your routers:") + "\n\n" + tree + "\n\n" + html.pre_language((f"{emojis[0]} — Enabled\n{emojis[2]} — Disabled\n"), "Specification") ) await message.answer(text, parse_mode="HTML")