Skip to content

Commit c7c652f

Browse files
committed
✨ Image.sticker
1 parent 03de882 commit c7c652f

File tree

17 files changed

+116
-50
lines changed

17 files changed

+116
-50
lines changed

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

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,19 @@
1919

2020
from nonebot_plugin_alconna.uniseg.builder import MessageBuilder, build
2121
from nonebot_plugin_alconna.uniseg.constraint import SupportAdapter
22-
from nonebot_plugin_alconna.uniseg.segment import At, AtAll, Audio, Button, File, Image, Keyboard, Other, Reply, Video
22+
from nonebot_plugin_alconna.uniseg.segment import (
23+
At,
24+
AtAll,
25+
Audio,
26+
Button,
27+
Emoji,
28+
File,
29+
Image,
30+
Keyboard,
31+
Other,
32+
Reply,
33+
Video,
34+
)
2335

2436

2537
class DiscordMessageBuilder(MessageBuilder):
@@ -46,12 +58,14 @@ def mention_everyone(self, seg: MentionEveryoneSegment):
4658
@build("custom_emoji")
4759
def custom_emoji(self, seg: CustomEmojiSegment):
4860
url = f"https://cdn.discordapp.com/emojis/{seg.data['id']}.{'gif' if seg.data['animated'] else 'png'}"
49-
return Image(url=url, id=url, name=f"{seg.data['name']}.{'gif' if seg.data['animated'] else 'png'}")
61+
return Emoji(
62+
id=str(seg.data["id"]), name=f"{seg.data['name']}.{'gif' if seg.data['animated'] else 'png'}", url=url
63+
)
5064

5165
@build("sticker")
5266
def sticker(self, seg: StickerSegment):
5367
url = f"https://cdn.discordapp.com/stickers/{seg.data['id']}.gif"
54-
return Image(url=url, id=url, name=f"{seg.data['id']}.gif")
68+
return Image(url=url, id=str(seg.data["id"]), name=f"{seg.data['id']}.gif", sticker=True)
5569

5670
@build("attachment")
5771
def attachment(self, seg: AttachmentSegment):

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,12 +100,13 @@ async def at_all(self, seg: AtAll, bot: Union[Bot, None]) -> "MessageSegment":
100100

101101
@export
102102
async def emoji(self, seg: Emoji, bot: Union[Bot, None]) -> "MessageSegment":
103-
return MessageSegment.custom_emoji(seg.name or "", seg.id)
103+
return MessageSegment.custom_emoji(seg.name or "", seg.id, bool(seg.name and seg.name.endswith("gif")))
104104

105105
@export
106106
async def media(self, seg: Union[Image, Voice, Video, Audio, File], bot: Union[Bot, None]) -> "MessageSegment":
107107
name = seg.__class__.__name__.lower()
108-
108+
if isinstance(seg, Image) and seg.sticker and seg.id:
109+
return MessageSegment.sticker(int(seg.id))
109110
if seg.raw and (seg.id or seg.name):
110111
content = seg.raw_bytes
111112
return MessageSegment.attachment(seg.id or seg.name, content=content)

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,19 +10,24 @@
1010
FileSegment,
1111
PictureSegment,
1212
ReferenceSegment,
13+
ShareSegment,
1314
VideoSegment,
1415
)
1516

1617
from nonebot_plugin_alconna.uniseg.builder import MessageBuilder, build
1718
from nonebot_plugin_alconna.uniseg.constraint import SupportAdapter
18-
from nonebot_plugin_alconna.uniseg.segment import At, AtAll, File, Image, Reply, Video
19+
from nonebot_plugin_alconna.uniseg.segment import At, AtAll, File, Image, Reply, Text, Video
1920

2021

2122
class DodoMessageBuilder(MessageBuilder):
2223
@classmethod
2324
def get_adapter(cls) -> SupportAdapter:
2425
return SupportAdapter.dodo
2526

