@satorijs/adapter-discord 4.5.9 → 4.5.11
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/bot.d.ts +7 -2
- package/lib/index.cjs +23 -16
- package/lib/message.d.ts +2 -2
- package/lib/types/gateway.d.ts +1 -1
- package/lib/types/internal.d.ts +3 -3
- package/lib/types/role.d.ts +5 -0
- package/lib/utils.d.ts +2 -2
- package/lib/ws.d.ts +2 -2
- package/package.json +3 -3
- package/src/bot.ts +9 -4
- package/src/message.ts +9 -7
- package/src/types/gateway.ts +1 -1
- package/src/types/internal.ts +3 -3
- package/src/types/role.ts +6 -0
- package/src/utils.ts +13 -13
- package/src/ws.ts +8 -7
- package/lib/index.cjs.map +0 -6
- package/lib/index.js +0 -2250
- package/lib/index.js.map +0 -6
package/lib/bot.d.ts
CHANGED
|
@@ -7,8 +7,8 @@ export declare class DiscordBot<C extends Context = Context> extends Bot<C, Disc
|
|
|
7
7
|
static MessageEncoder: typeof DiscordMessageEncoder;
|
|
8
8
|
static inject: string[];
|
|
9
9
|
http: HTTP;
|
|
10
|
-
internal: Internal
|
|
11
|
-
webhooks: Record<string, Webhook>;
|
|
10
|
+
internal: Internal<C>;
|
|
11
|
+
webhooks: Record<string, Webhook | null>;
|
|
12
12
|
webhookLock: Record<string, Promise<Webhook>>;
|
|
13
13
|
commands: Universal.Command[];
|
|
14
14
|
constructor(ctx: C, config: DiscordBot.Config);
|
|
@@ -49,6 +49,11 @@ export declare class DiscordBot<C extends Context = Context> extends Bot<C, Disc
|
|
|
49
49
|
}>;
|
|
50
50
|
setGuildMemberRole(guildId: string, userId: string, roleId: string): Promise<void>;
|
|
51
51
|
unsetGuildMemberRole(guildId: string, userId: string, roleId: string): Promise<void>;
|
|
52
|
+
getGuildMemberRoleList(guildId: string, userId: string, next?: string): Promise<{
|
|
53
|
+
data: {
|
|
54
|
+
id: string;
|
|
55
|
+
}[];
|
|
56
|
+
}>;
|
|
52
57
|
getGuildRoleList(guildId: string): Promise<{
|
|
53
58
|
data: Universal.GuildRole[];
|
|
54
59
|
}>;
|
package/lib/index.cjs
CHANGED
|
@@ -18,15 +18,15 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
18
18
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
19
|
|
|
20
20
|
// src/index.ts
|
|
21
|
-
var
|
|
22
|
-
__export(
|
|
21
|
+
var index_exports = {};
|
|
22
|
+
__export(index_exports, {
|
|
23
23
|
Discord: () => utils_exports,
|
|
24
24
|
DiscordBot: () => DiscordBot,
|
|
25
25
|
DiscordMessageEncoder: () => DiscordMessageEncoder,
|
|
26
26
|
WsClient: () => WsClient,
|
|
27
|
-
default: () =>
|
|
27
|
+
default: () => index_default
|
|
28
28
|
});
|
|
29
|
-
module.exports = __toCommonJS(
|
|
29
|
+
module.exports = __toCommonJS(index_exports);
|
|
30
30
|
|
|
31
31
|
// src/bot.ts
|
|
32
32
|
var import_core5 = require("@satorijs/core");
|
|
@@ -951,6 +951,7 @@ Internal.define({
|
|
|
951
951
|
PATCH: "modifyGuildRolePositions"
|
|
952
952
|
},
|
|
953
953
|
"/guilds/{guild.id}/roles/{role.id}": {
|
|
954
|
+
GET: "getGuildRole",
|
|
954
955
|
PATCH: "modifyGuildRole",
|
|
955
956
|
DELETE: "deleteGuildRole"
|
|
956
957
|
}
|
|
@@ -1230,7 +1231,7 @@ var decodeGuildMember = /* @__PURE__ */ __name((member) => ({
|
|
|
1230
1231
|
user: member.user && decodeUser(member.user),
|
|
1231
1232
|
nick: member.nick,
|
|
1232
1233
|
roles: member.roles,
|
|
1233
|
-
joinedAt: member.joined_at
|
|
1234
|
+
joinedAt: member.joined_at ? new Date(member.joined_at).valueOf() : void 0
|
|
1234
1235
|
}), "decodeGuildMember");
|
|
1235
1236
|
var decodeGuild = /* @__PURE__ */ __name((data) => ({
|
|
1236
1237
|
id: data.id,
|
|
@@ -1250,7 +1251,7 @@ var decodeRole = /* @__PURE__ */ __name((role) => ({
|
|
|
1250
1251
|
}), "decodeRole");
|
|
1251
1252
|
var encodeRole = /* @__PURE__ */ __name((role) => ({
|
|
1252
1253
|
...role,
|
|
1253
|
-
permissions: role.permissions
|
|
1254
|
+
permissions: role.permissions ? "" + role.permissions : void 0
|
|
1254
1255
|
}), "encodeRole");
|
|
1255
1256
|
async function decodeMessage(bot, data, message, payload = message, details = true) {
|
|
1256
1257
|
const { platform } = bot;
|
|
@@ -1341,7 +1342,7 @@ async function decodeMessage(bot, data, message, payload = message, details = tr
|
|
|
1341
1342
|
message.quote = await bot.getMessage(channel_id, message_id, false);
|
|
1342
1343
|
}
|
|
1343
1344
|
message.createdAt = new Date(data.timestamp).valueOf();
|
|
1344
|
-
message.updatedAt = data.edited_timestamp
|
|
1345
|
+
message.updatedAt = data.edited_timestamp ? new Date(data.edited_timestamp).valueOf() : void 0;
|
|
1345
1346
|
if (!payload) return message;
|
|
1346
1347
|
payload.channel = {
|
|
1347
1348
|
id: data.channel_id,
|
|
@@ -1608,9 +1609,9 @@ var DiscordMessageEncoder = class extends import_core3.MessageEncoder {
|
|
|
1608
1609
|
stack = [new State("message")];
|
|
1609
1610
|
buffer = "";
|
|
1610
1611
|
addition = {};
|
|
1611
|
-
figure
|
|
1612
|
+
figure;
|
|
1612
1613
|
mode = "default";
|
|
1613
|
-
listType
|
|
1614
|
+
listType;
|
|
1614
1615
|
rows = [];
|
|
1615
1616
|
async getUrl() {
|
|
1616
1617
|
const input = this.options?.session?.discord;
|
|
@@ -1657,7 +1658,9 @@ var DiscordMessageEncoder = class extends import_core3.MessageEncoder {
|
|
|
1657
1658
|
if (this.bot.http.isError(e) && e.response) {
|
|
1658
1659
|
if (e.response.data?.code === 10015) {
|
|
1659
1660
|
this.bot.logger.debug("webhook has been deleted, recreating..., %o", e.response.data);
|
|
1660
|
-
if (!this.bot.webhookLock[this.channelId])
|
|
1661
|
+
if (!this.bot.webhookLock[this.channelId]) {
|
|
1662
|
+
this.bot.webhooks[this.channelId] = null;
|
|
1663
|
+
}
|
|
1661
1664
|
await this.ensureWebhook();
|
|
1662
1665
|
return this.post(data, headers);
|
|
1663
1666
|
} else {
|
|
@@ -1708,7 +1711,7 @@ var DiscordMessageEncoder = class extends import_core3.MessageEncoder {
|
|
|
1708
1711
|
headers: { accept: type + "/*" },
|
|
1709
1712
|
timeout: 1e3
|
|
1710
1713
|
}).then(
|
|
1711
|
-
(headers) => headers.get("content-type")
|
|
1714
|
+
(headers) => headers.get("content-type")?.startsWith(type),
|
|
1712
1715
|
() => false
|
|
1713
1716
|
);
|
|
1714
1717
|
}
|
|
@@ -1829,7 +1832,7 @@ var DiscordMessageEncoder = class extends import_core3.MessageEncoder {
|
|
|
1829
1832
|
} else if (type === "ul" || type === "ol") {
|
|
1830
1833
|
this.listType = type;
|
|
1831
1834
|
await this.render(children);
|
|
1832
|
-
this.listType =
|
|
1835
|
+
this.listType = void 0;
|
|
1833
1836
|
} else if (type === "li") {
|
|
1834
1837
|
if (!this.buffer.endsWith("\n")) this.buffer += "\n";
|
|
1835
1838
|
if (this.listType === "ol") {
|
|
@@ -1837,7 +1840,7 @@ var DiscordMessageEncoder = class extends import_core3.MessageEncoder {
|
|
|
1837
1840
|
} else if (this.listType === "ul") {
|
|
1838
1841
|
this.buffer += "- ";
|
|
1839
1842
|
}
|
|
1840
|
-
this.render(children);
|
|
1843
|
+
await this.render(children);
|
|
1841
1844
|
this.buffer += "\n";
|
|
1842
1845
|
} else if (type === "at") {
|
|
1843
1846
|
if (attrs.id) {
|
|
@@ -2027,6 +2030,7 @@ var WsClient = class extends import_core4.Adapter.WsClient {
|
|
|
2027
2030
|
return this.bot.http.ws(url + "/?v=10&encoding=json");
|
|
2028
2031
|
}
|
|
2029
2032
|
heartbeat() {
|
|
2033
|
+
if (!this.socket) return;
|
|
2030
2034
|
this.bot.logger.debug(`heartbeat d ${this._d}`);
|
|
2031
2035
|
this.socket.send(JSON.stringify({
|
|
2032
2036
|
op: Gateway.Opcode.HEARTBEAT,
|
|
@@ -2138,7 +2142,7 @@ var DiscordBot = class extends import_core5.Bot {
|
|
|
2138
2142
|
}
|
|
2139
2143
|
});
|
|
2140
2144
|
this.internal = new Internal(this);
|
|
2141
|
-
|
|
2145
|
+
ctx.satori.proxyUrls.add("https://cdn.discordapp.com/");
|
|
2142
2146
|
ctx.plugin(WsClient, this);
|
|
2143
2147
|
}
|
|
2144
2148
|
async _ensureWebhook(channelId) {
|
|
@@ -2267,6 +2271,10 @@ var DiscordBot = class extends import_core5.Bot {
|
|
|
2267
2271
|
unsetGuildMemberRole(guildId, userId, roleId) {
|
|
2268
2272
|
return this.internal.removeGuildMemberRole(guildId, userId, roleId);
|
|
2269
2273
|
}
|
|
2274
|
+
async getGuildMemberRoleList(guildId, userId, next) {
|
|
2275
|
+
const data = await this.internal.getGuildMember(guildId, userId);
|
|
2276
|
+
return { data: data.roles.map((id) => ({ id })) };
|
|
2277
|
+
}
|
|
2270
2278
|
async getGuildRoleList(guildId) {
|
|
2271
2279
|
const data = await this.internal.getGuildRoles(guildId);
|
|
2272
2280
|
return { data: data.map(decodeRole) };
|
|
@@ -2320,7 +2328,7 @@ var DiscordBot = class extends import_core5.Bot {
|
|
|
2320
2328
|
})(DiscordBot || (DiscordBot = {}));
|
|
2321
2329
|
|
|
2322
2330
|
// src/index.ts
|
|
2323
|
-
var
|
|
2331
|
+
var index_default = DiscordBot;
|
|
2324
2332
|
// Annotate the CommonJS export names for ESM import in node:
|
|
2325
2333
|
0 && (module.exports = {
|
|
2326
2334
|
Discord,
|
|
@@ -2328,4 +2336,3 @@ var src_default = DiscordBot;
|
|
|
2328
2336
|
DiscordMessageEncoder,
|
|
2329
2337
|
WsClient
|
|
2330
2338
|
});
|
|
2331
|
-
//# sourceMappingURL=index.cjs.map
|
package/lib/message.d.ts
CHANGED
|
@@ -5,9 +5,9 @@ export declare class DiscordMessageEncoder<C extends Context = Context> extends
|
|
|
5
5
|
private stack;
|
|
6
6
|
private buffer;
|
|
7
7
|
private addition;
|
|
8
|
-
private figure
|
|
8
|
+
private figure?;
|
|
9
9
|
private mode;
|
|
10
|
-
private listType
|
|
10
|
+
private listType?;
|
|
11
11
|
private rows;
|
|
12
12
|
private getUrl;
|
|
13
13
|
post(data?: any, headers?: any): any;
|
package/lib/types/gateway.d.ts
CHANGED
package/lib/types/internal.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { Dict, HTTP } from '@satorijs/core';
|
|
1
|
+
import { Context, Dict, HTTP } from '@satorijs/core';
|
|
2
2
|
import { DiscordBot } from '../bot';
|
|
3
|
-
export declare class Internal {
|
|
3
|
+
export declare class Internal<C extends Context = Context> {
|
|
4
4
|
private bot;
|
|
5
|
-
constructor(bot: DiscordBot);
|
|
5
|
+
constructor(bot: DiscordBot<C>);
|
|
6
6
|
static define(routes: Dict<Partial<Record<HTTP.Method, string | string[]>>>): void;
|
|
7
7
|
}
|
package/lib/types/role.d.ts
CHANGED
|
@@ -215,6 +215,11 @@ declare module './internal' {
|
|
|
215
215
|
* @see https://discord.com/developers/docs/resources/guild#modify-guild-role-positions
|
|
216
216
|
*/
|
|
217
217
|
modifyGuildRolePositions(guild_id: snowflake, param: Role.Params.ModifyPositions): Promise<Role[]>;
|
|
218
|
+
/**
|
|
219
|
+
* Returns a role object for the specified role.
|
|
220
|
+
* @see https://discord.com/developers/docs/resources/guild#get-guild-role
|
|
221
|
+
*/
|
|
222
|
+
getGuildRole(guild_id: snowflake, role_id: snowflake): Promise<Role>;
|
|
218
223
|
/**
|
|
219
224
|
* Modify a guild role. Requires the MANAGE_ROLES permission. Returns the updated role on success. Fires a Guild Role Update Gateway event.
|
|
220
225
|
* @see https://discord.com/developers/docs/resources/guild#modify-guild-role
|
package/lib/utils.d.ts
CHANGED
|
@@ -10,8 +10,8 @@ export declare const decodeGuild: (data: Discord.Guild) => Universal.Guild;
|
|
|
10
10
|
export declare const decodeChannel: (data: Discord.Channel) => Universal.Channel;
|
|
11
11
|
export declare const decodeRole: (role: Discord.Role) => Universal.GuildRole;
|
|
12
12
|
export declare const encodeRole: (role: Partial<Universal.GuildRole>) => Partial<Discord.Role>;
|
|
13
|
-
export declare function decodeMessage(bot: DiscordBot
|
|
14
|
-
export declare function setupMessageGuildId(session: Session, guildId
|
|
13
|
+
export declare function decodeMessage<C extends Context = Context>(bot: DiscordBot<C>, data: Discord.Message, message: Universal.Message, payload?: Universal.MessageLike, details?: boolean): Promise<Universal.Message>;
|
|
14
|
+
export declare function setupMessageGuildId(session: Session, guildId?: string): void;
|
|
15
15
|
export declare function adaptSession<C extends Context>(bot: DiscordBot<C>, input: Discord.Gateway.Payload): Promise<C[typeof import("cordis").Context.session]>;
|
|
16
16
|
export declare const encodeCommand: (cmd: Universal.Command) => Discord.ApplicationCommand.Params.Create;
|
|
17
17
|
export declare function encodeCommandOptions(cmd: Universal.Command): Discord.ApplicationCommand.Option[];
|
package/lib/ws.d.ts
CHANGED
|
@@ -2,9 +2,9 @@ import { Adapter, Context, Schema } from '@satorijs/core';
|
|
|
2
2
|
import { DiscordBot } from './bot';
|
|
3
3
|
export declare class WsClient<C extends Context = Context> extends Adapter.WsClient<C, DiscordBot<C>> {
|
|
4
4
|
_d: number;
|
|
5
|
-
_ping
|
|
5
|
+
_ping?: NodeJS.Timeout;
|
|
6
6
|
_sessionId: string;
|
|
7
|
-
_resumeUrl
|
|
7
|
+
_resumeUrl?: string;
|
|
8
8
|
prepare(): Promise<WebSocket>;
|
|
9
9
|
heartbeat(): void;
|
|
10
10
|
accept(): void;
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@satorijs/adapter-discord",
|
|
3
3
|
"description": "Discord Adapter for Satorijs",
|
|
4
|
-
"version": "4.5.
|
|
4
|
+
"version": "4.5.11",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "lib/index.cjs",
|
|
7
7
|
"typings": "lib/index.d.ts",
|
|
@@ -33,10 +33,10 @@
|
|
|
33
33
|
"chat"
|
|
34
34
|
],
|
|
35
35
|
"devDependencies": {
|
|
36
|
-
"@satorijs/core": "^4.2
|
|
36
|
+
"@satorijs/core": "^4.5.2",
|
|
37
37
|
"cordis": "^3.18.1"
|
|
38
38
|
},
|
|
39
39
|
"peerDependencies": {
|
|
40
|
-
"@satorijs/core": "^4.2
|
|
40
|
+
"@satorijs/core": "^4.5.2"
|
|
41
41
|
}
|
|
42
42
|
}
|
package/src/bot.ts
CHANGED
|
@@ -12,8 +12,8 @@ export class DiscordBot<C extends Context = Context> extends Bot<C, DiscordBot.C
|
|
|
12
12
|
static inject = ['http']
|
|
13
13
|
|
|
14
14
|
public http: HTTP
|
|
15
|
-
public internal: Internal
|
|
16
|
-
public webhooks: Record<string, Webhook> = {}
|
|
15
|
+
public internal: Internal<C>
|
|
16
|
+
public webhooks: Record<string, Webhook | null> = {}
|
|
17
17
|
public webhookLock: Record<string, Promise<Webhook>> = {}
|
|
18
18
|
public commands: Universal.Command[] = []
|
|
19
19
|
|
|
@@ -28,7 +28,7 @@ export class DiscordBot<C extends Context = Context> extends Bot<C, DiscordBot.C
|
|
|
28
28
|
},
|
|
29
29
|
})
|
|
30
30
|
this.internal = new Internal(this)
|
|
31
|
-
|
|
31
|
+
ctx.satori.proxyUrls.add('https://cdn.discordapp.com/')
|
|
32
32
|
ctx.plugin(WsClient, this)
|
|
33
33
|
}
|
|
34
34
|
|
|
@@ -122,7 +122,7 @@ export class DiscordBot<C extends Context = Context> extends Bot<C, DiscordBot.C
|
|
|
122
122
|
async getGuildMemberList(guildId: string, after?: string) {
|
|
123
123
|
const users = await this.internal.listGuildMembers(guildId, { after, limit: 1000 })
|
|
124
124
|
const data = users.map(v => Discord.decodeGuildMember(v))
|
|
125
|
-
return { data, next: data[999]?.user
|
|
125
|
+
return { data, next: data[999]?.user!.id }
|
|
126
126
|
}
|
|
127
127
|
|
|
128
128
|
async getChannel(channelId: string) {
|
|
@@ -188,6 +188,11 @@ export class DiscordBot<C extends Context = Context> extends Bot<C, DiscordBot.C
|
|
|
188
188
|
return this.internal.removeGuildMemberRole(guildId, userId, roleId)
|
|
189
189
|
}
|
|
190
190
|
|
|
191
|
+
async getGuildMemberRoleList(guildId: string, userId: string, next?: string) {
|
|
192
|
+
const data = await this.internal.getGuildMember(guildId, userId)
|
|
193
|
+
return { data: data.roles.map(id => ({ id })) }
|
|
194
|
+
}
|
|
195
|
+
|
|
191
196
|
async getGuildRoleList(guildId: string) {
|
|
192
197
|
const data = await this.internal.getGuildRoles(guildId)
|
|
193
198
|
return { data: data.map(Discord.decodeRole) }
|
package/src/message.ts
CHANGED
|
@@ -19,9 +19,9 @@ export class DiscordMessageEncoder<C extends Context = Context> extends MessageE
|
|
|
19
19
|
private stack: State[] = [new State('message')]
|
|
20
20
|
private buffer: string = ''
|
|
21
21
|
private addition: Dict = {}
|
|
22
|
-
private figure
|
|
22
|
+
private figure?: h
|
|
23
23
|
private mode: RenderMode = 'default'
|
|
24
|
-
private listType
|
|
24
|
+
private listType?: 'ol' | 'ul'
|
|
25
25
|
private rows: ActionRow[] = []
|
|
26
26
|
private async getUrl() {
|
|
27
27
|
const input = this.options?.session?.discord
|
|
@@ -73,7 +73,9 @@ export class DiscordMessageEncoder<C extends Context = Context> extends MessageE
|
|
|
73
73
|
if (this.bot.http.isError(e) && e.response) {
|
|
74
74
|
if (e.response.data?.code === 10015) {
|
|
75
75
|
this.bot.logger.debug('webhook has been deleted, recreating..., %o', e.response.data)
|
|
76
|
-
if (!this.bot.webhookLock[this.channelId])
|
|
76
|
+
if (!this.bot.webhookLock[this.channelId]) {
|
|
77
|
+
this.bot.webhooks[this.channelId] = null
|
|
78
|
+
}
|
|
77
79
|
await this.ensureWebhook()
|
|
78
80
|
return this.post(data, headers)
|
|
79
81
|
} else {
|
|
@@ -134,7 +136,7 @@ export class DiscordMessageEncoder<C extends Context = Context> extends MessageE
|
|
|
134
136
|
headers: { accept: type + '/*' },
|
|
135
137
|
timeout: 1000,
|
|
136
138
|
}).then(
|
|
137
|
-
(headers) => headers.get('content-type')
|
|
139
|
+
(headers) => headers.get('content-type')?.startsWith(type),
|
|
138
140
|
() => false,
|
|
139
141
|
)
|
|
140
142
|
}
|
|
@@ -260,7 +262,7 @@ export class DiscordMessageEncoder<C extends Context = Context> extends MessageE
|
|
|
260
262
|
} else if (type === 'ul' || type === 'ol') {
|
|
261
263
|
this.listType = type
|
|
262
264
|
await this.render(children)
|
|
263
|
-
this.listType =
|
|
265
|
+
this.listType = undefined
|
|
264
266
|
} else if (type === 'li') {
|
|
265
267
|
if (!this.buffer.endsWith('\n')) this.buffer += '\n'
|
|
266
268
|
if (this.listType === 'ol') {
|
|
@@ -268,7 +270,7 @@ export class DiscordMessageEncoder<C extends Context = Context> extends MessageE
|
|
|
268
270
|
} else if (this.listType === 'ul') {
|
|
269
271
|
this.buffer += '- '
|
|
270
272
|
}
|
|
271
|
-
this.render(children)
|
|
273
|
+
await this.render(children)
|
|
272
274
|
this.buffer += '\n'
|
|
273
275
|
} else if (type === 'at') {
|
|
274
276
|
if (attrs.id) {
|
|
@@ -343,7 +345,7 @@ export class DiscordMessageEncoder<C extends Context = Context> extends MessageE
|
|
|
343
345
|
if (this.stack[0].type === 'forward' && this.stack[0].fakeMessageMap[attrs.id]?.length >= 1) {
|
|
344
346
|
// quote to fake message, eg. 1st message has id (in channel or thread), later message quote to it
|
|
345
347
|
replyId = this.stack[0].fakeMessageMap[attrs.id][0].id
|
|
346
|
-
channelId = this.stack[0].fakeMessageMap[attrs.id][0].channel
|
|
348
|
+
channelId = this.stack[0].fakeMessageMap[attrs.id][0].channel!.id
|
|
347
349
|
}
|
|
348
350
|
const quote = await this.bot.getMessage(channelId, replyId)
|
|
349
351
|
if (!guildId) {
|
package/src/types/gateway.ts
CHANGED
package/src/types/internal.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { Dict, HTTP, makeArray } from '@satorijs/core'
|
|
1
|
+
import { Context, Dict, HTTP, makeArray } from '@satorijs/core'
|
|
2
2
|
import { DiscordBot } from '../bot'
|
|
3
3
|
|
|
4
|
-
export class Internal {
|
|
5
|
-
constructor(private bot: DiscordBot) {}
|
|
4
|
+
export class Internal<C extends Context = Context> {
|
|
5
|
+
constructor(private bot: DiscordBot<C>) {}
|
|
6
6
|
|
|
7
7
|
static define(routes: Dict<Partial<Record<HTTP.Method, string | string[]>>>) {
|
|
8
8
|
for (const path in routes) {
|
package/src/types/role.ts
CHANGED
|
@@ -227,6 +227,11 @@ declare module './internal' {
|
|
|
227
227
|
* @see https://discord.com/developers/docs/resources/guild#modify-guild-role-positions
|
|
228
228
|
*/
|
|
229
229
|
modifyGuildRolePositions(guild_id: snowflake, param: Role.Params.ModifyPositions): Promise<Role[]>
|
|
230
|
+
/**
|
|
231
|
+
* Returns a role object for the specified role.
|
|
232
|
+
* @see https://discord.com/developers/docs/resources/guild#get-guild-role
|
|
233
|
+
*/
|
|
234
|
+
getGuildRole(guild_id: snowflake, role_id: snowflake): Promise<Role>
|
|
230
235
|
/**
|
|
231
236
|
* Modify a guild role. Requires the MANAGE_ROLES permission. Returns the updated role on success. Fires a Guild Role Update Gateway event.
|
|
232
237
|
* @see https://discord.com/developers/docs/resources/guild#modify-guild-role
|
|
@@ -247,6 +252,7 @@ Internal.define({
|
|
|
247
252
|
PATCH: 'modifyGuildRolePositions',
|
|
248
253
|
},
|
|
249
254
|
'/guilds/{guild.id}/roles/{role.id}': {
|
|
255
|
+
GET: 'getGuildRole',
|
|
250
256
|
PATCH: 'modifyGuildRole',
|
|
251
257
|
DELETE: 'deleteGuildRole',
|
|
252
258
|
},
|
package/src/utils.ts
CHANGED
|
@@ -29,7 +29,7 @@ export const decodeGuildMember = (member: Partial<Discord.GuildMember>): Univers
|
|
|
29
29
|
user: member.user && decodeUser(member.user),
|
|
30
30
|
nick: member.nick,
|
|
31
31
|
roles: member.roles,
|
|
32
|
-
joinedAt: member.joined_at
|
|
32
|
+
joinedAt: member.joined_at ? new Date(member.joined_at).valueOf() : undefined,
|
|
33
33
|
})
|
|
34
34
|
|
|
35
35
|
export const decodeGuild = (data: Discord.Guild): Universal.Guild => ({
|
|
@@ -56,11 +56,11 @@ export const decodeRole = (role: Discord.Role): Universal.GuildRole => ({
|
|
|
56
56
|
|
|
57
57
|
export const encodeRole = (role: Partial<Universal.GuildRole>): Partial<Discord.Role> => ({
|
|
58
58
|
...role,
|
|
59
|
-
permissions: role.permissions
|
|
59
|
+
permissions: role.permissions ? '' + role.permissions : undefined,
|
|
60
60
|
})
|
|
61
61
|
|
|
62
|
-
export async function decodeMessage(
|
|
63
|
-
bot: DiscordBot
|
|
62
|
+
export async function decodeMessage<C extends Context = Context>(
|
|
63
|
+
bot: DiscordBot<C>,
|
|
64
64
|
data: Discord.Message,
|
|
65
65
|
message: Universal.Message,
|
|
66
66
|
payload: Universal.MessageLike = message,
|
|
@@ -167,11 +167,11 @@ export async function decodeMessage(
|
|
|
167
167
|
// THREAD_STARTER_MESSAGE (21) 事件下,message_reference 有 message_id
|
|
168
168
|
if (details && data.message_reference?.message_id) {
|
|
169
169
|
const { message_id, channel_id } = data.message_reference
|
|
170
|
-
message.quote = await bot.getMessage(channel_id
|
|
170
|
+
message.quote = await bot.getMessage(channel_id!, message_id, false)
|
|
171
171
|
}
|
|
172
172
|
|
|
173
173
|
message.createdAt = new Date(data.timestamp).valueOf()
|
|
174
|
-
message.updatedAt = data.edited_timestamp
|
|
174
|
+
message.updatedAt = data.edited_timestamp ? new Date(data.edited_timestamp).valueOf() : undefined
|
|
175
175
|
if (!payload) return message
|
|
176
176
|
payload.channel = {
|
|
177
177
|
id: data.channel_id,
|
|
@@ -183,7 +183,7 @@ export async function decodeMessage(
|
|
|
183
183
|
return message
|
|
184
184
|
}
|
|
185
185
|
|
|
186
|
-
export function setupMessageGuildId(session: Session, guildId
|
|
186
|
+
export function setupMessageGuildId(session: Session, guildId?: string) {
|
|
187
187
|
session.guildId = guildId
|
|
188
188
|
session.isDirect = !guildId
|
|
189
189
|
session.subtype = guildId ? 'group' : 'private'
|
|
@@ -226,11 +226,11 @@ export async function adaptSession<C extends Context>(bot: DiscordBot<C>, input:
|
|
|
226
226
|
// if (!session.content) return
|
|
227
227
|
} else if (input.t === 'MESSAGE_UPDATE') {
|
|
228
228
|
session.type = 'message-updated'
|
|
229
|
-
const message = await bot._getMessage(input.d.channel_id
|
|
229
|
+
const message = await bot._getMessage(input.d.channel_id!, input.d.id!)
|
|
230
230
|
// Unlike creates, message updates may contain only a subset of the full message object payload
|
|
231
231
|
// https://discord.com/developers/docs/topics/gateway-events#message-update
|
|
232
232
|
await decodeMessage(bot, message, session.event.message = {}, session.event)
|
|
233
|
-
const channel = await bot.internal.getChannel(input.d.channel_id)
|
|
233
|
+
const channel = await bot.internal.getChannel(input.d.channel_id!)
|
|
234
234
|
setupMessageGuildId(session, channel.guild_id)
|
|
235
235
|
// if (!session.content) return
|
|
236
236
|
} else if (input.t === 'MESSAGE_DELETE') {
|
|
@@ -279,7 +279,7 @@ export async function adaptSession<C extends Context>(bot: DiscordBot<C>, input:
|
|
|
279
279
|
session.subtype = input.d.guild_id ? 'group' : 'private'
|
|
280
280
|
session.channelId = input.d.channel_id
|
|
281
281
|
session.guildId = input.d.guild_id
|
|
282
|
-
session.userId = session.isDirect ? input.d.user
|
|
282
|
+
session.userId = session.isDirect ? input.d.user!.id : input.d.member!.user!.id
|
|
283
283
|
session.messageId = input.d.id
|
|
284
284
|
session.content = ''
|
|
285
285
|
session.event.argv = decodeArgv(data, command)
|
|
@@ -296,7 +296,7 @@ export async function adaptSession<C extends Context>(bot: DiscordBot<C>, input:
|
|
|
296
296
|
session.subtype = input.d.guild_id ? 'group' : 'private'
|
|
297
297
|
session.channelId = input.d.channel_id
|
|
298
298
|
session.guildId = input.d.guild_id
|
|
299
|
-
session.userId = session.isDirect ? input.d.user
|
|
299
|
+
session.userId = session.isDirect ? input.d.user!.id : input.d.member!.user!.id
|
|
300
300
|
session.messageId = input.d.id
|
|
301
301
|
session.content = user_input
|
|
302
302
|
} else if (input.t === 'INTERACTION_CREATE' && input.d.type === Discord.Interaction.Type.MESSAGE_COMPONENT) {
|
|
@@ -328,7 +328,7 @@ export async function adaptSession<C extends Context>(bot: DiscordBot<C>, input:
|
|
|
328
328
|
session.isDirect = !input.d.guild_id
|
|
329
329
|
session.channelId = input.d.channel_id
|
|
330
330
|
session.guildId = input.d.guild_id
|
|
331
|
-
session.userId = session.isDirect ? input.d.user
|
|
331
|
+
session.userId = session.isDirect ? input.d.user!.id : input.d.member!.user!.id
|
|
332
332
|
session.messageId = input.d.id
|
|
333
333
|
session.content = ''
|
|
334
334
|
session.event.button = {
|
|
@@ -441,5 +441,5 @@ export function encodeCommandOptions(cmd: Universal.Command): Discord.Applicatio
|
|
|
441
441
|
})
|
|
442
442
|
}
|
|
443
443
|
}
|
|
444
|
-
return result.sort((a, b) => +b.required - +a.required)
|
|
444
|
+
return result.sort((a, b) => +b.required! - +a.required!)
|
|
445
445
|
}
|
package/src/ws.ts
CHANGED
|
@@ -5,9 +5,9 @@ import { DiscordBot } from './bot'
|
|
|
5
5
|
|
|
6
6
|
export class WsClient<C extends Context = Context> extends Adapter.WsClient<C, DiscordBot<C>> {
|
|
7
7
|
_d = 0
|
|
8
|
-
_ping
|
|
8
|
+
_ping?: NodeJS.Timeout
|
|
9
9
|
_sessionId = ''
|
|
10
|
-
_resumeUrl
|
|
10
|
+
_resumeUrl?: string
|
|
11
11
|
|
|
12
12
|
async prepare() {
|
|
13
13
|
if (this._resumeUrl) {
|
|
@@ -18,6 +18,7 @@ export class WsClient<C extends Context = Context> extends Adapter.WsClient<C, D
|
|
|
18
18
|
}
|
|
19
19
|
|
|
20
20
|
heartbeat() {
|
|
21
|
+
if (!this.socket) return
|
|
21
22
|
this.bot.logger.debug(`heartbeat d ${this._d}`)
|
|
22
23
|
this.socket.send(JSON.stringify({
|
|
23
24
|
op: Gateway.Opcode.HEARTBEAT,
|
|
@@ -26,7 +27,7 @@ export class WsClient<C extends Context = Context> extends Adapter.WsClient<C, D
|
|
|
26
27
|
}
|
|
27
28
|
|
|
28
29
|
accept() {
|
|
29
|
-
this.socket
|
|
30
|
+
this.socket!.addEventListener('message', async ({ data }) => {
|
|
30
31
|
let parsed: Gateway.Payload
|
|
31
32
|
data = data.toString()
|
|
32
33
|
try {
|
|
@@ -44,7 +45,7 @@ export class WsClient<C extends Context = Context> extends Adapter.WsClient<C, D
|
|
|
44
45
|
this._ping = setInterval(() => this.heartbeat(), parsed.d.heartbeat_interval)
|
|
45
46
|
if (this._sessionId) {
|
|
46
47
|
this.bot.logger.debug('resuming')
|
|
47
|
-
this.socket
|
|
48
|
+
this.socket!.send(JSON.stringify({
|
|
48
49
|
op: Gateway.Opcode.RESUME,
|
|
49
50
|
d: {
|
|
50
51
|
token: this.bot.config.token,
|
|
@@ -53,7 +54,7 @@ export class WsClient<C extends Context = Context> extends Adapter.WsClient<C, D
|
|
|
53
54
|
},
|
|
54
55
|
}))
|
|
55
56
|
} else {
|
|
56
|
-
this.socket
|
|
57
|
+
this.socket!.send(JSON.stringify({
|
|
57
58
|
op: Gateway.Opcode.IDENTIFY,
|
|
58
59
|
d: {
|
|
59
60
|
token: this.bot.config.token,
|
|
@@ -75,7 +76,7 @@ export class WsClient<C extends Context = Context> extends Adapter.WsClient<C, D
|
|
|
75
76
|
if (parsed.op === Gateway.Opcode.DISPATCH) {
|
|
76
77
|
this.bot.dispatch(this.bot.session({
|
|
77
78
|
type: 'internal',
|
|
78
|
-
_type: 'discord/' + parsed.t
|
|
79
|
+
_type: 'discord/' + parsed.t!.toLowerCase().replace(/_/g, '-'),
|
|
79
80
|
_data: parsed.d,
|
|
80
81
|
}))
|
|
81
82
|
if (parsed.t === 'READY') {
|
|
@@ -98,7 +99,7 @@ export class WsClient<C extends Context = Context> extends Adapter.WsClient<C, D
|
|
|
98
99
|
}
|
|
99
100
|
})
|
|
100
101
|
|
|
101
|
-
this.socket
|
|
102
|
+
this.socket!.addEventListener('close', () => {
|
|
102
103
|
clearInterval(this._ping)
|
|
103
104
|
})
|
|
104
105
|
}
|