Skip to content

Commit 3254af5

Browse files
committed
✨ experimental support message reaction for Onebot 11
1 parent 55fcfd3 commit 3254af5

File tree

2 files changed

+45
-5
lines changed

2 files changed

+45
-5
lines changed

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

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from nonebot.adapters.onebot.v11.bot import Bot as OnebotBot
88
from nonebot.adapters.onebot.v11.message import Message, MessageSegment
99

10-
from nonebot_plugin_alconna.uniseg.constraint import SupportScope
10+
from nonebot_plugin_alconna.uniseg.constraint import SupportScope, log
1111
from nonebot_plugin_alconna.uniseg.exporter import Target, SupportAdapter, MessageExporter, SerializeFailed, export
1212
from nonebot_plugin_alconna.uniseg.segment import (
1313
At,
@@ -194,5 +194,42 @@ async def recall(self, mid: Any, bot: Bot, context: Union[Target, Event]):
194194
elif not mid and isinstance(context, MessageEvent):
195195
await bot.delete_msg(message_id=context.message_id)
196196

197+
async def reaction(self, emoji: Emoji, mid: Any, bot: Bot, context: Union[Target, Event], delete: bool = False):
198+
assert isinstance(bot, OnebotBot)
199+
info = await bot.get_version_info()
200+
app_name = info["app_name"]
201+
message_id = mid["message_id"] if isinstance(mid, dict) else mid
202+
if app_name == "LLOneBot":
203+
await bot.call_api(
204+
"unset_msg_emoji_like" if delete else "set_msg_emoji_like",
205+
message_id=int(message_id),
206+
emoji_id=emoji.id,
207+
)
208+
elif app_name == "Lagrange.OneBot":
209+
if isinstance(context, Target):
210+
if context.private or context.channel:
211+
return
212+
group_id = int(context.id)
213+
else:
214+
if not hasattr(context, "group_id"):
215+
return
216+
group_id = int(context.group_id) # type: ignore
217+
await bot.call_api(
218+
"set_group_reaction",
219+
group_id=group_id,
220+
message_id=int(message_id),
221+
code=emoji.id,
222+
is_add=not delete,
223+
)
224+
elif app_name == "NapCat.Onebot":
225+
await bot.call_api(
226+
"set_msg_emoji_like",
227+
message_id=int(message_id),
228+
emoji_id=emoji.id,
229+
set=not delete,
230+
)
231+
else:
232+
log("WARNING", f"Unsupported Client: {app_name} for message reaction!")
233+
197234
def get_reply(self, mid: Any):
198235
return Reply(str(mid["message_id"]))

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

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -461,34 +461,37 @@ async def recall(self, mid: Any, bot: Bot, context: Union[Target, Event]):
461461

462462
async def reaction(self, emoji: Emoji, mid: Any, bot: Bot, context: Union[Target, Event], delete: bool = False):
463463
assert isinstance(bot, QQBot)
464+
assert emoji.id.isdigit()
465+
# https://bot.q.qq.com/wiki/develop/api-v2/openapi/emoji/model.html#EmojiType
466+
emj_type = 1 if int(emoji.id) < 5000 else 2
464467
if isinstance(mid, GuildMessage):
465468
if delete:
466469
await bot.delete_own_message_reaction(
467470
channel_id=mid.channel_id,
468471
message_id=mid.id,
469-
type=1,
472+
type=emj_type,
470473
id=emoji.id,
471474
)
472475
else:
473476
await bot.put_message_reaction(
474477
channel_id=mid.channel_id,
475478
message_id=mid.id,
476-
type=1,
479+
type=emj_type,
477480
id=emoji.id,
478481
)
479482
elif isinstance(mid, str) and isinstance(context, GuildMessageEvent):
480483
if delete:
481484
await bot.delete_own_message_reaction(
482485
channel_id=context.channel_id,
483486
message_id=mid,
484-
type=1,
487+
type=emj_type,
485488
id=emoji.id,
486489
)
487490
else:
488491
await bot.put_message_reaction(
489492
channel_id=context.channel_id,
490493
message_id=mid,
491-
type=1,
494+
type=emj_type,
492495
id=emoji.id,
493496
)
494497

0 commit comments

Comments
 (0)