onebots 0.4.63 → 0.4.65

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.
package/lib/adapter.d.ts CHANGED
@@ -46,7 +46,7 @@ export interface Adapter<T extends string = string, Sendable = any> extends Adap
46
46
  export declare namespace Adapter {
47
47
  interface Base<Sendable = any> {
48
48
  toSegment<V extends OneBot.Version>(version: V, message: Sendable): OneBot.Segment<V>[];
49
- fromSegment<V extends OneBot.Version>(version: V, segment: OneBot.Segment<V>[]): Sendable;
49
+ fromSegment<V extends OneBot.Version>(onebot: OneBot, version: V, segment: OneBot.Segment<V>[]): Sendable;
50
50
  getSelfInfo<V extends OneBot.Version>(uin: string, version: V): OneBot.SelfInfo<V>;
51
51
  /** 格式化事件 */
52
52
  formatEventPayload<V extends OneBot.Version>(uin: string, version: V, event: string, payload: Dict): OneBot.Payload<V>;
package/lib/adapter.js CHANGED
@@ -63,7 +63,7 @@ class Adapter extends events_1.EventEmitter {
63
63
  .join("");
64
64
  }
65
65
  fromCqcode(version, message) {
66
- const regExpMatchArray = message.match(/\[CQ:([a-z]+),([^]]+)]/);
66
+ const regExpMatchArray = message.match(/\[CQ:([a-z]+),([^\]]+)]/);
67
67
  if (!regExpMatchArray)
68
68
  return [
69
69
  {
@@ -75,10 +75,10 @@ class Adapter extends events_1.EventEmitter {
75
75
  ];
76
76
  const result = [];
77
77
  while (message.length) {
78
- const [match] = message.match(/\[CQ:([a-z]+),([^]]+)]/) || [];
78
+ const [match] = message.match(/\[CQ:([a-z]+),([^\]]+)]/) || [];
79
79
  if (!match)
80
80
  break;
81
- const prevText = message.substring(0, match.length);
81
+ const prevText = message.substring(0, message.indexOf(match));
82
82
  if (prevText) {
83
83
  result.push({
84
84
  type: "text",
@@ -89,9 +89,10 @@ class Adapter extends events_1.EventEmitter {
89
89
  }
90
90
  const [type, ...valueArr] = match.substring(1, match.length - 1).split(",");
91
91
  result.push({
92
- type: type,
92
+ type: type.split(":").at(-1),
93
93
  data: Object.fromEntries(valueArr.map(item => {
94
- const [key, value] = item.split("=");
94
+ const [key, ...values] = item.split("=");
95
+ const value = values.join("=");
95
96
  return [key, type === "reply" && key === "id" ? +value : value];
96
97
  })),
97
98
  });
@@ -17,7 +17,7 @@ export default class DingtalkAdapter extends Adapter<"dingtalk", Sendable> {
17
17
  sendPrivateMessage<V extends OneBot.Version>(uin: string, version: V, args: [string, Sendable, string]): Promise<OneBot.MessageRet<V>>;
18
18
  sendGroupMessage<V extends OneBot.Version>(uin: string, version: V, args: [string, Sendable, string]): Promise<OneBot.MessageRet<V>>;
19
19
  deleteMessage(uin: string, message_id: string): Promise<boolean>;
20
- fromSegment<V extends OneBot.Version>(version: V, segment: OneBot.Segment<V> | OneBot.Segment<V>[]): Sendable;
20
+ fromSegment<V extends OneBot.Version>(onebot: OneBot<Bot>, version: V, segment: OneBot.Segment<V> | OneBot.Segment<V>[]): Sendable;
21
21
  toSegment<V extends OneBot.Version>(version: V, message: Sendable): OneBot.Segment<V>[];
22
22
  fromCqcode<V extends OneBot.Version>(version: V, message: string): OneBot.Segment<V>[];
23
23
  formatEventPayload<V extends OneBot.Version>(uin: string, version: V, event: string, data: any): OneBot.Payload<V>;
@@ -139,8 +139,15 @@ class DingtalkAdapter extends adapter_1.Adapter {
139
139
  throw new Error(`暂不支持撤回${from_type}类型的消息`);
140
140
  }
141
141
  }
142
- fromSegment(version, segment) {
143
- return [].concat(segment).map(item => {
142
+ fromSegment(onebot, version, segment) {
143
+ return []
144
+ .concat(segment)
145
+ .map(segment => {
146
+ if (version === "V12" && ["image", "video", "audio"].includes(segment.type))
147
+ return onebot.V12.transformMedia(segment);
148
+ return segment;
149
+ })
150
+ .map(item => {
144
151
  if (typeof item === "string")
145
152
  return item;
146
153
  const { type, data } = item;
@@ -1,6 +1,6 @@
1
1
  import { Adapter } from "../../adapter";
2
2
  import { App } from "../../server/app";
3
- import { Config as IcqqConfig, Sendable } from "@icqqjs/icqq";
3
+ import { Client, Config as IcqqConfig, Sendable } from "@icqqjs/icqq";
4
4
  import { OneBot } from "../../onebot";
5
5
  export default class IcqqAdapter extends Adapter<"icqq", Sendable> {
6
6
  #private;
@@ -16,7 +16,7 @@ export default class IcqqAdapter extends Adapter<"icqq", Sendable> {
16
16
  sendGuildMessage<V extends OneBot.Version>(uin: string, version: V, args: [string, Sendable, string?]): Promise<OneBot.MessageRet<V>>;
17
17
  getMessage<V extends OneBot.Version>(uin: string, version: V, [message_id]: [string]): Promise<OneBot.Message<V>>;
18
18
  call<V extends OneBot.Version>(uin: string, version: V, method: string, args?: any[]): Promise<any>;
19
- fromSegment<V extends OneBot.Version>(version: V, segment: OneBot.Segment<V> | OneBot.Segment<V>[]): Sendable;
19
+ fromSegment<V extends OneBot.Version>(onebot: OneBot<Client>, version: V, segment: OneBot.Segment<V> | OneBot.Segment<V>[]): Sendable;
20
20
  toSegment<V extends OneBot.Version>(version: V, message: Sendable): OneBot.Segment<V>[];
21
21
  getSelfInfo<V extends OneBot.Version>(uin: string, version: V): OneBot.SelfInfo<V>;
22
22
  startOneBot(oneBot: OneBot): Promise<Function>;
@@ -45,72 +45,8 @@ const process_1 = __importDefault(require("process"));
45
45
  const fs_1 = require("fs");
46
46
  const onebot_1 = require("../../onebot");
47
47
  const path = __importStar(require("path"));
48
- const shareMusicCustom_1 = require("../../service/shareMusicCustom");
49
48
  const message_1 = require("@icqqjs/icqq/lib/message");
50
- async function processMessages(uin, target_id, target_type, list) {
51
- let result = [];
52
- for (const item of list) {
53
- const { type, data, ...other } = item;
54
- switch (type) {
55
- case "node": {
56
- result.push({
57
- type,
58
- ...data,
59
- user_id: data.user_id,
60
- message: await processMessages.call(this, uin, data.user_id, "private", data.content || []),
61
- });
62
- break;
63
- }
64
- case "music": {
65
- if (String(item.data.platform) === "custom") {
66
- item.data.platform = item.data["subtype"]; // gocq 的平台数据存储在 subtype 内,兼容 icqq 时要求前端必须发送 id 字段
67
- }
68
- const { type, data } = item;
69
- await shareMusicCustom_1.shareMusic.call(this[target_type === "private" ? "pickFriend" : "pickGroup"](target_id), {
70
- type,
71
- ...data,
72
- });
73
- break;
74
- }
75
- case "share": {
76
- await this[target_type === "private" ? "pickFriend" : "pickGroup"](target_id).shareUrl(item.data);
77
- break;
78
- }
79
- case "video":
80
- case "audio":
81
- case "image": {
82
- if (item["file_id"]?.startsWith("base64://"))
83
- item["file_id"] = Buffer.from(item["file_id"].slice(9), "base64");
84
- if (item["file"]?.startsWith("base64://"))
85
- item["file"] = Buffer.from(item["file"].slice(9), "base64");
86
- result.push({
87
- type: type,
88
- ...data,
89
- ...other,
90
- });
91
- break;
92
- }
93
- case "reply": {
94
- const oneBot = this.getOneBot(uin);
95
- const message_id = oneBot.V11.getStrByInt("message_id", data.id);
96
- const msg = await oneBot.internal.getMsg(message_id);
97
- result.push({
98
- type: "quote",
99
- ...msg,
100
- });
101
- break;
102
- }
103
- default: {
104
- result.push({
105
- type: type,
106
- ...data,
107
- ...other,
108
- });
109
- }
110
- }
111
- }
112
- return result;
113
- }
49
+ const utils_1 = require("../../adapters/icqq/utils");
114
50
  class IcqqAdapter extends adapter_1.Adapter {
115
51
  constructor(app, config) {
116
52
  super(app, "icqq", config);
@@ -203,7 +139,7 @@ class IcqqAdapter extends adapter_1.Adapter {
203
139
  let quote;
204
140
  if (source)
205
141
  quote = await client.getMsg(source);
206
- const result = await client.sendPrivateMsg(parseInt(user_id), await processMessages.call(this, uin, user_id, "private", message), quote);
142
+ const result = await client.sendPrivateMsg(parseInt(user_id), await utils_1.processMessages.call(this, uin, user_id, "private", message), quote);
207
143
  return {
208
144
  message_id: version === "V11"
209
145
  ? this.oneBots.get(uin).V11.transformToInt("message_id", result.message_id)
@@ -220,7 +156,7 @@ class IcqqAdapter extends adapter_1.Adapter {
220
156
  let quote;
221
157
  if (source)
222
158
  quote = await client.getMsg(source);
223
- const result = await client.sendGroupMsg(parseInt(group_id), await processMessages.call(this, uin, group_id, "group", message), quote);
159
+ const result = await client.sendGroupMsg(parseInt(group_id), await utils_1.processMessages.call(this, uin, group_id, "group", message), quote);
224
160
  return {
225
161
  message_id: version === "V11"
226
162
  ? this.oneBots.get(uin).V11.transformToInt("message_id", result.message_id)
@@ -231,7 +167,7 @@ class IcqqAdapter extends adapter_1.Adapter {
231
167
  const [target_id, message, source] = args;
232
168
  const client = this.oneBots.get(uin)?.internal;
233
169
  const [guild_id, channel_id] = target_id.split(":");
234
- const result = await client.sendGuildMsg(guild_id, channel_id, await processMessages.call(this, uin, target_id, "channel", message));
170
+ const result = await client.sendGuildMsg(guild_id, channel_id, await utils_1.processMessages.call(this, uin, target_id, "channel", message));
235
171
  const message_id = `${result.seq}:${result.rand}:${result.time}`;
236
172
  return {
237
173
  message_id: version === "V11"
@@ -260,8 +196,15 @@ class IcqqAdapter extends adapter_1.Adapter {
260
196
  throw onebot_1.OneBot.UnsupportedMethodError;
261
197
  }
262
198
  }
263
- fromSegment(version, segment) {
264
- return [].concat(segment).map(item => {
199
+ fromSegment(onebot, version, segment) {
200
+ return []
201
+ .concat(segment)
202
+ .map(segment => {
203
+ if (version === "V12" && ["image", "video", "audio"].includes(segment.type))
204
+ return onebot.V12.transformMedia(segment);
205
+ return segment;
206
+ })
207
+ .map(item => {
265
208
  if (typeof item === "string")
266
209
  return item;
267
210
  const { type, data } = item;
@@ -1,6 +1,4 @@
1
- import { Client, MessageElem, ShareElem } from "@icqqjs/icqq";
2
- export declare function processMessage(this: Client, elements: MessageElem[]): Promise<{
3
- element: MessageElem[];
4
- music?: MessageElem;
5
- share?: ShareElem;
6
- }>;
1
+ import { MessageElem } from "@icqqjs/icqq";
2
+ import { OneBot } from "../../onebot";
3
+ import IcqqAdapter from "../../adapters/icqq/index";
4
+ export declare function processMessages(this: IcqqAdapter, uin: string, target_id: number, target_type: "group" | "private", list: OneBot.Segment<OneBot.Version>[]): Promise<MessageElem[]>;
@@ -1,26 +1,68 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.processMessage = void 0;
4
- const utils_1 = require("../../utils");
5
- async function processMessage(elements) {
6
- let music = elements.find(e => e.type === "music");
7
- if (music) {
8
- (0, utils_1.remove)(elements, music);
9
- if (String(music.platform) === "custom") {
10
- music.platform = music["subtype"]; // gocq 的平台数据存储在 subtype 内,兼容 icqq 时要求前端必须发送 id 字段
3
+ exports.processMessages = void 0;
4
+ const shareMusicCustom_1 = require("./shareMusicCustom");
5
+ async function processMessages(uin, target_id, target_type, list) {
6
+ let result = [];
7
+ for (const item of list) {
8
+ const { type, data, ...other } = item;
9
+ switch (type) {
10
+ case "node": {
11
+ result.push({
12
+ type,
13
+ ...data,
14
+ user_id: data.user_id,
15
+ message: await processMessages.call(this, uin, data.user_id, "private", data.content || []),
16
+ });
17
+ break;
18
+ }
19
+ case "music": {
20
+ if (String(item.data.platform) === "custom") {
21
+ item.data.platform = item.data["subtype"]; // gocq 的平台数据存储在 subtype 内,兼容 icqq 时要求前端必须发送 id 字段
22
+ }
23
+ const { type, data } = item;
24
+ await shareMusicCustom_1.shareMusic.call(this[target_type === "private" ? "pickFriend" : "pickGroup"](target_id), {
25
+ type,
26
+ ...data,
27
+ });
28
+ break;
29
+ }
30
+ case "share": {
31
+ await this[target_type === "private" ? "pickFriend" : "pickGroup"](target_id).shareUrl(item.data);
32
+ break;
33
+ }
34
+ case "video":
35
+ case "audio":
36
+ case "image": {
37
+ item["file"] = item["file"] || item["file_id"] || item["url"];
38
+ if (item["file"]?.startsWith("base64://"))
39
+ item["file"] = Buffer.from(item["file"].slice(9), "base64");
40
+ result.push({
41
+ type: type,
42
+ ...data,
43
+ ...other,
44
+ });
45
+ break;
46
+ }
47
+ case "reply": {
48
+ const oneBot = this.getOneBot(uin);
49
+ const message_id = oneBot.V11.getStrByInt("message_id", data.id);
50
+ const msg = await oneBot.internal.getMsg(message_id);
51
+ result.push({
52
+ type: "quote",
53
+ ...msg,
54
+ });
55
+ break;
56
+ }
57
+ default: {
58
+ result.push({
59
+ type: type,
60
+ ...data,
61
+ ...other,
62
+ });
63
+ }
11
64
  }
12
65
  }
13
- let share = elements.find(e => e.type === "share");
14
- if (share)
15
- (0, utils_1.remove)(elements, share);
16
- for (const element of elements) {
17
- if (["image", "video", "audio"].includes(element.type)) {
18
- if (element["file_id"]?.startsWith("base64://"))
19
- element["file_id"] = Buffer.from(element["file_id"].slice(9), "base64");
20
- if (element["file"]?.startsWith("base64://"))
21
- element["file"] = Buffer.from(element["file"].slice(9), "base64");
22
- }
23
- }
24
- return { element: elements, share, music };
66
+ return result;
25
67
  }
26
- exports.processMessage = processMessage;
68
+ exports.processMessages = processMessages;
@@ -15,7 +15,7 @@ export default class QQAdapter extends Adapter<"qq", Sendable> {
15
15
  sendDirectMessage<V extends OneBot.Version>(uin: string, version: V, args: [string, Sendable, string]): Promise<OneBot.MessageRet<V>>;
16
16
  deleteMessage(uin: string, message_id: string): Promise<boolean>;
17
17
  call(uin: string, version: string, method: string, args?: any[]): Promise<any>;
18
- fromSegment<V extends OneBot.Version>(version: V, segment: OneBot.Segment<V> | OneBot.Segment<V>[]): Sendable;
18
+ fromSegment<V extends OneBot.Version>(onebot: OneBot<Bot>, version: V, segment: OneBot.Segment<V> | OneBot.Segment<V>[]): Sendable;
19
19
  toSegment<V extends OneBot.Version, M = Sendable>(version: V, message: M): OneBot.Segment<V>[];
20
20
  formatEventPayload<V extends OneBot.Version>(uin: string, version: V, event: string, data: any): OneBot.Payload<V>;
21
21
  start(uin: string): Promise<void>;
@@ -175,8 +175,15 @@ class QQAdapter extends adapter_1.Adapter {
175
175
  throw new Error(`call internal method error:${e.message}`);
176
176
  }
177
177
  }
178
- fromSegment(version, segment) {
179
- return [].concat(segment).map(item => {
178
+ fromSegment(onebot, version, segment) {
179
+ return []
180
+ .concat(segment)
181
+ .map(segment => {
182
+ if (version === "V12" && ["image", "video", "audio"].includes(segment.type))
183
+ return onebot.V12.transformMedia(segment);
184
+ return segment;
185
+ })
186
+ .map(item => {
180
187
  if (typeof item === "string")
181
188
  return item;
182
189
  const { type, data } = item;
@@ -14,7 +14,7 @@ export default class WechatAdapter extends Adapter<"wechat", Sendable> {
14
14
  sendPrivateMessage<V extends OneBot.Version>(uin: string, version: V, args: [string, Sendable, string]): Promise<OneBot.MessageRet<V>>;
15
15
  sendGroupMessage<V extends OneBot.Version>(uin: string, version: V, args: [string, Sendable, string]): Promise<OneBot.MessageRet<V>>;
16
16
  deleteMessage<V extends OneBot.Version>(uin: string, version: V, [str]: [string]): Promise<boolean>;
17
- fromSegment<V extends OneBot.Version>(version: V, segment: OneBot.Segment<V> | OneBot.Segment<V>[]): Sendable;
17
+ fromSegment<V extends OneBot.Version>(onebot: OneBot<Client>, version: V, segment: OneBot.Segment<V> | OneBot.Segment<V>[]): Sendable;
18
18
  toSegment<V extends OneBot.Version>(version: V, message: Sendable): OneBot.Segment<V>[];
19
19
  getFriendList<V extends OneBot.Version>(uin: string, version: V): Promise<OneBot.UserInfo<V>[]>;
20
20
  getGroupList<V extends OneBot.Version>(uin: string, version: V): Promise<OneBot.GroupInfo<V>[]>;
@@ -143,8 +143,15 @@ class WechatAdapter extends adapter_1.Adapter {
143
143
  return bot.internal.recallMsg(username, message_idArr.join(":"));
144
144
  }
145
145
  }
146
- fromSegment(version, segment) {
147
- return [].concat(segment).map(item => {
146
+ fromSegment(onebot, version, segment) {
147
+ return []
148
+ .concat(segment)
149
+ .map(segment => {
150
+ if (version === "V12" && ["image", "video", "audio"].includes(segment.type))
151
+ return onebot.V12.transformMedia(segment);
152
+ return segment;
153
+ })
154
+ .map(item => {
148
155
  if (typeof item === "string")
149
156
  return item;
150
157
  const { type, data } = item;
package/lib/db.js CHANGED
@@ -66,7 +66,7 @@ class JsonDB {
66
66
  while (parentPath.length) {
67
67
  const currentKey = parentPath.shift();
68
68
  if (!Reflect.has(temp, currentKey))
69
- Reflect.set(temp, key, {});
69
+ Reflect.set(temp, currentKey, {});
70
70
  temp = Reflect.get(temp, currentKey);
71
71
  }
72
72
  if (temp[key] !== undefined)
package/lib/server/app.js CHANGED
@@ -90,10 +90,15 @@ class App extends koa_1.default {
90
90
  this.use((0, koa_bodyparser_1.default)())
91
91
  .use(this.router.routes())
92
92
  .use(this.router.allowedMethods())
93
- .use((0, koa_basic_auth_1.default)({
94
- name: this.config.username,
95
- pass: this.config.password,
96
- }))
93
+ .use(async (ctx, next) => {
94
+ const adapter = ctx.path?.slice(1)?.split("/")[0];
95
+ if (this.adapters.has(adapter))
96
+ return next();
97
+ return (0, koa_basic_auth_1.default)({
98
+ name: this.config.username,
99
+ pass: this.config.password,
100
+ })(ctx, next);
101
+ })
97
102
  .use((0, koa_static_1.default)(path.resolve(__dirname, "../../dist")));
98
103
  this.httpServer = (0, http_1.createServer)(this.callback());
99
104
  this.ws = this.router.ws("/", this.httpServer);
@@ -503,7 +503,7 @@ class V11 extends service_1.Service {
503
503
  res.reply[0].data.platform = res.reply[0].data.type;
504
504
  delete res.reply[0].data.type;
505
505
  }
506
- res.reply = this.adapter.fromSegment("V11", res.reply);
506
+ res.reply = this.adapter.fromSegment(this.oneBot, "V11", res.reply);
507
507
  }
508
508
  this.action[action].apply(this, [id, res.reply, res.auto_escape]);
509
509
  }
@@ -577,7 +577,7 @@ class V11 extends service_1.Service {
577
577
  }
578
578
  params[k] = this.adapter.fromCqcode("V11", params[k]);
579
579
  }
580
- params[k] = this.adapter.fromSegment("V11", params[k]);
580
+ params[k] = this.adapter.fromSegment(this.oneBot, "V11", params[k]);
581
581
  params["message_id"] =
582
582
  params[k].find(e => e.type === "reply")?.id || params["message_id"];
583
583
  }
@@ -668,7 +668,6 @@ exports.V11 = V11;
668
668
  reconnect_interval: 3,
669
669
  use_http: true,
670
670
  enable_cors: true,
671
- enable_reissue: false,
672
671
  use_ws: true,
673
672
  http_reverse: [],
674
673
  ws_reverse: [],
@@ -44,4 +44,5 @@ export declare class CommonAction {
44
44
  uploadFileFragmented(this: V12, stage: "prepare" | "transfer" | "finish", name?: string, total_size?: number, file_id?: string, offset?: number, data?: string, sha256?: string): string | true;
45
45
  getFile(this: V12, file_id: string): V12.FileInfo;
46
46
  sendLike(this: V12, user_id: string, times?: number): Promise<any>;
47
+ imageOcr(this: V12, file: string): Promise<any>;
47
48
  }
@@ -133,5 +133,8 @@ class CommonAction {
133
133
  sendLike(user_id, times = 1) {
134
134
  return this.adapter.call(this.oneBot.uin, "V12", "sendLike", [user_id, times]);
135
135
  }
136
+ imageOcr(file) {
137
+ return this.adapter.call(this.oneBot.uin, "V12", "imageOcr", [file]);
138
+ }
136
139
  }
137
140
  exports.CommonAction = CommonAction;
@@ -49,6 +49,7 @@ export declare class V12 extends Service<"V12"> implements OneBot.Base {
49
49
  };
50
50
  system_online(data: any): void;
51
51
  dispatch(data: Record<string, any>): Promise<void>;
52
+ transformMedia(segment: V12.Segment): V12.Segment;
52
53
  apply(req: V12.RequestAction): Promise<string>;
53
54
  private httpAuth;
54
55
  private httpRequestHandler;
@@ -401,6 +401,18 @@ class V12 extends service_1.Service {
401
401
  return;
402
402
  this.emit("dispatch", payload);
403
403
  }
404
+ transformMedia(segment) {
405
+ const file = this.getFile(segment.data.file_id);
406
+ if (file)
407
+ return {
408
+ type: segment.type,
409
+ data: {
410
+ ...segment.data,
411
+ file_id: `base64://${file.data}`,
412
+ },
413
+ };
414
+ return segment;
415
+ }
404
416
  async apply(req) {
405
417
  let { action = "", params = {}, echo } = req;
406
418
  action = (0, utils_2.toLine)(action);
@@ -445,7 +457,7 @@ class V12 extends service_1.Service {
445
457
  }
446
458
  params[k] = this.adapter.fromCqcode("V12", params[k]);
447
459
  }
448
- params[k] = this.adapter.fromSegment("V12", params[k]);
460
+ params[k] = this.adapter.fromSegment(this.oneBot, "V12", params[k]);
449
461
  }
450
462
  args.push(params[k]);
451
463
  }
package/package.json CHANGED
@@ -1,10 +1,7 @@
1
1
  {
2
2
  "name": "onebots",
3
- "version": "0.4.63",
3
+ "version": "0.4.65",
4
4
  "description": "基于icqq的多例oneBot实现",
5
- "engines": {
6
- "node": ">=16"
7
- },
8
5
  "main": "lib/index.js",
9
6
  "bin": {
10
7
  "onebots": "./lib/bin.js"
@@ -21,6 +18,13 @@
21
18
  "docs:build": "vitepress build docs",
22
19
  "docs:preview": "vitepress preview docs"
23
20
  },
21
+ "engines": {
22
+ "node": ">=16"
23
+ },
24
+ "publishConfig": {
25
+ "access": "public",
26
+ "registry": "https://registry.npmjs.org"
27
+ },
24
28
  "repository": {
25
29
  "type": "git",
26
30
  "url": "git+https://github.com/liucl-cn/onebots.git"
@@ -89,4 +93,4 @@
89
93
  "reflect-metadata": "^0.1.13",
90
94
  "ws": "^8.16.0"
91
95
  }
92
- }
96
+ }