Skip to content

Commit 69835e0

Browse files
committed
recall & edit on UniMessage
1 parent 2815051 commit 69835e0

File tree

18 files changed

+360
-242
lines changed

18 files changed

+360
-242
lines changed

README.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,17 @@ async def _():
131131
| 按钮 Button | 🚫 | 🚫 | ⬆️ | 🚫 | 🚫 || 🚫 | 🚫 | 🚫 | 🚫 | 🚫 | ⬆️ || 🚫 || 🚫 || 🚫 | 🚫 | 🚫 | 🚫 | 🚫 |
132132
| 其余 Other |||||||||||||||||||||||
133133

134+
#### 消息 reaction
135+
136+
- onebot11 (🚧)
137+
- qq
138+
- dodo
139+
- discord
140+
- feishu
141+
- kritor (react)
142+
- kook
143+
- satori
144+
- telegram
134145

135146
## 配置项
136147

src/nonebot_plugin_alconna/uniseg/adapters/__init__.py

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,38 @@
11
import os
22
import importlib
3-
from typing import cast
43
from pathlib import Path
54
from warnings import warn
65
from contextlib import suppress
6+
from typing import TYPE_CHECKING, cast
77

88
from nonebot import get_adapters
99

10-
from ..loader import BaseLoader
11-
from ..target import TargetFetcher
12-
from ..builder import MessageBuilder
13-
from ..exporter import MessageExporter
1410
from ..constraint import SupportAdapter
1511

12+
if TYPE_CHECKING:
13+
from ..loader import BaseLoader
14+
from ..target import TargetFetcher
15+
from ..builder import MessageBuilder
16+
from ..exporter import MessageExporter
17+
1618
root = Path(__file__).parent
17-
loaders: dict[str, BaseLoader] = {}
19+
loaders: dict[str, "BaseLoader"] = {}
1820
_adapters = [path.stem for path in root.iterdir() if path.is_dir() and not path.stem.startswith("_")]
1921
for name in _adapters:
2022
try:
2123
module = importlib.import_module(f".{name}", __package__)
22-
loader = cast(BaseLoader, module.Loader())
24+
loader = cast("BaseLoader", module.Loader())
2325
loaders[loader.get_adapter().value] = loader
2426
except Exception as e: # noqa: PERF203
2527
warn(f"Failed to import uniseg adapter {name}: {e}", RuntimeWarning, 15)
2628

