From 350073369d4bee5886ee0ff80175498654b9c5f8 Mon Sep 17 00:00:00 2001 From: molanp <104612722+molanp@users.noreply.github.com> Date: Mon, 19 Jan 2026 01:40:36 +0800 Subject: [PATCH 1/3] =?UTF-8?q?feat(uniseg):=20=E6=B7=BB=E5=8A=A0=E4=BA=91?= =?UTF-8?q?=E6=B9=96=E5=B9=B3=E5=8F=B0=E9=80=82=E9=85=8D=E5=99=A8=E6=94=AF?= =?UTF-8?q?=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在SupportAdapter中添加yunhu枚举值 - 在SupportScope中添加yunhu枚举值及注释 - 在SupportAdapterModule中添加yunhu适配器模块映射 --- .../uniseg/adapters/yunhu/__init__.py | 17 ++ .../uniseg/adapters/yunhu/builder.py | 106 ++++++++++ .../uniseg/adapters/yunhu/exporter.py | 196 ++++++++++++++++++ .../uniseg/constraint.py | 4 + 4 files changed, 323 insertions(+) create mode 100644 src/nonebot_plugin_alconna/uniseg/adapters/yunhu/__init__.py create mode 100644 src/nonebot_plugin_alconna/uniseg/adapters/yunhu/builder.py create mode 100644 src/nonebot_plugin_alconna/uniseg/adapters/yunhu/exporter.py diff --git a/src/nonebot_plugin_alconna/uniseg/adapters/yunhu/__init__.py b/src/nonebot_plugin_alconna/uniseg/adapters/yunhu/__init__.py new file mode 100644 index 0000000..e14d017 --- /dev/null +++ b/src/nonebot_plugin_alconna/uniseg/adapters/yunhu/__init__.py @@ -0,0 +1,17 @@ +from nonebot_plugin_alconna.uniseg.constraint import SupportAdapter +from nonebot_plugin_alconna.uniseg.loader import BaseLoader + + +class Loader(BaseLoader): + def get_adapter(self) -> SupportAdapter: + return SupportAdapter.yunhu + + def get_builder(self): + from .builder import YunHuMessageBuilder + + return YunHuMessageBuilder() + + def get_exporter(self): + from .exporter import YunHuMessageExporter + + return YunHuMessageExporter() diff --git a/src/nonebot_plugin_alconna/uniseg/adapters/yunhu/builder.py b/src/nonebot_plugin_alconna/uniseg/adapters/yunhu/builder.py new file mode 100644 index 0000000..45b2440 --- /dev/null +++ b/src/nonebot_plugin_alconna/uniseg/adapters/yunhu/builder.py @@ -0,0 +1,106 @@ +from typing import TYPE_CHECKING + +from nonebot.adapters import Bot, Event +from nonebot.adapters.yunhu.message import Video as VideoSegment +from nonebot.adapters.yunhu.message import Text as TextSegment +from nonebot.adapters.yunhu.message import Face as FaceSegment +from nonebot.adapters.yunhu.message import Buttons as ButtonsSegment +from nonebot.adapters.yunhu.message import Markdown as MarkdownSegment +from nonebot.adapters.yunhu.message import At as AtSegment +from nonebot.adapters.yunhu.message import Image as ImageSegment +from nonebot.adapters.yunhu.message import Html as HtmlSegment +from nonebot.adapters.yunhu.message import File as FileSegment +from nonebot.adapters.yunhu.message import Message +from nonebot.adapters.yunhu.event import MessageEvent +from nonebot.adapters.yunhu.models import Reply as ReplySegement + +from nonebot_plugin_alconna.uniseg.builder import MessageBuilder, build +from nonebot_plugin_alconna.uniseg.constraint import SupportAdapter +from nonebot_plugin_alconna.uniseg.segment import ( + At, + Button, + Emoji, + File, + Image, + Keyboard, + Reply, + Text, + Video, +) + + +class YunHuMessageBuilder(MessageBuilder): + @classmethod + def get_adapter(cls) -> SupportAdapter: + return SupportAdapter.yunhu + + @build("text") + def text(self, seg: TextSegment): + return Text(seg.data["text"]) + + @build("markdown") + def markdown(self, seg: MarkdownSegment): + content = seg.data["text"] + return Text(content).mark(0, len(content), "markdown") + + @build("html") + def html(self, seg: HtmlSegment): + content = seg.data["text"] + return Text(content).mark(0, len(content), "html") + + @build("at") + def at(self, seg: AtSegment): + return At("user", seg.data["user_id"], seg.data["name"]) + + @build("face") + def face(self, seg: FaceSegment): + return Emoji(seg.data["code"], seg.data["emoji"]) + + @build("image") + def image(self, seg: ImageSegment): + return Image(id=seg.data["imageKey"], url=seg.data["url"], raw=seg.data["raw"]) + + @build("video") + def video(self, seg: VideoSegment): + return Video(id=seg.data["videoKey"], url=seg.data["url"], raw=seg.data["raw"]) + + @build("file") + def file(self, seg: FileSegment): + return File(id=seg.data["fileKey"], url=seg.data["url"], raw=seg.data["raw"]) + + @build("keyboard") + def keyboard(self, seg: ButtonsSegment): + kbs = [] + btns = seg.data["buttons"] + for kb in btns: + buttons = [] + for button in kb: + if button["actionType"] == 1: + flag = "link" + elif button["actionType"] == 2: + flag = "input" + elif button["actionType"] == 3: + flag = "action" + buttons.append( + Button( + flag=flag, + label=button["text"], + url=button["url"] if button["actionType"] == 1 else None, + text=button["value"] if button["actionType"] == 2 else None, + ) + ) + kbs.append(Keyboard(buttons=buttons)) + return kbs + + async def extract_reply(self, event: Event, bot: Bot): + if TYPE_CHECKING: + assert isinstance(event, MessageEvent) + if rpl := event.reply: + if TYPE_CHECKING: + assert isinstance(rpl, ReplySegement) + return Reply( + rpl.msgId, + Message.deserialize(rpl.content, rpl.content.at, rpl.contentType, rpl.commandName), + rpl, + ) + return None diff --git a/src/nonebot_plugin_alconna/uniseg/adapters/yunhu/exporter.py b/src/nonebot_plugin_alconna/uniseg/adapters/yunhu/exporter.py new file mode 100644 index 0000000..4106c7e --- /dev/null +++ b/src/nonebot_plugin_alconna/uniseg/adapters/yunhu/exporter.py @@ -0,0 +1,196 @@ +from pathlib import Path +from typing import TYPE_CHECKING, Any, Union, cast + +from nonebot.adapters import Bot, Event +from nonebot.adapters.yunhu.bot import Bot as YunHuBot +from nonebot.adapters.yunhu.event import MessageEvent +from nonebot.adapters.yunhu.event import NoticeEvent +from nonebot.adapters.yunhu.event import Event as YunHuEvent +from nonebot.adapters.yunhu.message import Message +from nonebot.adapters.yunhu.message import MessageSegment +from nonebot.adapters.yunhu.models import BaseNotice +from nonebot.adapters.yunhu.models import ButtonBody +from nonebot.adapters.yunhu.models import SendMsgResponse +from tarina import lang + +from nonebot_plugin_alconna.uniseg.constraint import SupportScope +from nonebot_plugin_alconna.uniseg.exporter import MessageExporter, SerializeFailed, SupportAdapter, Target, export +from nonebot_plugin_alconna.uniseg.segment import ( + At, + Button, + Emoji, + File, + Image, + Keyboard, + Reply, + Text, + Video, +) + + +class YunHuMessageExporter(MessageExporter[Message]): + @classmethod + def get_adapter(cls) -> SupportAdapter: + return SupportAdapter.yunhu + + def get_message_type(self): + return Message + + def get_target(self, event: Event, bot: Union[Bot, None] = None) -> Target: + if isinstance(event, MessageEvent): + return Target( + event.event.sender.senderId, + event.event.chat.chatId, + private=(event.event.chat.chatType == "bot"), + source=event.event.message.msgId, + adapter=self.get_adapter(), + self_id=bot.self_id if bot else None, + scope=SupportScope.yunhu, + ) + if isinstance(event, NoticeEvent): + if TYPE_CHECKING: + assert isinstance(event.event, BaseNotice) + return Target( + event.get_user_id(), + event.event.chatId, + private=(event.event.chatType == "user"), + source=event.header.eventId, + adapter=self.get_adapter(), + self_id=bot.self_id if bot else None, + scope=SupportScope.yunhu, + ) + raise NotImplementedError + + def get_message_id(self, event: Event) -> str: + assert isinstance( + event, + MessageEvent, + ) + return event.event.message.msgId + + @export + async def text(self, seg: Text, bot: Union[Bot, None]) -> "MessageSegment": + if seg.extract_most_style() == "markdown": + return MessageSegment.markdown(seg.text) + if seg.extract_most_style() == "html": + return MessageSegment.html(seg.text) + if seg.styles: + return MessageSegment.markdown(str(seg)) + return MessageSegment.text(seg.text) + + @export + async def at(self, seg: At, bot: Union[Bot, None]) -> "MessageSegment": + if seg.flag == "user": + return MessageSegment.at(seg.target, seg.display or "") + raise SerializeFailed( + lang.require("nbp-uniseg", "failed_segment").format(adapter="yunhu", seg=seg, target="at") + ) + + @export + async def face(self, seg: Emoji, bot: Union[Bot, None]) -> "MessageSegment": + return MessageSegment.face(seg.id, seg.name or "") + + @export + async def media(self, seg: Union[Image, Video, File], bot: Union[Bot, None]) -> "MessageSegment": + name = seg.__class__.__name__.lower() + method = { + "image": MessageSegment.image, + "video": MessageSegment.video, + "file": MessageSegment.file, + }[name] + + if seg.url: + return method(url=seg.url) + if seg.raw: + return method(raw=seg.raw_bytes) + if seg.path: + return method(raw=Path(seg.path).read_bytes()) + raise SerializeFailed(lang.require("nbp-uniseg", "invalid_segment").format(type="image", seg=seg)) + + @export + async def reply(self, seg: Reply, bot: Union[Bot, None]) -> "MessageSegment": + return MessageSegment("$yunhu:reply", {"message_id": seg.id}) + + def _button(self, seg: Button, bot: Union[Bot, None]) -> ButtonBody: + label = str(seg.label) + if seg.flag == "link": + return {"text": label, "actionType": 1, "url": seg.url} # pyright: ignore[reportReturnType] + if seg.flag == "action": + return {"text": label, "actionType": 3} # pyright: ignore[reportReturnType] + return {"text": label, "actionType": 2, "value": seg.text} # pyright: ignore[reportReturnType] + + @export + async def button(self, seg: Button, bot: Union[Bot, None]): + return MessageSegment("$yunhu:button", {"button": self._button(seg, bot)}) + + @export + async def keyboard(self, seg: Keyboard, bot: Union[Bot, None]): + if not seg.children: + raise SerializeFailed(lang.require("nbp-uniseg", "invalid_segment").format(type="keyboard", seg=seg)) + buttons = [self._button(but, bot) for but in seg.children] + if not seg.row: + return MessageSegment("$yunhu:button_row", {"buttons": buttons}) + rows = [buttons[i : i + (seg.row or 9)] for i in range(0, len(buttons), seg.row or 9)] + return MessageSegment("$yunhu:keyboard", {"buttons": rows}) + + async def send_to(self, target: Union[Target, YunHuEvent], bot: Bot, message: Message, **kwargs): + assert isinstance(bot, YunHuBot) + if TYPE_CHECKING: + assert isinstance(message, self.get_message_type()) + kb = None + if buttons := message.get("$yunhu:button"): + message = message.exclude("$yunhu:button") + buts = [but.data["button"] for but in buttons] + rows = [buts[i : i + 9] for i in range(0, len(buttons), 9)] + kb = rows + if rows := message.get("$yunhu:button_row"): + message = message.exclude("$yunhu:button_row") + but_rows = [row.data["buttons"] for row in rows] + if not kb: + kb = but_rows + else: + kb.extend(but_rows) + if keyboard := message.get("$yunhu:keyboard"): + message = message.exclude("$yunhu:keyboard") + if not kb: + kb = keyboard[0].data["buttons"] + else: + kb.extend(keyboard[0].data["buttons"]) + + if kb: + message.append(MessageSegment.buttons(kb)) + + if isinstance(target, YunHuEvent): + return await bot.send(event=target, message=message, **kwargs) + + content, content_type = message.serialize() + return await bot.send_msg( + receive_type=("user" if target.private else "group"), + receive_id=target.id, + content=content, + content_type=content_type, + parent_id=target.parent_id, + ) + + async def recall(self, mid: Any, bot: Bot, context: Union[Target, Event]): + assert isinstance(bot, YunHuBot) + if isinstance(mid, (str, int)) and isinstance(context, MessageEvent): + if context.event.message.chatType == "bot": + chat_id = context.event.sender.senderId + chat_type = "user" + else: + chat_id = context.event.message.chatId + await bot.delete_msg(message_id=str(mid), chat_id=chat_id, chat_type=chat_type) + else: + _mid: SendMsgResponse = cast(SendMsgResponse, mid) + assert _mid.data + await bot.delete_msg( + message_id=_mid.data.messageInfo.msgId, + chat_id=_mid.data.messageInfo.recvId, + chat_type=_mid.data.messageInfo.recvType, + ) + + def get_reply(self, mid: Any): + if isinstance(mid, MessageEvent): + return Reply(mid.event.message.msgId) + raise NotImplementedError diff --git a/src/nonebot_plugin_alconna/uniseg/constraint.py b/src/nonebot_plugin_alconna/uniseg/constraint.py index 4d55e9f..3425805 100644 --- a/src/nonebot_plugin_alconna/uniseg/constraint.py +++ b/src/nonebot_plugin_alconna/uniseg/constraint.py @@ -36,6 +36,7 @@ class SupportAdapter(str, Enum): tail_chat = "Tailchat" wxmp = "WXMP" efchat = "EFChat" + yunhu = "YunHu" nonebug = "fake" @@ -72,6 +73,8 @@ class SupportScope(str, Enum): """EFChat平台""" bililive = "BiliLive" """Bilibili直播平台""" + yunhu = "YunHu" + """云湖平台""" onebot12_other = "Onebot12" """ob12 的其他平台""" @@ -142,6 +145,7 @@ class SupportAdapterModule(str, Enum): telegram = "nonebot.adapters.telegram" tail_chat = "nonebot_adapter_tailchat" wxmp = "nonebot.adapters.wxmp" + yunhu = "nonebot.adapters.yunhu" UNISEG_MESSAGE: Literal["_alc_uniseg_message"] = "_alc_uniseg_message" From ab873460e834d61cb4cd16580bc7e25210520abb Mon Sep 17 00:00:00 2001 From: molanp <104612722+molanp@users.noreply.github.com> Date: Mon, 19 Jan 2026 17:21:37 +0800 Subject: [PATCH 2/3] =?UTF-8?q?feat(yunhu):=20=E6=94=B9=E8=BF=9B=E4=BA=91?= =?UTF-8?q?=E7=8B=90=E9=80=82=E9=85=8D=E5=99=A8=E7=9A=84=E6=B6=88=E6=81=AF?= =?UTF-8?q?=E6=9E=84=E5=BB=BA=E5=92=8C=E5=AF=BC=E5=87=BA=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 优化图片、视频、文件消息段的构建逻辑,支持优先使用URL或原始数据 - 修复群聊目标识别,当聊天类型为群组时正确设置chatId - 增强消息导出器的按钮处理逻辑,区分button、button_row和keyboard - 添加对回复消息的支持,允许指定回复特定消息ID - 更新约束范围,添加yunhu平台支持 --- .../uniseg/adapters/yunhu/builder.py | 19 +++++++++-- .../uniseg/adapters/yunhu/exporter.py | 33 +++++++++++++++---- .../uniseg/constraint.py | 1 + 3 files changed, 43 insertions(+), 10 deletions(-) diff --git a/src/nonebot_plugin_alconna/uniseg/adapters/yunhu/builder.py b/src/nonebot_plugin_alconna/uniseg/adapters/yunhu/builder.py index 45b2440..b25f499 100644 --- a/src/nonebot_plugin_alconna/uniseg/adapters/yunhu/builder.py +++ b/src/nonebot_plugin_alconna/uniseg/adapters/yunhu/builder.py @@ -58,15 +58,28 @@ def face(self, seg: FaceSegment): @build("image") def image(self, seg: ImageSegment): - return Image(id=seg.data["imageKey"], url=seg.data["url"], raw=seg.data["raw"]) + + if seg.data["url"]: + return Image(id=seg.data["imageKey"], url=seg.data["url"]) + if seg.data["raw"]: + return Image(id=seg.data["imageKey"], raw=seg.data["raw"]) + return Image(id=seg.data["imageKey"]) @build("video") def video(self, seg: VideoSegment): - return Video(id=seg.data["videoKey"], url=seg.data["url"], raw=seg.data["raw"]) + if seg.data["url"]: + return Video(id=seg.data["videoKey"], url=seg.data["url"]) + if seg.data["raw"]: + return Video(id=seg.data["videoKey"], raw=seg.data["raw"]) + return Video(id=seg.data["videoKey"]) @build("file") def file(self, seg: FileSegment): - return File(id=seg.data["fileKey"], url=seg.data["url"], raw=seg.data["raw"]) + if seg.data["url"]: + return File(id=seg.data["fileKey"], url=seg.data["url"]) + if seg.data["raw"]: + return File(id=seg.data["fileKey"], raw=seg.data["raw"]) + return File(id=seg.data["fileKey"]) @build("keyboard") def keyboard(self, seg: ButtonsSegment): diff --git a/src/nonebot_plugin_alconna/uniseg/adapters/yunhu/exporter.py b/src/nonebot_plugin_alconna/uniseg/adapters/yunhu/exporter.py index 4106c7e..6c6ec92 100644 --- a/src/nonebot_plugin_alconna/uniseg/adapters/yunhu/exporter.py +++ b/src/nonebot_plugin_alconna/uniseg/adapters/yunhu/exporter.py @@ -40,7 +40,7 @@ def get_target(self, event: Event, bot: Union[Bot, None] = None) -> Target: if isinstance(event, MessageEvent): return Target( event.event.sender.senderId, - event.event.chat.chatId, + event.event.chat.chatId if event.event.chat.chatType == "group" else "", private=(event.event.chat.chatType == "bot"), source=event.event.message.msgId, adapter=self.get_adapter(), @@ -137,12 +137,17 @@ async def send_to(self, target: Union[Target, YunHuEvent], bot: Bot, message: Me assert isinstance(bot, YunHuBot) if TYPE_CHECKING: assert isinstance(message, self.get_message_type()) + kb = None + message_id: str | None = None + + # 处理 button if buttons := message.get("$yunhu:button"): message = message.exclude("$yunhu:button") buts = [but.data["button"] for but in buttons] - rows = [buts[i : i + 9] for i in range(0, len(buttons), 9)] - kb = rows + kb = [buts[i : i + 9] for i in range(0, len(buts), 9)] + + # 处理 button_row if rows := message.get("$yunhu:button_row"): message = message.exclude("$yunhu:button_row") but_rows = [row.data["buttons"] for row in rows] @@ -150,18 +155,31 @@ async def send_to(self, target: Union[Target, YunHuEvent], bot: Bot, message: Me kb = but_rows else: kb.extend(but_rows) + + # 处理 keyboard if keyboard := message.get("$yunhu:keyboard"): message = message.exclude("$yunhu:keyboard") + keyboard_buttons = keyboard[0].data["buttons"] if not kb: - kb = keyboard[0].data["buttons"] + kb = keyboard_buttons else: - kb.extend(keyboard[0].data["buttons"]) + kb.extend(keyboard_buttons) if kb: message.append(MessageSegment.buttons(kb)) + # 处理 reply + if reply_segments := message.get("$yunhu:reply"): + message = message.exclude("$yunhu:reply") + raw_inner_id = reply_segments[0].data.get("message_id") + message_id = str(raw_inner_id) if raw_inner_id else None + else: + message_id = None + if isinstance(target, YunHuEvent): - return await bot.send(event=target, message=message, **kwargs) + if message_id: + return await bot.send(event=target, message=message, reply_to=message_id) + return await bot.send(event=target, message=message) content, content_type = message.serialize() return await bot.send_msg( @@ -169,7 +187,7 @@ async def send_to(self, target: Union[Target, YunHuEvent], bot: Bot, message: Me receive_id=target.id, content=content, content_type=content_type, - parent_id=target.parent_id, + parent_id=message_id, ) async def recall(self, mid: Any, bot: Bot, context: Union[Target, Event]): @@ -180,6 +198,7 @@ async def recall(self, mid: Any, bot: Bot, context: Union[Target, Event]): chat_type = "user" else: chat_id = context.event.message.chatId + chat_type = "group" await bot.delete_msg(message_id=str(mid), chat_id=chat_id, chat_type=chat_type) else: _mid: SendMsgResponse = cast(SendMsgResponse, mid) diff --git a/src/nonebot_plugin_alconna/uniseg/constraint.py b/src/nonebot_plugin_alconna/uniseg/constraint.py index 3425805..1e7ccda 100644 --- a/src/nonebot_plugin_alconna/uniseg/constraint.py +++ b/src/nonebot_plugin_alconna/uniseg/constraint.py @@ -114,6 +114,7 @@ def ensure_satori(platform: str): "dingtalk": SupportScope.ding, "mail": SupportScope.mail, "heybox": SupportScope.heybox, + "yunhu": SupportScope.yunhu, }.get(platform, SupportScope.satori_other) From 703f859516a50f2207d068dac089a760a71efd29 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 19 Jan 2026 09:22:33 +0000 Subject: [PATCH 3/3] :rotating_light: auto fix by pre-commit hooks --- .../uniseg/adapters/yunhu/builder.py | 28 ++++++------------- .../uniseg/adapters/yunhu/exporter.py | 22 +++------------ 2 files changed, 13 insertions(+), 37 deletions(-) diff --git a/src/nonebot_plugin_alconna/uniseg/adapters/yunhu/builder.py b/src/nonebot_plugin_alconna/uniseg/adapters/yunhu/builder.py index b25f499..17a8ad8 100644 --- a/src/nonebot_plugin_alconna/uniseg/adapters/yunhu/builder.py +++ b/src/nonebot_plugin_alconna/uniseg/adapters/yunhu/builder.py @@ -1,32 +1,22 @@ from typing import TYPE_CHECKING from nonebot.adapters import Bot, Event -from nonebot.adapters.yunhu.message import Video as VideoSegment -from nonebot.adapters.yunhu.message import Text as TextSegment -from nonebot.adapters.yunhu.message import Face as FaceSegment -from nonebot.adapters.yunhu.message import Buttons as ButtonsSegment -from nonebot.adapters.yunhu.message import Markdown as MarkdownSegment +from nonebot.adapters.yunhu.event import MessageEvent from nonebot.adapters.yunhu.message import At as AtSegment -from nonebot.adapters.yunhu.message import Image as ImageSegment -from nonebot.adapters.yunhu.message import Html as HtmlSegment +from nonebot.adapters.yunhu.message import Buttons as ButtonsSegment +from nonebot.adapters.yunhu.message import Face as FaceSegment from nonebot.adapters.yunhu.message import File as FileSegment +from nonebot.adapters.yunhu.message import Html as HtmlSegment +from nonebot.adapters.yunhu.message import Image as ImageSegment +from nonebot.adapters.yunhu.message import Markdown as MarkdownSegment from nonebot.adapters.yunhu.message import Message -from nonebot.adapters.yunhu.event import MessageEvent +from nonebot.adapters.yunhu.message import Text as TextSegment +from nonebot.adapters.yunhu.message import Video as VideoSegment from nonebot.adapters.yunhu.models import Reply as ReplySegement from nonebot_plugin_alconna.uniseg.builder import MessageBuilder, build from nonebot_plugin_alconna.uniseg.constraint import SupportAdapter -from nonebot_plugin_alconna.uniseg.segment import ( - At, - Button, - Emoji, - File, - Image, - Keyboard, - Reply, - Text, - Video, -) +from nonebot_plugin_alconna.uniseg.segment import At, Button, Emoji, File, Image, Keyboard, Reply, Text, Video class YunHuMessageBuilder(MessageBuilder): diff --git a/src/nonebot_plugin_alconna/uniseg/adapters/yunhu/exporter.py b/src/nonebot_plugin_alconna/uniseg/adapters/yunhu/exporter.py index 6c6ec92..5caa758 100644 --- a/src/nonebot_plugin_alconna/uniseg/adapters/yunhu/exporter.py +++ b/src/nonebot_plugin_alconna/uniseg/adapters/yunhu/exporter.py @@ -3,29 +3,15 @@ from nonebot.adapters import Bot, Event from nonebot.adapters.yunhu.bot import Bot as YunHuBot -from nonebot.adapters.yunhu.event import MessageEvent -from nonebot.adapters.yunhu.event import NoticeEvent from nonebot.adapters.yunhu.event import Event as YunHuEvent -from nonebot.adapters.yunhu.message import Message -from nonebot.adapters.yunhu.message import MessageSegment -from nonebot.adapters.yunhu.models import BaseNotice -from nonebot.adapters.yunhu.models import ButtonBody -from nonebot.adapters.yunhu.models import SendMsgResponse +from nonebot.adapters.yunhu.event import MessageEvent, NoticeEvent +from nonebot.adapters.yunhu.message import Message, MessageSegment +from nonebot.adapters.yunhu.models import BaseNotice, ButtonBody, SendMsgResponse from tarina import lang from nonebot_plugin_alconna.uniseg.constraint import SupportScope from nonebot_plugin_alconna.uniseg.exporter import MessageExporter, SerializeFailed, SupportAdapter, Target, export -from nonebot_plugin_alconna.uniseg.segment import ( - At, - Button, - Emoji, - File, - Image, - Keyboard, - Reply, - Text, - Video, -) +from nonebot_plugin_alconna.uniseg.segment import At, Button, Emoji, File, Image, Keyboard, Reply, Text, Video class YunHuMessageExporter(MessageExporter[Message]):