27+
@build("share")
28+
def share(self, seg: ShareSegment):
29+
return Text(seg.data["share"].jump_url).link()
30+
2631
@build("at_user")
2732
def at_user(self, seg: AtUserSegment):
2833
return At("user", seg.data["dodo_id"])

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
from nonebot.adapters.feishu.message import Image as ImageSegment
1010
from nonebot.adapters.feishu.message import Media as MediaSegment
1111
from nonebot.adapters.feishu.message import Post as PostSegment
12+
from nonebot.adapters.feishu.message import Sticker as StickerSegment
1213

1314
from nonebot_plugin_alconna.uniseg.builder import MessageBuilder, build
1415
from nonebot_plugin_alconna.uniseg.constraint import SupportAdapter
@@ -30,6 +31,10 @@ def at(self, seg: AtSegment):
3031
def image(self, seg: ImageSegment):
3132
return Image(id=seg.data["image_key"])
3233

34+
@build("sticker")
35+
def sticker(self, seg: StickerSegment):
36+
return Image(id=seg.data["file_key"], sticker=True)
37+
3338
@build("media")
3439
def media(self, seg: MediaSegment):
3540
return Video(id=seg.data["file_key"], name=seg.data["file_name"] or "video.mp4")

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,8 @@ async def at_all(self, seg: AtAll, bot: Union[Bot, None]) -> "MessageSegment":
7070
@export
7171
async def image(self, seg: Image, bot: Union[Bot, None]) -> "MessageSegment":
7272
if seg.id:
73+
if seg.sticker:
74+
return MessageSegment.sticker(seg.id)
7375
return MessageSegment.image(seg.id)
7476
if not bot:
7577
raise NotImplementedError

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ def face(self, seg: FaceSegment):
5151

5252
@build("image")
5353
def image(self, seg: ImageSegment):
54-
return Image(url=seg.data.get("file_url"), id=seg.data.get("file_md5"))
54+
return Image(url=seg.data.get("file_url"), id=seg.data.get("file_md5"), sticker=seg.data.get("sub_type") == 1)
5555

5656
@build("video")
5757
def video(self, seg: VideoSegment):

src/nonebot_plugin_alconna/uniseg/adapters/milky/builder.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,15 +52,17 @@ def face(self, seg: FaceSegment):
5252
@build("image")
5353
def image(self, seg: ImageSegment):
5454
if "resource_id" in seg.data:
55-
return Image(id=seg.data["resource_id"], url=seg.data.get("temp_url"))
55+
return Image(
56+
id=seg.data["resource_id"], url=seg.data.get("temp_url"), sticker=seg.data["sub_type"] == "sticker"
57+
)
5658
uri = seg.data["uri"]
5759
if uri.startswith("http"):
58-
return Image(url=uri)
60+
return Image(url=uri, sticker=seg.data["sub_type"] == "sticker")
5961
if uri.startswith("file://"):
60-
return Image(path=uri[7:])
62+
return Image(path=uri[7:], sticker=seg.data["sub_type"] == "sticker")
6163
if uri.startswith("base64://"):
6264
b64 = uri[9:]
63-
return Image(raw=b64decode(b64))
65+
return Image(raw=b64decode(b64), sticker=seg.data["sub_type"] == "sticker")
6466

6567
@build("video")
6668
def video(self, seg: VideoSegment):

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

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -99,15 +99,19 @@ async def media(self, seg: Union[Image, Voice, Audio], bot: Union[Bot, None]) ->
9999
"audio": MessageSegment.record,
100100
}[name]
101101
if seg.raw:
102-
return method(raw=seg.raw)
103-
if seg.path:
104-
return method(path=Path(seg.path))
105-
if seg.url:
106-
return method(seg.url)
107-
if seg.id:
108-
url = await bot.get_resource_temp_url(seg.id)
109-
return method(url)
110-
raise SerializeFailed(lang.require("nbp-uniseg", "invalid_segment").format(type=name, seg=seg))
102+
ans = method(raw=seg.raw)
103+
elif seg.path:
104+
ans = method(path=Path(seg.path))
105+
elif seg.url:
106+
ans = method(seg.url)
107+
elif seg.id:
108+
url = await bot.get_resource_temp_url(resource_id=seg.id)
109+
ans = method(url)
110+
else:
111+
raise SerializeFailed(lang.require("nbp-uniseg", "invalid_segment").format(type=name, seg=seg))
112+
if isinstance(seg, Image) and seg.sticker:
113+
ans.data["sub_type"] = "sticker"
114+
return ans
111115

