kook-client 1.0.0
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/LICENSE +21 -0
- package/README.md +51 -0
- package/lib/client.js +222 -0
- package/lib/constans.js +27 -0
- package/lib/core/baseClient.js +166 -0
- package/lib/core/receiver.js +88 -0
- package/lib/core/receivers/index.js +7 -0
- package/lib/core/receivers/webhook.js +18 -0
- package/lib/core/receivers/websocket.js +267 -0
- package/lib/elements.js +342 -0
- package/lib/entries/channel.js +137 -0
- package/lib/entries/channelMember.js +31 -0
- package/lib/entries/contact.js +9 -0
- package/lib/entries/guild.js +139 -0
- package/lib/entries/guildMember.js +73 -0
- package/lib/entries/user.js +115 -0
- package/lib/event/index.js +17 -0
- package/lib/event/message.js +86 -0
- package/lib/index.d.ts +958 -0
- package/lib/index.js +23 -0
- package/lib/message.js +173 -0
- package/lib/tsconfig.build.tsbuildinfo +1 -0
- package/lib/types.js +2 -0
- package/lib/utils.js +124 -0
- package/package.json +57 -0
package/lib/index.d.ts
ADDED
|
@@ -0,0 +1,958 @@
|
|
|
1
|
+
import * as log4js from 'log4js';
|
|
2
|
+
import { EventEmitter } from 'events';
|
|
3
|
+
import { BinaryLike } from 'crypto';
|
|
4
|
+
import { Stream } from 'node:stream';
|
|
5
|
+
import { AxiosInstance } from 'axios';
|
|
6
|
+
export type Dict<T = any, K extends string | symbol = string> = Record<K, T>;
|
|
7
|
+
export type LogLevel = "trace" | "debug" | "info" | "warn" | "error" | "fatal" | "mark" | "off";
|
|
8
|
+
export enum OpCode {
|
|
9
|
+
Event = 0,// 服务端进行消息推送
|
|
10
|
+
Hello = 1,// 客户端发送心跳
|
|
11
|
+
Ping = 2,// 心跳包
|
|
12
|
+
Pong = 3,// 心跳回包
|
|
13
|
+
Reconnect = 5,// 需要重连
|
|
14
|
+
ResumeAck = 6
|
|
15
|
+
}
|
|
16
|
+
export const UnsupportedMethodError: Error;
|
|
17
|
+
export enum ChannelType {
|
|
18
|
+
Channel = "GROUP",
|
|
19
|
+
Private = "PERSON",
|
|
20
|
+
Notice = "BROADCAST"
|
|
21
|
+
}
|
|
22
|
+
export enum NotifyType {
|
|
23
|
+
Default = 0,
|
|
24
|
+
All = 1,
|
|
25
|
+
At = 2,
|
|
26
|
+
Off = 3
|
|
27
|
+
}
|
|
28
|
+
export abstract class Receiver extends EventEmitter {
|
|
29
|
+
#private;
|
|
30
|
+
c: BaseClient;
|
|
31
|
+
sn: number;
|
|
32
|
+
buffer: Receiver.EventPacket[];
|
|
33
|
+
compress?: boolean;
|
|
34
|
+
protected constructor(c: BaseClient);
|
|
35
|
+
reset(): void;
|
|
36
|
+
decryptData(data: string, key: string): string;
|
|
37
|
+
abstract connect(): Promise<void>;
|
|
38
|
+
abstract disconnect(): Promise<void>;
|
|
39
|
+
}
|
|
40
|
+
export namespace Receiver {
|
|
41
|
+
export type Mode = 'webhook' | 'websocket';
|
|
42
|
+
export type EventPacket<T = any> = {
|
|
43
|
+
s: OpCode;
|
|
44
|
+
d: T;
|
|
45
|
+
sn: number;
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* 信令[1] HELLO
|
|
49
|
+
*
|
|
50
|
+
* **方向:** server->client
|
|
51
|
+
*
|
|
52
|
+
* **说明:** 当我们成功连接websocket后,客户端应该在6s内收到该包,否则认为连接超时。
|
|
53
|
+
*
|
|
54
|
+
* | 状态码 | 含义 | 备注 |
|
|
55
|
+
* | - | - | - |
|
|
56
|
+
* | 0 | 成功 |
|
|
57
|
+
* | 40100 | 缺少参数 | |
|
|
58
|
+
* | 40101 | 无效的token | |
|
|
59
|
+
* | 40102 | token验证失败 | |
|
|
60
|
+
* | 40103 | token过期 | 需要重新连接 |
|
|
61
|
+
*/
|
|
62
|
+
export interface HelloPacket {
|
|
63
|
+
s: OpCode.Hello;
|
|
64
|
+
d: {
|
|
65
|
+
code: 0 | 40100 | 40101 | 40102 | 40103;
|
|
66
|
+
session_id?: string;
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* 信令[2] PING
|
|
71
|
+
*
|
|
72
|
+
* **方向:** client -> server
|
|
73
|
+
*
|
|
74
|
+
* **说明:** 每隔30s(随机-5,+5),将当前的最大 `sn` 传给服务端,客户端应该在6s内收到PONG, 否则心跳超时。
|
|
75
|
+
*
|
|
76
|
+
* **参数列表:**
|
|
77
|
+
*
|
|
78
|
+
* | 参数 | 描述 | 类型 | 必传 |
|
|
79
|
+
* | ---- | --------------------------------- | ---- | ---- |
|
|
80
|
+
* | sn | 客户端目前收到的最新的消息 **sn** | number | Y |
|
|
81
|
+
*/
|
|
82
|
+
export interface PingEvent {
|
|
83
|
+
s: OpCode.Ping;
|
|
84
|
+
sn: number;
|
|
85
|
+
}
|
|
86
|
+
export interface PongEvent {
|
|
87
|
+
s: OpCode.Pong;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* 信令[5] RECONNECT
|
|
91
|
+
* **方向:** server->client
|
|
92
|
+
*
|
|
93
|
+
* **说明:** 服务端通知客户端, 代表该连接已失效, 请重新连接。客户端收到后应该主动断开当前连接。
|
|
94
|
+
*
|
|
95
|
+
* **注意:** 客户端收到该信令代表因为某些原因导致当前连接已失效, 需要进行以下操作以避免消息丢失.
|
|
96
|
+
* 1. 重新获取 gateway;
|
|
97
|
+
* 2. 清空本地的 sn 计数;
|
|
98
|
+
* 3. 清空本地消息队列.
|
|
99
|
+
*
|
|
100
|
+
* | 状态码 | 描述 |
|
|
101
|
+
* | ------------ | --------------------------------------- |
|
|
102
|
+
* | 40106 | resume 失败, 缺少参数 |
|
|
103
|
+
* | 40107 | 当前 `session` 已过期 (resume 失败, PING的sn无效) |
|
|
104
|
+
* | 40108 | 无效的 `sn` , 或 `sn` 已经不存在 (resume 失败, PING的 `sn` 无效) |
|
|
105
|
+
*/
|
|
106
|
+
export interface ReconnectEvent {
|
|
107
|
+
s: OpCode.Reconnect;
|
|
108
|
+
d: {
|
|
109
|
+
code: 40106 | 40107 | 40108;
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
type Construct = new (...args: any[]) => Receiver;
|
|
113
|
+
export function register(mode: Mode, receiver: Construct): void;
|
|
114
|
+
export function create(mode: Mode, ...args: any[]): Receiver;
|
|
115
|
+
}
|
|
116
|
+
export class WebhookReceiver extends Receiver {
|
|
117
|
+
config: WebhookReceiver.Config;
|
|
118
|
+
constructor(client: BaseClient, config: WebhookReceiver.Config);
|
|
119
|
+
connect(): Promise<void>;
|
|
120
|
+
disconnect(): Promise<void>;
|
|
121
|
+
}
|
|
122
|
+
export namespace WebhookReceiver {
|
|
123
|
+
interface Config {
|
|
124
|
+
token: string;
|
|
125
|
+
encrypt_key: string;
|
|
126
|
+
verify_key: string;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
export class WebsocketReceiver extends Receiver {
|
|
130
|
+
config: WebsocketReceiver.Config;
|
|
131
|
+
private _state;
|
|
132
|
+
private ws;
|
|
133
|
+
private url;
|
|
134
|
+
private session_id;
|
|
135
|
+
private readonly timers;
|
|
136
|
+
private readonly pingJitterRange;
|
|
137
|
+
private readonly pingBaseInterval;
|
|
138
|
+
private readonly helloTimeout;
|
|
139
|
+
private reconnectAttempts;
|
|
140
|
+
private maxReconnectAttempts;
|
|
141
|
+
private reconnectBaseDelay;
|
|
142
|
+
private reconnectTimer;
|
|
143
|
+
private lastPongTime;
|
|
144
|
+
private heartbeatTimeout;
|
|
145
|
+
constructor(client: BaseClient, config: WebsocketReceiver.Config);
|
|
146
|
+
get state(): WebsocketReceiver.State;
|
|
147
|
+
private set state(value);
|
|
148
|
+
get logger(): import("log4js").Logger;
|
|
149
|
+
private getGatewayUrl;
|
|
150
|
+
private waitForHello;
|
|
151
|
+
private sendPing;
|
|
152
|
+
private setupEventListeners;
|
|
153
|
+
private cleanup;
|
|
154
|
+
private getResumeQueryParams;
|
|
155
|
+
private scheduleReconnect;
|
|
156
|
+
reconnect(): Promise<void>;
|
|
157
|
+
private setupNetworkMonitoring;
|
|
158
|
+
connect(isReconnect?: boolean): Promise<void>;
|
|
159
|
+
disconnect(): Promise<void>;
|
|
160
|
+
}
|
|
161
|
+
export namespace WebsocketReceiver {
|
|
162
|
+
interface Config {
|
|
163
|
+
token: string;
|
|
164
|
+
compress?: boolean;
|
|
165
|
+
encrypt_key?: string;
|
|
166
|
+
}
|
|
167
|
+
enum State {
|
|
168
|
+
Initial = 0,
|
|
169
|
+
PullingGateway = 1,
|
|
170
|
+
Connecting = 2,
|
|
171
|
+
Open = 3,
|
|
172
|
+
Closed = 4,
|
|
173
|
+
Reconnection = 5
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
function validateCard(card: Segment<'card'>): void;
|
|
177
|
+
type ElementMap = {
|
|
178
|
+
'plain-text': {
|
|
179
|
+
content: string;
|
|
180
|
+
emoji?: boolean;
|
|
181
|
+
};
|
|
182
|
+
'kmarkdown': {
|
|
183
|
+
content: string;
|
|
184
|
+
};
|
|
185
|
+
'image': {
|
|
186
|
+
src: string;
|
|
187
|
+
alt?: string;
|
|
188
|
+
size?: 'sm' | 'lg';
|
|
189
|
+
circle?: boolean;
|
|
190
|
+
fallbackUrl?: string;
|
|
191
|
+
};
|
|
192
|
+
'button': {
|
|
193
|
+
theme: 'primary' | 'warning' | 'danger' | 'info' | 'success' | 'secondary' | 'none';
|
|
194
|
+
value: string;
|
|
195
|
+
click?: 'link' | 'return-val';
|
|
196
|
+
text: string;
|
|
197
|
+
};
|
|
198
|
+
'paragraph': {
|
|
199
|
+
cols: 1 | 2 | 3;
|
|
200
|
+
fields: (TextElement | MarkdownElement)[];
|
|
201
|
+
};
|
|
202
|
+
};
|
|
203
|
+
type ModuleMap = {
|
|
204
|
+
'header': {
|
|
205
|
+
text: TextElement;
|
|
206
|
+
};
|
|
207
|
+
'section': {
|
|
208
|
+
text?: TextElement | MarkdownElement | ParagraphElement;
|
|
209
|
+
mode: 'left' | 'right';
|
|
210
|
+
accessory?: ImageElement | ButtonElement;
|
|
211
|
+
};
|
|
212
|
+
'image-group': {
|
|
213
|
+
elements: ImageElement[];
|
|
214
|
+
};
|
|
215
|
+
'container': {
|
|
216
|
+
elements: ImageElement[];
|
|
217
|
+
};
|
|
218
|
+
'action-group': {
|
|
219
|
+
elements: ButtonElement[];
|
|
220
|
+
};
|
|
221
|
+
'context': {
|
|
222
|
+
elements: (TextElement | MarkdownElement | ImageElement)[];
|
|
223
|
+
};
|
|
224
|
+
'divider': {};
|
|
225
|
+
'file': {
|
|
226
|
+
src: string;
|
|
227
|
+
title: string;
|
|
228
|
+
};
|
|
229
|
+
'audio': {
|
|
230
|
+
src: string;
|
|
231
|
+
title: string;
|
|
232
|
+
cover?: string;
|
|
233
|
+
};
|
|
234
|
+
'video': {
|
|
235
|
+
src: string;
|
|
236
|
+
title: string;
|
|
237
|
+
};
|
|
238
|
+
'countdown': {
|
|
239
|
+
startTime?: number;
|
|
240
|
+
endTime: number;
|
|
241
|
+
mode: 'day' | 'hour' | 'second';
|
|
242
|
+
};
|
|
243
|
+
'invite': {
|
|
244
|
+
code: string;
|
|
245
|
+
};
|
|
246
|
+
};
|
|
247
|
+
type CardMap = {
|
|
248
|
+
'card': {
|
|
249
|
+
theme?: 'primary' | 'warning' | 'danger' | 'info' | 'success' | 'secondary' | 'none' | 'invisible';
|
|
250
|
+
color?: string;
|
|
251
|
+
size?: 'sm' | 'lg';
|
|
252
|
+
modules: Module[];
|
|
253
|
+
};
|
|
254
|
+
};
|
|
255
|
+
export type ElementType = keyof ElementMap;
|
|
256
|
+
export type Element<T extends ElementType = ElementType> = {
|
|
257
|
+
type: T;
|
|
258
|
+
} & ElementMap[T];
|
|
259
|
+
export type TextElement = Element<'plain-text'>;
|
|
260
|
+
export type MarkdownElement = Element<'kmarkdown'>;
|
|
261
|
+
export type ImageElement = Element<'image'>;
|
|
262
|
+
export type ButtonElement = Element<'button'>;
|
|
263
|
+
export type ParagraphElement = Element<'paragraph'>;
|
|
264
|
+
export type ModuleType = keyof ModuleMap;
|
|
265
|
+
export type Module<T extends ModuleType = ModuleType> = {
|
|
266
|
+
type: T;
|
|
267
|
+
} & ModuleMap[T];
|
|
268
|
+
export type HeaderModule = Module<'header'>;
|
|
269
|
+
export type SectionModule = Module<'section'>;
|
|
270
|
+
export type ImageModule = Module<'image-group'>;
|
|
271
|
+
export type ContainerModule = Module<'container'>;
|
|
272
|
+
export type ActionModule = Module<'action-group'>;
|
|
273
|
+
export type ContextModule = Module<'context'>;
|
|
274
|
+
export type DividerModule = Module<'divider'>;
|
|
275
|
+
export type FileModule = Module<'file'> | Module<'audio'> | Module<'video'>;
|
|
276
|
+
export type CountdownModule = Module<'countdown'>;
|
|
277
|
+
export type InviteModule = Module<'invite'>;
|
|
278
|
+
export type CardType = keyof CardMap;
|
|
279
|
+
export type Card<T extends CardType = CardType> = {
|
|
280
|
+
type: T;
|
|
281
|
+
} & CardMap[T];
|
|
282
|
+
export type ElementGenerator = {
|
|
283
|
+
<T extends ElementType = ElementType>(type: T, data: ElementMap[T]): Element<T>;
|
|
284
|
+
text(content: string, emoji?: boolean): TextElement;
|
|
285
|
+
markdown(content: string): MarkdownElement;
|
|
286
|
+
image(src: string, alt?: string, size?: 'sm' | 'lg', circle?: boolean, fallbackUrl?: string): ImageElement;
|
|
287
|
+
button(text: string, value: string, theme?: 'primary' | 'warning' | 'danger' | 'info' | 'success' | 'secondary' | 'none', click?: 'link' | 'return-val'): ButtonElement;
|
|
288
|
+
paragraph(cols: 1 | 2 | 3, fields: (TextElement | MarkdownElement)[]): ParagraphElement;
|
|
289
|
+
};
|
|
290
|
+
export const element: ElementGenerator;
|
|
291
|
+
export type ModuleGenerator = {
|
|
292
|
+
<T extends ModuleType = ModuleType>(type: T, data: ModuleMap[T]): Module<T>;
|
|
293
|
+
header(text: TextElement): HeaderModule;
|
|
294
|
+
section(text?: TextElement | MarkdownElement | ParagraphElement, mode?: 'left' | 'right', accessory?: ImageElement | ButtonElement): SectionModule;
|
|
295
|
+
image(elements: ImageElement[]): ImageModule;
|
|
296
|
+
container(elements: ImageElement[]): ContainerModule;
|
|
297
|
+
action(elements: ButtonElement[]): ActionModule;
|
|
298
|
+
context(elements: (TextElement | MarkdownElement | ImageElement)[]): ContextModule;
|
|
299
|
+
divider(): DividerModule;
|
|
300
|
+
file(src: string, title: string): FileModule;
|
|
301
|
+
audio(src: string, title: string, cover?: string): FileModule;
|
|
302
|
+
video(src: string, title: string): FileModule;
|
|
303
|
+
countdown(endTime: number, mode?: 'day' | 'hour' | 'second', startTime?: number): CountdownModule;
|
|
304
|
+
invite(code: string): InviteModule;
|
|
305
|
+
};
|
|
306
|
+
export const msgMod: ModuleGenerator;
|
|
307
|
+
type SegmentMap = {
|
|
308
|
+
'text': {
|
|
309
|
+
text: string;
|
|
310
|
+
};
|
|
311
|
+
'at': {
|
|
312
|
+
user_id: string;
|
|
313
|
+
};
|
|
314
|
+
'card': {
|
|
315
|
+
theme?: 'primary' | 'warning' | 'danger' | 'info' | 'success' | 'secondary' | 'none' | 'invisible';
|
|
316
|
+
color?: string;
|
|
317
|
+
size?: 'sm' | 'lg';
|
|
318
|
+
modules: Module[];
|
|
319
|
+
};
|
|
320
|
+
'image': {
|
|
321
|
+
url: string;
|
|
322
|
+
title?: string;
|
|
323
|
+
};
|
|
324
|
+
'video': {
|
|
325
|
+
url: string;
|
|
326
|
+
title?: string;
|
|
327
|
+
};
|
|
328
|
+
'audio': {
|
|
329
|
+
url: string;
|
|
330
|
+
title?: string;
|
|
331
|
+
};
|
|
332
|
+
'markdown': {
|
|
333
|
+
text: string;
|
|
334
|
+
};
|
|
335
|
+
'reply': {
|
|
336
|
+
id: string;
|
|
337
|
+
};
|
|
338
|
+
'file': {
|
|
339
|
+
url: string;
|
|
340
|
+
name?: string;
|
|
341
|
+
file_type?: string;
|
|
342
|
+
size?: number;
|
|
343
|
+
};
|
|
344
|
+
};
|
|
345
|
+
export type SegmentType = keyof SegmentMap;
|
|
346
|
+
export type Segment<T extends SegmentType = SegmentType> = {
|
|
347
|
+
type: T;
|
|
348
|
+
} & SegmentMap[T];
|
|
349
|
+
export type TextSegment = Segment<'text'>;
|
|
350
|
+
export type AtSegment = Segment<'at'>;
|
|
351
|
+
export type CardSegment = Segment<'card'>;
|
|
352
|
+
export type ImageSegment = Segment<'image'>;
|
|
353
|
+
export type AudioSegment = Segment<'audio'>;
|
|
354
|
+
export type VideoSegment = Segment<'video'>;
|
|
355
|
+
export type MarkdownSegment = Segment<'markdown'>;
|
|
356
|
+
export type ReplySegment = Segment<'reply'>;
|
|
357
|
+
export type FileSegment = Segment<'file'>;
|
|
358
|
+
export type Quotable = {
|
|
359
|
+
message_id: string;
|
|
360
|
+
};
|
|
361
|
+
export type MessageSegment = AtSegment | TextSegment | ImageSegment | MarkdownSegment | ReplySegment | FileSegment | CardSegment | VideoSegment | AudioSegment;
|
|
362
|
+
export type Sendable = string | MessageSegment | Array<string | MessageSegment>;
|
|
363
|
+
export type SegmentGenerator = {
|
|
364
|
+
<T extends SegmentType>(type: T, attrs: SegmentMap[T]): Segment<T>;
|
|
365
|
+
text(text: string): TextSegment;
|
|
366
|
+
at(user_id: string): AtSegment;
|
|
367
|
+
card(modules: Module[], options?: {
|
|
368
|
+
theme?: CardMap['card']['theme'];
|
|
369
|
+
color?: string;
|
|
370
|
+
size?: 'sm' | 'lg';
|
|
371
|
+
}): CardSegment;
|
|
372
|
+
image(url: string, title?: string): ImageSegment;
|
|
373
|
+
video(url: string, title?: string): VideoSegment;
|
|
374
|
+
audio(url: string, title?: string): AudioSegment;
|
|
375
|
+
markdown(text: string): MarkdownSegment;
|
|
376
|
+
reply(message_id: string): ReplySegment;
|
|
377
|
+
file(url: string, name?: string, file_type?: string, size?: number): FileSegment;
|
|
378
|
+
};
|
|
379
|
+
export const segment: SegmentGenerator;
|
|
380
|
+
export { validateCard };
|
|
381
|
+
export const toObject: <T = any>(data: any) => T;
|
|
382
|
+
/** md5 hash */
|
|
383
|
+
export const md5: (data: BinaryLike) => string;
|
|
384
|
+
export function isEmpty<T>(data: T): boolean;
|
|
385
|
+
export function genGroupId(guild_id: string, channel_id: string): string;
|
|
386
|
+
export function parseGroupId(group_id: string): {
|
|
387
|
+
guild_id: string;
|
|
388
|
+
channel_id: string;
|
|
389
|
+
};
|
|
390
|
+
export function remove<T>(list: T[], item: T): void;
|
|
391
|
+
/**
|
|
392
|
+
* create stream from local file
|
|
393
|
+
* @param filepath {string} filepath
|
|
394
|
+
*/
|
|
395
|
+
export function createLocalFileStream(filepath: string): Promise<Stream>;
|
|
396
|
+
/**
|
|
397
|
+
* create stream from remote url
|
|
398
|
+
* @param url {string} remote url
|
|
399
|
+
*/
|
|
400
|
+
export function createRemoteFileStream(url: string): Promise<Stream>;
|
|
401
|
+
export function getFile(file: string | Buffer): Promise<Buffer | Stream>;
|
|
402
|
+
export abstract class Contact {
|
|
403
|
+
c: Client;
|
|
404
|
+
protected constructor(c: Client);
|
|
405
|
+
abstract sendMsg(message: Sendable, quote?: Quotable): Promise<Message.Ret>;
|
|
406
|
+
abstract updateMsg(message_id: string, newMessage: Sendable, quote?: Quotable): Promise<boolean>;
|
|
407
|
+
abstract recallMsg(message_id: string): Promise<boolean>;
|
|
408
|
+
abstract getMsg(message_id: string): Promise<Message>;
|
|
409
|
+
}
|
|
410
|
+
export class User extends Contact {
|
|
411
|
+
info: User.Info;
|
|
412
|
+
constructor(c: Client, info: User.Info);
|
|
413
|
+
sendMsg(message: Sendable, quote?: Quotable): Promise<Message.Ret>;
|
|
414
|
+
recallMsg(message_id: string): Promise<boolean>;
|
|
415
|
+
getMsgReactions(message_id: string, emoji?: string): Promise<User.Info[]>;
|
|
416
|
+
addMsgReaction(message_id: string, emoji: string): Promise<void>;
|
|
417
|
+
deleteMsgReaction(message_id: string, emoji: string, user_id?: string): Promise<void>;
|
|
418
|
+
updateMsg(message_id: string, newMessage: Sendable, quote?: Quotable): Promise<boolean>;
|
|
419
|
+
/**
|
|
420
|
+
* 获取指定消息之前的聊天历史
|
|
421
|
+
* @param message_id {string} 消息id 不传则查询最新消息
|
|
422
|
+
* @param len {number} 获取的聊天历史长度 默认50条
|
|
423
|
+
*/
|
|
424
|
+
getChatHistory(message_id?: string, len?: number): Promise<Message[]>;
|
|
425
|
+
getMsg(message_id: string): Promise<Message>;
|
|
426
|
+
asGuildMember(guild_id: string): GuildMember;
|
|
427
|
+
asChannelMember(channel_id: string): ChannelMember;
|
|
428
|
+
}
|
|
429
|
+
export namespace User {
|
|
430
|
+
const map: WeakMap<Info, User>;
|
|
431
|
+
function as(this: Client, user_id: string, from_id?: never): User;
|
|
432
|
+
interface Info {
|
|
433
|
+
/**
|
|
434
|
+
* 用户id
|
|
435
|
+
*/
|
|
436
|
+
id: string;
|
|
437
|
+
/**
|
|
438
|
+
* 频道id
|
|
439
|
+
*/
|
|
440
|
+
guild_id?: string;
|
|
441
|
+
/**
|
|
442
|
+
* 用户名称
|
|
443
|
+
*/
|
|
444
|
+
username: string;
|
|
445
|
+
/**
|
|
446
|
+
* 用户昵称
|
|
447
|
+
*/
|
|
448
|
+
nickname: string;
|
|
449
|
+
/**
|
|
450
|
+
* 用户名认证数字
|
|
451
|
+
*/
|
|
452
|
+
identify_num: string;
|
|
453
|
+
/**
|
|
454
|
+
* 是否在线
|
|
455
|
+
*/
|
|
456
|
+
online: boolean;
|
|
457
|
+
/**
|
|
458
|
+
* 是否机器人
|
|
459
|
+
*/
|
|
460
|
+
bot: boolean;
|
|
461
|
+
/**
|
|
462
|
+
* 用户状态
|
|
463
|
+
*/
|
|
464
|
+
status: 1 | 0 | 10;
|
|
465
|
+
/**
|
|
466
|
+
* 用户头像
|
|
467
|
+
*/
|
|
468
|
+
avatar: string;
|
|
469
|
+
/**
|
|
470
|
+
* vip用户头像
|
|
471
|
+
*/
|
|
472
|
+
vip_avatar: string;
|
|
473
|
+
/**
|
|
474
|
+
* 是否验证了手机号
|
|
475
|
+
*/
|
|
476
|
+
mobile_verified: boolean;
|
|
477
|
+
roles: number[];
|
|
478
|
+
}
|
|
479
|
+
enum Permission {
|
|
480
|
+
normal = 1,
|
|
481
|
+
admin = 2,
|
|
482
|
+
owner = 4,
|
|
483
|
+
channelAdmin = 5
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
export class Channel extends Contact {
|
|
487
|
+
info: Channel.Info;
|
|
488
|
+
constructor(c: Client, info: Channel.Info);
|
|
489
|
+
update(newInfo: Omit<Channel.Info, 'id'>): Promise<void>;
|
|
490
|
+
delete(): Promise<void>;
|
|
491
|
+
addUsers(user_ids: string[]): Promise<boolean>;
|
|
492
|
+
getMsg(message_id: string): Promise<Message>;
|
|
493
|
+
getUserList(): Promise<User.Info[]>;
|
|
494
|
+
/**
|
|
495
|
+
* 获取指定消息之前的聊天历史
|
|
496
|
+
* @param message_id {string} 消息id 不传则查询最新消息
|
|
497
|
+
* @param len {number} 获取的聊天历史长度 默认50条
|
|
498
|
+
*/
|
|
499
|
+
getChatHistory(message_id?: string, len?: number): Promise<Message[]>;
|
|
500
|
+
sendMsg(message: Sendable, quote?: Quotable): Promise<Message.Ret>;
|
|
501
|
+
recallMsg(message_id: string): Promise<boolean>;
|
|
502
|
+
updateMsg(message_id: string, newMessage: Sendable, quote?: Quotable): Promise<boolean>;
|
|
503
|
+
getMsgReactions(message_id: string, emoji?: string): Promise<User.Info[]>;
|
|
504
|
+
addMsgReaction(message_id: string, emoji: string): Promise<void>;
|
|
505
|
+
deleteMsgReaction(message_id: string, emoji: string, user_id?: string): Promise<void>;
|
|
506
|
+
}
|
|
507
|
+
export namespace Channel {
|
|
508
|
+
const map: WeakMap<Info, Channel>;
|
|
509
|
+
function as(this: Client, channel_id: string): Channel;
|
|
510
|
+
interface Info {
|
|
511
|
+
/**
|
|
512
|
+
* 频道id
|
|
513
|
+
*/
|
|
514
|
+
id: string;
|
|
515
|
+
/**
|
|
516
|
+
* 创建者id
|
|
517
|
+
*/
|
|
518
|
+
user_id: string;
|
|
519
|
+
/**
|
|
520
|
+
* 频道名称
|
|
521
|
+
*/
|
|
522
|
+
/**
|
|
523
|
+
* 父分组频道id
|
|
524
|
+
*/
|
|
525
|
+
parent_id?: string;
|
|
526
|
+
name: string;
|
|
527
|
+
/**
|
|
528
|
+
* 频道类型
|
|
529
|
+
*/
|
|
530
|
+
type: ChannelType;
|
|
531
|
+
/**
|
|
532
|
+
* 频道排序
|
|
533
|
+
*/
|
|
534
|
+
level: number;
|
|
535
|
+
/**
|
|
536
|
+
* 人数限制
|
|
537
|
+
*/
|
|
538
|
+
limit_account: number;
|
|
539
|
+
is_category?: boolean;
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
export class Guild extends Contact {
|
|
543
|
+
info: Guild.Info;
|
|
544
|
+
constructor(c: Client, info: Guild.Info);
|
|
545
|
+
renew(): Promise<void>;
|
|
546
|
+
quit(): Promise<boolean>;
|
|
547
|
+
getRoleList(): Promise<Guild.Role[]>;
|
|
548
|
+
createRole(name: string): Promise<Guild.Role>;
|
|
549
|
+
updateRole(role_id: string, update_info: Partial<Omit<Guild.Role, 'id'>>): Promise<Guild.Role>;
|
|
550
|
+
deleteRole(role_id: string): Promise<boolean>;
|
|
551
|
+
kick(user_id: string): Promise<boolean>;
|
|
552
|
+
createChannel(channel_info: Omit<Channel.Info, 'id'>): Promise<Channel.Info>;
|
|
553
|
+
sendMsg(message: Sendable, quote?: Quotable): Promise<Message.Ret>;
|
|
554
|
+
recallMsg(message_id: string): Promise<boolean>;
|
|
555
|
+
updateMsg(message_id: string, newMessage: Sendable): Promise<boolean>;
|
|
556
|
+
getMsg(message_id: string): Promise<Message>;
|
|
557
|
+
}
|
|
558
|
+
export namespace Guild {
|
|
559
|
+
const map: WeakMap<Info, Guild>;
|
|
560
|
+
function as(this: Client, guild_id: string): Guild;
|
|
561
|
+
interface Info {
|
|
562
|
+
/**
|
|
563
|
+
* 服务器id
|
|
564
|
+
*/
|
|
565
|
+
id: string;
|
|
566
|
+
/**
|
|
567
|
+
* 服务器名称
|
|
568
|
+
*/
|
|
569
|
+
name: string;
|
|
570
|
+
/**
|
|
571
|
+
* 服务器主题
|
|
572
|
+
*/
|
|
573
|
+
topic: string;
|
|
574
|
+
/**
|
|
575
|
+
* 服务器主人id
|
|
576
|
+
*/
|
|
577
|
+
user_id: string;
|
|
578
|
+
/**
|
|
579
|
+
* icon url
|
|
580
|
+
*/
|
|
581
|
+
icon: string;
|
|
582
|
+
/**
|
|
583
|
+
* 通知类型
|
|
584
|
+
*/
|
|
585
|
+
notify_type: NotifyType;
|
|
586
|
+
/**
|
|
587
|
+
* 默认语音区域
|
|
588
|
+
*/
|
|
589
|
+
region: string;
|
|
590
|
+
/**
|
|
591
|
+
* 是否公开服务器
|
|
592
|
+
*/
|
|
593
|
+
enable_open: number;
|
|
594
|
+
/**
|
|
595
|
+
* 服务器公开id
|
|
596
|
+
*/
|
|
597
|
+
open_id?: number;
|
|
598
|
+
/**
|
|
599
|
+
* 默认频道
|
|
600
|
+
*/
|
|
601
|
+
default_channel_id?: string;
|
|
602
|
+
/**
|
|
603
|
+
* 欢迎频道
|
|
604
|
+
*/
|
|
605
|
+
welcome_channel_id?: string;
|
|
606
|
+
/**
|
|
607
|
+
* 助力数
|
|
608
|
+
*/
|
|
609
|
+
boost_num?: number;
|
|
610
|
+
/**
|
|
611
|
+
* 服务器等级
|
|
612
|
+
*/
|
|
613
|
+
level?: number;
|
|
614
|
+
}
|
|
615
|
+
interface Role {
|
|
616
|
+
role_id: number;
|
|
617
|
+
name: string;
|
|
618
|
+
color: number;
|
|
619
|
+
position: number;
|
|
620
|
+
hoist: number;
|
|
621
|
+
mentionable: number;
|
|
622
|
+
permissions: number;
|
|
623
|
+
}
|
|
624
|
+
enum Permission {
|
|
625
|
+
Admin = 1,
|
|
626
|
+
ManageGuild = 2,
|
|
627
|
+
ViewAdminLog = 4,
|
|
628
|
+
CreateGuildInvite = 8,
|
|
629
|
+
ManageInvite = 16,
|
|
630
|
+
ManageChannel = 32,
|
|
631
|
+
KickUser = 64,
|
|
632
|
+
BanUser = 128,
|
|
633
|
+
ManageCustomFace = 256,
|
|
634
|
+
UpdateGuildName = 512,
|
|
635
|
+
ManageRole = 1024,
|
|
636
|
+
ViewContentOrVoiceChannel = 2048,
|
|
637
|
+
PublishMsg = 4096,
|
|
638
|
+
ManageMsg = 8192,
|
|
639
|
+
UploadFile = 16384,
|
|
640
|
+
VoiceLink = 32768,
|
|
641
|
+
ManageVoice = 65536,
|
|
642
|
+
AtAll = 131072,
|
|
643
|
+
AddReaction = 262144,
|
|
644
|
+
FollowReaction = 524288,
|
|
645
|
+
PassiveLinkVoiceChannel = 1048576,
|
|
646
|
+
PressKeyTalk = 2097152,
|
|
647
|
+
FreeTally = 4194304,
|
|
648
|
+
Talk = 8388608,
|
|
649
|
+
MuteGuild = 16777216,
|
|
650
|
+
CloseGuildWheat = 33554432,
|
|
651
|
+
UpdateOtherUserNickname = 67108864,
|
|
652
|
+
PlayMusic = 134217728
|
|
653
|
+
}
|
|
654
|
+
interface BlackInfo {
|
|
655
|
+
user_id: string;
|
|
656
|
+
created_time: number;
|
|
657
|
+
remark: string;
|
|
658
|
+
user: User.Info;
|
|
659
|
+
}
|
|
660
|
+
}
|
|
661
|
+
export abstract class Message {
|
|
662
|
+
client: Client;
|
|
663
|
+
message_type: Message.Type;
|
|
664
|
+
timestamp: number;
|
|
665
|
+
get self_id(): string;
|
|
666
|
+
message_id: string;
|
|
667
|
+
author_id: string;
|
|
668
|
+
protected constructor(client: Client, payload: Message.Payload);
|
|
669
|
+
abstract recall(): Promise<boolean>;
|
|
670
|
+
abstract update(message: Sendable): Promise<boolean>;
|
|
671
|
+
abstract reply(message: Sendable, quote?: boolean): Promise<Message.Ret>;
|
|
672
|
+
abstract getReactions(emoji?: string): Promise<User.Info[]>;
|
|
673
|
+
abstract addReaction(emoji: string): Promise<void>;
|
|
674
|
+
abstract deleteReaction(emoji: string, user_id?: string): Promise<void>;
|
|
675
|
+
get author(): User;
|
|
676
|
+
raw_message: string;
|
|
677
|
+
message: MessageSegment[];
|
|
678
|
+
get [Symbol.unscopables](): {
|
|
679
|
+
client: boolean;
|
|
680
|
+
};
|
|
681
|
+
toJSON(): {
|
|
682
|
+
[k: string]: any;
|
|
683
|
+
};
|
|
684
|
+
}
|
|
685
|
+
export namespace Message {
|
|
686
|
+
type Ret = {
|
|
687
|
+
message_id: string;
|
|
688
|
+
};
|
|
689
|
+
type Type = 'private' | 'channel';
|
|
690
|
+
}
|
|
691
|
+
export namespace Message {
|
|
692
|
+
type Extra = {
|
|
693
|
+
type: number;
|
|
694
|
+
guild_id?: string;
|
|
695
|
+
channel_name?: string;
|
|
696
|
+
mention: string[];
|
|
697
|
+
mention_all: boolean;
|
|
698
|
+
mention_roles: string[];
|
|
699
|
+
mention_here: boolean;
|
|
700
|
+
author: User.Info;
|
|
701
|
+
quote?: Detail;
|
|
702
|
+
mention_info?: {
|
|
703
|
+
mention_part: User.Info[];
|
|
704
|
+
mention_role_part: Guild.Role[];
|
|
705
|
+
};
|
|
706
|
+
attachments?: AttachmentInfo;
|
|
707
|
+
kmarkdown?: MarkdownInfo;
|
|
708
|
+
};
|
|
709
|
+
type MarkdownInfo = {
|
|
710
|
+
raw_content: string;
|
|
711
|
+
mention_part: string[];
|
|
712
|
+
mention_role_part: string[];
|
|
713
|
+
};
|
|
714
|
+
type AttachmentInfo = {
|
|
715
|
+
type: string;
|
|
716
|
+
url: string;
|
|
717
|
+
name?: string;
|
|
718
|
+
file_type?: string;
|
|
719
|
+
size?: number;
|
|
720
|
+
};
|
|
721
|
+
type Payload = {
|
|
722
|
+
channel_type: ChannelType;
|
|
723
|
+
type: number;
|
|
724
|
+
target_id: string;
|
|
725
|
+
author_id: string;
|
|
726
|
+
content: string;
|
|
727
|
+
msg_id: string;
|
|
728
|
+
msg_timestamp: number;
|
|
729
|
+
nonce?: string;
|
|
730
|
+
extra: Extra;
|
|
731
|
+
};
|
|
732
|
+
interface Detail extends Extra {
|
|
733
|
+
id: string;
|
|
734
|
+
type: number;
|
|
735
|
+
content: string;
|
|
736
|
+
embeds: Embed[];
|
|
737
|
+
create_at: number;
|
|
738
|
+
update_at: number;
|
|
739
|
+
reactions: ReactionInfo[];
|
|
740
|
+
}
|
|
741
|
+
type ReactionInfo = {
|
|
742
|
+
emoji: {
|
|
743
|
+
id: string;
|
|
744
|
+
name: string;
|
|
745
|
+
};
|
|
746
|
+
count: number;
|
|
747
|
+
me: boolean;
|
|
748
|
+
};
|
|
749
|
+
type Embed = {
|
|
750
|
+
type: string;
|
|
751
|
+
url: string;
|
|
752
|
+
origin_or: string;
|
|
753
|
+
av_no: string;
|
|
754
|
+
iframe_path: string;
|
|
755
|
+
duration: number;
|
|
756
|
+
title: string;
|
|
757
|
+
pic: string;
|
|
758
|
+
};
|
|
759
|
+
function convertMessage(content: string, extra: Extra): MessageSegment[];
|
|
760
|
+
function processMessage(this: Client, message: Sendable, quote?: Quotable): Promise<[string, Quotable?, number?]>;
|
|
761
|
+
}
|
|
762
|
+
export interface MessageEvent {
|
|
763
|
+
reply(message: Sendable, quote?: boolean): Promise<any>;
|
|
764
|
+
}
|
|
765
|
+
export class PrivateMessageEvent extends Message implements MessageEvent {
|
|
766
|
+
message_type: 'private';
|
|
767
|
+
constructor(client: Client, payload: Message.Payload);
|
|
768
|
+
static fromDetail(client: Client, user_id: string, detail: Message.Detail): PrivateMessageEvent;
|
|
769
|
+
getReactions(emoji?: string): Promise<User.Info[]>;
|
|
770
|
+
addReaction(emoji: string): Promise<void>;
|
|
771
|
+
deleteReaction(emoji: string, user_id?: string): Promise<void>;
|
|
772
|
+
recall(): Promise<boolean>;
|
|
773
|
+
update(message: Sendable, quote?: boolean): Promise<boolean>;
|
|
774
|
+
reply(message: Sendable, quote?: boolean): Promise<Message.Ret>;
|
|
775
|
+
}
|
|
776
|
+
export class ChannelMessageEvent extends Message implements MessageEvent {
|
|
777
|
+
channel_id: string;
|
|
778
|
+
message_type: 'channel';
|
|
779
|
+
channel_name: string;
|
|
780
|
+
constructor(client: Client, payload: Message.Payload);
|
|
781
|
+
static fromDetail(client: Client, channel_id: string, detail: Message.Detail): ChannelMessageEvent;
|
|
782
|
+
get channel(): Channel;
|
|
783
|
+
recall(): Promise<boolean>;
|
|
784
|
+
update(message: Sendable): Promise<boolean>;
|
|
785
|
+
reply(message: Sendable, quote?: boolean): Promise<Message.Ret>;
|
|
786
|
+
getReactions(emoji?: string): Promise<User.Info[]>;
|
|
787
|
+
addReaction(emoji: string): Promise<void>;
|
|
788
|
+
deleteReaction(emoji: string, user_id?: string): Promise<void>;
|
|
789
|
+
}
|
|
790
|
+
export interface EventMap {
|
|
791
|
+
'message'(e: PrivateMessageEvent | ChannelMessageEvent): void;
|
|
792
|
+
'message.channel'(e: ChannelMessageEvent): void;
|
|
793
|
+
'message.private'(e: PrivateMessageEvent): void;
|
|
794
|
+
}
|
|
795
|
+
export class BaseClient extends EventEmitter {
|
|
796
|
+
request: AxiosInstance;
|
|
797
|
+
self_id: string;
|
|
798
|
+
nickname: string;
|
|
799
|
+
status: number;
|
|
800
|
+
config: BaseClient.Config;
|
|
801
|
+
logger: log4js.Logger;
|
|
802
|
+
receiver: Receiver;
|
|
803
|
+
private processedEvents;
|
|
804
|
+
constructor(config: BaseClient.Config);
|
|
805
|
+
/**
|
|
806
|
+
* 上传多媒体文件
|
|
807
|
+
* @param data 文件数据:可以是本地文件(file://)或网络地址(http://)或base64或Buffer
|
|
808
|
+
* @returns 返回可直接访问的文件URL
|
|
809
|
+
*/
|
|
810
|
+
uploadMedia(data: string | Buffer): Promise<string>;
|
|
811
|
+
em(event: string, payload: Dict): void;
|
|
812
|
+
}
|
|
813
|
+
export interface KookClient {
|
|
814
|
+
on<T extends keyof EventMap>(event: T, callback: EventMap[T]): this;
|
|
815
|
+
on<S extends string | symbol>(event: S & Exclude<string | symbol, keyof EventMap>, callback: (...args: any[]) => void): this;
|
|
816
|
+
once<T extends keyof EventMap>(event: T, callback: EventMap[T]): this;
|
|
817
|
+
once<S extends string | symbol>(event: S & Exclude<string | symbol, keyof EventMap>, callback: (...args: any[]) => void): this;
|
|
818
|
+
off<T extends keyof EventMap>(event: T, callback?: EventMap[T]): this;
|
|
819
|
+
off<S extends string | symbol>(event: S & Exclude<string | symbol, keyof EventMap>, callback?: (...args: any[]) => void): this;
|
|
820
|
+
emit<T extends keyof EventMap>(event: T, ...args: Parameters<EventMap[T]>): boolean;
|
|
821
|
+
emit<S extends string | symbol>(event: S & Exclude<string | symbol, keyof EventMap>, ...args: any[]): boolean;
|
|
822
|
+
addListener<T extends keyof EventMap>(event: T, callback: EventMap[T]): this;
|
|
823
|
+
addListener<S extends string | symbol>(event: S & Exclude<string | symbol, keyof EventMap>, callback: (...args: any[]) => void): this;
|
|
824
|
+
addListenerOnce<T extends keyof EventMap>(event: T, callback: EventMap[T]): this;
|
|
825
|
+
addListenerOnce<S extends string | symbol>(event: S & Exclude<string | symbol, keyof EventMap>, callback: (...args: any[]) => void): this;
|
|
826
|
+
removeListener<T extends keyof EventMap>(event: T, callback?: EventMap[T]): this;
|
|
827
|
+
removeListener<S extends string | symbol>(event: S & Exclude<string | symbol, keyof EventMap>, callback?: (...args: any[]) => void): this;
|
|
828
|
+
removeAllListeners<T extends keyof EventMap>(event: T): this;
|
|
829
|
+
removeAllListeners<S extends string | symbol>(event: S & Exclude<string | symbol, keyof EventMap>): this;
|
|
830
|
+
}
|
|
831
|
+
export namespace BaseClient {
|
|
832
|
+
const defaultConfig: Partial<Config>;
|
|
833
|
+
interface Config {
|
|
834
|
+
token: string;
|
|
835
|
+
mode: Receiver.Mode;
|
|
836
|
+
/**
|
|
837
|
+
* 验证 token,mode 为 webhook 时必填
|
|
838
|
+
* */
|
|
839
|
+
verify_token?: string;
|
|
840
|
+
/**
|
|
841
|
+
* 消息加密秘钥,mode 为 webhook 时必填
|
|
842
|
+
*/
|
|
843
|
+
encrypt_key?: string;
|
|
844
|
+
/**
|
|
845
|
+
* 下发数据是否压缩
|
|
846
|
+
*/
|
|
847
|
+
compress?: boolean;
|
|
848
|
+
language?: string;
|
|
849
|
+
timeout?: number;
|
|
850
|
+
max_retry?: number;
|
|
851
|
+
data_dir?: string;
|
|
852
|
+
ignore: 'bot' | 'self';
|
|
853
|
+
logLevel?: LogLevel;
|
|
854
|
+
}
|
|
855
|
+
function getFullTargetId(message: ChannelMessageEvent | PrivateMessageEvent): string;
|
|
856
|
+
}
|
|
857
|
+
export class GuildMember extends User {
|
|
858
|
+
guild_id: string;
|
|
859
|
+
constructor(c: Client, guild_id: string, info: User.Info);
|
|
860
|
+
get guild(): Guild;
|
|
861
|
+
setNickname(nickname: string): Promise<boolean>;
|
|
862
|
+
grant(role_id: string): Promise<boolean>;
|
|
863
|
+
revoke(role_id: string): Promise<boolean>;
|
|
864
|
+
addToBlackList(remark?: string, del_msg_days?: number): Promise<boolean>;
|
|
865
|
+
removeFromBlackList(): Promise<boolean>;
|
|
866
|
+
kick(): Promise<boolean>;
|
|
867
|
+
}
|
|
868
|
+
export namespace GuildMember {
|
|
869
|
+
const map: WeakMap<User.Info, GuildMember>;
|
|
870
|
+
function as(this: Client, guild_id: string, user_id: string): GuildMember;
|
|
871
|
+
}
|
|
872
|
+
export class ChannelMember extends User {
|
|
873
|
+
channel_id: string;
|
|
874
|
+
constructor(c: Client, channel_id: string, info: User.Info);
|
|
875
|
+
get channel(): Channel;
|
|
876
|
+
move(channel_id: string): Promise<boolean>;
|
|
877
|
+
}
|
|
878
|
+
export namespace ChannelMember {
|
|
879
|
+
const map: WeakMap<User.Info, ChannelMember>;
|
|
880
|
+
function as(this: Client, channel_id: string, user_id: string): ChannelMember;
|
|
881
|
+
}
|
|
882
|
+
type MemberMap = Map<string, User.Info>;
|
|
883
|
+
type BlackMap = Map<string, Guild.BlackInfo>;
|
|
884
|
+
export class Client extends BaseClient {
|
|
885
|
+
#private;
|
|
886
|
+
guilds: Map<string, Guild.Info>;
|
|
887
|
+
blacklist: Map<string, BlackMap>;
|
|
888
|
+
channels: Map<string, Channel.Info>;
|
|
889
|
+
guildMembers: Map<string, MemberMap>;
|
|
890
|
+
channelMembers: Map<string, MemberMap>;
|
|
891
|
+
users: Map<string, User.Info>;
|
|
892
|
+
pickGuild: (guild_id: string) => Guild;
|
|
893
|
+
pickGuildMember: (guild_id: string, user_id: string) => GuildMember;
|
|
894
|
+
pickChannel: (channel_id: string) => Channel;
|
|
895
|
+
pickChannelMember: (channel_id: string, user_id: string) => ChannelMember;
|
|
896
|
+
pickUser: (user_id: string, from_id?: never) => User;
|
|
897
|
+
constructor(config: Client.Config);
|
|
898
|
+
get black_user_nums(): number;
|
|
899
|
+
getSelfInfo(): Promise<User.Info>;
|
|
900
|
+
setOnline(): Promise<boolean>;
|
|
901
|
+
setOffline(): Promise<boolean>;
|
|
902
|
+
getOnlineStatus(): Promise<{
|
|
903
|
+
online: boolean;
|
|
904
|
+
online_os: string[];
|
|
905
|
+
}>;
|
|
906
|
+
/**
|
|
907
|
+
* 获取频道列表
|
|
908
|
+
*/
|
|
909
|
+
getGuildList(): Promise<Guild.Info[]>;
|
|
910
|
+
/**
|
|
911
|
+
* 获取频道信息
|
|
912
|
+
* @param guild_id
|
|
913
|
+
*/
|
|
914
|
+
getGuildInfo(guild_id: string): Promise<Guild.Info>;
|
|
915
|
+
getChannelList(guild_id: string): Promise<Channel.Info[]>;
|
|
916
|
+
/**
|
|
917
|
+
* 获取频道成员列表
|
|
918
|
+
* @param guild_id
|
|
919
|
+
* @param channel_id
|
|
920
|
+
*/
|
|
921
|
+
getGuildUserList(guild_id: string, channel_id?: string): Promise<User.Info[]>;
|
|
922
|
+
getBlacklist(guild_id: string): Promise<Guild.BlackInfo[]>;
|
|
923
|
+
sendPrivateMsg(user_id: string, message: Sendable, quote?: Quotable): Promise<Message.Ret>;
|
|
924
|
+
sendChannelMsg(channel_id: string, message: Sendable, quote?: Quotable): Promise<Message.Ret>;
|
|
925
|
+
getPrivateMsg(user_id: string, message_id: string): Promise<Message>;
|
|
926
|
+
getChannelMsg(channel_id: string, message_id: string): Promise<Message>;
|
|
927
|
+
recallPrivateMsg(user_id: string, message_id: string): Promise<boolean>;
|
|
928
|
+
recallChannelMsg(channel_id: string, message_is: string): Promise<boolean>;
|
|
929
|
+
getPrivateChatHistory(user_id: string, message_id?: string, len?: number): Promise<Message[]>;
|
|
930
|
+
getChannelChatHistory(channel_id: string, message_id?: string, len?: number): Promise<Message[]>;
|
|
931
|
+
init(): Promise<void>;
|
|
932
|
+
connect(): Promise<void>;
|
|
933
|
+
disconnect(): Promise<void>;
|
|
934
|
+
}
|
|
935
|
+
export namespace Client {
|
|
936
|
+
interface Info {
|
|
937
|
+
id: string;
|
|
938
|
+
username: string;
|
|
939
|
+
avatar: string;
|
|
940
|
+
union_openid?: string;
|
|
941
|
+
union_user_account?: string;
|
|
942
|
+
}
|
|
943
|
+
interface Config extends BaseClient.Config {
|
|
944
|
+
}
|
|
945
|
+
const defaultConfig: Partial<Config>;
|
|
946
|
+
}
|
|
947
|
+
export function defineConfig(config: Client.Config): Client.Config;
|
|
948
|
+
export function createClient(config: Client.Config): Client;
|
|
949
|
+
export interface Client extends BaseClient {
|
|
950
|
+
on<T extends keyof EventMap>(event: T, listener: EventMap[T]): this;
|
|
951
|
+
on<S extends string | symbol>(event: S & Exclude<S, keyof EventMap>, listener: (...args: any[]) => any): this;
|
|
952
|
+
emit<T extends keyof EventMap>(event: T, ...args: Parameters<EventMap[T]>): boolean;
|
|
953
|
+
emit<S extends string | symbol>(event: S & Exclude<S, keyof EventMap>, ...args: any[]): boolean;
|
|
954
|
+
once<T extends keyof EventMap>(event: T, listener: EventMap[T]): this;
|
|
955
|
+
once<S extends string | symbol>(event: S & Exclude<S, keyof EventMap>, listener: (...args: any[]) => any): this;
|
|
956
|
+
off<T extends keyof EventMap>(event: T): this;
|
|
957
|
+
off<S extends string | symbol>(event: S & Exclude<S, keyof EventMap>): this;
|
|
958
|
+
}
|