@satorijs/adapter-discord 4.5.10 → 4.6.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/lib/bot.d.ts +11 -6
- package/lib/index.cjs +44 -26
- 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 +18 -13
- 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 +25 -15
- 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);
|
|
@@ -40,15 +40,20 @@ export declare class DiscordBot<C extends Context = Context> extends Bot<C, Disc
|
|
|
40
40
|
getChannelList(guildId: string): Promise<{
|
|
41
41
|
data: Universal.Channel[];
|
|
42
42
|
}>;
|
|
43
|
-
createReaction(channelId: string, messageId: string,
|
|
44
|
-
deleteReaction(channelId: string, messageId: string,
|
|
45
|
-
clearReaction(channelId: string, messageId: string,
|
|
46
|
-
getReactionList(channelId: string, messageId: string,
|
|
43
|
+
createReaction(channelId: string, messageId: string, emojiId: string): Promise<void>;
|
|
44
|
+
deleteReaction(channelId: string, messageId: string, emojiId: string, userId?: string): Promise<void>;
|
|
45
|
+
clearReaction(channelId: string, messageId: string, emojiId?: string): Promise<void>;
|
|
46
|
+
getReactionList(channelId: string, messageId: string, emojiId: string, after?: string): Promise<{
|
|
47
47
|
data: Universal.User[];
|
|
48
48
|
next: string;
|
|
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
|
}
|
|
@@ -1229,8 +1230,8 @@ var decodeUser = /* @__PURE__ */ __name((user) => ({
|
|
|
1229
1230
|
var decodeGuildMember = /* @__PURE__ */ __name((member) => ({
|
|
1230
1231
|
user: member.user && decodeUser(member.user),
|
|
1231
1232
|
nick: member.nick,
|
|
1232
|
-
roles: member.roles,
|
|
1233
|
-
joinedAt: member.joined_at
|
|
1233
|
+
roles: member.roles?.map((id) => ({ id })),
|
|
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,
|
|
@@ -1491,11 +1492,21 @@ async function adaptSession(bot, input) {
|
|
|
1491
1492
|
session.event.button = {
|
|
1492
1493
|
id
|
|
1493
1494
|
};
|
|
1495
|
+
} else if (input.t === "CHANNEL_CREATE") {
|
|
1496
|
+
session.type = "channel-added";
|
|
1497
|
+
session.guildId = input.d.guild_id;
|
|
1498
|
+
session.channelId = input.d.id;
|
|
1499
|
+
session.event.channel = decodeChannel(input.d);
|
|
1494
1500
|
} else if (input.t === "CHANNEL_UPDATE") {
|
|
1495
1501
|
session.type = "channel-updated";
|
|
1496
1502
|
session.guildId = input.d.guild_id;
|
|
1497
|
-
session.subtype = input.d.guild_id ? "group" : "private";
|
|
1498
1503
|
session.channelId = input.d.id;
|
|
1504
|
+
session.event.channel = decodeChannel(input.d);
|
|
1505
|
+
} else if (input.t === "CHANNEL_DELETE") {
|
|
1506
|
+
session.type = "channel-removed";
|
|
1507
|
+
session.guildId = input.d.guild_id;
|
|
1508
|
+
session.channelId = input.d.id;
|
|
1509
|
+
session.event.channel = decodeChannel(input.d);
|
|
1499
1510
|
} else {
|
|
1500
1511
|
return;
|
|
1501
1512
|
}
|
|
@@ -1608,9 +1619,9 @@ var DiscordMessageEncoder = class extends import_core3.MessageEncoder {
|
|
|
1608
1619
|
stack = [new State("message")];
|
|
1609
1620
|
buffer = "";
|
|
1610
1621
|
addition = {};
|
|
1611
|
-
figure
|
|
1622
|
+
figure;
|
|
1612
1623
|
mode = "default";
|
|
1613
|
-
listType
|
|
1624
|
+
listType;
|
|
1614
1625
|
rows = [];
|
|
1615
1626
|
async getUrl() {
|
|
1616
1627
|
const input = this.options?.session?.discord;
|
|
@@ -1657,7 +1668,9 @@ var DiscordMessageEncoder = class extends import_core3.MessageEncoder {
|
|
|
1657
1668
|
if (this.bot.http.isError(e) && e.response) {
|
|
1658
1669
|
if (e.response.data?.code === 10015) {
|
|
1659
1670
|
this.bot.logger.debug("webhook has been deleted, recreating..., %o", e.response.data);
|
|
1660
|
-
if (!this.bot.webhookLock[this.channelId])
|
|
1671
|
+
if (!this.bot.webhookLock[this.channelId]) {
|
|
1672
|
+
this.bot.webhooks[this.channelId] = null;
|
|
1673
|
+
}
|
|
1661
1674
|
await this.ensureWebhook();
|
|
1662
1675
|
return this.post(data, headers);
|
|
1663
1676
|
} else {
|
|
@@ -1708,7 +1721,7 @@ var DiscordMessageEncoder = class extends import_core3.MessageEncoder {
|
|
|
1708
1721
|
headers: { accept: type + "/*" },
|
|
1709
1722
|
timeout: 1e3
|
|
1710
1723
|
}).then(
|
|
1711
|
-
(headers) => headers.get("content-type")
|
|
1724
|
+
(headers) => headers.get("content-type")?.startsWith(type),
|
|
1712
1725
|
() => false
|
|
1713
1726
|
);
|
|
1714
1727
|
}
|
|
@@ -1829,7 +1842,7 @@ var DiscordMessageEncoder = class extends import_core3.MessageEncoder {
|
|
|
1829
1842
|
} else if (type === "ul" || type === "ol") {
|
|
1830
1843
|
this.listType = type;
|
|
1831
1844
|
await this.render(children);
|
|
1832
|
-
this.listType =
|
|
1845
|
+
this.listType = void 0;
|
|
1833
1846
|
} else if (type === "li") {
|
|
1834
1847
|
if (!this.buffer.endsWith("\n")) this.buffer += "\n";
|
|
1835
1848
|
if (this.listType === "ol") {
|
|
@@ -1837,7 +1850,7 @@ var DiscordMessageEncoder = class extends import_core3.MessageEncoder {
|
|
|
1837
1850
|
} else if (this.listType === "ul") {
|
|
1838
1851
|
this.buffer += "- ";
|
|
1839
1852
|
}
|
|
1840
|
-
this.render(children);
|
|
1853
|
+
await this.render(children);
|
|
1841
1854
|
this.buffer += "\n";
|
|
1842
1855
|
} else if (type === "at") {
|
|
1843
1856
|
if (attrs.id) {
|
|
@@ -2027,6 +2040,7 @@ var WsClient = class extends import_core4.Adapter.WsClient {
|
|
|
2027
2040
|
return this.bot.http.ws(url + "/?v=10&encoding=json");
|
|
2028
2041
|
}
|
|
2029
2042
|
heartbeat() {
|
|
2043
|
+
if (!this.socket) return;
|
|
2030
2044
|
this.bot.logger.debug(`heartbeat d ${this._d}`);
|
|
2031
2045
|
this.socket.send(JSON.stringify({
|
|
2032
2046
|
op: Gateway.Opcode.HEARTBEAT,
|
|
@@ -2240,25 +2254,25 @@ var DiscordBot = class extends import_core5.Bot {
|
|
|
2240
2254
|
const channels = await this.internal.getGuildChannels(guildId);
|
|
2241
2255
|
return { data: channels.map(decodeChannel) };
|
|
2242
2256
|
}
|
|
2243
|
-
createReaction(channelId, messageId,
|
|
2244
|
-
return this.internal.createReaction(channelId, messageId,
|
|
2257
|
+
createReaction(channelId, messageId, emojiId) {
|
|
2258
|
+
return this.internal.createReaction(channelId, messageId, emojiId);
|
|
2245
2259
|
}
|
|
2246
|
-
deleteReaction(channelId, messageId,
|
|
2260
|
+
deleteReaction(channelId, messageId, emojiId, userId) {
|
|
2247
2261
|
if (!userId) {
|
|
2248
|
-
return this.internal.deleteOwnReaction(channelId, messageId,
|
|
2262
|
+
return this.internal.deleteOwnReaction(channelId, messageId, emojiId);
|
|
2249
2263
|
} else {
|
|
2250
|
-
return this.internal.deleteUserReaction(channelId, messageId,
|
|
2264
|
+
return this.internal.deleteUserReaction(channelId, messageId, emojiId, userId);
|
|
2251
2265
|
}
|
|
2252
2266
|
}
|
|
2253
|
-
clearReaction(channelId, messageId,
|
|
2254
|
-
if (!
|
|
2267
|
+
clearReaction(channelId, messageId, emojiId) {
|
|
2268
|
+
if (!emojiId) {
|
|
2255
2269
|
return this.internal.deleteAllReactions(channelId, messageId);
|
|
2256
2270
|
} else {
|
|
2257
|
-
return this.internal.deleteAllReactionsForEmoji(channelId, messageId,
|
|
2271
|
+
return this.internal.deleteAllReactionsForEmoji(channelId, messageId, emojiId);
|
|
2258
2272
|
}
|
|
2259
2273
|
}
|
|
2260
|
-
async getReactionList(channelId, messageId,
|
|
2261
|
-
const data = await this.internal.getReactions(channelId, messageId,
|
|
2274
|
+
async getReactionList(channelId, messageId, emojiId, after) {
|
|
2275
|
+
const data = await this.internal.getReactions(channelId, messageId, emojiId, { after, limit: 100 });
|
|
2262
2276
|
return { data: data.map(decodeUser), next: data[99]?.id };
|
|
2263
2277
|
}
|
|
2264
2278
|
setGuildMemberRole(guildId, userId, roleId) {
|
|
@@ -2267,6 +2281,10 @@ var DiscordBot = class extends import_core5.Bot {
|
|
|
2267
2281
|
unsetGuildMemberRole(guildId, userId, roleId) {
|
|
2268
2282
|
return this.internal.removeGuildMemberRole(guildId, userId, roleId);
|
|
2269
2283
|
}
|
|
2284
|
+
async getGuildMemberRoleList(guildId, userId, next) {
|
|
2285
|
+
const data = await this.internal.getGuildMember(guildId, userId);
|
|
2286
|
+
return { data: data.roles.map((id) => ({ id })) };
|
|
2287
|
+
}
|
|
2270
2288
|
async getGuildRoleList(guildId) {
|
|
2271
2289
|
const data = await this.internal.getGuildRoles(guildId);
|
|
2272
2290
|
return { data: data.map(decodeRole) };
|
|
@@ -2320,7 +2338,7 @@ var DiscordBot = class extends import_core5.Bot {
|
|
|
2320
2338
|
})(DiscordBot || (DiscordBot = {}));
|
|
2321
2339
|
|
|
2322
2340
|
// src/index.ts
|
|
2323
|
-
var
|
|
2341
|
+
var index_default = DiscordBot;
|
|
2324
2342
|
// Annotate the CommonJS export names for ESM import in node:
|
|
2325
2343
|
0 && (module.exports = {
|
|
2326
2344
|
Discord,
|
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.
|
|
4
|
+
"version": "4.6.0",
|
|
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.
|
|
36
|
+
"@satorijs/core": "^4.6.0",
|
|
37
37
|
"cordis": "^3.18.1"
|
|
38
38
|
},
|
|
39
39
|
"peerDependencies": {
|
|
40
|
-
"@satorijs/core": "^4.
|
|
40
|
+
"@satorijs/core": "^4.6.0"
|
|
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
|
|
|
@@ -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) {
|
|
@@ -155,28 +155,28 @@ export class DiscordBot<C extends Context = Context> extends Bot<C, DiscordBot.C
|
|
|
155
155
|
return { data: channels.map(Discord.decodeChannel) }
|
|
156
156
|
}
|
|
157
157
|
|
|
158
|
-
createReaction(channelId: string, messageId: string,
|
|
159
|
-
return this.internal.createReaction(channelId, messageId,
|
|
158
|
+
createReaction(channelId: string, messageId: string, emojiId: string) {
|
|
159
|
+
return this.internal.createReaction(channelId, messageId, emojiId)
|
|
160
160
|
}
|
|
161
161
|
|
|
162
|
-
deleteReaction(channelId: string, messageId: string,
|
|
162
|
+
deleteReaction(channelId: string, messageId: string, emojiId: string, userId?: string) {
|
|
163
163
|
if (!userId) {
|
|
164
|
-
return this.internal.deleteOwnReaction(channelId, messageId,
|
|
164
|
+
return this.internal.deleteOwnReaction(channelId, messageId, emojiId)
|
|
165
165
|
} else {
|
|
166
|
-
return this.internal.deleteUserReaction(channelId, messageId,
|
|
166
|
+
return this.internal.deleteUserReaction(channelId, messageId, emojiId, userId)
|
|
167
167
|
}
|
|
168
168
|
}
|
|
169
169
|
|
|
170
|
-
clearReaction(channelId: string, messageId: string,
|
|
171
|
-
if (!
|
|
170
|
+
clearReaction(channelId: string, messageId: string, emojiId?: string) {
|
|
171
|
+
if (!emojiId) {
|
|
172
172
|
return this.internal.deleteAllReactions(channelId, messageId)
|
|
173
173
|
} else {
|
|
174
|
-
return this.internal.deleteAllReactionsForEmoji(channelId, messageId,
|
|
174
|
+
return this.internal.deleteAllReactionsForEmoji(channelId, messageId, emojiId)
|
|
175
175
|
}
|
|
176
176
|
}
|
|
177
177
|
|
|
178
|
-
async getReactionList(channelId: string, messageId: string,
|
|
179
|
-
const data = await this.internal.getReactions(channelId, messageId,
|
|
178
|
+
async getReactionList(channelId: string, messageId: string, emojiId: string, after?: string) {
|
|
179
|
+
const data = await this.internal.getReactions(channelId, messageId, emojiId, { after, limit: 100 })
|
|
180
180
|
return { data: data.map(Discord.decodeUser), next: data[99]?.id }
|
|
181
181
|
}
|
|
182
182
|
|
|
@@ -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
|
@@ -28,8 +28,8 @@ export const decodeUser = (user: Discord.User): Universal.User => ({
|
|
|
28
28
|
export const decodeGuildMember = (member: Partial<Discord.GuildMember>): Universal.GuildMember => ({
|
|
29
29
|
user: member.user && decodeUser(member.user),
|
|
30
30
|
nick: member.nick,
|
|
31
|
-
roles: member.roles,
|
|
32
|
-
joinedAt: member.joined_at
|
|
31
|
+
roles: member.roles?.map(id => ({ id })),
|
|
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,17 +328,27 @@ 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 = {
|
|
335
335
|
id,
|
|
336
336
|
}
|
|
337
|
+
} else if (input.t === 'CHANNEL_CREATE') {
|
|
338
|
+
session.type = 'channel-added'
|
|
339
|
+
session.guildId = input.d.guild_id
|
|
340
|
+
session.channelId = input.d.id
|
|
341
|
+
session.event.channel = decodeChannel(input.d)
|
|
337
342
|
} else if (input.t === 'CHANNEL_UPDATE') {
|
|
338
343
|
session.type = 'channel-updated'
|
|
339
344
|
session.guildId = input.d.guild_id
|
|
340
|
-
session.subtype = input.d.guild_id ? 'group' : 'private'
|
|
341
345
|
session.channelId = input.d.id
|
|
346
|
+
session.event.channel = decodeChannel(input.d)
|
|
347
|
+
} else if (input.t === 'CHANNEL_DELETE') {
|
|
348
|
+
session.type = 'channel-removed'
|
|
349
|
+
session.guildId = input.d.guild_id
|
|
350
|
+
session.channelId = input.d.id
|
|
351
|
+
session.event.channel = decodeChannel(input.d)
|
|
342
352
|
} else {
|
|
343
353
|
return
|
|
344
354
|
}
|
|
@@ -441,5 +451,5 @@ export function encodeCommandOptions(cmd: Universal.Command): Discord.Applicatio
|
|
|
441
451
|
})
|
|
442
452
|
}
|
|
443
453
|
}
|
|
444
|
-
return result.sort((a, b) => +b.required - +a.required)
|
|
454
|
+
return result.sort((a, b) => +b.required! - +a.required!)
|
|
445
455
|
}
|