112116
@export
113117
async def video(self, seg: Video, bot: Union[Bot, None]) -> "MessageSegment":
@@ -117,7 +121,7 @@ async def video(self, seg: Video, bot: Union[Bot, None]) -> "MessageSegment":
117121
if seg.thumbnail.url:
118122
thumb_url = seg.thumbnail.url
119123
elif seg.thumbnail.id:
120-
thumb_url = await bot.get_resource_temp_url(seg.thumbnail.id)
124+
thumb_url = await bot.get_resource_temp_url(resource_id=seg.thumbnail.id)
121125
elif seg.__class__.to_url and seg.thumbnail.raw:
122126
thumb_url = await seg.__class__.to_url(
123127
seg.thumbnail.raw,
@@ -137,7 +141,7 @@ async def video(self, seg: Video, bot: Union[Bot, None]) -> "MessageSegment":
137141
if seg.url:
138142
return MessageSegment.video(seg.url, thumb_url=thumb_url)
139143
if seg.id:
140-
url = await bot.get_resource_temp_url(seg.id)
144+
url = await bot.get_resource_temp_url(resource_id=seg.id)
141145
return MessageSegment.video(url, thumb_url=thumb_url)
142146
raise SerializeFailed(lang.require("nbp-uniseg", "invalid_segment").format(type="video", seg=seg))
143147

src/nonebot_plugin_alconna/uniseg/adapters/onebot11/builder.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@ def face(self, seg: MessageSegment):
2828

2929
@build("image")
3030
def image(self, seg: MessageSegment):
31-
return Image(url=seg.data.get("url") or seg.data.get("file"), id=seg.data["file"])
31+
is_sticker = seg.data.get("subType") == 1 or seg.data.get("sub_type") == 1
32+
return Image(url=seg.data.get("url") or seg.data.get("file"), id=seg.data["file"], sticker=is_sticker)
3233

3334
@build("video")
3435
def video(self, seg: MessageSegment):

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

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -84,12 +84,23 @@ async def media(self, seg: Union[Image, Voice, Video, Audio], bot: Union[Bot, No
8484
"audio": MessageSegment.record,
8585
}[name]
8686
if seg.raw:
87-
return method(seg.raw_bytes)
88-
if seg.path:
89-
return method(Path(seg.path))
90-
if seg.url:
91-
return method(seg.url)
92-
raise SerializeFailed(lang.require("nbp-uniseg", "invalid_segment").format(type=name, seg=seg))
87+
ans = method(seg.raw_bytes)
88+
elif seg.path:
89+
ans = method(Path(seg.path))
90+
elif seg.url:
91+
ans = method(seg.url)
92+
else:
93+
raise SerializeFailed(lang.require("nbp-uniseg", "invalid_segment").format(type=name, seg=seg))
94+
if isinstance(seg, Image) and seg.sticker:
95+
# 傻逼玩意,谁爱用用去
96+
# assert isinstance(bot, OnebotBot)
97+
# info = await bot.get_version_info()
98+
# app_name = info["app_name"]
99+
# if app_name == "NapCat.Onebot":
100+
# ans.data["sub_type"] = 1
101+
# else:
102+
ans.data["subType"] = 1
103+
return ans
93104

94105
@export
95106
async def file(self, seg: File, bot: Union[Bot, None]) -> "MessageSegment":

0 commit comments

Comments
 (0)