kook-client 1.0.0 → 1.0.1
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/client.js +15 -21
- package/lib/constans.js +7 -10
- package/lib/core/baseClient.js +31 -53
- package/lib/core/receiver.js +12 -16
- package/lib/core/receivers/index.js +2 -7
- package/lib/core/receivers/webhook.js +3 -7
- package/lib/core/receivers/websocket.js +17 -20
- package/lib/elements.js +31 -33
- package/lib/entries/channel.js +9 -13
- package/lib/entries/channelMember.js +3 -7
- package/lib/entries/contact.js +1 -5
- package/lib/entries/guild.js +8 -12
- package/lib/entries/guildMember.js +3 -7
- package/lib/entries/user.js +9 -13
- package/lib/event/index.js +1 -17
- package/lib/event/message.js +6 -11
- package/lib/index.d.ts +8 -20
- package/lib/index.js +7 -23
- package/lib/message.js +16 -20
- package/lib/tsconfig.build.tsbuildinfo +1 -1
- package/lib/types.js +1 -2
- package/lib/utils.js +13 -61
- package/package.json +2 -1
package/lib/client.js
CHANGED
|
@@ -1,21 +1,16 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
3
2
|
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
4
3
|
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
5
4
|
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
6
5
|
};
|
|
7
6
|
var _Client_instances, _Client_initChannels, _Client_initUsers, _Client_initBlacklist;
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
const user_1 = require("./entries/user");
|
|
16
|
-
const guildMember_1 = require("./entries/guildMember");
|
|
17
|
-
const channelMember_1 = require("./entries/channelMember");
|
|
18
|
-
class Client extends baseClient_1.BaseClient {
|
|
7
|
+
import { BaseClient } from "./core/baseClient";
|
|
8
|
+
import { Guild } from "./entries/guild";
|
|
9
|
+
import { Channel } from "./entries/channel";
|
|
10
|
+
import { User } from "./entries/user";
|
|
11
|
+
import { GuildMember } from "./entries/guildMember";
|
|
12
|
+
import { ChannelMember } from "./entries/channelMember";
|
|
13
|
+
export class Client extends BaseClient {
|
|
19
14
|
constructor(config) {
|
|
20
15
|
super(Object.assign({}, Client.defaultConfig, config));
|
|
21
16
|
_Client_instances.add(this);
|
|
@@ -25,11 +20,11 @@ class Client extends baseClient_1.BaseClient {
|
|
|
25
20
|
this.guildMembers = new Map();
|
|
26
21
|
this.channelMembers = new Map();
|
|
27
22
|
this.users = new Map();
|
|
28
|
-
this.pickGuild =
|
|
29
|
-
this.pickGuildMember =
|
|
30
|
-
this.pickChannel =
|
|
31
|
-
this.pickChannelMember =
|
|
32
|
-
this.pickUser =
|
|
23
|
+
this.pickGuild = Guild.as.bind(this);
|
|
24
|
+
this.pickGuildMember = GuildMember.as.bind(this);
|
|
25
|
+
this.pickChannel = Channel.as.bind(this);
|
|
26
|
+
this.pickChannelMember = ChannelMember.as.bind(this);
|
|
27
|
+
this.pickUser = User.as.bind(this);
|
|
33
28
|
const nodeVersion = parseInt(process.version.slice(1));
|
|
34
29
|
if (nodeVersion < 16) {
|
|
35
30
|
this.logger.warn(`你的node版本(${process.version}) <16,可能会出现不可预测的错误,请升级node版本,为确保服务正常运行,请升级node版本`);
|
|
@@ -184,7 +179,6 @@ class Client extends baseClient_1.BaseClient {
|
|
|
184
179
|
await this.receiver.disconnect();
|
|
185
180
|
}
|
|
186
181
|
}
|
|
187
|
-
exports.Client = Client;
|
|
188
182
|
_Client_instances = new WeakSet(), _Client_initChannels = async function _Client_initChannels(guild_id) {
|
|
189
183
|
const channels = await this.getChannelList(guild_id);
|
|
190
184
|
for (const channel of channels) {
|
|
@@ -213,10 +207,10 @@ _Client_instances = new WeakSet(), _Client_initChannels = async function _Client
|
|
|
213
207
|
};
|
|
214
208
|
(function (Client) {
|
|
215
209
|
Client.defaultConfig = {};
|
|
216
|
-
})(Client || (
|
|
217
|
-
function defineConfig(config) {
|
|
210
|
+
})(Client || (Client = {}));
|
|
211
|
+
export function defineConfig(config) {
|
|
218
212
|
return config;
|
|
219
213
|
}
|
|
220
|
-
function createClient(config) {
|
|
214
|
+
export function createClient(config) {
|
|
221
215
|
return new Client(config);
|
|
222
216
|
}
|
package/lib/constans.js
CHANGED
|
@@ -1,8 +1,5 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.NotifyType = exports.ChannelType = exports.UnsupportedMethodError = exports.OpCode = void 0;
|
|
4
1
|
// 心跳参数
|
|
5
|
-
var OpCode;
|
|
2
|
+
export var OpCode;
|
|
6
3
|
(function (OpCode) {
|
|
7
4
|
OpCode[OpCode["Event"] = 0] = "Event";
|
|
8
5
|
OpCode[OpCode["Hello"] = 1] = "Hello";
|
|
@@ -10,18 +7,18 @@ var OpCode;
|
|
|
10
7
|
OpCode[OpCode["Pong"] = 3] = "Pong";
|
|
11
8
|
OpCode[OpCode["Reconnect"] = 5] = "Reconnect";
|
|
12
9
|
OpCode[OpCode["ResumeAck"] = 6] = "ResumeAck";
|
|
13
|
-
})(OpCode || (
|
|
14
|
-
|
|
15
|
-
var ChannelType;
|
|
10
|
+
})(OpCode || (OpCode = {}));
|
|
11
|
+
export const UnsupportedMethodError = new Error('暂未支持');
|
|
12
|
+
export var ChannelType;
|
|
16
13
|
(function (ChannelType) {
|
|
17
14
|
ChannelType["Channel"] = "GROUP";
|
|
18
15
|
ChannelType["Private"] = "PERSON";
|
|
19
16
|
ChannelType["Notice"] = "BROADCAST";
|
|
20
|
-
})(ChannelType || (
|
|
21
|
-
var NotifyType;
|
|
17
|
+
})(ChannelType || (ChannelType = {}));
|
|
18
|
+
export var NotifyType;
|
|
22
19
|
(function (NotifyType) {
|
|
23
20
|
NotifyType[NotifyType["Default"] = 0] = "Default";
|
|
24
21
|
NotifyType[NotifyType["All"] = 1] = "All";
|
|
25
22
|
NotifyType[NotifyType["At"] = 2] = "At";
|
|
26
23
|
NotifyType[NotifyType["Off"] = 3] = "Off";
|
|
27
|
-
})(NotifyType || (
|
|
24
|
+
})(NotifyType || (NotifyType = {}));
|
package/lib/core/baseClient.js
CHANGED
|
@@ -1,55 +1,16 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
-
};
|
|
38
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
-
exports.BaseClient = void 0;
|
|
40
|
-
const axios_1 = __importDefault(require("axios"));
|
|
41
|
-
const form_data_1 = __importDefault(require("form-data"));
|
|
42
|
-
const log4js = __importStar(require("log4js"));
|
|
43
|
-
const events_1 = require("events");
|
|
44
|
-
const utils_1 = require("../utils");
|
|
45
|
-
const receiver_1 = require("../core/receiver");
|
|
46
|
-
class BaseClient extends events_1.EventEmitter {
|
|
1
|
+
import axios from "axios";
|
|
2
|
+
import FormData from 'form-data';
|
|
3
|
+
import log4js from 'log4js';
|
|
4
|
+
import { EventEmitter } from "events";
|
|
5
|
+
import { getFile } from "../utils";
|
|
6
|
+
import { Receiver } from "../core/receiver";
|
|
7
|
+
export class BaseClient extends EventEmitter {
|
|
47
8
|
constructor(config) {
|
|
48
9
|
var _a;
|
|
49
10
|
super();
|
|
50
11
|
this.processedEvents = new Set();
|
|
51
12
|
this.config = Object.assign({}, BaseClient.defaultConfig, config);
|
|
52
|
-
this.request =
|
|
13
|
+
this.request = axios.create({
|
|
53
14
|
baseURL: 'https://www.kookapp.cn/api',
|
|
54
15
|
timeout: config.timeout || 5000,
|
|
55
16
|
headers: {
|
|
@@ -68,7 +29,7 @@ class BaseClient extends events_1.EventEmitter {
|
|
|
68
29
|
}
|
|
69
30
|
if (config.headers['Content-Type'] === 'multipart/form-data') {
|
|
70
31
|
delete config.data.message_reference;
|
|
71
|
-
const formData = new
|
|
32
|
+
const formData = new FormData(); // 使用 form-data
|
|
72
33
|
for (const key in config.data) {
|
|
73
34
|
if (config.data[key] !== undefined) {
|
|
74
35
|
formData.append(key, config.data[key]); // 使用 append 而不是 set
|
|
@@ -87,7 +48,7 @@ class BaseClient extends events_1.EventEmitter {
|
|
|
87
48
|
});
|
|
88
49
|
this.logger = log4js.getLogger(`[KOOK]`);
|
|
89
50
|
this.logger.level = (_a = this.config).logLevel || (_a.logLevel = 'info');
|
|
90
|
-
this.receiver =
|
|
51
|
+
this.receiver = Receiver.create(config.mode, this, config);
|
|
91
52
|
this.logger.info(`using ${config.mode} mode`);
|
|
92
53
|
}
|
|
93
54
|
/**
|
|
@@ -96,8 +57,8 @@ class BaseClient extends events_1.EventEmitter {
|
|
|
96
57
|
* @returns 返回可直接访问的文件URL
|
|
97
58
|
*/
|
|
98
59
|
async uploadMedia(data) {
|
|
99
|
-
const formData = new
|
|
100
|
-
const fileData = await
|
|
60
|
+
const formData = new FormData();
|
|
61
|
+
const fileData = await getFile(data);
|
|
101
62
|
// console.error(await getFile(data));
|
|
102
63
|
formData.append('file', fileData, 'awa.png'); // 显式指定文件名
|
|
103
64
|
try {
|
|
@@ -149,7 +110,24 @@ class BaseClient extends events_1.EventEmitter {
|
|
|
149
110
|
}
|
|
150
111
|
}
|
|
151
112
|
}
|
|
152
|
-
|
|
113
|
+
// export interface KookClient {
|
|
114
|
+
// on<T extends keyof EventMap>(event: T, callback: EventMap[T]): this
|
|
115
|
+
// on<S extends string | symbol>(event: S & Exclude<string | symbol, keyof EventMap>, callback: (...args: any[]) => void): this
|
|
116
|
+
// once<T extends keyof EventMap>(event: T, callback: EventMap[T]): this
|
|
117
|
+
// once<S extends string | symbol>(event: S & Exclude<string | symbol, keyof EventMap>, callback: (...args: any[]) => void): this
|
|
118
|
+
// off<T extends keyof EventMap>(event: T, callback?: EventMap[T]): this
|
|
119
|
+
// off<S extends string | symbol>(event: S & Exclude<string | symbol, keyof EventMap>, callback?: (...args: any[]) => void): this
|
|
120
|
+
// emit<T extends keyof EventMap>(event: T, ...args: Parameters<EventMap[T]>): boolean
|
|
121
|
+
// emit<S extends string | symbol>(event: S & Exclude<string | symbol, keyof EventMap>, ...args: any[]): boolean
|
|
122
|
+
// addListener<T extends keyof EventMap>(event: T, callback: EventMap[T]): this
|
|
123
|
+
// addListener<S extends string | symbol>(event: S & Exclude<string | symbol, keyof EventMap>, callback: (...args: any[]) => void): this
|
|
124
|
+
// addListenerOnce<T extends keyof EventMap>(event: T, callback: EventMap[T]): this
|
|
125
|
+
// addListenerOnce<S extends string | symbol>(event: S & Exclude<string | symbol, keyof EventMap>, callback: (...args: any[]) => void): this
|
|
126
|
+
// removeListener<T extends keyof EventMap>(event: T, callback?: EventMap[T]): this
|
|
127
|
+
// removeListener<S extends string | symbol>(event: S & Exclude<string | symbol, keyof EventMap>, callback?: (...args: any[]) => void): this
|
|
128
|
+
// removeAllListeners<T extends keyof EventMap>(event: T): this
|
|
129
|
+
// removeAllListeners<S extends string | symbol>(event: S & Exclude<string | symbol, keyof EventMap>): this
|
|
130
|
+
// }
|
|
153
131
|
(function (BaseClient) {
|
|
154
132
|
BaseClient.defaultConfig = {
|
|
155
133
|
ignore: 'bot'
|
|
@@ -163,4 +141,4 @@ exports.BaseClient = BaseClient;
|
|
|
163
141
|
}
|
|
164
142
|
}
|
|
165
143
|
BaseClient.getFullTargetId = getFullTargetId;
|
|
166
|
-
})(BaseClient || (
|
|
144
|
+
})(BaseClient || (BaseClient = {}));
|
package/lib/core/receiver.js
CHANGED
|
@@ -1,17 +1,14 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
3
2
|
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
4
3
|
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
5
4
|
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
6
5
|
};
|
|
7
6
|
var _Receiver_instances, _Receiver_transformEvent, _Receiver_transformChannelEvent, _Receiver_transformPrivateEvent, _Receiver_transformNoticeEvent;
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
const event_1 = require("../event");
|
|
14
|
-
class Receiver extends events_1.EventEmitter {
|
|
7
|
+
import { EventEmitter } from "events";
|
|
8
|
+
import { createDecipheriv } from 'crypto';
|
|
9
|
+
import { ChannelType } from "../constans";
|
|
10
|
+
import { ChannelMessageEvent, PrivateMessageEvent } from "../event";
|
|
11
|
+
export class Receiver extends EventEmitter {
|
|
15
12
|
constructor(c) {
|
|
16
13
|
super();
|
|
17
14
|
_Receiver_instances.add(this);
|
|
@@ -33,19 +30,18 @@ class Receiver extends events_1.EventEmitter {
|
|
|
33
30
|
const finalKey = key.padEnd(32, '0');
|
|
34
31
|
const finalKeyBuf = Buffer.from(finalKey, 'utf8');
|
|
35
32
|
const finalIvBuf = Buffer.from(iv, 'utf8');
|
|
36
|
-
const decipher =
|
|
33
|
+
const decipher = createDecipheriv('aes-256-cbc', finalKeyBuf, finalIvBuf);
|
|
37
34
|
const decryptedData = decipher.update(encryptedData);
|
|
38
35
|
return decryptedData.toString('utf8') + decipher.final().toString('utf8');
|
|
39
36
|
}
|
|
40
37
|
}
|
|
41
|
-
exports.Receiver = Receiver;
|
|
42
38
|
_Receiver_instances = new WeakSet(), _Receiver_transformEvent = function _Receiver_transformEvent(event) {
|
|
43
39
|
switch (event.channel_type) {
|
|
44
|
-
case
|
|
40
|
+
case ChannelType.Channel:
|
|
45
41
|
return __classPrivateFieldGet(this, _Receiver_instances, "m", _Receiver_transformChannelEvent).call(this, event);
|
|
46
|
-
case
|
|
42
|
+
case ChannelType.Private:
|
|
47
43
|
return __classPrivateFieldGet(this, _Receiver_instances, "m", _Receiver_transformPrivateEvent).call(this, event);
|
|
48
|
-
case
|
|
44
|
+
case ChannelType.Notice:
|
|
49
45
|
return __classPrivateFieldGet(this, _Receiver_instances, "m", _Receiver_transformNoticeEvent).call(this, event);
|
|
50
46
|
default:
|
|
51
47
|
throw new Error(`unknown channel type ${event.channel_type}`);
|
|
@@ -57,7 +53,7 @@ _Receiver_instances = new WeakSet(), _Receiver_transformEvent = function _Receiv
|
|
|
57
53
|
return;
|
|
58
54
|
if (event.author_id === this.c.self_id && this.c.config.ignore === 'self')
|
|
59
55
|
return;
|
|
60
|
-
const messageEvent = new
|
|
56
|
+
const messageEvent = new ChannelMessageEvent(this.c, event);
|
|
61
57
|
this.c.em('message.channel', messageEvent);
|
|
62
58
|
this.c.logger.info(`recv from Channel(${messageEvent.channel_id}): ${messageEvent.raw_message}`);
|
|
63
59
|
}, _Receiver_transformPrivateEvent = function _Receiver_transformPrivateEvent(event) {
|
|
@@ -67,7 +63,7 @@ _Receiver_instances = new WeakSet(), _Receiver_transformEvent = function _Receiv
|
|
|
67
63
|
return;
|
|
68
64
|
if (event.author_id === this.c.self_id && this.c.config.ignore === 'self')
|
|
69
65
|
return;
|
|
70
|
-
const messageEvent = new
|
|
66
|
+
const messageEvent = new PrivateMessageEvent(this.c, event);
|
|
71
67
|
this.c.em('message.private', messageEvent);
|
|
72
68
|
this.c.logger.info(`recv from User(${messageEvent.author_id}): ${messageEvent.raw_message}`);
|
|
73
69
|
}, _Receiver_transformNoticeEvent = function _Receiver_transformNoticeEvent(event) {
|
|
@@ -85,4 +81,4 @@ _Receiver_instances = new WeakSet(), _Receiver_transformEvent = function _Receiv
|
|
|
85
81
|
return new Construct(...args);
|
|
86
82
|
}
|
|
87
83
|
Receiver.create = create;
|
|
88
|
-
})(Receiver || (
|
|
84
|
+
})(Receiver || (Receiver = {}));
|
|
@@ -1,7 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
exports.WebsocketReceiver = exports.WebhookReceiver = void 0;
|
|
4
|
-
var webhook_1 = require("./webhook");
|
|
5
|
-
Object.defineProperty(exports, "WebhookReceiver", { enumerable: true, get: function () { return webhook_1.WebhookReceiver; } });
|
|
6
|
-
var websocket_1 = require("./websocket");
|
|
7
|
-
Object.defineProperty(exports, "WebsocketReceiver", { enumerable: true, get: function () { return websocket_1.WebsocketReceiver; } });
|
|
1
|
+
export { WebhookReceiver } from './webhook';
|
|
2
|
+
export { WebsocketReceiver } from './websocket';
|
|
@@ -1,8 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
exports.WebhookReceiver = void 0;
|
|
4
|
-
const receiver_1 = require("../../core/receiver");
|
|
5
|
-
class WebhookReceiver extends receiver_1.Receiver {
|
|
1
|
+
import { Receiver } from "../../core/receiver";
|
|
2
|
+
export class WebhookReceiver extends Receiver {
|
|
6
3
|
constructor(client, config) {
|
|
7
4
|
super(client);
|
|
8
5
|
this.config = config;
|
|
@@ -14,5 +11,4 @@ class WebhookReceiver extends receiver_1.Receiver {
|
|
|
14
11
|
return Promise.resolve(undefined);
|
|
15
12
|
}
|
|
16
13
|
}
|
|
17
|
-
|
|
18
|
-
receiver_1.Receiver.register('webhook', WebhookReceiver);
|
|
14
|
+
Receiver.register('webhook', WebhookReceiver);
|
|
@@ -1,10 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
const constans_1 = require("../../constans");
|
|
7
|
-
class WebsocketReceiver extends receiver_1.Receiver {
|
|
1
|
+
import { Receiver } from "../../core/receiver";
|
|
2
|
+
import { WebSocket } from "ws";
|
|
3
|
+
import { OpCode } from "../../constans";
|
|
4
|
+
import * as dns from "dns";
|
|
5
|
+
export class WebsocketReceiver extends Receiver {
|
|
8
6
|
constructor(client, config) {
|
|
9
7
|
super(client);
|
|
10
8
|
this.config = config;
|
|
@@ -62,10 +60,10 @@ class WebsocketReceiver extends receiver_1.Receiver {
|
|
|
62
60
|
});
|
|
63
61
|
}
|
|
64
62
|
sendPing() {
|
|
65
|
-
if (this.ws?.readyState ===
|
|
63
|
+
if (this.ws?.readyState === WebSocket.OPEN) {
|
|
66
64
|
// 发送包含当前 sn 的 Ping(必须为数字)
|
|
67
65
|
this.ws.send(JSON.stringify({
|
|
68
|
-
s:
|
|
66
|
+
s: OpCode.Ping,
|
|
69
67
|
sn: this.sn || 0
|
|
70
68
|
}));
|
|
71
69
|
this.lastPongTime = Date.now();
|
|
@@ -91,20 +89,20 @@ class WebsocketReceiver extends receiver_1.Receiver {
|
|
|
91
89
|
if (data.sn)
|
|
92
90
|
this.sn = Number(data.sn); // 确保为数字
|
|
93
91
|
switch (data.s) {
|
|
94
|
-
case
|
|
92
|
+
case OpCode.Hello:
|
|
95
93
|
this.emit('hello', data.d);
|
|
96
94
|
break;
|
|
97
|
-
case
|
|
95
|
+
case OpCode.Event:
|
|
98
96
|
this.emit('event', data.d);
|
|
99
97
|
break;
|
|
100
|
-
case
|
|
98
|
+
case OpCode.Reconnect:
|
|
101
99
|
this.logger.debug('Received reconnect command from server', data.d);
|
|
102
100
|
this.scheduleReconnect();
|
|
103
101
|
break;
|
|
104
|
-
case
|
|
102
|
+
case OpCode.ResumeAck:
|
|
105
103
|
this.emit('resume', data.d);
|
|
106
104
|
break;
|
|
107
|
-
case
|
|
105
|
+
case OpCode.Pong:
|
|
108
106
|
this.lastPongTime = Date.now();
|
|
109
107
|
this.logger.debug('Received pong from server');
|
|
110
108
|
break;
|
|
@@ -154,7 +152,7 @@ class WebsocketReceiver extends receiver_1.Receiver {
|
|
|
154
152
|
// Clean up WebSocket
|
|
155
153
|
if (this.ws) {
|
|
156
154
|
this.ws.removeAllListeners();
|
|
157
|
-
if (this.ws.readyState ===
|
|
155
|
+
if (this.ws.readyState === WebSocket.OPEN) {
|
|
158
156
|
this.ws.close();
|
|
159
157
|
}
|
|
160
158
|
this.ws = null;
|
|
@@ -196,7 +194,7 @@ class WebsocketReceiver extends receiver_1.Receiver {
|
|
|
196
194
|
// 可以添加定期的网络连通性检查
|
|
197
195
|
const networkCheckInterval = setInterval(() => {
|
|
198
196
|
// 简单的网络连通性检查
|
|
199
|
-
|
|
197
|
+
dns.resolve('www.kookapp.cn', (err) => {
|
|
200
198
|
if (err) {
|
|
201
199
|
this.logger.debug('Network connectivity issue detected');
|
|
202
200
|
if (this.state === WebsocketReceiver.State.Closed) {
|
|
@@ -221,7 +219,7 @@ class WebsocketReceiver extends receiver_1.Receiver {
|
|
|
221
219
|
}
|
|
222
220
|
this.url = url;
|
|
223
221
|
this.state = WebsocketReceiver.State.Connecting;
|
|
224
|
-
this.ws = new
|
|
222
|
+
this.ws = new WebSocket(this.url);
|
|
225
223
|
this.setupEventListeners();
|
|
226
224
|
const receiveCode = await this.waitForHello();
|
|
227
225
|
if (receiveCode !== 0) {
|
|
@@ -252,7 +250,6 @@ class WebsocketReceiver extends receiver_1.Receiver {
|
|
|
252
250
|
this.state = WebsocketReceiver.State.Closed;
|
|
253
251
|
}
|
|
254
252
|
}
|
|
255
|
-
exports.WebsocketReceiver = WebsocketReceiver;
|
|
256
253
|
(function (WebsocketReceiver) {
|
|
257
254
|
let State;
|
|
258
255
|
(function (State) {
|
|
@@ -263,5 +260,5 @@ exports.WebsocketReceiver = WebsocketReceiver;
|
|
|
263
260
|
State[State["Closed"] = 4] = "Closed";
|
|
264
261
|
State[State["Reconnection"] = 5] = "Reconnection";
|
|
265
262
|
})(State = WebsocketReceiver.State || (WebsocketReceiver.State = {}));
|
|
266
|
-
})(WebsocketReceiver || (
|
|
267
|
-
|
|
263
|
+
})(WebsocketReceiver || (WebsocketReceiver = {}));
|
|
264
|
+
Receiver.register('websocket', WebsocketReceiver);
|
package/lib/elements.js
CHANGED
|
@@ -1,7 +1,3 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.segment = exports.msgMod = exports.element = void 0;
|
|
4
|
-
exports.validateCard = validateCard;
|
|
5
1
|
// 验证卡片消息
|
|
6
2
|
function validateCard(card) {
|
|
7
3
|
// 1. 验证卡片结构
|
|
@@ -211,22 +207,22 @@ function validateElement(element) {
|
|
|
211
207
|
break;
|
|
212
208
|
}
|
|
213
209
|
}
|
|
214
|
-
|
|
210
|
+
export const element = function (type, data) {
|
|
215
211
|
return {
|
|
216
212
|
type,
|
|
217
213
|
...data
|
|
218
214
|
};
|
|
219
215
|
};
|
|
220
|
-
|
|
216
|
+
element.text = (content, emoji = true) => ({
|
|
221
217
|
type: 'plain-text',
|
|
222
218
|
content,
|
|
223
219
|
emoji
|
|
224
220
|
});
|
|
225
|
-
|
|
221
|
+
element.markdown = (content) => ({
|
|
226
222
|
type: 'kmarkdown',
|
|
227
223
|
content
|
|
228
224
|
});
|
|
229
|
-
|
|
225
|
+
element.image = (src, alt, size, circle, fallbackUrl) => ({
|
|
230
226
|
type: 'image',
|
|
231
227
|
src,
|
|
232
228
|
...(alt && { alt }),
|
|
@@ -234,89 +230,89 @@ exports.element.image = (src, alt, size, circle, fallbackUrl) => ({
|
|
|
234
230
|
...(circle && { circle }),
|
|
235
231
|
...(fallbackUrl && { fallbackUrl })
|
|
236
232
|
});
|
|
237
|
-
|
|
233
|
+
element.button = (text, value, theme = 'primary', click) => ({
|
|
238
234
|
type: 'button',
|
|
239
235
|
text,
|
|
240
236
|
value,
|
|
241
237
|
theme,
|
|
242
238
|
...(click && { click })
|
|
243
239
|
});
|
|
244
|
-
|
|
240
|
+
element.paragraph = (cols, fields) => ({
|
|
245
241
|
type: 'paragraph',
|
|
246
242
|
cols,
|
|
247
243
|
fields
|
|
248
244
|
});
|
|
249
|
-
|
|
245
|
+
export const msgMod = function (type, data) {
|
|
250
246
|
return {
|
|
251
247
|
type,
|
|
252
248
|
...data
|
|
253
249
|
};
|
|
254
250
|
};
|
|
255
|
-
|
|
251
|
+
msgMod.header = (text) => ({
|
|
256
252
|
type: 'header',
|
|
257
253
|
text
|
|
258
254
|
});
|
|
259
|
-
|
|
255
|
+
msgMod.section = (text, mode = 'left', accessory) => ({
|
|
260
256
|
type: 'section',
|
|
261
257
|
...(text && { text }),
|
|
262
258
|
mode,
|
|
263
259
|
...(accessory && { accessory })
|
|
264
260
|
});
|
|
265
|
-
|
|
261
|
+
msgMod.image = (elements) => ({
|
|
266
262
|
type: 'image-group',
|
|
267
263
|
elements
|
|
268
264
|
});
|
|
269
|
-
|
|
265
|
+
msgMod.container = (elements) => ({
|
|
270
266
|
type: 'container',
|
|
271
267
|
elements
|
|
272
268
|
});
|
|
273
|
-
|
|
269
|
+
msgMod.action = (elements) => ({
|
|
274
270
|
type: 'action-group',
|
|
275
271
|
elements
|
|
276
272
|
});
|
|
277
|
-
|
|
273
|
+
msgMod.context = (elements) => ({
|
|
278
274
|
type: 'context',
|
|
279
275
|
elements
|
|
280
276
|
});
|
|
281
|
-
|
|
277
|
+
msgMod.divider = () => ({
|
|
282
278
|
type: 'divider'
|
|
283
279
|
});
|
|
284
|
-
|
|
280
|
+
msgMod.file = (src, title) => ({
|
|
285
281
|
type: 'file',
|
|
286
282
|
src,
|
|
287
283
|
title
|
|
288
284
|
});
|
|
289
|
-
|
|
285
|
+
msgMod.audio = (src, title, cover) => ({
|
|
290
286
|
type: 'audio',
|
|
291
287
|
src,
|
|
292
288
|
title,
|
|
293
289
|
...(cover && { cover })
|
|
294
290
|
});
|
|
295
|
-
|
|
291
|
+
msgMod.video = (src, title) => ({
|
|
296
292
|
type: 'video',
|
|
297
293
|
src,
|
|
298
294
|
title
|
|
299
295
|
});
|
|
300
|
-
|
|
296
|
+
msgMod.countdown = (endTime, mode = 'hour', startTime) => ({
|
|
301
297
|
type: 'countdown',
|
|
302
298
|
endTime,
|
|
303
299
|
mode,
|
|
304
300
|
...(startTime && { startTime })
|
|
305
301
|
});
|
|
306
|
-
|
|
302
|
+
msgMod.invite = (code) => ({
|
|
307
303
|
type: 'invite',
|
|
308
304
|
code
|
|
309
305
|
});
|
|
310
|
-
|
|
306
|
+
export const segment = function (type, attrs) {
|
|
311
307
|
return {
|
|
312
308
|
type,
|
|
313
309
|
...attrs
|
|
314
310
|
};
|
|
315
311
|
};
|
|
316
|
-
|
|
317
|
-
|
|
312
|
+
segment.text = (text) => segment('text', { text });
|
|
313
|
+
segment.at = (user_id) => segment('at', { user_id });
|
|
318
314
|
// 修改后的卡片消息段生成器
|
|
319
|
-
|
|
315
|
+
segment.card = (modules, options) => {
|
|
320
316
|
// 创建卡片对象
|
|
321
317
|
const cardObj = {
|
|
322
318
|
type: 'card',
|
|
@@ -329,14 +325,16 @@ exports.segment.card = (modules, options) => {
|
|
|
329
325
|
...cardObj
|
|
330
326
|
};
|
|
331
327
|
};
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
328
|
+
segment.image = (url, title) => segment('image', { url, ...(title && { title }) });
|
|
329
|
+
segment.video = (url, title) => segment('video', { url, ...(title && { title }) });
|
|
330
|
+
segment.audio = (url, title) => segment('audio', { url, ...(title && { title }) });
|
|
331
|
+
segment.markdown = (text) => segment('markdown', { text });
|
|
332
|
+
segment.reply = (message_id) => segment('reply', { id: message_id });
|
|
333
|
+
segment.file = (url, name, file_type, size) => segment('file', {
|
|
338
334
|
url,
|
|
339
335
|
...(name && { name }),
|
|
340
336
|
...(file_type && { file_type }),
|
|
341
337
|
...(size && { size })
|
|
342
338
|
});
|
|
339
|
+
// 导出验证
|
|
340
|
+
export { validateCard };
|
package/lib/entries/channel.js
CHANGED
|
@@ -1,10 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
const _1 = require("..");
|
|
6
|
-
const event_1 = require("../event");
|
|
7
|
-
class Channel extends contact_1.Contact {
|
|
1
|
+
import { Contact } from "../entries/contact";
|
|
2
|
+
import { Message } from "..";
|
|
3
|
+
import { ChannelMessageEvent } from "../event";
|
|
4
|
+
export class Channel extends Contact {
|
|
8
5
|
constructor(c, info) {
|
|
9
6
|
super(c);
|
|
10
7
|
this.info = info;
|
|
@@ -44,7 +41,7 @@ class Channel extends contact_1.Contact {
|
|
|
44
41
|
msg_id: message_id
|
|
45
42
|
}
|
|
46
43
|
});
|
|
47
|
-
return
|
|
44
|
+
return ChannelMessageEvent.fromDetail(this.c, this.info.id, data);
|
|
48
45
|
}
|
|
49
46
|
async getUserList() {
|
|
50
47
|
const { data } = await this.c.request.get('/v3/channel/user-list', {
|
|
@@ -66,11 +63,11 @@ class Channel extends contact_1.Contact {
|
|
|
66
63
|
page_size: len
|
|
67
64
|
});
|
|
68
65
|
return (result?.data?.items || []).map((item) => {
|
|
69
|
-
return
|
|
66
|
+
return ChannelMessageEvent.fromDetail(this.c, this.info.id, item);
|
|
70
67
|
});
|
|
71
68
|
}
|
|
72
69
|
async sendMsg(message, quote) {
|
|
73
|
-
const [content, quoteObj, type] = await
|
|
70
|
+
const [content, quoteObj, type] = await Message.processMessage.call(this.c, message, quote);
|
|
74
71
|
const { data } = await this.c.request.post('/v3/message/create', {
|
|
75
72
|
target_id: this.info.id,
|
|
76
73
|
content, // 处理后的内容(图片URL / 文本 / Markdown / Card JSON)
|
|
@@ -89,7 +86,7 @@ class Channel extends contact_1.Contact {
|
|
|
89
86
|
return result['code'] === 0;
|
|
90
87
|
}
|
|
91
88
|
async updateMsg(message_id, newMessage, quote) {
|
|
92
|
-
[newMessage, quote] = await
|
|
89
|
+
[newMessage, quote] = await Message.processMessage.call(this.c, newMessage, quote);
|
|
93
90
|
const result = await this.c.request.post('/v3/message/update', {
|
|
94
91
|
msg_id: message_id,
|
|
95
92
|
content: newMessage,
|
|
@@ -120,7 +117,6 @@ class Channel extends contact_1.Contact {
|
|
|
120
117
|
});
|
|
121
118
|
}
|
|
122
119
|
}
|
|
123
|
-
exports.Channel = Channel;
|
|
124
120
|
(function (Channel) {
|
|
125
121
|
Channel.map = new WeakMap();
|
|
126
122
|
function as(channel_id) {
|
|
@@ -134,4 +130,4 @@ exports.Channel = Channel;
|
|
|
134
130
|
return channel;
|
|
135
131
|
}
|
|
136
132
|
Channel.as = as;
|
|
137
|
-
})(Channel || (
|
|
133
|
+
})(Channel || (Channel = {}));
|