27-
EXPORTER_MAPPING: dict[str, MessageExporter] = {
29+
EXPORTER_MAPPING: dict[str, "MessageExporter"] = {
2830
SupportAdapter.nonebug.value: loaders[SupportAdapter.nonebug.value].get_exporter()
2931
}
30-
BUILDER_MAPPING: dict[str, MessageBuilder] = {
32+
BUILDER_MAPPING: dict[str, "MessageBuilder"] = {
3133
SupportAdapter.nonebug.value: loaders[SupportAdapter.nonebug.value].get_builder()
3234
}
33-
FETCHER_MAPPING: dict[str, TargetFetcher] = {}
35+
FETCHER_MAPPING: dict[str, "TargetFetcher"] = {}
3436
adapters = {}
3537
try:
3638
adapters = get_adapters()

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

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
from pathlib import Path
2-
from typing import TYPE_CHECKING, Any, Union, cast
2+
from typing import TYPE_CHECKING, Any, Union, Sequence, cast
33

44
from tarina import lang
55
from nonebot.adapters import Bot, Event
66
from nonebot.internal.driver import Request
7+
from nonebot.adapters.discord.api import SnowflakeType
78
from nonebot.adapters.discord.bot import Bot as DiscordBot
89
from nonebot.adapters.discord.api.model import Button as ButtonModel
910
from nonebot.adapters.discord.message import Message, MessageSegment, parse_message
@@ -25,6 +26,7 @@
2526
Video,
2627
Voice,
2728
Button,
29+
Segment,
2830
Keyboard,
2931
)
3032

@@ -177,16 +179,21 @@ async def send_to(self, target: Union[Target, Event], bot: Bot, message: Message
177179
return await bot.send_to(channel_id=int(target.id), message=message, **kwargs)
178180

179181
async def recall(self, mid: Any, bot: Bot, context: Union[Target, Event]):
182+
if isinstance(mid, (str, SnowflakeType)):
183+
assert isinstance(context, MessageEvent)
184+
return await bot.delete_message(channel_id=context.channel_id, message_id=int(mid))
180185
_mid: MessageGet = cast(MessageGet, mid)
181186
assert isinstance(bot, DiscordBot)
182187
return await bot.delete_message(channel_id=mid.channel_id, message_id=_mid.id)
183188

184-
async def edit(self, new: Message, mid: Any, bot: Bot, context: Union[Target, Event]):
189+
async def edit(self, new: Sequence[Segment], mid: Any, bot: Bot, context: Union[Target, Event]):
185190
_mid: MessageGet = cast(MessageGet, mid)
186191
assert isinstance(bot, DiscordBot)
187-
if TYPE_CHECKING:
188-
assert isinstance(new, self.get_message_type())
189-
return await bot.edit_message(channel_id=mid.channel_id, message_id=_mid.id, **parse_message(new))
192+
new_msg = await self.export(new, bot, True)
193+
if isinstance(mid, (str, SnowflakeType)):
194+
assert isinstance(context, MessageEvent)
195+
return await bot.edit_message(channel_id=context.channel_id, message_id=int(mid), **parse_message(new_msg))
196+
return await bot.edit_message(channel_id=mid.channel_id, message_id=_mid.id, **parse_message(new_msg))
190197

191198
def get_reply(self, mid: Any):
192199
_mid: MessageGet = cast(MessageGet, mid)

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

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from pathlib import Path
2-
from typing import TYPE_CHECKING, Any, Union, cast
2+
from typing import TYPE_CHECKING, Any, Union, Sequence, cast
33

44
from tarina import lang
55
from nonebot.drivers import Request
@@ -10,7 +10,7 @@
1010
from nonebot.adapters.dodo.message import Message, MessageSegment
1111

1212
from nonebot_plugin_alconna.uniseg.constraint import SupportScope
13-
from nonebot_plugin_alconna.uniseg.segment import At, Text, Image, Reply, Video
13+
from nonebot_plugin_alconna.uniseg.segment import At, Text, Image, Reply, Video, Segment
1414
from nonebot_plugin_alconna.uniseg.exporter import Target, SupportAdapter, MessageExporter, SerializeFailed, export
1515

1616

@@ -108,14 +108,13 @@ async def recall(self, mid: Any, bot: Bot, context: Union[Target, Event]):
108108
return await bot.set_channel_message_withdraw(message_id=mid)
109109
return None
110110

111-
async def edit(self, new: Message, mid: Any, bot: Bot, context: Union[Target, Event]):
111+
async def edit(self, new: Sequence[Segment], mid: Any, bot: Bot, context: Union[Target, Event]):
112112
assert isinstance(bot, DoDoBot)
113-
if TYPE_CHECKING:
114-
assert isinstance(new, Message)
113+
new_msg = await self.export(new, bot, True)
115114
if isinstance(context, Target) and not context.private:
116-
return await bot.set_channel_message_edit(message_id=mid, message_body=new.to_message_body()[0])
115+
return await bot.set_channel_message_edit(message_id=mid, message_body=new_msg.to_message_body()[0])
117116
if hasattr(context, "channel_id"):
118-
return await bot.set_channel_message_edit(message_id=mid, message_body=new.to_message_body()[0])
117+
return await bot.set_channel_message_edit(message_id=mid, message_body=new_msg.to_message_body()[0])
119118
return None
120119

121120
def get_reply(self, mid: Any):

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

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from pathlib import Path
2-
from typing import TYPE_CHECKING, Any, Union
2+
from typing import TYPE_CHECKING, Any, Union, Sequence
33

44
from tarina import lang
55
from nonebot.adapters import Bot, Event
@@ -9,8 +9,8 @@
99
from nonebot.adapters.feishu.event import MessageEvent, GroupMessageEvent, PrivateMessageEvent
1010

1111
from nonebot_plugin_alconna.uniseg.constraint import SupportScope
12-
from nonebot_plugin_alconna.uniseg.segment import At, File, Text, AtAll, Audio, Image, Reply, Video, Voice
1312
from nonebot_plugin_alconna.uniseg.exporter import Target, SupportAdapter, MessageExporter, SerializeFailed, export
13+
from nonebot_plugin_alconna.uniseg.segment import At, File, Text, AtAll, Audio, Image, Reply, Video, Voice, Segment
1414

1515

1616
class FeishuMessageExporter(MessageExporter[Message]):
@@ -174,15 +174,15 @@ async def recall(self, mid: Any, bot: Bot, context: Union[Target, Event]):
174174
assert isinstance(bot, FeishuBot)
175175

176176
params = {"method": "DELETE"}
177-
return await bot.call_api(f"im/v1/messages/{mid['message_id']}", **params)
177+
message_id = mid if isinstance(mid, str) else mid["message_id"]
178+
return await bot.call_api(f"im/v1/messages/{message_id}", **params)
178179

179-
async def edit(self, new: Message, mid: Any, bot: Bot, context: Union[Target, Event]):
180+
async def edit(self, new: Sequence[Segment], mid: Any, bot: Bot, context: Union[Target, Event]):
180181
assert isinstance(bot, FeishuBot)
181-
if TYPE_CHECKING:
182-
assert isinstance(new, self.get_message_type())
183-
184-
msg_type, content = new.serialize()
185-
return await bot.edit_msg(mid["message_id"], content=content, msg_type=msg_type)
182+
new_msg = await self.export(new, bot, True)
183+
msg_type, content = new_msg.serialize()
184+
message_id = mid if isinstance(mid, str) else mid["message_id"]
185+
return await bot.edit_msg(message_id, content=content, msg_type=msg_type)
186186

187187
def get_reply(self, mid: Any):
188188
return Reply(mid["message_id"])

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

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,9 @@ async def send_to(self, target: Union[Target, Event], bot: Bot, message: "Messag
221221

222222
async def recall(self, mid: Any, bot: Bot, context: Union[Target, Event]):
223223
assert isinstance(bot, GeWeChatBot)
224-
mid = cast(postMessageResponse, mid)
225-
resp = mid.data
226-
await bot.revokeMsg(resp.toWxid, str(resp.msgId), str(resp.newMsgId), str(resp.createTime))
224+
if isinstance(mid, (str, int)) and isinstance(context, MessageEvent):
225+
await bot.revokeMsg(context.ToUserName, str(context.MsgId), str(context.NewMsgId), str(context.CreateTime))
226+
else:
227+
mid = cast(postMessageResponse, mid)
228+
resp = mid.data
229+
await bot.revokeMsg(resp.toWxid, str(resp.msgId), str(resp.newMsgId), str(resp.createTime))

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

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from typing import TYPE_CHECKING, Any, Union, cast
1+
from typing import TYPE_CHECKING, Any, Union, Sequence, cast
22

33
from tarina import lang
44
from nonebot.adapters import Bot, Event
@@ -9,7 +9,20 @@
99

1010
from nonebot_plugin_alconna.uniseg.constraint import SupportScope
1111
from nonebot_plugin_alconna.uniseg.exporter import Target, SupportAdapter, MessageExporter, SerializeFailed, export
12-
from nonebot_plugin_alconna.uniseg.segment import At, File, Text, AtAll, Audio, Emoji, Hyper, Image, Reply, Video, Voice
12+
from nonebot_plugin_alconna.uniseg.segment import (
13+
At,
14+
File,
15+
Text,
16+
AtAll,
17+
Audio,
18+
Emoji,
19+
Hyper,
20+
Image,
21+
Reply,
22+
Video,
23+
Voice,
24+
Segment,
25+
)
1326

1427

1528
class KookMessageExporter(MessageExporter["Message"]):
@@ -125,6 +138,11 @@ async def send_to(self, target: Union[Target, Event], bot: Bot, message: Message
125138
return await bot.send_msg(message_type="channel", channel_id=target.id, message=message, **kwargs)
126139

127140
async def recall(self, mid: Any, bot: Bot, context: Union[Target, Event]):
141+
if isinstance(mid, str):
142+
if isinstance(context, PrivateMessageEvent):
143+
await bot.directMessage_delete(msg_id=mid)
144+
else:
145+
await bot.message_delete(msg_id=mid)
128146
_mid: MessageCreateReturn = cast(MessageCreateReturn, mid)
129147

130148
assert _mid.msg_id
@@ -140,17 +158,19 @@ async def recall(self, mid: Any, bot: Bot, context: Union[Target, Event]):
140158
else:
141159
await bot.message_delete(msg_id=_mid.msg_id)
142160

143-
async def edit(self, new: Message, mid: Any, bot: Bot, context: Union[Target, Event]):
161+
async def edit(self, new: Sequence[Segment], mid: Any, bot: Bot, context: Union[Target, Event]):
144162
if TYPE_CHECKING:
145-
assert isinstance(new, self.get_message_type())
146163
assert isinstance(bot, KBot)
147164

148-
_mid: MessageCreateReturn = cast(MessageCreateReturn, mid)
149-
if not _mid.msg_id:
150-
return
151-
data = await MessageSerializer(new).serialize(bot=bot)
165+
data = await MessageSerializer(await self.export(new, bot, True)).serialize(bot=bot)
152166
data.pop("type", None)
153-
data["msg_id"] = _mid.msg_id
167+
if isinstance(mid, str):
168+
data["msg_id"] = mid
169+
else:
170+
_mid: MessageCreateReturn = cast(MessageCreateReturn, mid)
171+
if not _mid.msg_id:
172+
return
173+
data["msg_id"] = _mid.msg_id
154174
if isinstance(context, Target):
155175
if context.private:
156176
data.pop("quote", None)

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -309,8 +309,11 @@ async def send_to(self, target: Union[Target, Event], bot: Bot, message: Message
309309

310310
async def recall(self, mid: Any, bot: Bot, context: Union[Target, Event]):
311311
assert isinstance(bot, KritorBot)
312-
assert isinstance(mid, (SendMessageByResIdResponse, SendMessageResponse))
313-
await bot.recall_message(message_id=mid.message_id)
312+
if isinstance(mid, str):
313+
await bot.recall_message(message_id=mid)
314+
else:
315+
assert isinstance(mid, (SendMessageByResIdResponse, SendMessageResponse))
316+
await bot.recall_message(message_id=mid.message_id)
314317

315318
def get_reply(self, mid: Any):
316319
return Reply(str(mid["message_id"]))

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,12 @@ async def send_to(self, target: Union[Target, Event], bot: Bot, message: Message
187187

188188
async def recall(self, mid: Any, bot: Bot, context: Union[Target, Event]):
189189
assert isinstance(bot, OnebotBot)
190-
await bot.delete_msg(message_id=mid["message_id"])
190+
if isinstance(mid, dict) and "message_id" in mid:
191+
await bot.delete_msg(message_id=mid["message_id"])
192+
elif isinstance(mid, (str, int)):
193+
await bot.delete_msg(message_id=int(mid))
194+
elif not mid and isinstance(context, MessageEvent):
195+
await bot.delete_msg(message_id=context.message_id)
191196

192197
def get_reply(self, mid: Any):
193198
return Reply(str(mid["message_id"]))

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ async def send_to(self, target: Union[Target, Event], bot: Bot, message: Message
145145
async def recall(self, mid: Any, bot: Bot, context: Union[Target, Event]):
146146
assert isinstance(bot, OnebotBot)
147147

148-
await bot.delete_message(message_id=mid["message_id"])
148+
await bot.delete_message(message_id=mid["message_id"] if isinstance(mid, dict) else mid)
149149

150150
def get_reply(self, mid: Any):
151151
return Reply(mid["message_id"])

0 commit comments

Comments
 (0)