@zhin.js/adapter-icqq 1.0.22 → 1.0.24

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/CHANGELOG.md CHANGED
@@ -1,5 +1,29 @@
1
1
  # @zhin.js/adapter-icqq
2
2
 
3
+ ## 1.0.24
4
+
5
+ ### Patch Changes
6
+
7
+ - f9faa1d: fix: test release
8
+ - Updated dependencies [f9faa1d]
9
+ - @zhin.js/client@1.0.7
10
+ - @zhin.js/core@1.0.19
11
+ - zhin.js@1.0.19
12
+ - @zhin.js/console@1.0.15
13
+ - @zhin.js/http@1.0.10
14
+
15
+ ## 1.0.23
16
+
17
+ ### Patch Changes
18
+
19
+ - d16a69c: fix: test trust publish
20
+ - Updated dependencies [d16a69c]
21
+ - @zhin.js/client@1.0.6
22
+ - @zhin.js/core@1.0.18
23
+ - zhin.js@1.0.18
24
+ - @zhin.js/console@1.0.14
25
+ - @zhin.js/http@1.0.9
26
+
3
27
  ## 1.0.22
4
28
 
5
29
  ### Patch Changes
package/lib/index.d.ts CHANGED
@@ -1,12 +1,20 @@
1
1
  import { Config, Client, PrivateMessageEvent, GroupMessageEvent, Sendable } from "@icqqjs/icqq";
