|
6 | 6 | from nonebot.adapters.milky.utils import to_uri |
7 | 7 | from nonebot.adapters.milky.bot import Bot as MilkyBot |
8 | 8 | from nonebot.adapters.milky.event import Event as MilkyEvent |
| 9 | +from nonebot.adapters.milky.model.api import MessageResponse |
9 | 10 | from nonebot.adapters.milky.message import Message, MessageSegment |
10 | 11 | from nonebot.adapters.milky.event import MessageEvent, MessageRecallEvent |
11 | | -from nonebot.adapters.milky.model.api import MessageGroupResponse, MessagePrivateResponse |
12 | 12 |
|
13 | 13 | from nonebot_plugin_alconna.uniseg.constraint import SupportScope |
14 | 14 | from nonebot_plugin_alconna.uniseg.exporter import Target, SupportAdapter, MessageExporter, SerializeFailed, export |
@@ -64,12 +64,10 @@ def get_target(self, event: Event, bot: Union[Bot, None] = None) -> Target: |
64 | 64 | raise NotImplementedError |
65 | 65 |
|
66 | 66 | def get_message_id(self, event: Event) -> str: |
67 | | - if (message_id := getattr(event, "message_id", None)) is not None: |
68 | | - return str(message_id) |
69 | 67 | assert isinstance(event, MilkyEvent) |
70 | 68 | if (message_seq := getattr(event.data, "message_seq", None)) is not None: |
71 | | - if (client_seq := getattr(event.data, "client_seq", None)) is not None: |
72 | | - return f"{message_seq}#{client_seq}" |
| 69 | + if isinstance(event, MessageEvent): |
| 70 | + return f"{message_seq}@{event.data.message_scene}:{event.data.peer_id}" |
73 | 71 | return str(message_seq) |
74 | 72 | raise NotImplementedError |
75 | 73 |
|
@@ -164,8 +162,8 @@ async def file(self, seg: File, bot: Union[Bot, None]) -> "MessageSegment": |
164 | 162 |
|
165 | 163 | @export |
166 | 164 | async def reply(self, seg: Reply, bot: Union[Bot, None]) -> "MessageSegment": |
167 | | - message_seq, _, client_seq = seg.id.partition("#") |
168 | | - return MessageSegment.reply(int(message_seq), int(client_seq) if client_seq else None) |
| 165 | + message_seq, *_ = seg.id.split("@") |
| 166 | + return MessageSegment.reply(int(message_seq)) |
169 | 167 |
|
170 | 168 | @export |
171 | 169 | async def reference(self, seg: Reference, bot: Union[Bot, None]) -> "MessageSegment": |
@@ -229,74 +227,83 @@ async def send_to(self, target: Union[Target, Event], bot: Bot, message: Message |
229 | 227 |
|
230 | 228 | async def recall(self, mid: Any, bot: Bot, context: Union[Target, Event]): |
231 | 229 | assert isinstance(bot, MilkyBot) |
232 | | - if isinstance(mid, MessagePrivateResponse): |
233 | | - user_id = int(context.id if isinstance(context, Target) else context.get_user_id()) |
234 | | - await bot.recall_private_message(user_id=user_id, message_seq=mid.message_seq, client_seq=mid.client_seq) |
235 | | - elif isinstance(mid, MessageGroupResponse): |
236 | | - group_id = int(context.id if isinstance(context, Target) else getattr(context.data, "group_id", -1)) # type: ignore |
237 | | - await bot.recall_group_message(group_id=group_id, message_seq=mid.message_seq) |
238 | | - elif isinstance(mid, int): |
239 | | - if isinstance(context, Target): |
240 | | - assert not context.private |
241 | | - group_id = int(context.id) |
242 | | - else: |
243 | | - group_id = int(getattr(context.data, "group_id", -1)) # type: ignore |
244 | | - await bot.recall_group_message(group_id=group_id, message_seq=mid) |
245 | | - elif isinstance(mid, str): |
246 | | - message_seq, _, client_seq = mid.partition("#") |
247 | | - if not client_seq: |
248 | | - if isinstance(context, Target): |
249 | | - assert not context.private |
250 | | - group_id = int(context.id) |
251 | | - else: |
252 | | - assert not context.is_private # type: ignore |
253 | | - group_id = int(getattr(context.data, "group_id", -1)) # type: ignore |
254 | | - await bot.recall_group_message(group_id=group_id, message_seq=int(message_seq)) |
255 | | - else: |
256 | | - user_id = int(context.id if isinstance(context, Target) else context.get_user_id()) |
257 | | - await bot.recall_private_message( |
258 | | - user_id=user_id, message_seq=int(message_seq), client_seq=int(client_seq) |
259 | | - ) |
260 | | - elif isinstance(mid, File) and mid.id: |
| 230 | + if isinstance(mid, File) and mid.id: |
261 | 231 | if isinstance(context, Target): |
262 | 232 | if not context.private: |
263 | 233 | group_id = int(context.id) |
264 | 234 | await bot.delete_group_file(group_id=group_id, file_id=mid.id) |
265 | 235 | elif not context.is_private: # type: ignore |
266 | 236 | group_id = int(getattr(context.data, "group_id", -1)) # type: ignore |
267 | 237 | await bot.delete_group_file(group_id=group_id, file_id=mid.id) |
| 238 | + return |
| 239 | + if isinstance(mid, MessageResponse): |
| 240 | + message_seq = mid.message_seq |
| 241 | + elif isinstance(mid, int): |
| 242 | + message_seq = mid |
| 243 | + elif isinstance(mid, str): |
| 244 | + message_seq, _, target = mid.partition("@") |
| 245 | + message_seq = int(message_seq) |
| 246 | + if target: |
| 247 | + scene, _, peer_id = target.partition(":") |
| 248 | + if scene == "group": |
| 249 | + await bot.recall_group_message(group_id=int(peer_id), message_seq=message_seq) |
| 250 | + else: |
| 251 | + await bot.recall_private_message(user_id=int(peer_id), message_seq=message_seq) |
| 252 | + return |
| 253 | + else: |
| 254 | + return |
| 255 | + if isinstance(context, Target): |
| 256 | + if context.private: |
| 257 | + user_id = int(context.id) |
| 258 | + await bot.recall_private_message(user_id=user_id, message_seq=message_seq) |
| 259 | + else: |
| 260 | + group_id = int(context.id) |
| 261 | + await bot.recall_group_message(group_id=group_id, message_seq=message_seq) |
| 262 | + elif isinstance(context, MilkyEvent): |
| 263 | + if context.is_private: |
| 264 | + user_id = int(context.get_user_id()) |
| 265 | + await bot.recall_private_message(user_id=user_id, message_seq=message_seq) |
| 266 | + else: |
| 267 | + group_id = int(getattr(context.data, "group_id", -1)) |
| 268 | + await bot.recall_group_message(group_id=group_id, message_seq=message_seq) |
268 | 269 |
|
269 | 270 | async def reaction(self, emoji: Emoji, mid: Any, bot: Bot, context: Union[Target, Event], delete: bool = False): |
270 | 271 | assert isinstance(bot, MilkyBot) |
271 | 272 |
|
272 | | - if isinstance(mid, MessagePrivateResponse): |
| 273 | + if isinstance(context, Target): |
| 274 | + if context.private: |
| 275 | + return |
| 276 | + group_id = int(context.id) |
| 277 | + elif isinstance(context, MilkyEvent): |
| 278 | + if context.is_private: |
| 279 | + return |
| 280 | + group_id = int(getattr(context.data, "group_id", -1)) # type: ignore |
| 281 | + else: |
273 | 282 | return |
274 | | - group_id = int(context.id if isinstance(context, Target) else getattr(context.data, "group_id", -1)) # type: ignore |
275 | | - if isinstance(mid, MessageGroupResponse): |
| 283 | + if isinstance(mid, MessageResponse): |
276 | 284 | message_seq = mid.message_seq |
277 | 285 | elif isinstance(mid, int): |
278 | 286 | message_seq = mid |
279 | 287 | elif isinstance(mid, str): |
280 | | - message_seq, _, client_seq = mid.partition("#") |
281 | | - if client_seq: |
282 | | - return |
| 288 | + message_seq, _, target = mid.partition("@") |
283 | 289 | message_seq = int(message_seq) |
| 290 | + if target: |
| 291 | + scene, _, peer_id = target.partition(":") |
| 292 | + if scene == "group": |
| 293 | + group_id = int(peer_id) |
| 294 | + else: |
| 295 | + return |
284 | 296 | else: |
285 | 297 | return |
286 | 298 | await bot.send_group_message_reaction( |
287 | 299 | group_id=group_id, message_seq=message_seq, reaction=emoji.id, is_add=not delete |
288 | 300 | ) |
289 | 301 |
|
290 | 302 | def get_reply(self, mid: Any): |
291 | | - if isinstance(mid, MessagePrivateResponse): |
292 | | - return Reply(f"{mid.message_seq}#{mid.client_seq}", origin=mid) |
293 | | - if isinstance(mid, MessageGroupResponse): |
| 303 | + if isinstance(mid, MessageResponse): |
294 | 304 | return Reply(str(mid.message_seq), origin=mid) |
295 | 305 | if isinstance(mid, int): |
296 | 306 | return Reply(str(mid)) |
297 | 307 | if isinstance(mid, str): |
298 | | - message_seq, _, client_seq = mid.partition("#") |
299 | | - if client_seq: |
300 | | - return Reply(f"{message_seq}#{client_seq}") |
301 | | - return Reply(str(message_seq)) |
| 308 | + return Reply(mid) |
302 | 309 | raise ValueError(f"Invalid message id: {mid}") |
0 commit comments