@napuketto/adapter 0.0.21 → 0.0.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { i as ProtocolConfig, n as BaseProtocolAdapter, s as ActionRegistry, u as ErrorCodeMap } from "../index-CDKj-jus.mjs";
|
|
2
2
|
import "../gray-tip-CcpfI1Og.mjs";
|
|
3
|
-
import { BuddyEventChannel, CanonicalElement, ChatType, FriendApi, GroupApi, GroupCache, GroupEventChannel, GroupNotifyApi, MsgApi, MsgEventChannel, Peer, ProfileApi, ProfileLikeApi, RichMediaApi, TicketApi, WebApi } from "@napuketto/kernel";
|
|
3
|
+
import { BuddyCacheEventChannel, BuddyEventChannel, CanonicalElement, ChatType, FriendApi, GroupApi, GroupCache, GroupEventChannel, GroupNotifyApi, MsgApi, MsgEventChannel, Peer, ProfileApi, ProfileLikeApi, RichMediaApi, TicketApi, WebApi } from "@napuketto/kernel";
|
|
4
4
|
import { z } from "zod";
|
|
5
5
|
import { EventBroadcaster, TransportAdapter } from "@napuketto/network";
|
|
6
6
|
//#region src/onebot11/helper/message-unique.d.ts
|
|
@@ -182,6 +182,11 @@ type OB11MessageSegment = {
|
|
|
182
182
|
file: string;
|
|
183
183
|
url?: string;
|
|
184
184
|
};
|
|
185
|
+
} | {
|
|
186
|
+
type: "file";
|
|
187
|
+
data: {
|
|
188
|
+
file: string;
|
|
189
|
+
};
|
|
185
190
|
} | {
|
|
186
191
|
type: "reply";
|
|
187
192
|
data: {
|
|
@@ -650,6 +655,7 @@ declare const ob11ConfigSchema: z.ZodObject<{
|
|
|
650
655
|
array: "array";
|
|
651
656
|
string: "string";
|
|
652
657
|
}>>;
|
|
658
|
+
groupUploadAsNotice: z.ZodDefault<z.ZodBoolean>;
|
|
653
659
|
httpServers: z.ZodDefault<z.ZodArray<z.ZodObject<{
|
|
654
660
|
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
655
661
|
host: z.ZodDefault<z.ZodString>;
|
|
@@ -712,6 +718,8 @@ interface OneBot11AdapterOptions extends OneBotApiOptions {
|
|
|
712
718
|
groupChannel?: GroupEventChannel;
|
|
713
719
|
/** kernel 好友事件通道(可选:Buddy/onBuddyReqChange → OB11 request 源)。 */
|
|
714
720
|
friendChannel?: BuddyEventChannel;
|
|
721
|
+
/** 好友缓存 diff 通道(可选:BuddyCache/onBuddyAdded → OB11 friend_add 源,B2)。 */
|
|
722
|
+
buddyCacheEvents?: BuddyCacheEventChannel;
|
|
715
723
|
/** 校准日志(可选:未知事件形状 raw JSON;IPC 模式传 loader pino 实例)。 */
|
|
716
724
|
logger?: AdapterLoggerLike;
|
|
717
725
|
}
|
|
@@ -721,6 +729,7 @@ declare class NapukettoOneBot11Adapter extends BaseProtocolAdapter<OB11Config> {
|
|
|
721
729
|
private readonly msgChannel;
|
|
722
730
|
private readonly groupChannel;
|
|
723
731
|
private readonly friendChannel;
|
|
732
|
+
private readonly buddyCacheEvents;
|
|
724
733
|
private readonly calibLogger;
|
|
725
734
|
private readonly selfUin;
|
|
726
735
|
private readonly oneBotApi;
|
|
@@ -731,6 +740,8 @@ declare class NapukettoOneBot11Adapter extends BaseProtocolAdapter<OB11Config> {
|
|
|
731
740
|
private heartbeatTimer;
|
|
732
741
|
private reportSelfMessage;
|
|
733
742
|
private messageFormat;
|
|
743
|
+
/** 群文件报形式(B4):true = fileElement 群消息报 group_upload notice 替代 message。 */
|
|
744
|
+
private groupUploadAsNotice;
|
|
734
745
|
/** IPC 桥模式标记(subscribeOnly 启动;reload 时跳过传输重建)。 */
|
|
735
746
|
private subscribedOnly;
|
|
736
747
|
constructor(opts: OneBot11AdapterOptions);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../../src/onebot11/helper/message-unique.ts","../../src/onebot11/api/one-bot-api.ts","../../src/onebot11/action/error-map.ts","../../src/onebot11/action/group/get-group-at-all-remain.ts","../../src/onebot11/types/index.ts","../../src/onebot11/event/base.ts","../../src/onebot11/event/message.ts","../../src/onebot11/event/meta.ts","../../src/onebot11/event/notice.ts","../../src/onebot11/event/request.ts","../../src/onebot11/event/index.ts","../../src/onebot11/action/index.ts","../../src/onebot11/helper/codec/cqcode.ts","../../src/onebot11/helper/codec/segment.ts","../../src/onebot11/helper/config.ts","../../src/onebot11/helper/data.ts","../../src/onebot11/adapter.ts","../../src/onebot11/transport.ts"],"mappings":";;;;;;cAkBa;;mBAEQ;;mBAEA;;mBAEA;;UAET;;mBAES;;;;;EAMjB,MAAM,eAAe,OAAO;;EAmB5B,SAAS;;EAKT,aAAa;;EAKb,QAAQ,gBAAgB;;EAKxB,QAAQ;;UAYA;;;;;UCvDK;;EAEb;;EAEA,mBAAmB;;EAEnB;;EAEA;;EAEA,aAAa;;EAEb,gBAAgB;;;UAIH;EACb,QAAQ;EACR,UAAU;EACV,gBAAgB;EAChB,WAAW;EACX,WAAW;EACX,cAAc;EACd,YAAY;EACZ,gBAAgB;EAChB,QAAQ;;EAER;IAAQ;IAAa;;;EAErB,QAAQ;;EAER,aAAa;;;;;;cAOJ;;WAEA,QAAQ;;WAER,UAAU;;WAEV,gBAAgB;;WAEhB,WAAW;;WAEX,WAAW;;WAEX,cAAc;;WAEd,YAAY;;WAEZ,gBAAgB;;WAEhB,QAAQ;;WAER,YAAY;;WAEZ,eAAe;;WAEf;IAAQ;IAAa;;;WAErB;;WAEA;;WAEA,mBAAmB;;WAEnB;;WAEA;;WAEA,aAAa;;WAEb,gBAAgB;EAEzB,YAAY,MAAM;;EAuBlB,SAAS,iBAAiB,QAAQ;;EAKlC,SAAS,iBAAiB,QAAQ;;;;;cCzHzB,kBAAkB;;;;UCMd;EACb;EACA;EACA;;;;;;;;;UCba,WAAW;EACxB;EACA;EACA,MAAM;EACN;EACA;;;KAIQ;EACJ;EAAc;IAAQ;;;EACtB;EAAY;IAAQ;IAAY;;;EAChC;EAAc;IAAQ;;;EACtB;EAAe;IAAQ;IAAc;;;EACrC;EAAgB;IAAQ;IAAc;;;EACtC;EAAe;IAAQ;IAAc;;;EACrC;EAAe;IAAQ;;;EACvB;EAAiB;IAAQ;;;EACzB;EAAc;IAAQ;;;EACtB;EAAa;IAAQ;;;EACrB;EAAgB;IAAQ;;;;KAGpB,uBAAuB;;UAGlB;EACb;EACA;EACA;EACA;;;UAIa;EACb;EACA;EACA;EACA;;;UAIa;EACb;EACA;;;UAIa;EACb;EACA;EACA;EACA;IACI;IACA;IACA;IACA;;EAEJ;EACA,SAAS;EACT;EACA;EACA;;;KAIQ;;UAGK;EACb;EACA;EACA;EACA;EACA,MAAM;EACN;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;EAEA;EACA;EACA;EACA;EACA;EACA;;;UAIa;EACb;EACA;EACA;;;UAIa;EACb;EACA;EACA,MAAM;EACN;;EAEA;EACA;EACA;EACA;;;UAIa;EACb;EACA;EACA;EACA;EACA;;;UAIa;EACb;EACA;EACA;;;UAIa;EACb;EACA,oBAAoB;EACpB,gBAAgB;EAChB,gBAAgB;EAChB,aAAa;EACb,oBAAoB;EACpB,cAAc;;;UAID;EACb;EACA;EACA;;EAEA;EACA;EACA;EACA,eAAe;EACf,gBAAgB;EAChB;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../../src/onebot11/helper/message-unique.ts","../../src/onebot11/api/one-bot-api.ts","../../src/onebot11/action/error-map.ts","../../src/onebot11/action/group/get-group-at-all-remain.ts","../../src/onebot11/types/index.ts","../../src/onebot11/event/base.ts","../../src/onebot11/event/message.ts","../../src/onebot11/event/meta.ts","../../src/onebot11/event/notice.ts","../../src/onebot11/event/request.ts","../../src/onebot11/event/index.ts","../../src/onebot11/action/index.ts","../../src/onebot11/helper/codec/cqcode.ts","../../src/onebot11/helper/codec/segment.ts","../../src/onebot11/helper/config.ts","../../src/onebot11/helper/data.ts","../../src/onebot11/adapter.ts","../../src/onebot11/transport.ts"],"mappings":";;;;;;cAkBa;;mBAEQ;;mBAEA;;mBAEA;;UAET;;mBAES;;;;;EAMjB,MAAM,eAAe,OAAO;;EAmB5B,SAAS;;EAKT,aAAa;;EAKb,QAAQ,gBAAgB;;EAKxB,QAAQ;;UAYA;;;;;UCvDK;;EAEb;;EAEA,mBAAmB;;EAEnB;;EAEA;;EAEA,aAAa;;EAEb,gBAAgB;;;UAIH;EACb,QAAQ;EACR,UAAU;EACV,gBAAgB;EAChB,WAAW;EACX,WAAW;EACX,cAAc;EACd,YAAY;EACZ,gBAAgB;EAChB,QAAQ;;EAER;IAAQ;IAAa;;;EAErB,QAAQ;;EAER,aAAa;;;;;;cAOJ;;WAEA,QAAQ;;WAER,UAAU;;WAEV,gBAAgB;;WAEhB,WAAW;;WAEX,WAAW;;WAEX,cAAc;;WAEd,YAAY;;WAEZ,gBAAgB;;WAEhB,QAAQ;;WAER,YAAY;;WAEZ,eAAe;;WAEf;IAAQ;IAAa;;;WAErB;;WAEA;;WAEA,mBAAmB;;WAEnB;;WAEA;;WAEA,aAAa;;WAEb,gBAAgB;EAEzB,YAAY,MAAM;;EAuBlB,SAAS,iBAAiB,QAAQ;;EAKlC,SAAS,iBAAiB,QAAQ;;;;;cCzHzB,kBAAkB;;;;UCMd;EACb;EACA;EACA;;;;;;;;;UCba,WAAW;EACxB;EACA;EACA,MAAM;EACN;EACA;;;KAIQ;EACJ;EAAc;IAAQ;;;EACtB;EAAY;IAAQ;IAAY;;;EAChC;EAAc;IAAQ;;;EACtB;EAAe;IAAQ;IAAc;;;EACrC;EAAgB;IAAQ;IAAc;;;EACtC;EAAe;IAAQ;IAAc;;;EACrC;EAAc;IAAQ;;;EACtB;EAAe;IAAQ;;;EACvB;EAAiB;IAAQ;;;EACzB;EAAc;IAAQ;;;EACtB;EAAa;IAAQ;;;EACrB;EAAgB;IAAQ;;;;KAGpB,uBAAuB;;UAGlB;EACb;EACA;EACA;EACA;;;UAIa;EACb;EACA;EACA;EACA;;;UAIa;EACb;EACA;;;UAIa;EACb;EACA;EACA;EACA;IACI;IACA;IACA;IACA;;EAEJ;EACA,SAAS;EACT;EACA;EACA;;;KAIQ;;UAGK;EACb;EACA;EACA;EACA;EACA,MAAM;EACN;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;EAEA;EACA;EACA;EACA;EACA;EACA;;;UAIa;EACb;EACA;EACA;;;UAIa;EACb;EACA;EACA,MAAM;EACN;;EAEA;EACA;EACA;EACA;;;UAIa;EACb;EACA;EACA;EACA;EACA;;;UAIa;EACb;EACA;EACA;;;UAIa;EACb;EACA,oBAAoB;EACpB,gBAAgB;EAChB,gBAAgB;EAChB,aAAa;EACb,oBAAoB;EACpB,cAAc;;;UAID;EACb;EACA;EACA;;EAEA;EACA;EACA;EACA,eAAe;EACf,gBAAgB;EAChB;;;;;;;;;;;;KCtJQ;;UAGK;;EAEb;;EAEA;;EAEA,WAAW;;;;;UCPE;EACb;EACA;EACA;;;UAIa,oBAAoB;EACjC;EACA;;;UAIa,8BAA8B;EAC3C;EACA;;EAEA;EACA;EACA;EACA;EACA,SAAS;EACT;EACA;EACA,QAAQ;EACR,YAAY;;;UAIC,gCAAgC;EAC7C;EACA;;EAEA;EACA;EACA;EACA,SAAS;EACT;EACA;EACA,QAAQ;;EAER;;;KAIQ,mBAAmB,wBAAwB;;;;UC9CtC;EACb;EACA;GACC;;;UAIY,+BAA+B;EAC5C;EACA;EACA;;;UAIa,+BAA+B;EAC5C;EACA;;EAEA;EACA,QAAQ;;;KAIA,gBAAgB,yBAAyB;;;;UCvBpC;EACb;EACA;EACA;EACA;;;UAIa;EACb;EACA;EACA;;;UAIa;EACb;EACA;EACA;;;UAIa,mCAAmC;EAChD;EACA;EACA;EACA;EACA,MAAM;;;UAIO,kCAAkC;EAC/C;EACA;EACA;EACA;EACA;;;UAIa,qCAAqC;EAClD;EACA;EACA;EACA;EACA;EACA;;;UAIa,qCAAqC;EAClD;EACA;EACA;EACA;EACA;EACA;;;UAIa,gCAAgC;EAC7C;EACA;EACA;EACA;EACA;EACA;;EAEA;;;UAIa,iCAAiC;EAC9C;EACA;EACA;;;UAIa,mCAAmC;EAChD;EACA;EACA;EACA;EACA;EACA;;;UAIa,oCAAoC;EACjD;EACA;EACA;EACA;;;UAIa,iCAAiC;EAC9C;EACA;EACA;EACA;EACA;EACA;;;UAIa,oCAAoC;EACjD;EACA;EACA;EACA;EACA;EACA;EACA;;;UAIa,8BAA8B;EAC3C;EACA;EACA;EACA;EACA;EACA;;EAEA;;;UAIa,mCAAmC;EAChD;EACA;EACA;EACA,MAAM;;;UAIO,iCAAiC;EAC9C;EACA;EACA;EACA;;;UAIa,oCAAoC;EACjD;EACA;EACA;EACA;EACA;EACA,OAAO;;;UAIM,kCAAkC;EAC/C;EACA;EACA;EACA;EACA;;;KAIQ,kBACN,6BACA,4BACA,+BACA,+BACA,0BACA,2BACA,6BACA,8BACA,2BACA,8BACA,wBACA,6BACA,2BACA,8BACA;;;;UCpLW,+BAA+B;EAC5C;EACA;EACA;;EAEA;;EAEA;;;UAIa,8BAA8B;EAC3C;EACA;;EAEA;EACA;EACA;EACA;EACA;;;KAIQ,mBAAmB,yBAAyB;;;;KCiB5C,YAAY,mBAAoB,kBAAmB,mBAAoB;;;;UCyDlE;;EAEb,KAAK;;;iBAIO,yBAAyB,MAAM,iBAAiB;;;;;;;;;;;;;;UC9E/C;EACb;EACA,QAAQ;;;iBAII,aAAa;;iBAKb,cAAc;;iBAKd,eAAe;;iBASf,aACZ,cACA,QAAQ;;iBAeI,eAAe,eAAe,eAAe;;iBAkB7C,iBAAiB,OAAO,eAAe;;;;iBCsHvC,oBAAoB,UAAU;;;;cCxJjC,kBAAgB,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuB3B,EAAA,KAAA;;KAGU,aAAa,EAAE,aAAa;;;;iBC/DxB,oBAAoB,UAAU,qBAAqB;;iBAYnD,oBAAoB,UAAU,uBAAuB;;iBAoIrD,oBAAoB,eAAe;;iBAkBnC,qBAAqB,UAAU;;iBAK/B,qBAAqB,eAAe;;;;UCxInC;EACb,KAAK,cAAc;EACnB,KAAK,cAAc;;;UAIN,+BAA+B;;EAE5C,QAAQ,eAAe;;EAEvB,aAAa;;EAEb,YAAY;;EAEZ,eAAe;;EAEf,gBAAgB;;EAEhB,mBAAmB;;EAEnB,SAAS;;;cAIA,iCAAiC,oBAAoB;WACrD;mBAEQ;mBACA;mBACA;mBACA;mBACA;mBACA;mBACA;;WAER,UAAU;UACX;UACA;UACA;UACA;UACA;;UAEA;;UAEA;EAER,YAAY,MAAM;;;;;UAwBJ;;UAYA;;UAyCN;;UAiBM;;UAaN;;;;;;EA6FF,iBAAiB;;EAUvB;;;;;;UAUc;;UA2BA;;UAiBA;;UA4BA;;UAiBN;;;;;EAWF,cAAc,cAAc,UAAU,wBAAwB;;;;;UCtWvD;;EAEb,SAAS;;EAET,YAAY;;EAEZ,aAAa;;;UAIA;;EAEb,QAAQ;;EAER,aAAa;;EAEb,gBAAgB,cAAc,UAAU;;EAExC;;;iBAiBY,uBAAuB,MAAM,gCAAgC"}
|
package/dist/onebot11/index.mjs
CHANGED
|
@@ -1536,6 +1536,10 @@ const CANONICAL_TO_SEGMENT = {
|
|
|
1536
1536
|
type: "video",
|
|
1537
1537
|
data: mediaData(el.path, el.url)
|
|
1538
1538
|
}),
|
|
1539
|
+
file: (el) => ({
|
|
1540
|
+
type: "file",
|
|
1541
|
+
data: { file: el.name ?? el.path }
|
|
1542
|
+
}),
|
|
1539
1543
|
reply: (el) => ({
|
|
1540
1544
|
type: "reply",
|
|
1541
1545
|
data: { id: el.messageId }
|
|
@@ -1626,6 +1630,10 @@ const CQ_SEGMENT_BUILDERS = {
|
|
|
1626
1630
|
type: "video",
|
|
1627
1631
|
data: mediaData(params["file"] ?? "", params["url"])
|
|
1628
1632
|
}),
|
|
1633
|
+
file: (params) => ({
|
|
1634
|
+
type: "file",
|
|
1635
|
+
data: { file: params["file"] ?? "" }
|
|
1636
|
+
}),
|
|
1629
1637
|
reply: (params) => ({
|
|
1630
1638
|
type: "reply",
|
|
1631
1639
|
data: { id: params["id"] ?? "" }
|
|
@@ -1721,6 +1729,12 @@ const ob11ConfigSchema = z.object({
|
|
|
1721
1729
|
reportSelfMessage: z.boolean().default(false),
|
|
1722
1730
|
/** 消息内容格式:array = 消息段数组(标准),string = CQ 码字符串。 */
|
|
1723
1731
|
messagePostFormat: z.enum(MESSAGE_FORMATS).default("array"),
|
|
1732
|
+
/**
|
|
1733
|
+
* 群文件报形式(B4,2026-09-08):false(缺省)= message 事件 + file 段
|
|
1734
|
+
* (go-cqhttp 兼容;此前 file 元素被静默丢弃,本版本起透出);true = 含
|
|
1735
|
+
* fileElement 的群消息改报 group_upload notice 事件(替代 message 事件)。
|
|
1736
|
+
*/
|
|
1737
|
+
groupUploadAsNotice: z.boolean().default(false),
|
|
1724
1738
|
/** HTTP 反向服务器列表。 */
|
|
1725
1739
|
httpServers: z.array(httpServerSchema).default([]),
|
|
1726
1740
|
/** HTTP 正向上报列表。 */
|
|
@@ -1886,27 +1900,14 @@ function toOb11MessageInfo(msg, unique, ctx = {}) {
|
|
|
1886
1900
|
}
|
|
1887
1901
|
//#endregion
|
|
1888
1902
|
//#region src/onebot11/helper/notice.ts
|
|
1889
|
-
/**
|
|
1890
|
-
* OB11 notice 事件翻译(P2-7,2026-08-05;2026-09-08 T4 补全)
|
|
1891
|
-
*
|
|
1892
|
-
* NT QQ 中群成员变动/撤回等系统事件通过**消息的灰色提示元素(grayTip)**广播。
|
|
1893
|
-
* 本模块把 RawMessage 里的 grayTip 翻译为 OB11 notice 事件(纯函数,ADR-008)。
|
|
1894
|
-
*
|
|
1895
|
-
* 支持:
|
|
1896
|
-
* - group_recall(群撤回,grayTip.subElementType=REVOKE + chatType=GROUP)
|
|
1897
|
-
* - friend_recall(好友撤回,REVOKE + chatType=C2C,2026-09-08)
|
|
1898
|
-
* - group_increase / group_decrease(群成员变动,subElementType=GROUP + TipGroupElement.type)
|
|
1899
|
-
* - group_admin(管理员变更,TipGroupElement.type=BLOCK/UNBLOCK 的 role 语义)
|
|
1900
|
-
* - group_ban(禁言,TipGroupElement.type=SHUT_UP)
|
|
1901
|
-
* - notify.poke(戳一戳,aioOpGrayTipElement;⚠️ 待真实 poke 事件验证,2026-09-08)
|
|
1902
|
-
*
|
|
1903
|
-
* 未知/未翻译的 grayTip 子类型(JSON/BUDDY/ESSENCE/GROUP_NOTIFY 等)打 raw JSON
|
|
1904
|
-
* 日志(ctx.logger 可选)——为后续真实事件校准积累数据。
|
|
1905
|
-
*
|
|
1906
|
-
* user_id/operator_id 都是 uin:接收 uidToUin Map(调用方批量转换后传入,保持纯函数)。
|
|
1907
|
-
*/
|
|
1908
1903
|
/** 毫秒 → 秒(Unix 时间戳)。 */
|
|
1909
1904
|
const MS_TO_SEC$3 = 1e3;
|
|
1905
|
+
/** 群文件业务类型(group_upload 的 file.busid,与 kernel 群文件系列同源语义)。 */
|
|
1906
|
+
const GROUP_FILE_BUS_ID = 102;
|
|
1907
|
+
/** 检查消息是否含文件元素(group_upload 开关分支判定)。 */
|
|
1908
|
+
function hasFileElement(msg) {
|
|
1909
|
+
return msg.elements.some((el) => el.fileElement !== void 0);
|
|
1910
|
+
}
|
|
1910
1911
|
/** 检查消息是否含可翻译的 grayTip 元素。 */
|
|
1911
1912
|
function hasGrayTip(msg) {
|
|
1912
1913
|
return msg.elements.some((el) => el.grayTipElement !== void 0);
|
|
@@ -2045,6 +2046,45 @@ function toBan(common, grp, ctx) {
|
|
|
2045
2046
|
duration: Number(shutUp?.duration ?? 0)
|
|
2046
2047
|
};
|
|
2047
2048
|
}
|
|
2049
|
+
/**
|
|
2050
|
+
* 好友添加(friend_add,B2,2026-09-08)。
|
|
2051
|
+
* 数据源 = kernel BuddyCache 快照 diff(Buddy/onBuddyListChange 全量快照对比,
|
|
2052
|
+
* 首帧 baseline 不发)——非 grayTip 路径。user_id 取 coreInfo.uin(顶层 uin 兜底)。
|
|
2053
|
+
*/
|
|
2054
|
+
function toFriendAdd(entry, selfUin) {
|
|
2055
|
+
const uin = entry.coreInfo?.uin ?? entry.uin ?? "";
|
|
2056
|
+
return {
|
|
2057
|
+
time: Math.floor(Date.now() / MS_TO_SEC$3),
|
|
2058
|
+
self_id: Number(selfUin),
|
|
2059
|
+
post_type: "notice",
|
|
2060
|
+
notice_type: "friend_add",
|
|
2061
|
+
user_id: Number(uin)
|
|
2062
|
+
};
|
|
2063
|
+
}
|
|
2064
|
+
/**
|
|
2065
|
+
* 群文件上传(group_upload,B4,2026-09-08)。
|
|
2066
|
+
* 数据源 = 含 fileElement 的群消息(开关 groupUploadAsNotice=true 时替代
|
|
2067
|
+
* message 事件报出)。file.id 取 fileUuid(缺省文件名)、size 取 fileSize、
|
|
2068
|
+
* busid 固定 102(群文件业务类型,与 kernel GROUP_FILE_BIZ_TYPE 同源语义)。
|
|
2069
|
+
*/
|
|
2070
|
+
function toGroupUpload(msg, selfUin) {
|
|
2071
|
+
const file = msg.elements.find((e) => e.fileElement !== void 0)?.fileElement;
|
|
2072
|
+
if (file === void 0) return null;
|
|
2073
|
+
return {
|
|
2074
|
+
time: Math.floor(Number(msg.msgTime) / MS_TO_SEC$3),
|
|
2075
|
+
self_id: Number(selfUin),
|
|
2076
|
+
post_type: "notice",
|
|
2077
|
+
notice_type: "group_upload",
|
|
2078
|
+
group_id: Number(msg.peerUid),
|
|
2079
|
+
user_id: Number(msg.senderUin),
|
|
2080
|
+
file: {
|
|
2081
|
+
id: file.fileUuid ?? file.fileName ?? "",
|
|
2082
|
+
name: file.fileName ?? "",
|
|
2083
|
+
size: Number(file.fileSize ?? 0),
|
|
2084
|
+
busid: GROUP_FILE_BUS_ID
|
|
2085
|
+
}
|
|
2086
|
+
};
|
|
2087
|
+
}
|
|
2048
2088
|
/** 单个 grayTip 元素 → notice 事件(null = 不可翻译;未知子类型打 raw 日志)。 */
|
|
2049
2089
|
function translateGrayTip(msg, g, ctx) {
|
|
2050
2090
|
const subType = g.subElementType;
|
|
@@ -2293,16 +2333,17 @@ var GetGroupMsgHistoryAction = class extends BaseAction {
|
|
|
2293
2333
|
//#endregion
|
|
2294
2334
|
//#region src/onebot11/action/message/get-media.ts
|
|
2295
2335
|
/**
|
|
2296
|
-
* get_image / get_record 动作:获取图片/语音文件(P2-14;2026-09-08 T5
|
|
2336
|
+
* get_image / get_record 动作:获取图片/语音文件(P2-14;2026-09-08 T5 接主动下载;
|
|
2337
|
+
* 2026-09-08 B1 语音接原生 downloadRichMedia)
|
|
2297
2338
|
*
|
|
2298
2339
|
* message_id 反查 → fetchMsgsByMsgId → 找 PIC/PTT 元素:
|
|
2299
2340
|
* - 本地文件解析:NT 相对路径(sourcePath/filePath)按 mediaBaseDir(QQ NT
|
|
2300
2341
|
* global 目录)解析为绝对路径,命中磁盘即返回 file
|
|
2301
2342
|
* - 图片主动下载:本地未命中且有 picUrl → @napuketto/media downloadUrl 落
|
|
2302
2343
|
* cacheDir/media/,返回 file(绝对路径)+ url + file_size/file_name
|
|
2303
|
-
* -
|
|
2304
|
-
*
|
|
2305
|
-
*
|
|
2344
|
+
* - 语音主动下载(B1):本地未命中 → kernel MsgApi.downloadPtt(原生
|
|
2345
|
+
* downloadRichMedia + 轮询元素回查)→ filePath 落盘后返回绝对路径;
|
|
2346
|
+
* 失败回退原始 filePath(NT 相对/绝对)+ 元数据,不抛错
|
|
2306
2347
|
*/
|
|
2307
2348
|
const getMediaSchema = z.object({
|
|
2308
2349
|
/** CQ 码 file 字段或 message_id(简化:message_id 反查)。 */
|
|
@@ -2390,7 +2431,7 @@ var GetImageAction = class extends BaseAction {
|
|
|
2390
2431
|
return base;
|
|
2391
2432
|
}
|
|
2392
2433
|
};
|
|
2393
|
-
/**
|
|
2434
|
+
/** 获取语音信息(本地优先;未命中走原生 downloadRichMedia,失败回退原始路径)。 */
|
|
2394
2435
|
var GetRecordAction = class extends BaseAction {
|
|
2395
2436
|
name = "get_record";
|
|
2396
2437
|
schema = getMediaSchema;
|
|
@@ -2401,15 +2442,37 @@ var GetRecordAction = class extends BaseAction {
|
|
|
2401
2442
|
this.deps = deps;
|
|
2402
2443
|
}
|
|
2403
2444
|
async _handle(payload) {
|
|
2404
|
-
|
|
2405
|
-
|
|
2406
|
-
|
|
2407
|
-
|
|
2408
|
-
|
|
2409
|
-
|
|
2410
|
-
|
|
2411
|
-
|
|
2445
|
+
const id = takeId(payload, "get_record");
|
|
2446
|
+
const { msgId, peer } = resolveMsgIdAndPeer(id, this.deps.messageUnique);
|
|
2447
|
+
const [first] = await this.deps.msgApi.fetchMsgsByMsgId(peer, [msgId]);
|
|
2448
|
+
if (first === void 0) throw kernelError(`消息 ${id} 不存在或已被撤回`, "NOT_FOUND");
|
|
2449
|
+
const ptt = first.elements.find((e) => e.pttElement !== void 0)?.pttElement;
|
|
2450
|
+
if (ptt === void 0 || ptt.filePath === void 0) throw kernelError(`消息 ${id} 不包含语音`, "NOT_FOUND");
|
|
2451
|
+
const meta = () => ({
|
|
2452
|
+
...ptt.fileSize !== void 0 ? { file_size: ptt.fileSize } : {},
|
|
2453
|
+
...ptt.fileName !== void 0 ? { file_name: ptt.fileName } : {}
|
|
2412
2454
|
});
|
|
2455
|
+
const local = resolveLocalMediaFile(ptt.filePath, this.deps);
|
|
2456
|
+
if (local !== null) return {
|
|
2457
|
+
...meta(),
|
|
2458
|
+
file: local
|
|
2459
|
+
};
|
|
2460
|
+
try {
|
|
2461
|
+
const downloaded = await this.deps.msgApi.downloadPtt(msgId, peer);
|
|
2462
|
+
const rel = downloaded.filePath;
|
|
2463
|
+
if (rel !== void 0 && rel !== "") {
|
|
2464
|
+
const localAfter = resolveLocalMediaFile(rel, this.deps);
|
|
2465
|
+
if (localAfter !== null) return {
|
|
2466
|
+
...downloaded.fileSize !== void 0 ? { file_size: downloaded.fileSize } : {},
|
|
2467
|
+
...downloaded.fileName !== void 0 ? { file_name: downloaded.fileName } : {},
|
|
2468
|
+
file: localAfter
|
|
2469
|
+
};
|
|
2470
|
+
}
|
|
2471
|
+
} catch {}
|
|
2472
|
+
return {
|
|
2473
|
+
...meta(),
|
|
2474
|
+
file: ptt.filePath
|
|
2475
|
+
};
|
|
2413
2476
|
}
|
|
2414
2477
|
};
|
|
2415
2478
|
//#endregion
|
|
@@ -3711,6 +3774,7 @@ var NapukettoOneBot11Adapter = class extends BaseProtocolAdapter {
|
|
|
3711
3774
|
msgChannel;
|
|
3712
3775
|
groupChannel;
|
|
3713
3776
|
friendChannel;
|
|
3777
|
+
buddyCacheEvents;
|
|
3714
3778
|
calibLogger;
|
|
3715
3779
|
selfUin;
|
|
3716
3780
|
oneBotApi;
|
|
@@ -3721,6 +3785,8 @@ var NapukettoOneBot11Adapter = class extends BaseProtocolAdapter {
|
|
|
3721
3785
|
heartbeatTimer = null;
|
|
3722
3786
|
reportSelfMessage = false;
|
|
3723
3787
|
messageFormat = "array";
|
|
3788
|
+
/** 群文件报形式(B4):true = fileElement 群消息报 group_upload notice 替代 message。 */
|
|
3789
|
+
groupUploadAsNotice = false;
|
|
3724
3790
|
/** IPC 桥模式标记(subscribeOnly 启动;reload 时跳过传输重建)。 */
|
|
3725
3791
|
subscribedOnly = false;
|
|
3726
3792
|
constructor(opts) {
|
|
@@ -3736,6 +3802,7 @@ var NapukettoOneBot11Adapter = class extends BaseProtocolAdapter {
|
|
|
3736
3802
|
this.msgChannel = opts.msgChannel;
|
|
3737
3803
|
this.groupChannel = opts.groupChannel;
|
|
3738
3804
|
this.friendChannel = opts.friendChannel;
|
|
3805
|
+
this.buddyCacheEvents = opts.buddyCacheEvents;
|
|
3739
3806
|
this.calibLogger = opts.logger;
|
|
3740
3807
|
this.selfUin = opts.self.uin;
|
|
3741
3808
|
this.oneBotApi = new OneBotApi(opts);
|
|
@@ -3749,6 +3816,7 @@ var NapukettoOneBot11Adapter = class extends BaseProtocolAdapter {
|
|
|
3749
3816
|
if (this.subscribedOnly) {
|
|
3750
3817
|
this.reportSelfMessage = config.reportSelfMessage;
|
|
3751
3818
|
this.messageFormat = config.messagePostFormat;
|
|
3819
|
+
this.groupUploadAsNotice = config.groupUploadAsNotice;
|
|
3752
3820
|
return;
|
|
3753
3821
|
}
|
|
3754
3822
|
await this.stopAll();
|
|
@@ -3759,6 +3827,7 @@ var NapukettoOneBot11Adapter = class extends BaseProtocolAdapter {
|
|
|
3759
3827
|
this.subscribedOnly = false;
|
|
3760
3828
|
this.reportSelfMessage = config.reportSelfMessage;
|
|
3761
3829
|
this.messageFormat = config.messagePostFormat;
|
|
3830
|
+
this.groupUploadAsNotice = config.groupUploadAsNotice;
|
|
3762
3831
|
const broadcaster = this.getBroadcaster();
|
|
3763
3832
|
if (broadcaster !== void 0) {
|
|
3764
3833
|
this.transports = assembleOb11Transports({
|
|
@@ -3830,6 +3899,13 @@ var NapukettoOneBot11Adapter = class extends BaseProtocolAdapter {
|
|
|
3830
3899
|
return;
|
|
3831
3900
|
}
|
|
3832
3901
|
if (!this.reportSelfMessage && String(msg.senderUin) === this.selfUin) return;
|
|
3902
|
+
if (this.groupUploadAsNotice && msg.chatType === ChatType.GROUP && hasFileElement(msg)) {
|
|
3903
|
+
const notice = toGroupUpload(msg, this.selfUin);
|
|
3904
|
+
if (notice !== null) {
|
|
3905
|
+
this.broadcastEvent(notice);
|
|
3906
|
+
return;
|
|
3907
|
+
}
|
|
3908
|
+
}
|
|
3833
3909
|
this.broadcastMessageEvent(msg);
|
|
3834
3910
|
});
|
|
3835
3911
|
}));
|
|
@@ -3850,6 +3926,9 @@ var NapukettoOneBot11Adapter = class extends BaseProtocolAdapter {
|
|
|
3850
3926
|
this.calibLogger?.info({ raw: JSON.stringify(arg)?.slice(0, 2e3) }, `ob11: ${evt} raw(friend_add 校准数据)`);
|
|
3851
3927
|
}));
|
|
3852
3928
|
}
|
|
3929
|
+
if (this.buddyCacheEvents !== void 0) this.unsubscribes.push(this.buddyCacheEvents.on("BuddyCache/onBuddyAdded", (entry) => {
|
|
3930
|
+
this.broadcastEvent(toFriendAdd(entry, this.selfUin));
|
|
3931
|
+
}));
|
|
3853
3932
|
}
|
|
3854
3933
|
/**
|
|
3855
3934
|
* 仅启动接收链路(IPC 桥模式,2026-08-27):订阅消息通道维护 messageUnique +
|
|
@@ -3860,6 +3939,7 @@ var NapukettoOneBot11Adapter = class extends BaseProtocolAdapter {
|
|
|
3860
3939
|
const config = await this.config.load();
|
|
3861
3940
|
this.reportSelfMessage = config.reportSelfMessage;
|
|
3862
3941
|
this.messageFormat = config.messagePostFormat;
|
|
3942
|
+
this.groupUploadAsNotice = config.groupUploadAsNotice;
|
|
3863
3943
|
this.subscribedOnly = true;
|
|
3864
3944
|
this.subscribe();
|
|
3865
3945
|
}
|