2
- import { Bot, Adapter, Message, SendOptions, MessageSegment, SendContent } from "zhin.js";
3
- declare module '@zhin.js/types' {
2
+ import { Bot, Adapter, Plugin, Message, SendOptions, MessageSegment, SendContent } from "zhin.js";
3
+ import { Router } from "@zhin.js/http";
4
+ declare module "zhin.js" {
5
+ namespace Plugin {
6
+ interface Contexts {
7
+ icqq: IcqqAdapter;
8
+ web: any;
9
+ router: Router;
10
+ }
11
+ }
4
12
  interface RegisteredAdapters {
5
- icqq: Adapter<IcqqBot>;
13
+ icqq: IcqqAdapter;
6
14
  }
7
15
  }
8
- export interface IcqqBotConfig extends Bot.Config, Config {
9
- context: 'icqq';
16
+ export interface IcqqBotConfig extends Config {
17
+ context: "icqq";
10
18
  name: `${number}`;
11
19
  password?: string;
12
20
  scope?: string;
@@ -14,9 +22,11 @@ export interface IcqqBotConfig extends Bot.Config, Config {
14
22
  export interface IcqqBot {
15
23
  $config: IcqqBotConfig;
16
24
  }
17
- export declare class IcqqBot extends Client implements Bot<PrivateMessageEvent | GroupMessageEvent, IcqqBotConfig> {
18
- $connected?: boolean;
19
- constructor(config: IcqqBotConfig);
25
+ export declare class IcqqBot extends Client implements Bot<IcqqBotConfig, PrivateMessageEvent | GroupMessageEvent> {
26
+ adapter: IcqqAdapter;
27
+ $connected: boolean;
28
+ get $id(): `${number}`;
29
+ constructor(adapter: IcqqAdapter, config: IcqqBotConfig);
20
30
  private handleIcqqMessage;
21
31
  $connect(): Promise<void>;
22
32
  $disconnect(): Promise<void>;
@@ -28,4 +38,9 @@ export declare namespace IcqqBot {
28
38
  function toSegments(message: Sendable): MessageSegment[];
29
39
  function toSendable(content: SendContent): Sendable;
30
40
  }
41
+ declare class IcqqAdapter extends Adapter<IcqqBot> {
42
+ constructor(plugin: Plugin);
43
+ createBot(config: IcqqBotConfig): IcqqBot;
44
+ }
45
+ export {};
31
46
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,QAAQ,EAAc,MAAM,cAAc,CAAC;AAE5G,OAAO,EACH,GAAG,EAGH,OAAO,EAGP,OAAO,EACP,WAAW,EACX,cAAc,EACd,WAAW,EAEd,MAAM,SAAS,CAAC;AACjB,OAAO,QAAQ,gBAAgB,CAAA;IAC3B,UAAU,kBAAkB;QACxB,IAAI,EAAC,OAAO,CAAC,OAAO,CAAC,CAAA;KACxB;CACJ;AAED,MAAM,WAAW,aAAc,SAAQ,GAAG,CAAC,MAAM,EAAC,MAAM;IACpD,OAAO,EAAC,MAAM,CAAA;IACd,IAAI,EAAC,GAAG,MAAM,EAAE,CAAA;IAChB,QAAQ,CAAC,EAAC,MAAM,CAAA;IAChB,KAAK,CAAC,EAAC,MAAM,CAAA;CAChB;AACD,MAAM,WAAW,OAAO;IACpB,OAAO,EAAC,aAAa,CAAA;CACxB;AACD,qBAAa,OAAQ,SAAQ,MAAO,YAAW,GAAG,CAAC,mBAAmB,GAAC,iBAAiB,EAAC,aAAa,CAAC;IACnG,UAAU,CAAC,EAAC,OAAO,CAAA;gBACP,MAAM,EAAC,aAAa;IAOhC,OAAO,CAAC,iBAAiB;IAMnB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IA8BzB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAIlC,cAAc,CAAC,GAAG,EAAC,mBAAmB,GAAC,iBAAiB;IAgClD,cAAc,CAAC,EAAE,EAAC,MAAM,GAAE,OAAO,CAAC,IAAI,CAAC;IAGvC,YAAY,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;CAoB5D;AACD,yBAAiB,OAAO,CAAA;IAqBpB,SAAgB,UAAU,CAAC,OAAO,EAAC,QAAQ,GAAE,cAAc,EAAE,CAS5D;IACD,SAAgB,UAAU,CAAC,OAAO,EAAC,WAAW,GAAE,QAAQ,CASvD;CACJ"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,QAAQ,EAAe,MAAM,cAAc,CAAC;AAE7G,OAAO,EACL,GAAG,EAEH,OAAO,EACP,MAAM,EACN,OAAO,EACP,WAAW,EACX,cAAc,EACd,WAAW,EAEZ,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAEvC,OAAO,QAAQ,SAAS,CAAC;IACvB,UAAU,MAAM,CAAC;QACf,UAAU,QAAQ;YAChB,IAAI,EAAE,WAAW,CAAC;YAClB,GAAG,EAAE,GAAG,CAAC;YACT,MAAM,EAAE,MAAM,CAAC;SAChB;KACF;IAED,UAAU,kBAAkB;QAC1B,IAAI,EAAE,WAAW,CAAC;KACnB;CACF;AAKD,MAAM,WAAW,aAAc,SAAQ,MAAM;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,OAAO;IACtB,OAAO,EAAE,aAAa,CAAC;CACxB;AAED,qBAAa,OAAQ,SAAQ,MAAO,YAAW,GAAG,CAAC,aAAa,EAAE,mBAAmB,GAAG,iBAAiB,CAAC;IAOrF,OAAO,EAAE,WAAW;IANvC,UAAU,EAAE,OAAO,CAAS;IAE5B,IAAI,GAAG,gBAEN;gBAEkB,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa;IAQ9D,OAAO,CAAC,iBAAiB;IAMnB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IA8BzB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAKlC,cAAc,CAAC,GAAG,EAAE,mBAAmB,GAAG,iBAAiB;IAiCrD,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzC,YAAY,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;CAgB1D;AAED,yBAAiB,OAAO,CAAC;IAGvB,SAAgB,UAAU,CAAC,OAAO,EAAE,QAAQ,GAAG,cAAc,EAAE,CAW9D;IAED,SAAgB,UAAU,CAAC,OAAO,EAAE,WAAW,GAAG,QAAQ,CASzD;CACF;AAED,cAAM,WAAY,SAAQ,OAAO,CAAC,OAAO,CAAC;gBAC5B,MAAM,EAAE,MAAM;IAI1B,SAAS,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO;CAG1C"}
package/lib/index.js CHANGED
@@ -1,48 +1,53 @@
1
1
  import { Client } from "@icqqjs/icqq";
2
2
  import path from "path";
3
- import { usePlugin, useContext, Adapter, registerAdapter, Message, segment } from "zhin.js";
3
+ import { usePlugin, Adapter, Message, segment, } from "zhin.js";
4
4
  const plugin = usePlugin();
5
+ const { useContext } = plugin;
5
6
  export class IcqqBot extends Client {
6
- $connected;
7
- constructor(config) {
7
+ adapter;
8
+ $connected = false;
9
+ get $id() {
10
+ return this.$config.name;
11
+ }
12
+ constructor(adapter, config) {
8
13
  if (!config.scope)
9
- config.scope = 'icqqjs';
14
+ config.scope = "icqqjs";
10
15
  if (!config.data_dir)
11
- config.data_dir = path.join(process.cwd(), 'data');
12
- if (config.scope.startsWith('@'))
16
+ config.data_dir = path.join(process.cwd(), "data");
17
+ if (config.scope.startsWith("@"))
13
18
  config.scope = config.scope.slice(1);
14
19
  super(config);
20
+ this.adapter = adapter;
15
21
  this.$config = config;
16
22
  }
17
23
  handleIcqqMessage(msg) {
18
24
  const message = this.$formatMessage(msg);
19
- plugin.dispatch('message.receive', message);
20
- plugin.logger.info(`${this.$config.name} recv ${message.$channel.type}(${message.$channel.id}):${segment.raw(message.$content)}`);
21
- plugin.dispatch(`message.${message.$channel.type}.receive`, message);
25
+ this.adapter.emit("message.receive", message);
26
+ plugin.logger.debug(`${this.$config.name} recv ${message.$channel.type}(${message.$channel.id}):${segment.raw(message.$content)}`);
22
27
  }
23
28
  async $connect() {
24
- this.on('message', this.handleIcqqMessage.bind(this));
25
- this.on('system.login.device', async (e) => {
29
+ this.on("message", this.handleIcqqMessage.bind(this));
30
+ this.on("system.login.device", async (e) => {
26
31
  await this.sendSmsCode();
27
- plugin.logger.info('请输入短信验证码:');
28
- process.stdin.once('data', (data) => {
32
+ plugin.logger.info("请输入短信验证码:");
33
+ process.stdin.once("data", (data) => {
29
34
  this.submitSmsCode(data.toString().trim());
30
35
  });
31
36
  });
32
- this.on('system.login.qrcode', (e) => {
37
+ this.on("system.login.qrcode", (e) => {
33
38
  plugin.logger.info(`取码地址:${e.image}\n请扫码完成后回车继续:`);
34
- process.stdin.once('data', () => {
39
+ process.stdin.once("data", () => {
35
40
  this.login();
36
41
  });
37
42
  });
38
- this.on('system.login.slider', (e) => {
43
+ this.on("system.login.slider", (e) => {
39
44
  plugin.logger.info(`取码地址:${e.url}\n请输入滑块验证ticket:`);
40
- process.stdin.once('data', (e) => {
45
+ process.stdin.once("data", (e) => {
41
46
  this.submitSlider(e.toString().trim());
42
47
  });
43
48
  });
44
49
  return new Promise((resolve) => {
45
- this.once('system.online', () => {
50
+ this.once("system.online", () => {
46
51
  this.$connected = true;
47
52
  resolve();
48
53
  });
@@ -56,15 +61,15 @@ export class IcqqBot extends Client {
56
61
  $formatMessage(msg) {
57
62
  const result = Message.from(msg, {
58
63
  $id: msg.message_id.toString(),
59
- $adapter: 'icqq',
64
+ $adapter: "icqq",
60
65
  $bot: `${this.$config.name}`,
61
66
  $sender: {
62
67
  id: msg.sender.user_id.toString(),
63
68
  name: msg.sender.nickname.toString(),
64
69
  },
65
70
  $channel: {
66
- id: msg.message_type === 'group' ? msg.group_id.toString() : msg.from_id.toString(),
67
- type: msg.message_type
71
+ id: msg.message_type === "group" ? msg.group_id.toString() : msg.from_id.toString(),
72
+ type: msg.message_type,
68
73
  },
69
74
  $content: IcqqBot.toSegments(msg.message),
70
75
  $raw: msg.raw_message,
@@ -76,14 +81,14 @@ export class IcqqBot extends Client {
76
81
  if (!Array.isArray(content))
77
82
  content = [content];
78
83
  if (quote)
79
- content.unshift({ type: 'reply', data: { id: typeof quote === "boolean" ? result.$id : quote } });
84
+ content.unshift({ type: "reply", data: { id: typeof quote === "boolean" ? result.$id : quote } });
80
85
  return await this.$sendMessage({
81
86
  ...result.$channel,
82
- context: 'icqq',
87
+ context: "icqq",
83
88
  bot: `${this.uin}`,
84
- content
89
+ content,
85
90
  });
86
- }
91
+ },
87
92
  });
88
93
  return result;
89
94
  }
@@ -91,19 +96,16 @@ export class IcqqBot extends Client {
91
96
  await this.deleteMsg(id);
92
97
  }
93
98
  async $sendMessage(options) {
94
- options = await plugin.app.handleBeforeSend(options);
95
99
  switch (options.type) {
96
- case 'private': {
100
+ case "private": {
97
101
  const result = await this.sendPrivateMsg(Number(options.id), IcqqBot.toSendable(options.content));
98
- plugin.logger.info(`${this.$config.name} send ${options.type}(${options.id}):${segment.raw(options.content)}`);
102
+ plugin.logger.debug(`${this.$config.name} send ${options.type}(${options.id}):${segment.raw(options.content)}`);
99
103
  return result.message_id.toString();
100
- break;
101
104
  }
102
105
  case "group": {
103
106
  const result = await this.sendGroupMsg(Number(options.id), IcqqBot.toSendable(options.content));
104
- plugin.logger.info(`${this.$config.name} send ${options.type}(${options.id}):${segment.raw(options.content)}`);
107
+ plugin.logger.debug(`${this.$config.name} send ${options.type}(${options.id}):${segment.raw(options.content)}`);
105
108
  return result.message_id.toString();
106
- break;
107
109
  }
108
110
  default:
109
111
  throw new Error(`unsupported channel type ${options.type}`);
@@ -111,34 +113,17 @@ export class IcqqBot extends Client {
111
113
  }
112
114
  }
113
115
  (function (IcqqBot) {
114
- const allowTypes = [
115
- 'text',
116
- 'face',
117
- 'image',
118
- 'record',
119
- 'audio',
120
- 'dice',
121
- 'rps',
122
- 'video',
123
- 'file',
124
- 'location',
125
- 'share',
126
- 'json',
127
- 'at',
128
- 'reply',
129
- 'long_msg',
130
- 'button',
131
- 'markdown',
132
- 'xml',
133
- ];
116
+ const allowTypes = ["text", "face", "image", "record", "audio", "dice", "rps", "video", "file", "location", "share", "json", "at", "reply", "long_msg", "button", "markdown", "xml"];
134
117
  function toSegments(message) {
135
118
  if (!Array.isArray(message))
136
119
  message = [message];
137
- return message.filter((item, index) => {
138
- return typeof item === "string" || (item.type !== 'long_msg' || index !== 0);
139
- }).map((item) => {
120
+ return message
121
+ .filter((item, index) => {
122
+ return typeof item === "string" || item.type !== "long_msg" || index !== 0;
123
+ })
124
+ .map((item) => {
140
125
  if (typeof item === "string")
141
- return { type: 'text', data: { text: item } };
126
+ return { type: "text", data: { text: item } };
142
127
  const { type, ...data } = item;
143
128
  return { type, data };
144
129
  });
@@ -149,39 +134,60 @@ export class IcqqBot extends Client {
149
134
  content = [content];
150
135
  return content.map((seg) => {
151
136
  if (typeof seg === "string")
152
- return { type: 'text', text: seg };
137
+ return { type: "text", text: seg };
153
138
  let { type, data } = seg;
154
- if (typeof type === 'function')
139
+ if (typeof type === "function")
155
140
  type = type.name;
156
141
  if (!allowTypes.includes(type))
157
- return { type: 'text', text: segment.toString(seg) };
142
+ return { type: "text", text: segment.toString(seg) };
158
143
  return { type, ...data };
159
144
  });
160
145
  }
161
146
  IcqqBot.toSendable = toSendable;
162
147
  })(IcqqBot || (IcqqBot = {}));
163
- registerAdapter(new Adapter('icqq', IcqqBot));
164
- useContext('web', (web) => {
148
+ class IcqqAdapter extends Adapter {
149
+ constructor(plugin) {
150
+ super(plugin, "icqq", []);
151
+ }
152
+ createBot(config) {
153
+ return new IcqqBot(this, config);
154
+ }
155
+ }
156
+ const { provide } = usePlugin();
157
+ provide({
158
+ name: "icqq",
159
+ description: "ICQQ Adapter",
160
+ mounted: async (p) => {
161
+ const adapter = new IcqqAdapter(p);
162
+ await adapter.start();
163
+ return adapter;
164
+ },
165
+ dispose: async (adapter) => {
166
+ await adapter.stop();
167
+ },
168
+ });
169
+ useContext("web", (web) => {
165
170
  // 注册ICQQ适配器的客户端入口文件
166
171
  const dispose = web.addEntry({
167
- production: path.resolve(import.meta.dirname, '../dist/index.js'),
168
- development: path.resolve(import.meta.dirname, '../client/index.tsx')
172
+ production: path.resolve(import.meta.dirname, "../dist/index.js"),
173
+ development: path.resolve(import.meta.dirname, "../client/index.tsx"),
169
174
  });
170
175
  return dispose;
171
176
  });
172
- useContext('router', 'icqq', (router, icqq) => {
173
- router.get('/api/icqq/bots', async (ctx) => {
177
+ useContext("router", async (router) => {
178
+ const icqq = plugin.root.inject("icqq");
179
+ router.get("/api/icqq/bots", async (ctx) => {
174
180
  try {
175
181
  const bots = Array.from(icqq.bots.values());
176
182
  if (bots.length === 0) {
177
183
  ctx.body = {
178
184
  success: true,
179
185
  data: [],
180
- message: '暂无ICQQ机器人实例'
186
+ message: "暂无ICQQ机器人实例",
181
187
  };
182
188
  return;
183
189
  }
184
- const result = bots.map(bot => {
190
+ const result = bots.map((bot) => {
185
191
  try {
186
192
  return {
187
193
  name: bot.$config.name,
@@ -190,14 +196,13 @@ useContext('router', 'icqq', (router, icqq) => {
190
196
  friendCount: bot.fl?.size || 0,
191
197
  receiveCount: bot.stat?.recv_msg_cnt || 0,
192
198
  sendCount: bot.stat?.sent_msg_cnt || 0,
193
- loginMode: bot.$config.password ? 'password' : 'qrcode',
194
- status: bot.$connected ? 'online' : 'offline',
195
- lastActivity: new Date().toISOString()
199
+ loginMode: bot.$config.password ? "password" : "qrcode",
200
+ status: bot.$connected ? "online" : "offline",
201
+ lastActivity: new Date().toISOString(),
196
202
  };
197
203
  }
198
204
  catch (botError) {
199
205
  // 单个机器人数据获取失败时的处理
200
- // 获取机器人数据失败,返回错误状态
201
206
  return {
202
207
  name: bot.$config.name,
203
208
  connected: false,
@@ -205,27 +210,26 @@ useContext('router', 'icqq', (router, icqq) => {
205
210
  friendCount: 0,
206
211
  receiveCount: 0,
207
212
  sendCount: 0,
208
- loginMode: 'unknown',
209
- status: 'error',
210
- error: '数据获取失败'
213
+ loginMode: "unknown",
214
+ status: "error",
215
+ error: "数据获取失败",
211
216
  };
212
217
  }
213
218
  });
214
219
  ctx.body = {
215
220
  success: true,
216
221
  data: result,
217
- timestamp: new Date().toISOString()
222
+ timestamp: new Date().toISOString(),
218
223
  };
219
224
  }
220
225
  catch (error) {
221
- // ICQQ API调用失败
222
226
  ctx.status = 500;
223
227
  ctx.body = {
224
228
  success: false,
225
- error: 'ICQQ_API_ERROR',
226
- message: '获取机器人数据失败',
227
- details: process.env.NODE_ENV === 'development' ? error.message : undefined,
228
- timestamp: new Date().toISOString()
229
+ error: "ICQQ_API_ERROR",
230
+ message: "获取机器人数据失败",
231
+ details: process.env.NODE_ENV === "development" ? error.message : undefined,
232
+ timestamp: new Date().toISOString(),
229
233
  };
230
234
  }
231
235
  });
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zhin.js/adapter-icqq",
3
- "version": "1.0.22",
3
+ "version": "1.0.24",
4
4
  "description": "zhin adapter for icqq",
5
5
  "type": "module",
6
6
  "main": "./lib/index.js",
@@ -43,11 +43,11 @@
43
43
  "typescript": "^5.3.0"
44
44
  },
45
45
  "peerDependencies": {
46
- "zhin.js": "1.0.17",
47
- "@zhin.js/http": "1.0.7",
48
- "@zhin.js/client": "1.0.5",
49
- "@zhin.js/types": "1.0.5",
50
- "@zhin.js/console": "1.0.13"
46
+ "@zhin.js/core": "1.0.19",
47
+ "@zhin.js/client": "1.0.7",
48
+ "@zhin.js/http": "1.0.10",
49
+ "@zhin.js/console": "1.0.15",
50
+ "zhin.js": "1.0.19"
51
51
  },
52
52
  "peerDependenciesMeta": {
53
53
  "@zhin.js/client": {
@@ -58,11 +58,12 @@
58
58
  },
59
59
  "@zhin.js/console": {
60
60
  "optional": true
61
- },
62
- "@zhin.js/types": {
63
- "optional": true
64
61
  }
65
62
  },
63
+ "publishConfig": {
64
+ "access": "public",
65
+ "registry": "https://registry.npmjs.org"
66
+ },
66
67
  "scripts": {
67
68
  "build": "tsc && (test -f ../../services/console/lib/bin.js && node ../../services/console/lib/bin.js build || echo 'Skipping client build: console not built yet')",
68
69
  "clean": "rm -rf lib"
package/src/index.ts CHANGED
@@ -1,250 +1,277 @@
1
- import { Config, Client, PrivateMessageEvent, GroupMessageEvent, Sendable, MessageElem} from "@icqqjs/icqq";
1
+ import { Config, Client, PrivateMessageEvent, GroupMessageEvent, Sendable, MessageElem } from "@icqqjs/icqq";
2
2
  import path from "path";
3
3
  import {
4
- Bot,
5
- usePlugin,
6
- useContext,
7
- Adapter,
8
- Plugin,
9
- registerAdapter,
10
- Message,
11
- SendOptions,
12
- MessageSegment,
13
- SendContent,
14
- segment
4
+ Bot,
5
+ usePlugin,
6
+ Adapter,
7
+ Plugin,
8
+ Message,
9
+ SendOptions,
10
+ MessageSegment,
11
+ SendContent,
12
+ segment,
15
13
  } from "zhin.js";
16
- declare module '@zhin.js/types'{
17
- interface RegisteredAdapters{
18
- icqq:Adapter<IcqqBot>
14
+ import { Router } from "@zhin.js/http";
15
+
16
+ declare module "zhin.js" {
17
+ namespace Plugin {
18
+ interface Contexts {
19
+ icqq: IcqqAdapter;
20
+ web: any;
21
+ router: Router;
19
22
  }
23
+ }
24
+
25
+ interface RegisteredAdapters {
26
+ icqq: IcqqAdapter;
27
+ }
20
28
  }
21
- const plugin =usePlugin()
22
- export interface IcqqBotConfig extends Bot.Config,Config{
23
- context:'icqq'
24
- name:`${number}`
25
- password?:string
26
- scope?:string
29
+
30
+ const plugin = usePlugin();
31
+ const { useContext } = plugin;
32
+
33
+ export interface IcqqBotConfig extends Config {
34
+ context: "icqq";
35
+ name: `${number}`;
36
+ password?: string;
37
+ scope?: string;
27
38
  }
28
- export interface IcqqBot{
29
- $config:IcqqBotConfig
39
+
40
+ export interface IcqqBot {
41
+ $config: IcqqBotConfig;
30
42
  }
31
- export class IcqqBot extends Client implements Bot<PrivateMessageEvent|GroupMessageEvent,IcqqBotConfig>{
32
- $connected?:boolean
33
- constructor(config:IcqqBotConfig) {
34
- if(!config.scope) config.scope='icqqjs'
35
- if(!config.data_dir) config.data_dir=path.join(process.cwd(),'data')
36
- if(config.scope.startsWith('@')) config.scope=config.scope.slice(1)
37
- super(config);
38
- this.$config=config
39
- }
40
- private handleIcqqMessage(msg: PrivateMessageEvent|GroupMessageEvent): void {
41
- const message =this.$formatMessage(msg) ;
42
- plugin.dispatch('message.receive',message)
43
- plugin.logger.info(`${this.$config.name} recv ${message.$channel.type}(${message.$channel.id}):${segment.raw(message.$content)}`)
44
- plugin.dispatch(`message.${message.$channel.type}.receive`,message)
45
- }
46
- async $connect(): Promise<void> {
47
- this.on('message',this.handleIcqqMessage.bind(this))
48
- this.on('system.login.device',async (e:unknown)=>{
49
- await this.sendSmsCode()
50
- plugin.logger.info('请输入短信验证码:')
51
- process.stdin.once('data',(data)=>{
52
- this.submitSmsCode(data.toString().trim())
53
- })
54
- })
55
- this.on('system.login.qrcode',(e)=>{
56
- plugin.logger.info(`取码地址:${e.image}\n请扫码完成后回车继续:`)
57
- process.stdin.once('data',()=>{
58
- this.login()
59
- })
60
- })
61
- this.on('system.login.slider',(e)=>{
62
- plugin.logger.info(`取码地址:${e.url}\n请输入滑块验证ticket:`)
63
- process.stdin.once('data',(e)=>{
64
- this.submitSlider(e.toString().trim())
65
- })
66
- })
67
- return new Promise((resolve)=>{
68
- this.once('system.online',()=>{
69
- this.$connected=true;
70
- resolve()
71
- })
72
- this.login(Number(this.$config.name),this.$config.password)
73
- })
74
- }
75
43
 
76
- async $disconnect(): Promise<void> {
77
- await this.logout()
78
- this.$connected=false;
79
- }
80
- $formatMessage(msg:PrivateMessageEvent|GroupMessageEvent){
81
- const result= Message.from(msg,{
82
- $id: msg.message_id.toString(),
83
- $adapter:'icqq',
84
- $bot:`${this.$config.name}`,
85
- $sender:{
86
- id:msg.sender.user_id.toString(),
87
- name:msg.sender.nickname.toString(),
88
- },
89
- $channel:{
90
- id:msg.message_type==='group'?msg.group_id.toString():msg.from_id.toString(),
91
- type:msg.message_type
92
- },
93
- $content: IcqqBot.toSegments(msg.message),
94
- $raw: msg.raw_message,
95
- $timestamp: msg.time,
96
- $recall: async () => {
97
- await this.$recallMessage(result.$id)
98
- },
99
- $reply:async (content: SendContent, quote?: boolean|string):Promise<string>=> {
100
- if(!Array.isArray(content)) content=[content];
101
- if(quote) content.unshift({type:'reply',data:{id:typeof quote==="boolean"?result.$id:quote}})
102
- return await this.$sendMessage({
103
- ...result.$channel,
104
- context:'icqq',
105
- bot:`${this.uin}`,
106
- content
107
- })
108
- }
109
- })
110
- return result
111
- }
112
- async $recallMessage(id:string):Promise<void> {
113
- await this.deleteMsg(id)
114
- }
115
- async $sendMessage(options: SendOptions): Promise<string> {
116
- options=await plugin.app.handleBeforeSend(options)
117
- switch (options.type){
118
- case 'private':{
119
- const result= await this.sendPrivateMsg(Number(options.id),IcqqBot.toSendable(options.content))
120
- plugin.logger.info(`${this.$config.name} send ${options.type}(${options.id}):${segment.raw(options.content)}`)
121
- return result.message_id.toString()
122
- break;
123
- }
124
- case "group":{
125
- const result=await this.sendGroupMsg(Number(options.id),IcqqBot.toSendable(options.content))
126
- plugin.logger.info(`${this.$config.name} send ${options.type}(${options.id}):${segment.raw(options.content)}`)
127
- return result.message_id.toString()
128
- break;
129
- }
130
- default:
131
- throw new Error(`unsupported channel type ${options.type}`)
132
- }
44
+ export class IcqqBot extends Client implements Bot<IcqqBotConfig, PrivateMessageEvent | GroupMessageEvent> {
45
+ $connected: boolean = false;
46
+
47
+ get $id() {
48
+ return this.$config.name;
49
+ }
50
+
51
+ constructor(public adapter: IcqqAdapter, config: IcqqBotConfig) {
52
+ if (!config.scope) config.scope = "icqqjs";
53
+ if (!config.data_dir) config.data_dir = path.join(process.cwd(), "data");
54
+ if (config.scope.startsWith("@")) config.scope = config.scope.slice(1);
55
+ super(config);
56
+ this.$config = config;
57
+ }
58
+
59
+ private handleIcqqMessage(msg: PrivateMessageEvent | GroupMessageEvent): void {
60
+ const message = this.$formatMessage(msg);
61
+ this.adapter.emit("message.receive", message);
62
+ plugin.logger.debug(`${this.$config.name} recv ${message.$channel.type}(${message.$channel.id}):${segment.raw(message.$content)}`);
63
+ }
64
+
65
+ async $connect(): Promise<void> {
66
+ this.on("message", this.handleIcqqMessage.bind(this));
67
+ this.on("system.login.device", async (e: unknown) => {
68
+ await this.sendSmsCode();
69
+ plugin.logger.info("请输入短信验证码:");
70
+ process.stdin.once("data", (data) => {
71
+ this.submitSmsCode(data.toString().trim());
72
+ });
73
+ });
74
+ this.on("system.login.qrcode", (e) => {
75
+ plugin.logger.info(`取码地址:${e.image}\n请扫码完成后回车继续:`);
76
+ process.stdin.once("data", () => {
77
+ this.login();
78
+ });
79
+ });
80
+ this.on("system.login.slider", (e) => {
81
+ plugin.logger.info(`取码地址:${e.url}\n请输入滑块验证ticket:`);
82
+ process.stdin.once("data", (e) => {
83
+ this.submitSlider(e.toString().trim());
84
+ });
85
+ });
86
+ return new Promise((resolve) => {
87
+ this.once("system.online", () => {
88
+ this.$connected = true;
89
+ resolve();
90
+ });
91
+ this.login(Number(this.$config.name), this.$config.password);
92
+ });
93
+ }
94
+
95
+ async $disconnect(): Promise<void> {
96
+ await this.logout();
97
+ this.$connected = false;
98
+ }
99
+
100
+ $formatMessage(msg: PrivateMessageEvent | GroupMessageEvent) {
101
+ const result = Message.from(msg, {
102
+ $id: msg.message_id.toString(),
103
+ $adapter: "icqq" as const,
104
+ $bot: `${this.$config.name}`,
105
+ $sender: {
106
+ id: msg.sender.user_id.toString(),
107
+ name: msg.sender.nickname.toString(),
108
+ },
109
+ $channel: {
110
+ id: msg.message_type === "group" ? msg.group_id.toString() : msg.from_id.toString(),
111
+ type: msg.message_type,
112
+ },
113
+ $content: IcqqBot.toSegments(msg.message),
114
+ $raw: msg.raw_message,
115
+ $timestamp: msg.time,
116
+ $recall: async () => {
117
+ await this.$recallMessage(result.$id);
118
+ },
119
+ $reply: async (content: SendContent, quote?: boolean | string): Promise<string> => {
120
+ if (!Array.isArray(content)) content = [content];
121
+ if (quote) content.unshift({ type: "reply", data: { id: typeof quote === "boolean" ? result.$id : quote } });
122
+ return await this.$sendMessage({
123
+ ...result.$channel,
124
+ context: "icqq",
125
+ bot: `${this.uin}`,
126
+ content,
127
+ });
128
+ },
129
+ });
130
+ return result;
131
+ }
132
+
133
+ async $recallMessage(id: string): Promise<void> {
134
+ await this.deleteMsg(id);
135
+ }
136
+
137
+ async $sendMessage(options: SendOptions): Promise<string> {
138
+ switch (options.type) {
139
+ case "private": {
140
+ const result = await this.sendPrivateMsg(Number(options.id), IcqqBot.toSendable(options.content));
141
+ plugin.logger.debug(`${this.$config.name} send ${options.type}(${options.id}):${segment.raw(options.content)}`);
142
+ return result.message_id.toString();
143
+ }
144
+ case "group": {
145
+ const result = await this.sendGroupMsg(Number(options.id), IcqqBot.toSendable(options.content));
146
+ plugin.logger.debug(`${this.$config.name} send ${options.type}(${options.id}):${segment.raw(options.content)}`);
147
+ return result.message_id.toString();
148
+ }
149
+ default:
150
+ throw new Error(`unsupported channel type ${options.type}`);
133
151
  }
152
+ }
153
+ }
154
+
155
+ export namespace IcqqBot {
156
+ const allowTypes = ["text", "face", "image", "record", "audio", "dice", "rps", "video", "file", "location", "share", "json", "at", "reply", "long_msg", "button", "markdown", "xml"];
134
157
 
158
+ export function toSegments(message: Sendable): MessageSegment[] {
159
+ if (!Array.isArray(message)) message = [message];
160
+ return message
161
+ .filter((item, index) => {
162
+ return typeof item === "string" || item.type !== "long_msg" || index !== 0;
163
+ })
164
+ .map((item): MessageSegment => {
165
+ if (typeof item === "string") return { type: "text", data: { text: item } };
166
+ const { type, ...data } = item;
167
+ return { type, data };
168
+ });
169
+ }
170
+
171
+ export function toSendable(content: SendContent): Sendable {
172
+ if (!Array.isArray(content)) content = [content];
173
+ return content.map((seg): MessageElem => {
174
+ if (typeof seg === "string") return { type: "text", text: seg };
175
+ let { type, data } = seg;
176
+ if (typeof type === "function") type = type.name;
177
+ if (!allowTypes.includes(type)) return { type: "text", text: segment.toString(seg) };
178
+ return { type, ...data } as MessageElem;
179
+ });
180
+ }
135
181
  }
136
- export namespace IcqqBot{
137
- const allowTypes=[
138
- 'text',
139
- 'face',
140
- 'image',
141
- 'record',
142
- 'audio',
143
- 'dice',
144
- 'rps',
145
- 'video',
146
- 'file',
147
- 'location',
148
- 'share',
149
- 'json',
150
- 'at',
151
- 'reply',
152
- 'long_msg',
153
- 'button',
154
- 'markdown',
155
- 'xml',
156
- ]
157
- export function toSegments(message:Sendable):MessageSegment[]{
158
- if(!Array.isArray(message)) message=[message]
159
- return message.filter((item,index)=>{
160
- return typeof item==="string"||(item.type!=='long_msg'||index!==0)
161
- }).map((item):MessageSegment=>{
162
- if(typeof item==="string") return {type:'text',data:{text:item}}
163
- const {type,...data}=item
164
- return {type,data}
165
- })
166
- }
167
- export function toSendable(content:SendContent):Sendable{
168
- if(!Array.isArray(content)) content=[content]
169
- return content.map((seg):MessageElem=>{
170
- if(typeof seg==="string") return {type:'text',text:seg}
171
- let {type,data}=seg
172
- if(typeof type==='function') type=type.name
173
- if(!allowTypes.includes(type)) return {type:'text',text:segment.toString(seg)}
174
- return {type,...data} as MessageElem
175
- })
176
- }
182
+
183
+ class IcqqAdapter extends Adapter<IcqqBot> {
184
+ constructor(plugin: Plugin) {
185
+ super(plugin, "icqq", []);
186
+ }
187
+
188
+ createBot(config: IcqqBotConfig): IcqqBot {
189
+ return new IcqqBot(this, config);
190
+ }
177
191
  }
178
- registerAdapter(new Adapter('icqq',IcqqBot))
179
-
180
- useContext('web', (web) => {
181
- // 注册ICQQ适配器的客户端入口文件
182
- const dispose = web.addEntry({
183
- production: path.resolve(import.meta.dirname, '../dist/index.js'),
184
- development: path.resolve(import.meta.dirname, '../client/index.tsx')
185
- })
186
- return dispose
192
+
193
+ const { provide } = usePlugin();
194
+
195
+ provide({
196
+ name: "icqq",
197
+ description: "ICQQ Adapter",
198
+ mounted: async (p) => {
199
+ const adapter = new IcqqAdapter(p);
200
+ await adapter.start();
201
+ return adapter;
202
+ },
203
+ dispose: async (adapter) => {
204
+ await adapter.stop();
205
+ },
206
+ });
207
+
208
+ useContext("web", (web: any) => {
209
+ // 注册ICQQ适配器的客户端入口文件
210
+ const dispose = web.addEntry({
211
+ production: path.resolve(import.meta.dirname, "../dist/index.js"),
212
+ development: path.resolve(import.meta.dirname, "../client/index.tsx"),
213
+ });
214
+ return dispose;
187
215
  });
188
- useContext('router','icqq', (router,icqq) => {
189
- router.get('/api/icqq/bots', async (ctx) => {
216
+
217
+ useContext("router", async (router: Router) => {
218
+ const icqq = plugin.root.inject("icqq") as IcqqAdapter;
219
+ router.get("/api/icqq/bots", async (ctx: any) => {
220
+ try {
221
+ const bots = Array.from(icqq.bots.values());
222
+
223
+ if (bots.length === 0) {
224
+ ctx.body = {
225
+ success: true,
226
+ data: [],
227
+ message: "暂无ICQQ机器人实例",
228
+ };
229
+ return;
230
+ }
231
+
232
+ const result = bots.map((bot) => {
190
233
  try {
191
- const bots = Array.from(icqq.bots.values())
192
-
193
- if (bots.length === 0) {
194
- ctx.body = {
195
- success: true,
196
- data: [],
197
- message: '暂无ICQQ机器人实例'
198
- }
199
- return
200
- }
201
-
202
- const result = bots.map(bot => {
203
- try {
204
- return {
205
- name: bot.$config.name,
206
- connected: bot.$connected || false,
207
- groupCount: bot.gl?.size || 0,
208
- friendCount: bot.fl?.size || 0,
209
- receiveCount: bot.stat?.recv_msg_cnt || 0,
210
- sendCount: bot.stat?.sent_msg_cnt || 0,
211
- loginMode: bot.$config.password ? 'password' : 'qrcode',
212
- status: bot.$connected ? 'online' : 'offline',
213
- lastActivity: new Date().toISOString()
214
- }
215
- } catch (botError) {
216
- // 单个机器人数据获取失败时的处理
217
- // 获取机器人数据失败,返回错误状态
218
- return {
219
- name: bot.$config.name,
220
- connected: false,
221
- groupCount: 0,
222
- friendCount: 0,
223
- receiveCount: 0,
224
- sendCount: 0,
225
- loginMode: 'unknown',
226
- status: 'error',
227
- error: '数据获取失败'
228
- }
229
- }
230
- })
231
-
232
- ctx.body = {
233
- success: true,
234
- data: result,
235
- timestamp: new Date().toISOString()
236
- }
237
- } catch (error) {
238
- // ICQQ API调用失败
239
-
240
- ctx.status = 500
241
- ctx.body = {
242
- success: false,
243
- error: 'ICQQ_API_ERROR',
244
- message: '获取机器人数据失败',
245
- details: process.env.NODE_ENV === 'development' ? (error as Error).message : undefined,
246
- timestamp: new Date().toISOString()
247
- }
234
+ return {
235
+ name: bot.$config.name,
236
+ connected: bot.$connected || false,
237
+ groupCount: bot.gl?.size || 0,
238
+ friendCount: bot.fl?.size || 0,
239
+ receiveCount: bot.stat?.recv_msg_cnt || 0,
240
+ sendCount: bot.stat?.sent_msg_cnt || 0,
241
+ loginMode: bot.$config.password ? "password" : "qrcode",
242
+ status: bot.$connected ? "online" : "offline",
243
+ lastActivity: new Date().toISOString(),
244
+ };
245
+ } catch (botError) {
246
+ // 单个机器人数据获取失败时的处理
247
+ return {
248
+ name: bot.$config.name,
249
+ connected: false,
250
+ groupCount: 0,
251
+ friendCount: 0,
252
+ receiveCount: 0,
253
+ sendCount: 0,
254
+ loginMode: "unknown",
255
+ status: "error",
256
+ error: "数据获取失败",
257
+ };
248
258
  }
249
- })
250
- })
259
+ });
260
+
261
+ ctx.body = {
262
+ success: true,
263
+ data: result,
264
+ timestamp: new Date().toISOString(),
265
+ };
266
+ } catch (error) {
267
+ ctx.status = 500;
268
+ ctx.body = {
269
+ success: false,
270
+ error: "ICQQ_API_ERROR",
271
+ message: "获取机器人数据失败",
272
+ details: process.env.NODE_ENV === "development" ? (error as Error).message : undefined,
273
+ timestamp: new Date().toISOString(),
274
+ };
275
+ }
276
+ });
277
+ });