fix(bridge): include emoji type in group reaction request

set_msg_emoji_like silently no-op'd for unicode emoji because the
reaction request didn't tell the server which emoji namespace the
code belongs to (QQ face vs unicode codepoint). Derive the type
from the code length — short numeric ids are QQ faces, longer
codepoint strings are unicode.
This commit is contained in:
DrSmoothl
2026-05-14 20:45:37 +08:00
parent 00a70b1ccc
commit 564eec21bb
2 changed files with 11 additions and 1 deletions
@@ -30,8 +30,13 @@ export async function sendLike(bridge: Bridge, userId: number, count: number): P
export async function setGroupReaction(bridge: Bridge, groupId: number, sequence: number, code: string, isSet: boolean): Promise<void> {
const subCmd = isSet ? 1 : 2;
const cmd = isSet ? 'OidbSvcTrpcTcp.0x9082_1' : 'OidbSvcTrpcTcp.0x9082_2';
// Same heuristic NapCat uses: QQ face ids are 1–3 digits ("76"),
// unicode codepoints are longer ("128516"). Server requires the
// type field to pick the right resolution table; omitting it makes
// unicode reactions silently fail.
const type = code.length > 3 ? 2 : 1;
await sendOidbAndCheck(bridge, cmd, 0x9082, subCmd,
{ groupUin: groupId, sequence, code }, OidbGroupReactionSchema);
{ groupUin: groupId, sequence, code, type }, OidbGroupReactionSchema);
}
export async function getEmojiLikes(
@@ -395,6 +395,11 @@ export const OidbGroupReactionSchema = {
groupUin: { field: 1, type: 'uint32' as const },
sequence: { field: 2, type: 'uint32' as const },
code: { field: 3, type: 'string' as const },
// 1 = legacy QQ face (short numeric id like "76"), 2 = unicode emoji
// (decimal codepoint string like "128516" for 😄). Omitting this
// field used to make unicode reactions fail server-side because the
// server defaulted to type=1 and couldn't resolve a 6-digit code.
type: { field: 4, type: 'uint32' as const },
} satisfies ProtoSchema;
// --- 0x6D8_1: Group file list ---