@snowluma/sdk 0.1.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/CHANGELOG.md +8 -0
- package/README.md +259 -0
- package/VERSIONING.md +43 -0
- package/dist/actions.d.ts +4 -0
- package/dist/actions.d.ts.map +1 -0
- package/dist/actions.js +121 -0
- package/dist/actions.js.map +1 -0
- package/dist/client/api-client.d.ts +151 -0
- package/dist/client/api-client.d.ts.map +1 -0
- package/dist/client/api-client.js +331 -0
- package/dist/client/api-client.js.map +1 -0
- package/dist/client/http-client.d.ts +25 -0
- package/dist/client/http-client.d.ts.map +1 -0
- package/dist/client/http-client.js +81 -0
- package/dist/client/http-client.js.map +1 -0
- package/dist/client/index.d.ts +6 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +4 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/websocket-client.d.ts +65 -0
- package/dist/client/websocket-client.d.ts.map +1 -0
- package/dist/client/websocket-client.js +309 -0
- package/dist/client/websocket-client.js.map +1 -0
- package/dist/client/websocket-types.d.ts +53 -0
- package/dist/client/websocket-types.d.ts.map +1 -0
- package/dist/client/websocket-types.js +2 -0
- package/dist/client/websocket-types.js.map +1 -0
- package/dist/client/websocket-utils.d.ts +10 -0
- package/dist/client/websocket-utils.d.ts.map +1 -0
- package/dist/client/websocket-utils.js +68 -0
- package/dist/client/websocket-utils.js.map +1 -0
- package/dist/emitter.d.ts +11 -0
- package/dist/emitter.d.ts.map +1 -0
- package/dist/emitter.js +34 -0
- package/dist/emitter.js.map +1 -0
- package/dist/errors.d.ts +39 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +71 -0
- package/dist/errors.js.map +1 -0
- package/dist/events/command.d.ts +4 -0
- package/dist/events/command.d.ts.map +1 -0
- package/dist/events/command.js +46 -0
- package/dist/events/command.js.map +1 -0
- package/dist/events/context.d.ts +6 -0
- package/dist/events/context.d.ts.map +1 -0
- package/dist/events/context.js +65 -0
- package/dist/events/context.js.map +1 -0
- package/dist/events/guards.d.ts +11 -0
- package/dist/events/guards.d.ts.map +1 -0
- package/dist/events/guards.js +26 -0
- package/dist/events/guards.js.map +1 -0
- package/dist/events/index.d.ts +5 -0
- package/dist/events/index.d.ts.map +1 -0
- package/dist/events/index.js +5 -0
- package/dist/events/index.js.map +1 -0
- package/dist/events/types.d.ts +52 -0
- package/dist/events/types.d.ts.map +1 -0
- package/dist/events/types.js +2 -0
- package/dist/events/types.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/abort.d.ts +11 -0
- package/dist/internal/abort.d.ts.map +1 -0
- package/dist/internal/abort.js +62 -0
- package/dist/internal/abort.js.map +1 -0
- package/dist/internal/json.d.ts +8 -0
- package/dist/internal/json.d.ts.map +1 -0
- package/dist/internal/json.js +60 -0
- package/dist/internal/json.js.map +1 -0
- package/dist/messages/chain.d.ts +100 -0
- package/dist/messages/chain.d.ts.map +1 -0
- package/dist/messages/chain.js +220 -0
- package/dist/messages/chain.js.map +1 -0
- package/dist/messages/cq-format.d.ts +5 -0
- package/dist/messages/cq-format.d.ts.map +1 -0
- package/dist/messages/cq-format.js +23 -0
- package/dist/messages/cq-format.js.map +1 -0
- package/dist/messages/cq.d.ts +5 -0
- package/dist/messages/cq.d.ts.map +1 -0
- package/dist/messages/cq.js +98 -0
- package/dist/messages/cq.js.map +1 -0
- package/dist/messages/index.d.ts +29 -0
- package/dist/messages/index.d.ts.map +1 -0
- package/dist/messages/index.js +10 -0
- package/dist/messages/index.js.map +1 -0
- package/dist/messages/segments.d.ts +24 -0
- package/dist/messages/segments.d.ts.map +1 -0
- package/dist/messages/segments.js +65 -0
- package/dist/messages/segments.js.map +1 -0
- package/dist/types/actions.d.ts +474 -0
- package/dist/types/actions.d.ts.map +1 -0
- package/dist/types/actions.js +2 -0
- package/dist/types/actions.js.map +1 -0
- package/dist/types/events.d.ts +60 -0
- package/dist/types/events.d.ts.map +1 -0
- package/dist/types/events.js +2 -0
- package/dist/types/events.js.map +1 -0
- package/dist/types/index.d.ts +7 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +7 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/json.d.ts +37 -0
- package/dist/types/json.d.ts.map +1 -0
- package/dist/types/json.js +2 -0
- package/dist/types/json.js.map +1 -0
- package/dist/types/messages.d.ts +90 -0
- package/dist/types/messages.d.ts.map +1 -0
- package/dist/types/messages.js +2 -0
- package/dist/types/messages.js.map +1 -0
- package/dist/types/params.d.ts +228 -0
- package/dist/types/params.d.ts.map +1 -0
- package/dist/types/params.js +2 -0
- package/dist/types/params.js.map +1 -0
- package/dist/types/results.d.ts +83 -0
- package/dist/types/results.d.ts.map +1 -0
- package/dist/types/results.js +2 -0
- package/dist/types/results.js.map +1 -0
- package/package.json +95 -0
package/dist/errors.js
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/** Base error for every exception intentionally thrown by the SnowLuma SDK. */
|
|
2
|
+
export class SnowLumaError extends Error {
|
|
3
|
+
constructor(message, options) {
|
|
4
|
+
super(message, options);
|
|
5
|
+
this.name = 'SnowLumaError';
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
/** Transport-layer failures before a valid OneBot API response is available. */
|
|
9
|
+
export class SnowLumaTransportError extends SnowLumaError {
|
|
10
|
+
constructor(message, options) {
|
|
11
|
+
super(message, options);
|
|
12
|
+
this.name = 'SnowLumaTransportError';
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
/** The request was cancelled by the caller's AbortSignal. */
|
|
16
|
+
export class SnowLumaAbortError extends SnowLumaTransportError {
|
|
17
|
+
constructor(message = 'SnowLuma request aborted', options) {
|
|
18
|
+
super(message, options);
|
|
19
|
+
this.name = 'SnowLumaAbortError';
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
/** The request exceeded the configured timeout. */
|
|
23
|
+
export class SnowLumaTimeoutError extends SnowLumaTransportError {
|
|
24
|
+
timeoutMs;
|
|
25
|
+
constructor(message, timeoutMs, options) {
|
|
26
|
+
super(message, options);
|
|
27
|
+
this.name = 'SnowLumaTimeoutError';
|
|
28
|
+
this.timeoutMs = timeoutMs;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/** The SDK could not establish or keep a connection to SnowLuma. */
|
|
32
|
+
export class SnowLumaConnectionError extends SnowLumaTransportError {
|
|
33
|
+
constructor(message, options) {
|
|
34
|
+
super(message, options);
|
|
35
|
+
this.name = 'SnowLumaConnectionError';
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/** SnowLuma returned a payload that could not be parsed as the expected protocol shape. */
|
|
39
|
+
export class SnowLumaParseError extends SnowLumaTransportError {
|
|
40
|
+
constructor(message, options) {
|
|
41
|
+
super(message, options);
|
|
42
|
+
this.name = 'SnowLumaParseError';
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/** A OneBot API response with status failed or a non-zero retcode. */
|
|
46
|
+
export class SnowLumaApiError extends SnowLumaError {
|
|
47
|
+
response;
|
|
48
|
+
retcode;
|
|
49
|
+
wording;
|
|
50
|
+
constructor(response) {
|
|
51
|
+
super(response.wording || `SnowLuma API failed with retcode ${response.retcode}`);
|
|
52
|
+
this.name = 'SnowLumaApiError';
|
|
53
|
+
this.response = response;
|
|
54
|
+
this.retcode = response.retcode;
|
|
55
|
+
this.wording = response.wording;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/** Authentication or authorization failure returned by SnowLuma. */
|
|
59
|
+
export class SnowLumaAuthError extends SnowLumaApiError {
|
|
60
|
+
constructor(response) {
|
|
61
|
+
super(response);
|
|
62
|
+
this.name = 'SnowLumaAuthError';
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
export function createSnowLumaApiError(response) {
|
|
66
|
+
return isAuthFailure(response) ? new SnowLumaAuthError(response) : new SnowLumaApiError(response);
|
|
67
|
+
}
|
|
68
|
+
function isAuthFailure(response) {
|
|
69
|
+
return response.retcode === 1401 || response.retcode === 401 || response.retcode === 403;
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAEA,+EAA+E;AAC/E,MAAM,OAAO,aAAc,SAAQ,KAAK;IACtC,YAAY,OAAe,EAAE,OAAsB;QACjD,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF;AAED,gFAAgF;AAChF,MAAM,OAAO,sBAAuB,SAAQ,aAAa;IACvD,YAAY,OAAe,EAAE,OAAsB;QACjD,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;IACvC,CAAC;CACF;AAED,6DAA6D;AAC7D,MAAM,OAAO,kBAAmB,SAAQ,sBAAsB;IAC5D,YAAY,OAAO,GAAG,0BAA0B,EAAE,OAAsB;QACtE,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAED,mDAAmD;AACnD,MAAM,OAAO,oBAAqB,SAAQ,sBAAsB;IACrD,SAAS,CAAS;IAE3B,YAAY,OAAe,EAAE,SAAiB,EAAE,OAAsB;QACpE,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;QACnC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;CACF;AAED,oEAAoE;AACpE,MAAM,OAAO,uBAAwB,SAAQ,sBAAsB;IACjE,YAAY,OAAe,EAAE,OAAsB;QACjD,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;IACxC,CAAC;CACF;AAED,2FAA2F;AAC3F,MAAM,OAAO,kBAAmB,SAAQ,sBAAsB;IAC5D,YAAY,OAAe,EAAE,OAAsB;QACjD,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAED,sEAAsE;AACtE,MAAM,OAAO,gBAAkC,SAAQ,aAAa;IACzD,QAAQ,CAAqB;IAC7B,OAAO,CAAS;IAChB,OAAO,CAAU;IAE1B,YAAY,QAA4B;QACtC,KAAK,CAAC,QAAQ,CAAC,OAAO,IAAI,oCAAoC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;QAClF,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;QAC/B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC;QAChC,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC;IAClC,CAAC;CACF;AAED,oEAAoE;AACpE,MAAM,OAAO,iBAAmC,SAAQ,gBAAuB;IAC7E,YAAY,QAA4B;QACtC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAChB,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF;AAED,MAAM,UAAU,sBAAsB,CAAQ,QAA4B;IACxE,OAAO,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,gBAAgB,CAAC,QAAQ,CAAC,CAAC;AACpG,CAAC;AAED,SAAS,aAAa,CAAC,QAA8B;IACnD,OAAO,QAAQ,CAAC,OAAO,KAAK,IAAI,IAAI,QAAQ,CAAC,OAAO,KAAK,GAAG,IAAI,QAAQ,CAAC,OAAO,KAAK,GAAG,CAAC;AAC3F,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { OneBotMessageEvent } from '../types/index';
|
|
2
|
+
import type { CommandMatch, CommandOptions } from './types';
|
|
3
|
+
export declare function matchCommand(event: OneBotMessageEvent, command: string | RegExp, options?: CommandOptions): CommandMatch | null;
|
|
4
|
+
//# sourceMappingURL=command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../src/events/command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE5D,wBAAgB,YAAY,CAC1B,KAAK,EAAE,kBAAkB,EACzB,OAAO,EAAE,MAAM,GAAG,MAAM,EACxB,OAAO,GAAE,cAAmB,GAC3B,YAAY,GAAG,IAAI,CA2CrB"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
export function matchCommand(event, command, options = {}) {
|
|
2
|
+
const trim = options.trim ?? true;
|
|
3
|
+
const raw = trim ? event.raw_message.trim() : event.raw_message;
|
|
4
|
+
const prefixes = normalizePrefixes(options.prefixes ?? '/');
|
|
5
|
+
for (const prefix of prefixes) {
|
|
6
|
+
if (prefix && !raw.startsWith(prefix))
|
|
7
|
+
continue;
|
|
8
|
+
const text = prefix ? raw.slice(prefix.length).trimStart() : raw;
|
|
9
|
+
if (!text)
|
|
10
|
+
continue;
|
|
11
|
+
if (command instanceof RegExp) {
|
|
12
|
+
const match = text.match(command);
|
|
13
|
+
if (!match || match.index !== 0)
|
|
14
|
+
continue;
|
|
15
|
+
const matchedText = match[0] ?? '';
|
|
16
|
+
const rest = text.slice(matchedText.length).trim();
|
|
17
|
+
return {
|
|
18
|
+
command: matchedText,
|
|
19
|
+
text,
|
|
20
|
+
args: rest ? rest.split(/\s+/) : [],
|
|
21
|
+
rest,
|
|
22
|
+
prefix,
|
|
23
|
+
match,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
const [head = '', ...args] = text.split(/\s+/);
|
|
27
|
+
const matches = options.caseSensitive
|
|
28
|
+
? head === command
|
|
29
|
+
: head.toLowerCase() === command.toLowerCase();
|
|
30
|
+
if (!matches)
|
|
31
|
+
continue;
|
|
32
|
+
return {
|
|
33
|
+
command: head,
|
|
34
|
+
text,
|
|
35
|
+
args,
|
|
36
|
+
rest: text.slice(head.length).trim(),
|
|
37
|
+
prefix,
|
|
38
|
+
match: null,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
function normalizePrefixes(prefixes) {
|
|
44
|
+
return Array.isArray(prefixes) ? prefixes : [prefixes];
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command.js","sourceRoot":"","sources":["../../src/events/command.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,YAAY,CAC1B,KAAyB,EACzB,OAAwB,EACxB,UAA0B,EAAE;IAE5B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC;IAClC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC;IAChE,MAAM,QAAQ,GAAG,iBAAiB,CAAC,OAAO,CAAC,QAAQ,IAAI,GAAG,CAAC,CAAC;IAE5D,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;QAC9B,IAAI,MAAM,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC;YAAE,SAAS;QAEhD,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;QACjE,IAAI,CAAC,IAAI;YAAE,SAAS;QAEpB,IAAI,OAAO,YAAY,MAAM,EAAE,CAAC;YAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAClC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,KAAK,CAAC;gBAAE,SAAS;YAC1C,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACnC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;YACnD,OAAO;gBACL,OAAO,EAAE,WAAW;gBACpB,IAAI;gBACJ,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE;gBACnC,IAAI;gBACJ,MAAM;gBACN,KAAK;aACN,CAAC;QACJ,CAAC;QAED,MAAM,CAAC,IAAI,GAAG,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC/C,MAAM,OAAO,GAAG,OAAO,CAAC,aAAa;YACnC,CAAC,CAAC,IAAI,KAAK,OAAO;YAClB,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,OAAO,CAAC,WAAW,EAAE,CAAC;QACjD,IAAI,CAAC,OAAO;YAAE,SAAS;QAEvB,OAAO;YACL,OAAO,EAAE,IAAI;YACb,IAAI;YACJ,IAAI;YACJ,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE;YACpC,MAAM;YACN,KAAK,EAAE,IAAI;SACZ,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,iBAAiB,CAAC,QAA2B;IACpD,OAAO,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;AACzD,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { SnowLumaApiClient } from '../client/api-client';
|
|
2
|
+
import type { SnowLumaEvent } from '../types/index';
|
|
3
|
+
import type { SnowLumaEventContext } from './types';
|
|
4
|
+
/** Creates the helper context object used by WebSocket event handlers. */
|
|
5
|
+
export declare function createEventContext<TEvent extends SnowLumaEvent>(event: TEvent, client: SnowLumaApiClient): SnowLumaEventContext<TEvent>;
|
|
6
|
+
//# sourceMappingURL=context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/events/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAEpD,0EAA0E;AAC1E,wBAAgB,kBAAkB,CAAC,MAAM,SAAS,aAAa,EAC7D,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,iBAAiB,GACxB,oBAAoB,CAAC,MAAM,CAAC,CA+D9B"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { isGroupMessageEvent, isPrivateMessageEvent, isRequestEvent } from './guards';
|
|
2
|
+
/** Creates the helper context object used by WebSocket event handlers. */
|
|
3
|
+
export function createEventContext(event, client) {
|
|
4
|
+
let stopped = false;
|
|
5
|
+
const context = {
|
|
6
|
+
event,
|
|
7
|
+
client,
|
|
8
|
+
get stopped() {
|
|
9
|
+
return stopped;
|
|
10
|
+
},
|
|
11
|
+
stopPropagation() {
|
|
12
|
+
stopped = true;
|
|
13
|
+
},
|
|
14
|
+
async reply(message, options) {
|
|
15
|
+
if (isGroupMessageEvent(event)) {
|
|
16
|
+
return client.sendGroupMessage(event.group_id, message, options);
|
|
17
|
+
}
|
|
18
|
+
if (isPrivateMessageEvent(event)) {
|
|
19
|
+
return client.sendPrivateMessage(event.user_id, message, options);
|
|
20
|
+
}
|
|
21
|
+
throw new Error('reply() is only available for message events');
|
|
22
|
+
},
|
|
23
|
+
async approve(options) {
|
|
24
|
+
if (!isRequestEvent(event)) {
|
|
25
|
+
throw new Error('approve() is only available for request events');
|
|
26
|
+
}
|
|
27
|
+
if (event.request_type === 'friend') {
|
|
28
|
+
return client.setFriendAddRequest(event.flag, true, options);
|
|
29
|
+
}
|
|
30
|
+
if (event.request_type === 'group') {
|
|
31
|
+
return client.setGroupAddRequest(event.flag, {
|
|
32
|
+
...options,
|
|
33
|
+
subType: options?.subType ?? event.sub_type,
|
|
34
|
+
approve: true,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
throw new Error(`approve() does not support request_type=${event.request_type}`);
|
|
38
|
+
},
|
|
39
|
+
async reject(reason, options) {
|
|
40
|
+
if (!isRequestEvent(event)) {
|
|
41
|
+
throw new Error('reject() is only available for request events');
|
|
42
|
+
}
|
|
43
|
+
if (event.request_type === 'friend') {
|
|
44
|
+
return client.setFriendAddRequest(event.flag, false, options);
|
|
45
|
+
}
|
|
46
|
+
if (event.request_type === 'group') {
|
|
47
|
+
return client.setGroupAddRequest(event.flag, {
|
|
48
|
+
...options,
|
|
49
|
+
subType: options?.subType ?? event.sub_type,
|
|
50
|
+
approve: false,
|
|
51
|
+
reason: reason ?? options?.reason,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
throw new Error(`reject() does not support request_type=${event.request_type}`);
|
|
55
|
+
},
|
|
56
|
+
async quickOperation(operation, options) {
|
|
57
|
+
return client.raw('.handle_quick_operation', {
|
|
58
|
+
context: event,
|
|
59
|
+
operation,
|
|
60
|
+
}, options);
|
|
61
|
+
},
|
|
62
|
+
};
|
|
63
|
+
return context;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/events/context.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAGtF,0EAA0E;AAC1E,MAAM,UAAU,kBAAkB,CAChC,KAAa,EACb,MAAyB;IAEzB,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,MAAM,OAAO,GAAiC;QAC5C,KAAK;QACL,MAAM;QACN,IAAI,OAAO;YACT,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,eAAe;YACb,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC;QACD,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO;YAC1B,IAAI,mBAAmB,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC/B,OAAO,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YACnE,CAAC;YACD,IAAI,qBAAqB,CAAC,KAAK,CAAC,EAAE,CAAC;gBACjC,OAAO,MAAM,CAAC,kBAAkB,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YACpE,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAClE,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,OAAO;YACnB,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC3B,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;YACpE,CAAC;YACD,IAAI,KAAK,CAAC,YAAY,KAAK,QAAQ,EAAE,CAAC;gBACpC,OAAO,MAAM,CAAC,mBAAmB,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;YAC/D,CAAC;YACD,IAAI,KAAK,CAAC,YAAY,KAAK,OAAO,EAAE,CAAC;gBACnC,OAAO,MAAM,CAAC,kBAAkB,CAAC,KAAK,CAAC,IAAI,EAAE;oBAC3C,GAAG,OAAO;oBACV,OAAO,EAAE,OAAO,EAAE,OAAO,IAAI,KAAK,CAAC,QAAQ;oBAC3C,OAAO,EAAE,IAAI;iBACd,CAAC,CAAC;YACL,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,2CAA2C,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC;QACnF,CAAC;QACD,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO;YAC1B,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC3B,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;YACnE,CAAC;YACD,IAAI,KAAK,CAAC,YAAY,KAAK,QAAQ,EAAE,CAAC;gBACpC,OAAO,MAAM,CAAC,mBAAmB,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;YAChE,CAAC;YACD,IAAI,KAAK,CAAC,YAAY,KAAK,OAAO,EAAE,CAAC;gBACnC,OAAO,MAAM,CAAC,kBAAkB,CAAC,KAAK,CAAC,IAAI,EAAE;oBAC3C,GAAG,OAAO;oBACV,OAAO,EAAE,OAAO,EAAE,OAAO,IAAI,KAAK,CAAC,QAAQ;oBAC3C,OAAO,EAAE,KAAK;oBACd,MAAM,EAAE,MAAM,IAAI,OAAO,EAAE,MAAM;iBAClC,CAAC,CAAC;YACL,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,0CAA0C,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC;QAClF,CAAC;QACD,KAAK,CAAC,cAAc,CAAC,SAAS,EAAE,OAAO;YACrC,OAAO,MAAM,CAAC,GAAG,CAAC,yBAAyB,EAAE;gBAC3C,OAAO,EAAE,KAAK;gBACd,SAAS;aACV,EAAE,OAAO,CAAC,CAAC;QACd,CAAC;KACF,CAAC;IAEF,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { OneBotGroupMessageEvent, OneBotMessageEvent, OneBotMetaEvent, OneBotNoticeEvent, OneBotPrivateMessageEvent, OneBotRequestEvent, SnowLumaEvent } from '../types/index';
|
|
2
|
+
import type { EventPredicate } from './types';
|
|
3
|
+
export declare function isMessageEvent(event: SnowLumaEvent): event is OneBotMessageEvent;
|
|
4
|
+
export declare function isPrivateMessageEvent(event: SnowLumaEvent): event is OneBotPrivateMessageEvent;
|
|
5
|
+
export declare function isGroupMessageEvent(event: SnowLumaEvent): event is OneBotGroupMessageEvent;
|
|
6
|
+
export declare function isNoticeEvent(event: SnowLumaEvent): event is OneBotNoticeEvent;
|
|
7
|
+
export declare function isRequestEvent(event: SnowLumaEvent): event is OneBotRequestEvent;
|
|
8
|
+
export declare function isMetaEvent(event: SnowLumaEvent): event is OneBotMetaEvent;
|
|
9
|
+
export declare function noticeType(type: string): EventPredicate<OneBotNoticeEvent>;
|
|
10
|
+
export declare function requestType(type: string): EventPredicate<OneBotRequestEvent>;
|
|
11
|
+
//# sourceMappingURL=guards.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guards.d.ts","sourceRoot":"","sources":["../../src/events/guards.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,uBAAuB,EACvB,kBAAkB,EAClB,eAAe,EACf,iBAAiB,EACjB,yBAAyB,EACzB,kBAAkB,EAClB,aAAa,EACd,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C,wBAAgB,cAAc,CAAC,KAAK,EAAE,aAAa,GAAG,KAAK,IAAI,kBAAkB,CAGhF;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,aAAa,GAAG,KAAK,IAAI,yBAAyB,CAE9F;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,aAAa,GAAG,KAAK,IAAI,uBAAuB,CAE1F;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,aAAa,GAAG,KAAK,IAAI,iBAAiB,CAE9E;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,aAAa,GAAG,KAAK,IAAI,kBAAkB,CAEhF;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,aAAa,GAAG,KAAK,IAAI,eAAe,CAE1E;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,CAAC,iBAAiB,CAAC,CAE1E;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,CAAC,kBAAkB,CAAC,CAE5E"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export function isMessageEvent(event) {
|
|
2
|
+
return (event.post_type === 'message' || event.post_type === 'message_sent')
|
|
3
|
+
&& (event.message_type === 'private' || event.message_type === 'group');
|
|
4
|
+
}
|
|
5
|
+
export function isPrivateMessageEvent(event) {
|
|
6
|
+
return isMessageEvent(event) && event.message_type === 'private';
|
|
7
|
+
}
|
|
8
|
+
export function isGroupMessageEvent(event) {
|
|
9
|
+
return isMessageEvent(event) && event.message_type === 'group';
|
|
10
|
+
}
|
|
11
|
+
export function isNoticeEvent(event) {
|
|
12
|
+
return event.post_type === 'notice' && typeof event.notice_type === 'string';
|
|
13
|
+
}
|
|
14
|
+
export function isRequestEvent(event) {
|
|
15
|
+
return event.post_type === 'request' && typeof event.request_type === 'string' && typeof event.flag === 'string';
|
|
16
|
+
}
|
|
17
|
+
export function isMetaEvent(event) {
|
|
18
|
+
return event.post_type === 'meta_event' && typeof event.meta_event_type === 'string';
|
|
19
|
+
}
|
|
20
|
+
export function noticeType(type) {
|
|
21
|
+
return (event) => isNoticeEvent(event) && event.notice_type === type;
|
|
22
|
+
}
|
|
23
|
+
export function requestType(type) {
|
|
24
|
+
return (event) => isRequestEvent(event) && event.request_type === type;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=guards.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guards.js","sourceRoot":"","sources":["../../src/events/guards.ts"],"names":[],"mappings":"AAWA,MAAM,UAAU,cAAc,CAAC,KAAoB;IACjD,OAAO,CAAC,KAAK,CAAC,SAAS,KAAK,SAAS,IAAI,KAAK,CAAC,SAAS,KAAK,cAAc,CAAC;WACvE,CAAC,KAAK,CAAC,YAAY,KAAK,SAAS,IAAI,KAAK,CAAC,YAAY,KAAK,OAAO,CAAC,CAAC;AAC5E,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAoB;IACxD,OAAO,cAAc,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,YAAY,KAAK,SAAS,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAoB;IACtD,OAAO,cAAc,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,YAAY,KAAK,OAAO,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAoB;IAChD,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ,IAAI,OAAO,KAAK,CAAC,WAAW,KAAK,QAAQ,CAAC;AAC/E,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAoB;IACjD,OAAO,KAAK,CAAC,SAAS,KAAK,SAAS,IAAI,OAAO,KAAK,CAAC,YAAY,KAAK,QAAQ,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC;AACnH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAoB;IAC9C,OAAO,KAAK,CAAC,SAAS,KAAK,YAAY,IAAI,OAAO,KAAK,CAAC,eAAe,KAAK,QAAQ,CAAC;AACvF,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,OAAO,CAAC,KAAK,EAA8B,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,WAAW,KAAK,IAAI,CAAC;AACnG,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,OAAO,CAAC,KAAK,EAA+B,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,YAAY,KAAK,IAAI,CAAC;AACtG,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/events/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/events/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { SnowLumaApiClient } from '../client/api-client';
|
|
2
|
+
import type { JsonObject, OneBotMessageEvent, OutgoingMessage, RequestOptions, SnowLumaEvent } from '../types/index';
|
|
3
|
+
export type MaybePromise<T = void> = T | Promise<T>;
|
|
4
|
+
export type EventNext = () => Promise<void>;
|
|
5
|
+
/** Type guard or predicate used by client.when(). */
|
|
6
|
+
export type EventPredicate<TEvent extends SnowLumaEvent = SnowLumaEvent> = (event: SnowLumaEvent) => event is TEvent;
|
|
7
|
+
/** Handler for one narrowed SnowLuma event. */
|
|
8
|
+
export type EventHandler<TEvent extends SnowLumaEvent = SnowLumaEvent> = (event: TEvent, context: SnowLumaEventContext<TEvent>) => MaybePromise;
|
|
9
|
+
/** Middleware in the WebSocket event dispatch pipeline. */
|
|
10
|
+
export type EventMiddleware = (event: SnowLumaEvent, context: SnowLumaEventContext, next: EventNext) => MaybePromise;
|
|
11
|
+
/** Options for accepting or rejecting OneBot request events. */
|
|
12
|
+
export interface RequestDecisionOptions extends RequestOptions {
|
|
13
|
+
reason?: string;
|
|
14
|
+
subType?: string;
|
|
15
|
+
}
|
|
16
|
+
/** Convenience context passed to event middleware and handlers. */
|
|
17
|
+
export interface SnowLumaEventContext<TEvent extends SnowLumaEvent = SnowLumaEvent> {
|
|
18
|
+
readonly event: TEvent;
|
|
19
|
+
readonly client: SnowLumaApiClient;
|
|
20
|
+
readonly stopped: boolean;
|
|
21
|
+
/** Prevents subsequent middleware and final onEvent listeners from running. */
|
|
22
|
+
stopPropagation(): void;
|
|
23
|
+
/** Replies to private or group message events with the correct API. */
|
|
24
|
+
reply(message: OutgoingMessage, options?: RequestOptions & {
|
|
25
|
+
autoEscape?: boolean;
|
|
26
|
+
}): Promise<unknown>;
|
|
27
|
+
/** Approves a friend or group request event. */
|
|
28
|
+
approve(options?: RequestDecisionOptions): Promise<unknown>;
|
|
29
|
+
/** Rejects a friend or group request event. */
|
|
30
|
+
reject(reason?: string, options?: RequestDecisionOptions): Promise<unknown>;
|
|
31
|
+
/** Sends OneBot .handle_quick_operation with the current event as context. */
|
|
32
|
+
quickOperation(operation: JsonObject, options?: RequestOptions): Promise<unknown>;
|
|
33
|
+
}
|
|
34
|
+
/** Command matching options for WebSocketClient.command(). */
|
|
35
|
+
export interface CommandOptions {
|
|
36
|
+
prefixes?: string | string[];
|
|
37
|
+
trim?: boolean;
|
|
38
|
+
caseSensitive?: boolean;
|
|
39
|
+
}
|
|
40
|
+
/** Parsed command information passed to command handlers. */
|
|
41
|
+
export interface CommandMatch {
|
|
42
|
+
command: string;
|
|
43
|
+
text: string;
|
|
44
|
+
args: string[];
|
|
45
|
+
rest: string;
|
|
46
|
+
prefix: string;
|
|
47
|
+
match: RegExpMatchArray | null;
|
|
48
|
+
}
|
|
49
|
+
export type CommandHandler<TEvent extends OneBotMessageEvent = OneBotMessageEvent> = (event: TEvent, context: SnowLumaEventContext<TEvent> & {
|
|
50
|
+
command: CommandMatch;
|
|
51
|
+
}, match: CommandMatch) => MaybePromise;
|
|
52
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/events/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,KAAK,EACV,UAAU,EACV,kBAAkB,EAClB,eAAe,EACf,cAAc,EACd,aAAa,EACd,MAAM,gBAAgB,CAAC;AAExB,MAAM,MAAM,YAAY,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AACpD,MAAM,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;AAE5C,qDAAqD;AACrD,MAAM,MAAM,cAAc,CAAC,MAAM,SAAS,aAAa,GAAG,aAAa,IAAI,CAAC,KAAK,EAAE,aAAa,KAAK,KAAK,IAAI,MAAM,CAAC;AAErH,+CAA+C;AAC/C,MAAM,MAAM,YAAY,CAAC,MAAM,SAAS,aAAa,GAAG,aAAa,IAAI,CACvE,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,oBAAoB,CAAC,MAAM,CAAC,KAClC,YAAY,CAAC;AAElB,2DAA2D;AAC3D,MAAM,MAAM,eAAe,GAAG,CAC5B,KAAK,EAAE,aAAa,EACpB,OAAO,EAAE,oBAAoB,EAC7B,IAAI,EAAE,SAAS,KACZ,YAAY,CAAC;AAElB,gEAAgE;AAChE,MAAM,WAAW,sBAAuB,SAAQ,cAAc;IAC5D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,mEAAmE;AACnE,MAAM,WAAW,oBAAoB,CAAC,MAAM,SAAS,aAAa,GAAG,aAAa;IAChF,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;IACnC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,+EAA+E;IAC/E,eAAe,IAAI,IAAI,CAAC;IACxB,uEAAuE;IACvE,KAAK,CAAC,OAAO,EAAE,eAAe,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG;QAAE,UAAU,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACvG,gDAAgD;IAChD,OAAO,CAAC,OAAO,CAAC,EAAE,sBAAsB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5D,+CAA+C;IAC/C,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,sBAAsB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5E,8EAA8E;IAC9E,cAAc,CAAC,SAAS,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACnF;AAED,8DAA8D;AAC9D,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC7B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,6DAA6D;AAC7D,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAAC;CAChC;AAED,MAAM,MAAM,cAAc,CAAC,MAAM,SAAS,kBAAkB,GAAG,kBAAkB,IAAI,CACnF,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,oBAAoB,CAAC,MAAM,CAAC,GAAG;IAAE,OAAO,EAAE,YAAY,CAAA;CAAE,EACjE,KAAK,EAAE,YAAY,KAChB,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/events/types.ts"],"names":[],"mappings":""}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export { SNOWLUMA_ACTIONS, isSnowLumaAction } from './actions';
|
|
2
|
+
export { SnowLumaApiClient } from './client/api-client';
|
|
3
|
+
export { SnowLumaHttpClient, createHttpClient } from './client/http-client';
|
|
4
|
+
export { SnowLumaWebSocketClient, createWebSocketClient } from './client/websocket-client';
|
|
5
|
+
export { SnowLumaAbortError, SnowLumaApiError, SnowLumaAuthError, SnowLumaConnectionError, SnowLumaError, SnowLumaParseError, SnowLumaTimeoutError, SnowLumaTransportError, createSnowLumaApiError, } from './errors';
|
|
6
|
+
export { MessageChain, at, atAll, br, chain, contact, escapeCqParam, escapeCqText, face, forward, image, json, location, message, music, node, normalizeMessage, parseSegments, poke, raw, record, reply, share, text, toCQString, video, xml, fromCQString, } from './messages/index';
|
|
7
|
+
export { createEventContext, isGroupMessageEvent, isMessageEvent, isMetaEvent, isNoticeEvent, isPrivateMessageEvent, isRequestEvent, matchCommand, noticeType, requestType, } from './events/index';
|
|
8
|
+
export type { SnowLumaKnownAction, } from './actions';
|
|
9
|
+
export type { SnowLumaHttpClientOptions, } from './client/http-client';
|
|
10
|
+
export type { ReconnectOptions, SnowLumaWebSocketClientOptions, SnowLumaWebSocketEvents, WebSocketCloseInfo, WebSocketConstructor, } from './client/websocket-client';
|
|
11
|
+
export type { CommandHandler, CommandMatch, CommandOptions, EventHandler, EventMiddleware, EventNext, EventPredicate, MaybePromise, RequestDecisionOptions, SnowLumaEventContext, } from './events/index';
|
|
12
|
+
export type * from './types/index';
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC5E,OAAO,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAC3F,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EACjB,uBAAuB,EACvB,aAAa,EACb,kBAAkB,EAClB,oBAAoB,EACpB,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,UAAU,CAAC;AAClB,OAAO,EACL,YAAY,EACZ,EAAE,EACF,KAAK,EACL,EAAE,EACF,KAAK,EACL,OAAO,EACP,aAAa,EACb,YAAY,EACZ,IAAI,EACJ,OAAO,EACP,KAAK,EACL,IAAI,EACJ,QAAQ,EACR,OAAO,EACP,KAAK,EACL,IAAI,EACJ,gBAAgB,EAChB,aAAa,EACb,IAAI,EACJ,GAAG,EACH,MAAM,EACN,KAAK,EACL,KAAK,EACL,IAAI,EACJ,UAAU,EACV,KAAK,EACL,GAAG,EACH,YAAY,GACb,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,cAAc,EACd,WAAW,EACX,aAAa,EACb,qBAAqB,EACrB,cAAc,EACd,YAAY,EACZ,UAAU,EACV,WAAW,GACZ,MAAM,gBAAgB,CAAC;AAExB,YAAY,EACV,mBAAmB,GACpB,MAAM,WAAW,CAAC;AAEnB,YAAY,EACV,yBAAyB,GAC1B,MAAM,sBAAsB,CAAC;AAE9B,YAAY,EACV,gBAAgB,EAChB,8BAA8B,EAC9B,uBAAuB,EACvB,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,2BAA2B,CAAC;AAEnC,YAAY,EACV,cAAc,EACd,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,eAAe,EACf,SAAS,EACT,cAAc,EACd,YAAY,EACZ,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,gBAAgB,CAAC;AAExB,mBAAmB,eAAe,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { SNOWLUMA_ACTIONS, isSnowLumaAction } from './actions';
|
|
2
|
+
export { SnowLumaApiClient } from './client/api-client';
|
|
3
|
+
export { SnowLumaHttpClient, createHttpClient } from './client/http-client';
|
|
4
|
+
export { SnowLumaWebSocketClient, createWebSocketClient } from './client/websocket-client';
|
|
5
|
+
export { SnowLumaAbortError, SnowLumaApiError, SnowLumaAuthError, SnowLumaConnectionError, SnowLumaError, SnowLumaParseError, SnowLumaTimeoutError, SnowLumaTransportError, createSnowLumaApiError, } from './errors';
|
|
6
|
+
export { MessageChain, at, atAll, br, chain, contact, escapeCqParam, escapeCqText, face, forward, image, json, location, message, music, node, normalizeMessage, parseSegments, poke, raw, record, reply, share, text, toCQString, video, xml, fromCQString, } from './messages/index';
|
|
7
|
+
export { createEventContext, isGroupMessageEvent, isMessageEvent, isMetaEvent, isNoticeEvent, isPrivateMessageEvent, isRequestEvent, matchCommand, noticeType, requestType, } from './events/index';
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC5E,OAAO,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAC3F,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EACjB,uBAAuB,EACvB,aAAa,EACb,kBAAkB,EAClB,oBAAoB,EACpB,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,UAAU,CAAC;AAClB,OAAO,EACL,YAAY,EACZ,EAAE,EACF,KAAK,EACL,EAAE,EACF,KAAK,EACL,OAAO,EACP,aAAa,EACb,YAAY,EACZ,IAAI,EACJ,OAAO,EACP,KAAK,EACL,IAAI,EACJ,QAAQ,EACR,OAAO,EACP,KAAK,EACL,IAAI,EACJ,gBAAgB,EAChB,aAAa,EACb,IAAI,EACJ,GAAG,EACH,MAAM,EACN,KAAK,EACL,KAAK,EACL,IAAI,EACJ,UAAU,EACV,KAAK,EACL,GAAG,EACH,YAAY,GACb,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,cAAc,EACd,WAAW,EACX,aAAa,EACb,qBAAqB,EACrB,cAAc,EACd,YAAY,EACZ,UAAU,EACV,WAAW,GACZ,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface RequestAbortState {
|
|
2
|
+
signal: AbortSignal;
|
|
3
|
+
cleanup(): void;
|
|
4
|
+
isTimedOut(): boolean;
|
|
5
|
+
isExternallyAborted(): boolean;
|
|
6
|
+
}
|
|
7
|
+
export declare function createRequestAbortState(timeoutMs: number, externalSignal?: AbortSignal): RequestAbortState;
|
|
8
|
+
export declare function throwIfAborted(signal?: AbortSignal, message?: string): void;
|
|
9
|
+
export declare function isAbortError(error: unknown): boolean;
|
|
10
|
+
export declare function raceWithAbort<T>(promise: Promise<T>, signal?: AbortSignal, message?: string): Promise<T>;
|
|
11
|
+
//# sourceMappingURL=abort.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"abort.d.ts","sourceRoot":"","sources":["../../src/internal/abort.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,WAAW,CAAC;IACpB,OAAO,IAAI,IAAI,CAAC;IAChB,UAAU,IAAI,OAAO,CAAC;IACtB,mBAAmB,IAAI,OAAO,CAAC;CAChC;AAED,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,MAAM,EACjB,cAAc,CAAC,EAAE,WAAW,GAC3B,iBAAiB,CAoCnB;AAED,wBAAgB,cAAc,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,OAAO,SAA6B,GAAG,IAAI,CAI/F;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAKpD;AAED,wBAAgB,aAAa,CAAC,CAAC,EAC7B,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EACnB,MAAM,CAAC,EAAE,WAAW,EACpB,OAAO,SAA6B,GACnC,OAAO,CAAC,CAAC,CAAC,CAcZ"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { SnowLumaAbortError } from '../errors';
|
|
2
|
+
export function createRequestAbortState(timeoutMs, externalSignal) {
|
|
3
|
+
const controller = new AbortController();
|
|
4
|
+
let timedOut = false;
|
|
5
|
+
let externallyAborted = false;
|
|
6
|
+
const onExternalAbort = () => {
|
|
7
|
+
externallyAborted = true;
|
|
8
|
+
controller.abort(externalSignal?.reason);
|
|
9
|
+
};
|
|
10
|
+
if (externalSignal?.aborted) {
|
|
11
|
+
onExternalAbort();
|
|
12
|
+
}
|
|
13
|
+
else {
|
|
14
|
+
externalSignal?.addEventListener('abort', onExternalAbort, { once: true });
|
|
15
|
+
}
|
|
16
|
+
const timer = timeoutMs > 0
|
|
17
|
+
? setTimeout(() => {
|
|
18
|
+
timedOut = true;
|
|
19
|
+
controller.abort();
|
|
20
|
+
}, timeoutMs)
|
|
21
|
+
: null;
|
|
22
|
+
return {
|
|
23
|
+
signal: controller.signal,
|
|
24
|
+
cleanup() {
|
|
25
|
+
if (timer)
|
|
26
|
+
clearTimeout(timer);
|
|
27
|
+
externalSignal?.removeEventListener('abort', onExternalAbort);
|
|
28
|
+
},
|
|
29
|
+
isTimedOut() {
|
|
30
|
+
return timedOut;
|
|
31
|
+
},
|
|
32
|
+
isExternallyAborted() {
|
|
33
|
+
return externallyAborted || externalSignal?.aborted === true;
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
export function throwIfAborted(signal, message = 'SnowLuma request aborted') {
|
|
38
|
+
if (signal?.aborted) {
|
|
39
|
+
throw new SnowLumaAbortError(message, { cause: signal.reason });
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
export function isAbortError(error) {
|
|
43
|
+
return typeof error === 'object'
|
|
44
|
+
&& error !== null
|
|
45
|
+
&& 'name' in error
|
|
46
|
+
&& error.name === 'AbortError';
|
|
47
|
+
}
|
|
48
|
+
export function raceWithAbort(promise, signal, message = 'SnowLuma request aborted') {
|
|
49
|
+
if (!signal)
|
|
50
|
+
return promise;
|
|
51
|
+
throwIfAborted(signal, message);
|
|
52
|
+
return new Promise((resolve, reject) => {
|
|
53
|
+
const onAbort = () => {
|
|
54
|
+
reject(new SnowLumaAbortError(message, { cause: signal.reason }));
|
|
55
|
+
};
|
|
56
|
+
signal.addEventListener('abort', onAbort, { once: true });
|
|
57
|
+
promise.then(resolve, reject).finally(() => {
|
|
58
|
+
signal.removeEventListener('abort', onAbort);
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=abort.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"abort.js","sourceRoot":"","sources":["../../src/internal/abort.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAS/C,MAAM,UAAU,uBAAuB,CACrC,SAAiB,EACjB,cAA4B;IAE5B,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,iBAAiB,GAAG,KAAK,CAAC;IAE9B,MAAM,eAAe,GAAG,GAAS,EAAE;QACjC,iBAAiB,GAAG,IAAI,CAAC;QACzB,UAAU,CAAC,KAAK,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;IAC3C,CAAC,CAAC;IAEF,IAAI,cAAc,EAAE,OAAO,EAAE,CAAC;QAC5B,eAAe,EAAE,CAAC;IACpB,CAAC;SAAM,CAAC;QACN,cAAc,EAAE,gBAAgB,CAAC,OAAO,EAAE,eAAe,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7E,CAAC;IAED,MAAM,KAAK,GAAG,SAAS,GAAG,CAAC;QACzB,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE;YAChB,QAAQ,GAAG,IAAI,CAAC;YAChB,UAAU,CAAC,KAAK,EAAE,CAAC;QACrB,CAAC,EAAE,SAAS,CAAC;QACb,CAAC,CAAC,IAAI,CAAC;IAET,OAAO;QACL,MAAM,EAAE,UAAU,CAAC,MAAM;QACzB,OAAO;YACL,IAAI,KAAK;gBAAE,YAAY,CAAC,KAAK,CAAC,CAAC;YAC/B,cAAc,EAAE,mBAAmB,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;QAChE,CAAC;QACD,UAAU;YACR,OAAO,QAAQ,CAAC;QAClB,CAAC;QACD,mBAAmB;YACjB,OAAO,iBAAiB,IAAI,cAAc,EAAE,OAAO,KAAK,IAAI,CAAC;QAC/D,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAoB,EAAE,OAAO,GAAG,0BAA0B;IACvF,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;QACpB,MAAM,IAAI,kBAAkB,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAClE,CAAC;AACH,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAc;IACzC,OAAO,OAAO,KAAK,KAAK,QAAQ;WAC3B,KAAK,KAAK,IAAI;WACd,MAAM,IAAI,KAAK;WACd,KAA4B,CAAC,IAAI,KAAK,YAAY,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,OAAmB,EACnB,MAAoB,EACpB,OAAO,GAAG,0BAA0B;IAEpC,IAAI,CAAC,MAAM;QAAE,OAAO,OAAO,CAAC;IAC5B,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEhC,OAAO,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACxC,MAAM,OAAO,GAAG,GAAS,EAAE;YACzB,MAAM,CAAC,IAAI,kBAAkB,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACpE,CAAC,CAAC;QAEF,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;YACzC,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ApiResponse, JsonObject, JsonValue } from '../types/index';
|
|
2
|
+
export declare function isJsonObject(value: unknown): value is JsonObject;
|
|
3
|
+
export declare function asJsonValue(value: unknown): JsonValue;
|
|
4
|
+
export declare function assertApiResponse(value: unknown): ApiResponse;
|
|
5
|
+
export declare function createEcho(): string;
|
|
6
|
+
export declare function echoKey(value: JsonValue | undefined): string;
|
|
7
|
+
export declare function appendAccessToken(urlValue: string, accessToken?: string): string;
|
|
8
|
+
//# sourceMappingURL=json.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../src/internal/json.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEzE,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,UAAU,CAEhE;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,SAAS,CAerD;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAqB7D;AAED,wBAAgB,UAAU,IAAI,MAAM,CAGnC;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,CAG5D;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAOhF"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
export function isJsonObject(value) {
|
|
2
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
3
|
+
}
|
|
4
|
+
export function asJsonValue(value) {
|
|
5
|
+
if (value === null)
|
|
6
|
+
return null;
|
|
7
|
+
if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {
|
|
8
|
+
return value;
|
|
9
|
+
}
|
|
10
|
+
if (Array.isArray(value))
|
|
11
|
+
return value.map(asJsonValue);
|
|
12
|
+
if (isJsonObject(value)) {
|
|
13
|
+
const out = {};
|
|
14
|
+
for (const [key, item] of Object.entries(value)) {
|
|
15
|
+
if (item === undefined)
|
|
16
|
+
continue;
|
|
17
|
+
out[key] = asJsonValue(item);
|
|
18
|
+
}
|
|
19
|
+
return out;
|
|
20
|
+
}
|
|
21
|
+
return String(value);
|
|
22
|
+
}
|
|
23
|
+
export function assertApiResponse(value) {
|
|
24
|
+
if (!isJsonObject(value)) {
|
|
25
|
+
throw new Error('response is not a JSON object');
|
|
26
|
+
}
|
|
27
|
+
const status = value.status === 'ok' ? 'ok' : value.status === 'failed' ? 'failed' : null;
|
|
28
|
+
if (!status) {
|
|
29
|
+
throw new Error('response status is missing or invalid');
|
|
30
|
+
}
|
|
31
|
+
const retcode = typeof value.retcode === 'number' && Number.isFinite(value.retcode)
|
|
32
|
+
? value.retcode
|
|
33
|
+
: status === 'ok' ? 0 : -1;
|
|
34
|
+
return {
|
|
35
|
+
status,
|
|
36
|
+
retcode,
|
|
37
|
+
data: asJsonValue(value.data ?? null),
|
|
38
|
+
echo: value.echo === undefined ? undefined : asJsonValue(value.echo),
|
|
39
|
+
wording: typeof value.wording === 'string' ? value.wording : undefined,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
export function createEcho() {
|
|
43
|
+
const random = Math.random().toString(36).slice(2);
|
|
44
|
+
return `snowluma-sdk:${Date.now().toString(36)}:${random}`;
|
|
45
|
+
}
|
|
46
|
+
export function echoKey(value) {
|
|
47
|
+
if (value === undefined)
|
|
48
|
+
return '';
|
|
49
|
+
return JSON.stringify(value);
|
|
50
|
+
}
|
|
51
|
+
export function appendAccessToken(urlValue, accessToken) {
|
|
52
|
+
if (!accessToken)
|
|
53
|
+
return urlValue;
|
|
54
|
+
const url = new URL(urlValue);
|
|
55
|
+
if (!url.searchParams.has('access_token')) {
|
|
56
|
+
url.searchParams.set('access_token', accessToken);
|
|
57
|
+
}
|
|
58
|
+
return url.toString();
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=json.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/internal/json.ts"],"names":[],"mappings":"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"}
|