Skip to content

Commit 1fb2e30

Browse files
committed
✨ respect Media.name
resolve #95
1 parent 4980b54 commit 1fb2e30

File tree

20 files changed

+125
-41
lines changed

20 files changed

+125
-41
lines changed

src/nonebot_plugin_alconna/builtins/extensions/markdown.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
class MarkdownOutputExtension(Extension):
1414
"""
15-
用于将 Alconna 的自动输出转+换为 Markdown 格式
15+
用于将 Alconna 的自动输出转换为 Markdown 格式
1616
1717
Example:
1818
>>> from nonebot_plugin_alconna import MsgId, on_alconna

src/nonebot_plugin_alconna/builtins/plugins/switch/__init__.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,11 @@
3939
unmatch_tips=lambda x: f"预期输入为某个命令的id或者名称,而不是 {x}\n例如:/enable 0",
4040
),
4141
],
42+
Option(
43+
"--page",
44+
Args["index", int],
45+
help_text="查看指定页数的命令",
46+
),
4247
Option("--hide", alias=["-H", "隐藏"], help_text="是否列出隐藏命令", action=store_true, default=False),
4348
meta=CommandMeta(
4449
description="启用某个命令",
@@ -61,7 +66,7 @@
6166
Option(
6267
"--page",
6368
Args["index", int],
64-
help_text="查看指定页数的命令帮助",
69+
help_text="查看指定页数的命令",
6570
),
6671
Option("--hide", alias=["-H", "隐藏"], help_text="是否列出隐藏命令", action=store_true, default=False),
6772
meta=CommandMeta(

src/nonebot_plugin_alconna/uniseg/adapters/discord/exporter.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,8 @@ async def media(self, seg: Union[Image, Voice, Video, Audio, File], bot: Union[B
110110
return MessageSegment.attachment(seg.id or seg.name, content=content)
111111
if seg.path:
112112
path = Path(seg.path)
113-
return MessageSegment.attachment(path.name, content=path.read_bytes())
113+
filename = path.name if seg.name == seg.__default_name__ else seg.name
114+
return MessageSegment.attachment(filename, content=path.read_bytes())
114115
if bot and seg.url and (seg.id or seg.name):
115116
resp = await bot.adapter.request(Request("GET", seg.url))
116117
return MessageSegment.attachment(

src/nonebot_plugin_alconna/uniseg/adapters/dodo/exporter.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,16 +66,18 @@ async def at(self, seg: At, bot: Union[Bot, None]) -> "MessageSegment":
6666
async def image(self, seg: Image, bot: Union[Bot, None]) -> "MessageSegment":
6767
if TYPE_CHECKING:
6868
assert isinstance(bot, DoDoBot)
69+
filename = None
6970
if seg.raw:
7071
data = seg.raw_bytes
7172
elif seg.path:
7273
data = Path(seg.path)
74+
filename = data.name if seg.name == seg.__default_name__ else seg.name
7375
elif seg.url:
7476
resp = await bot.adapter.request(Request("GET", seg.url))
7577
data = cast(bytes, resp.content)
7678
else:
7779
raise SerializeFailed(lang.require("nbp-uniseg", "invalid_segment").format(type="image", seg=seg))
78-
res = await bot.set_resouce_picture_upload(file=data)
80+
res = await bot.set_resouce_picture_upload(file=data, file_name=filename)
7981

8082
return MessageSegment.picture(res.url, res.width, res.height)
8183

src/nonebot_plugin_alconna/uniseg/adapters/feishu/exporter.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -96,16 +96,18 @@ async def audio(self, seg: Union[Voice, Audio], bot: Union[Bot, None]) -> "Messa
9696
return MessageSegment.audio(seg.id, int(seg.duration) if seg.duration else None)
9797
if not bot:
9898
raise NotImplementedError
99+
filename = seg.name
99100
if seg.url:
100101
resp = await bot.adapter.request(Request("GET", seg.url))
101102
raw = resp.content
102103
elif seg.path:
103104
raw = Path(seg.path).read_bytes()
105+
filename = Path(seg.path).name if seg.name == seg.__default_name__ else seg.name
104106
elif seg.raw:
105107
raw = seg.raw_bytes
106108
else:
107109
raise SerializeFailed(lang.require("nbp-uniseg", "invalid_segment").format(type=name, seg=seg))
108-
data = {"file_type": "stream", "file_name": seg.name}
110+
data = {"file_type": "stream", "file_name": filename}
109111
files = {"file": ("file", raw)}
110112
params = {"method": "POST", "data": data, "files": files}
111113
result = await bot.call_api("im/v1/files", **params)
@@ -118,16 +120,18 @@ async def file(self, seg: File, bot: Union[Bot, None]) -> "MessageSegment":
118120
return MessageSegment.file(seg.id, seg.name)
119121
if not bot:
120122
raise NotImplementedError
123+
filename = seg.name
121124
if seg.url:
122125
resp = await bot.adapter.request(Request("GET", seg.url))
123126
raw = resp.content
124127
elif seg.path:
125128
raw = Path(seg.path).read_bytes()
129+
filename = Path(seg.path).name if seg.name == seg.__default_name__ else seg.name
126130
elif seg.raw:
127131
raw = seg.raw_bytes
128132
else:
129133
raise SerializeFailed(lang.require("nbp-uniseg", "invalid_segment").format(type="file", seg=seg))
130-
data = {"file_type": "stream", "file_name": seg.name}
134+
data = {"file_type": "stream", "file_name": filename}
131135
files = {"file": ("file", raw)}
132136
params = {"method": "POST", "data": data, "files": files}
133137
result = await bot.call_api("im/v1/files", **params)
@@ -140,16 +144,18 @@ async def video(self, seg: Video, bot: Union[Bot, None]) -> "MessageSegment":
140144
return MessageSegment.sticker(seg.id)
141145
if not bot:
142146
raise NotImplementedError
147+
filename = seg.name
143148
if seg.url:
144149
resp = await bot.adapter.request(Request("GET", seg.url))
145150
raw = resp.content
146151
elif seg.path:
147152
raw = Path(seg.path).read_bytes()
153+
filename = Path(seg.path).name if seg.name == seg.__default_name__ else seg.name
148154
elif seg.raw:
149155
raw = seg.raw_bytes
150156
else:
151157
raise SerializeFailed(lang.require("nbp-uniseg", "invalid_segment").format(type="video", seg=seg))
152-
data = {"file_type": "stream", "file_name": seg.name}
158+
data = {"file_type": "stream", "file_name": filename}
153159
files = {"file": ("file", raw)}
154160
params = {"method": "POST", "data": data, "files": files}
155161
result = await bot.call_api("im/v1/files", **params)

src/nonebot_plugin_alconna/uniseg/adapters/gewechat/exporter.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import asyncio
2+
from pathlib import Path
23
from typing import Any, Union, cast
34

45
from tarina import lang
@@ -138,7 +139,7 @@ async def file(self, seg: File, bot: Union[Bot, None]) -> "MessageSegment":
138139
if seg.__class__.to_url and seg.path:
139140
return MessageSegment.file(
140141
await seg.__class__.to_url(seg.path, bot, None if seg.name == seg.__default_name__ else seg.name),
141-
seg.name,
142+
Path(seg.path).name if seg.name == seg.__default_name__ else seg.name,
142143
)
143144
raise SerializeFailed(lang.require("nbp-uniseg", "invalid_segment").format(type="file", seg=seg))
144145

src/nonebot_plugin_alconna/uniseg/adapters/heybox/exporter.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from pathlib import Path
12
from typing import TYPE_CHECKING, Union
23

34
from tarina import lang
@@ -52,6 +53,14 @@ async def at(self, seg: At, bot: Union[Bot, None]) -> "MessageSegment":
5253
async def image(self, seg: Image, bot: Union[Bot, None]) -> "MessageSegment":
5354
if seg.url:
5455
return MessageSegment.image(url=seg.url, width=seg.width or 0, height=seg.height or 0)
56+
if seg.path:
57+
path = Path(seg.path)
58+
return MessageSegment.local_image(
59+
path.read_bytes(),
60+
width=seg.width or 0,
61+
height=seg.height or 0,
62+
filename=path.name if seg.name == seg.__default_name__ else seg.name,
63+
)
5564
if seg.raw:
5665
return MessageSegment.local_image(
5766
seg.raw_bytes, width=seg.width or 0, height=seg.height or 0, filename=seg.name

src/nonebot_plugin_alconna/uniseg/adapters/kook/exporter.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ async def media(self, seg: Union[Image, Voice, Video, Audio, File], bot: Union[B
8383
if TYPE_CHECKING:
8484
assert isinstance(bot, KBot)
8585
name = seg.__class__.__name__.lower()
86+
title = None if seg.name == seg.__default_name__ else seg.name
8687
method = {
8788
"image": MessageSegment.image,
8889
"voice": MessageSegment.audio,
@@ -91,14 +92,14 @@ async def media(self, seg: Union[Image, Voice, Video, Audio, File], bot: Union[B
9192
"file": MessageSegment.file,
9293
}[name]
9394
if seg.id or seg.url:
94-
return method(seg.id or seg.url)
95+
return method(seg.id or seg.url, title)
9596
if seg.__class__.to_url and seg.raw:
9697
return method(
97-
await seg.__class__.to_url(seg.raw, bot, None if seg.name == seg.__default_name__ else seg.name)
98+
await seg.__class__.to_url(seg.raw, bot, None if seg.name == seg.__default_name__ else seg.name), title
9899
)
99100
if seg.__class__.to_url and seg.path:
100101
return method(
101-
await seg.__class__.to_url(seg.path, bot, None if seg.name == seg.__default_name__ else seg.name)
102+
await seg.__class__.to_url(seg.path, bot, None if seg.name == seg.__default_name__ else seg.name), title
102103
)
103104
local_method = {
104105
"image": MessageSegment.local_image,
@@ -108,9 +109,9 @@ async def media(self, seg: Union[Image, Voice, Video, Audio, File], bot: Union[B
108109
"file": MessageSegment.local_file,
109110
}[name]
110111
if seg.raw:
111-
return local_method(seg.raw_bytes)
112+
return local_method(seg.raw_bytes, title)
112113
if seg.path:
113-
return local_method(seg.path)
114+
return local_method(seg.path, title)
114115
raise SerializeFailed(lang.require("nbp-uniseg", "invalid_segment").format(type=name, seg=seg))
115116

116117
@export

src/nonebot_plugin_alconna/uniseg/adapters/kritor/exporter.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
from nonebot_plugin_alconna.uniseg.exporter import Target, SupportAdapter, MessageExporter, SerializeFailed, export
3535
from nonebot_plugin_alconna.uniseg.segment import (
3636
At,
37+
File,
3738
Text,
3839
AtAll,
3940
Audio,
@@ -165,6 +166,15 @@ async def media(self, seg: Union[Image, Voice, Video, Audio], bot: Union[Bot, No
165166
return method(url=seg.url)
166167
raise SerializeFailed(lang.require("nbp-uniseg", "invalid_segment").format(type=name, seg=seg))
167168

169+
@export
170+
async def file(self, seg: File, bot: Union[Bot, None]) -> "MessageSegment":
171+
if seg.path:
172+
return MessageSegment(
173+
"$kritor:file",
174+
{"file": seg.path, "name": Path(seg.path).name if seg.name == seg.__default_name__ else seg.name},
175+
)
176+
raise SerializeFailed(lang.require("nbp-uniseg", "invalid_segment").format(type="file", seg=seg))
177+
168178
@export
169179
async def hyper(self, seg: Hyper, bot: Union[Bot, None]) -> "MessageSegment":
170180
assert seg.raw, lang.require("nbp-uniseg", "invalid_segment").format(type="hyper", seg=seg)
@@ -272,6 +282,18 @@ async def send_to(self, target: Union[Target, Event], bot: Bot, message: Message
272282
else:
273283
node.message.group.group_id = contact.id
274284
return await bot.send_forward_message(contact, seg.data["nodes"])
285+
286+
if msg := message.include("$kritor:file"):
287+
if _target.private:
288+
uid = (await bot.get_uid_by_uin(target_uins=[int(_target.id)]))[int(_target.id)]
289+
return await bot.upload_private_file(
290+
target_uin=int(_target.id),
291+
target_uid=uid,
292+
path=msg[0].data["file"],
293+
name=msg[0].data["name"],
294+
)
295+
return await bot.upload_group_file(group=_target.id, path=msg[0].data["file"], name=msg[0].data["name"])
296+
275297
kb = None
276298
if message.has("$kritor:button"):
277299
buttons = [seg.data["button"] for seg in message.get("$kritor:button")]

src/nonebot_plugin_alconna/uniseg/adapters/mail/exporter.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,8 @@ async def media(self, seg: Union[Image, Voice, Video, Audio, File], bot: Union[B
6262
return MessageSegment.attachment(seg.raw, seg.id or seg.name, seg.mimetype)
6363
if seg.path:
6464
path = Path(seg.path)
65-
return MessageSegment.attachment(path, path.name)
65+
filename = path.name if seg.name == seg.__default_name__ else seg.name
66+
return MessageSegment.attachment(path, filename)
6667
if bot and seg.url:
6768
if name == "image":
6869
return MessageSegment.html(f'<img src="{seg.url}" />')
@@ -71,10 +72,8 @@ async def media(self, seg: Union[Image, Voice, Video, Audio, File], bot: Union[B
7172
if name in ["audio", "voice"]:
7273
return MessageSegment.html(f'<audio src="{seg.url}" controls />')
7374
resp = await bot.adapter.request(Request("GET", seg.url))
74-
return MessageSegment.attachment(
75-
resp.content, # type: ignore
76-
seg.id or seg.name or seg.url.split("/")[-1],
77-
)
75+
name = seg.id or (seg.url.split("/")[-1] if seg.name == seg.__default_name__ else seg.name)
76+
return MessageSegment.attachment(resp.content, name) # type: ignore
7877
raise SerializeFailed(lang.require("nbp-uniseg", "invalid_segment").format(type=name, seg=seg))
7978

8079
@export

0 commit comments

Comments
 (0)