SnowLuma v2.4.2 source snapshot
Dev Build / cleanup (push) Waiting to run
Dev Build / typecheck (push) Waiting to run
Publish MCP to npm / Build, test, and publish MCP (push) Waiting to run
Publish SDK to npm / Build, test, and publish SDK (push) Waiting to run
Sync action catalog to docs / sync (push) Waiting to run
Publish UI to npm / Build and publish UI (push) Waiting to run
Build and Release / preflight (push) Waiting to run

This commit is contained in:
TanTan committed 2026-11-13 09:02:00 +08:00
commit fa9c73363d
1367 files changed
+355735

No files matched your search

@@ -0,0 +1,72 @@
import type { FriendMessage } from '../events';
import type { MsgPushContext } from '../msg-push/context';
import { decodeDatalineMsgBody, elementsFromDatalineBody } from './codec';
import { DATALINE_SELF_TER_TYPE, findDatalineDeviceByTerType } from './device-contacts';
/**
* Incoming my-device chats reuse the private-file push type but carry a
* different body. Rewrite the conversation peer onto the matching device
* contact — both sides of the wire use the logged-in account number.
*/
export function tryDecodeDatalineFriendMessage(ctx: MsgPushContext): FriendMessage | null {
if (ctx.head.msgType !== 529 || ctx.head.subType !== 7) {
return null;
}
const raw = ctx.body?.msgContent;
if (!raw || raw.length === 0) {
return null;
}
const body = decodeDatalineMsgBody(raw);
if (!body) {
return null;
}
if (
body.subCmd == null &&
!body.header &&
!body.generic &&
!(body.ftn && body.ftn.length > 0)
) {
return null;
}
const elements = elementsFromDatalineBody(body);
const srcTer = body.header?.srcTerType ?? 0;
const dstTer = body.header?.dstTerType ?? 0;
const sentBySelf = srcTer === DATALINE_SELF_TER_TYPE;
const peerTer = peerTerType(srcTer, dstTer);
const peer = findDatalineDeviceByTerType(peerTer);
const sequenceAuthoritative = ctx.head.ntMsgSeq > 0;
return {
kind: 'friend_message',
time: ctx.head.timestamp,
selfUin: ctx.selfUin,
senderUin: sentBySelf ? ctx.selfUin : (peer?.uin ?? ctx.fromUin),
senderUid: sentBySelf ? ctx.fromUid : (peer?.uid ?? ctx.fromUid),
...(peer ? { peerUin: peer.uin } : {}),
msgSeq: ctx.head.sequence,
ntMsgSeq: ctx.head.ntMsgSeq,
clientSeq: ctx.head.sequence,
sequenceAuthoritative,
msgId: ctx.head.msgId & 0x7fffffff,
elements,
senderNick: sentBySelf ? '' : (peer?.name ?? ''),
};
}
function peerTerType(srcTer: number, dstTer: number): number {
if (srcTer !== DATALINE_SELF_TER_TYPE && srcTer > 0) {
return srcTer;
}
if (dstTer !== DATALINE_SELF_TER_TYPE && dstTer > 0) {
return dstTer;
}
return dstTer || srcTer || DATALINE_SELF_TER_TYPE;
}