melobot.protocols.console.adapter.base 源代码

import asyncio
import sys

from typing_extensions import Any, cast

from melobot import get_bot
from melobot.adapter import (
    AbstractEchoFactory,
    AbstractEventFactory,
    AbstractOutputFactory,
    ActionHandleGroup,
)
from melobot.adapter import Adapter as RootAdapter
from melobot.typ import SyncOrAsyncCallable

from ..const import PROTOCOL_IDENTIFIER
from ..io.model import EchoPacket, InPacket, NormalOutputData, OutPacket, OutputType, RawOutputData
from ..io.src import ConsoleIO
from . import action as ac
from . import echo as ec
from . import event as ev


class EventFactory(AbstractEventFactory[InPacket, ev.Event]):
    async def create(self, packet: InPacket) -> ev.Event:
        event = ev.Event.resolve(packet.data)
        asyncio.create_task(get_bot().wait_finish(event)).add_done_callback(
            lambda *_, **__: packet.finished.set_result(None)
        )
        return event


class OutputFactory(AbstractOutputFactory[OutPacket, ac.Action]):
    async def create(self, action: ac.Action) -> OutPacket:
        match action.type:
            case OutputType.STDOUT_OR_STDERR:
                action = cast(ac.NormalOutputAction, action)
                return OutPacket(
                    data=NormalOutputData(
                        content=action.msg,
                        stream=sys.stdout if action.is_stdout else sys.stderr,
                        next_prompt_args=action.next_prompt_args,
                    )
                )
            case OutputType.RAW_OUTPUT:
                action = cast(ac.RawOutputAction, action)
                return OutPacket(
                    data=RawOutputData(
                        executor=action.executor, next_prompt_args=action.next_prompt_args
                    )
                )
            case _:
                raise ValueError(f"不支持的行为操作:{action}")


class EchoFactory(AbstractEchoFactory[EchoPacket, ec.Echo]):
    async def create(self, packet: EchoPacket) -> ec.Echo | None:
        if packet.noecho:
            return None
        raise ValueError("暂不支持 Echo 功能,但输入输出管理器提供了异常的标识")


[文档] class Adapter( RootAdapter[EventFactory, OutputFactory, EchoFactory, ac.Action, ConsoleIO, ConsoleIO] ): def __init__(self) -> None: super().__init__(PROTOCOL_IDENTIFIER, EventFactory(), OutputFactory(), EchoFactory()) async def __send_text__(self, text: str) -> ActionHandleGroup[ec.Echo]: return await self.send(text)
[文档] async def send( self, msg: str, stderr: bool = False, next_prompt_args: dict[str, Any] | None = None, ) -> ActionHandleGroup[ec.Echo]: return await self.call_output( ac.NormalOutputAction(msg, "stderr" if stderr else "stdout", next_prompt_args) )
[文档] async def raw_output( self, executor: SyncOrAsyncCallable[[], Any], next_prompt_args: dict[str, Any] | None = None ) -> ActionHandleGroup[ec.Echo]: return await self.call_output(ac.RawOutputAction(executor, next_prompt_args))