@buape/carbon 0.5.0 → 0.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.
Files changed (67) hide show
  1. package/dist/package.json +22 -5
  2. package/dist/src/abstracts/BaseInteraction.d.ts +3 -1
  3. package/dist/src/abstracts/BaseInteraction.d.ts.map +1 -1
  4. package/dist/src/abstracts/BaseInteraction.js +13 -7
  5. package/dist/src/abstracts/BaseInteraction.js.map +1 -1
  6. package/dist/src/abstracts/Plugin.d.ts +14 -0
  7. package/dist/src/abstracts/Plugin.d.ts.map +1 -0
  8. package/dist/src/abstracts/Plugin.js +4 -0
  9. package/dist/src/abstracts/Plugin.js.map +1 -0
  10. package/dist/src/adapters/bun/index.d.ts +16 -0
  11. package/dist/src/adapters/bun/index.d.ts.map +1 -0
  12. package/dist/src/adapters/bun/index.js +20 -0
  13. package/dist/src/adapters/bun/index.js.map +1 -0
  14. package/dist/src/adapters/cloudflare/index.d.ts +16 -0
  15. package/dist/src/adapters/cloudflare/index.d.ts.map +1 -0
  16. package/dist/src/adapters/cloudflare/index.js +17 -0
  17. package/dist/src/adapters/cloudflare/index.js.map +1 -0
  18. package/dist/src/adapters/next/index.d.ts +14 -0
  19. package/dist/src/adapters/next/index.d.ts.map +1 -0
  20. package/dist/src/adapters/next/index.js +17 -0
  21. package/dist/src/adapters/next/index.js.map +1 -0
  22. package/dist/src/adapters/node/index.d.ts +16 -0
  23. package/dist/src/adapters/node/index.d.ts.map +1 -0
  24. package/dist/src/adapters/node/index.js +20 -0
  25. package/dist/src/adapters/node/index.js.map +1 -0
  26. package/dist/src/adapters/shared.d.ts +10 -0
  27. package/dist/src/adapters/shared.d.ts.map +1 -0
  28. package/dist/src/adapters/shared.js +2 -0
  29. package/dist/src/adapters/shared.js.map +1 -0
  30. package/dist/src/classes/Client.d.ts +37 -59
  31. package/dist/src/classes/Client.d.ts.map +1 -1
  32. package/dist/src/classes/Client.js +74 -112
  33. package/dist/src/classes/Client.js.map +1 -1
  34. package/dist/src/classes/Embed.d.ts +2 -1
  35. package/dist/src/classes/Embed.d.ts.map +1 -1
  36. package/dist/src/classes/Embed.js +12 -10
  37. package/dist/src/classes/Embed.js.map +1 -1
  38. package/dist/src/createHandle.d.ts +20 -0
  39. package/dist/src/createHandle.d.ts.map +1 -0
  40. package/dist/src/createHandle.js +57 -0
  41. package/dist/src/createHandle.js.map +1 -0
  42. package/dist/src/index.d.ts +1 -0
  43. package/dist/src/index.d.ts.map +1 -1
  44. package/dist/src/index.js +1 -0
  45. package/dist/src/index.js.map +1 -1
  46. package/dist/src/internals/ModalInteraction.d.ts +1 -1
  47. package/dist/src/internals/ModalInteraction.d.ts.map +1 -1
  48. package/dist/src/internals/ModalInteraction.js +1 -1
  49. package/dist/src/internals/ModalInteraction.js.map +1 -1
  50. package/dist/src/plugins/linked-roles/LinkedRoles.d.ts +61 -0
  51. package/dist/src/plugins/linked-roles/LinkedRoles.d.ts.map +1 -0
  52. package/dist/src/plugins/linked-roles/LinkedRoles.js +196 -0
  53. package/dist/src/plugins/linked-roles/LinkedRoles.js.map +1 -0
  54. package/dist/src/plugins/linked-roles/index.d.ts +3 -0
  55. package/dist/src/plugins/linked-roles/index.d.ts.map +1 -0
  56. package/dist/src/plugins/linked-roles/index.js +3 -0
  57. package/dist/src/plugins/linked-roles/index.js.map +1 -0
  58. package/dist/src/plugins/linked-roles/types.d.ts +94 -0
  59. package/dist/src/plugins/linked-roles/types.d.ts.map +1 -0
  60. package/dist/src/plugins/linked-roles/types.js +39 -0
  61. package/dist/src/plugins/linked-roles/types.js.map +1 -0
  62. package/dist/src/utils.d.ts +4 -3
  63. package/dist/src/utils.d.ts.map +1 -1
  64. package/dist/src/utils.js +15 -13
  65. package/dist/src/utils.js.map +1 -1
  66. package/dist/tsconfig.tsbuildinfo +1 -1
  67. package/package.json +23 -6
@@ -0,0 +1,196 @@
1
+ import { Plugin } from "../../abstracts/Plugin.js";
2
+ import { ApplicationRoleConnectionMetadataType } from "./types.js";
3
+ // TODO: IMO, the metadata for this should be handled similarly to the client and its commands
4
+ // That is passing an array of connection instances as the second argument to the constructor
5
+ // That is, maybe, for another pr though
6
+ // TODO: Improve the response messages
7
+ /**
8
+ * This class is the main class that is used for the linked roles feature of Carbon.
9
+ * It handles all the additional routes and oauth.
10
+ *
11
+ * @example
12
+ * ```ts
13
+ * import { createHandle, Client, ApplicationRoleConnectionMetadataType } from "@buape/carbon"
14
+ * import { LinkedRoles } from "@buape/carbon/linked-roles"
15
+ *
16
+ * const handle = createHandle((env) => {
17
+ * const client = new Client({ ... }, [ ... ])
18
+ * const linkedRoles = new LinkedRoles(client, {
19
+ * metadata: [
20
+ * {
21
+ * key: 'is_staff',
22
+ * name: 'Verified Staff',
23
+ * description: 'Whether the user is a verified staff member',
24
+ * type: ApplicationRoleConnectionMetadataType.BooleanEqual
25
+ * }
26
+ * ],
27
+ * metadataCheckers: {
28
+ * is_staff: async (userId) => {
29
+ * const allStaff = ["439223656200273932"]
30
+ * return allStaff.includes(userId)
31
+ * }
32
+ * }
33
+ * })
34
+ * return [client, linkedRoles]
35
+ * })
36
+ * ```
37
+ */
38
+ export class LinkedRoles extends Plugin {
39
+ client;
40
+ options;
41
+ constructor(client, options) {
42
+ super();
43
+ this.client = client;
44
+ this.options = { ...options };
45
+ this.appendRoutes();
46
+ }
47
+ appendRoutes() {
48
+ this.routes.push({
49
+ method: "GET",
50
+ path: "/linked-roles/deploy",
51
+ handler: this.handleDeployRequest.bind(this),
52
+ protected: true,
53
+ disabled: this.options.disableDeployRoute
54
+ });
55
+ this.routes.push({
56
+ method: "GET",
57
+ path: "/linked-roles/verify-user",
58
+ handler: this.handleUserVerificationRequest.bind(this),
59
+ disabled: this.options.disableVerifyUserRoute
60
+ });
61
+ this.routes.push({
62
+ method: "GET",
63
+ path: "/linked-roles/verify-user/callback",
64
+ handler: this.handleUserVerificationCallbackRequest.bind(this),
65
+ disabled: this.options.disableVerifyUserCallbackRoute
66
+ });
67
+ }
68
+ /**
69
+ * Handle a request to deploy the linked roles to Discord
70
+ * @returns A response
71
+ */
72
+ async handleDeployRequest() {
73
+ await this.setMetadata(this.options.metadata);
74
+ return new Response("OK", { status: 202 });
75
+ }
76
+ /**
77
+ * Handle the verify user request
78
+ * @returns A response
79
+ */
80
+ async handleUserVerificationRequest() {
81
+ return new Response("Found", {
82
+ status: 302,
83
+ headers: {
84
+ Location: `https://discord.com/oauth2/authorize?client_id=${this.client.options.clientId}&redirect_uri=${encodeURIComponent(`${this.client.options.baseUrl}/linked-roles/verify-user/callback`)}&response_type=code&scope=identify+role_connections.write&prompt=none`
85
+ }
86
+ });
87
+ }
88
+ /**
89
+ * Handle the verify user callback request
90
+ * @param req The request
91
+ * @returns A response
92
+ */
93
+ async handleUserVerificationCallbackRequest(req) {
94
+ const url = new URL(req.url);
95
+ const code = String(url.searchParams.get("code"));
96
+ const tokens = await this.getOAuthTokens(code);
97
+ const authData = await (await fetch("https://discord.com/api/v10/oauth2/@me", {
98
+ headers: {
99
+ Authorization: `Bearer ${tokens.access_token}`
100
+ }
101
+ })).json();
102
+ if (!authData.user)
103
+ return new Response("", {
104
+ status: 307,
105
+ headers: {
106
+ Location: `${this.client.options.baseUrl}/connect`
107
+ }
108
+ });
109
+ const newMetadata = await this.getMetadataFromCheckers(authData.user.id);
110
+ await this.updateMetadata(authData.user?.id, newMetadata, tokens);
111
+ // IDEA: Maybe we can redirect to a success page instead of just a message
112
+ return new Response("You can now close this tab.");
113
+ }
114
+ async getMetadataFromCheckers(userId) {
115
+ const result = {};
116
+ for (const metadata of this.options.metadata) {
117
+ const checker = this.options.metadataCheckers[metadata.key];
118
+ if (!checker)
119
+ throw new Error(`You did not provide a checker for ${metadata.key}`);
120
+ const value = await checker(userId);
121
+ switch (metadata.type) {
122
+ case ApplicationRoleConnectionMetadataType.BooleanEqual:
123
+ case ApplicationRoleConnectionMetadataType.BooleanNotEqual:
124
+ if (typeof value !== "boolean")
125
+ throw new Error(`Expected boolean for ${metadata.key}`);
126
+ break;
127
+ case ApplicationRoleConnectionMetadataType.DatetimeGreaterThanOrEqual:
128
+ case ApplicationRoleConnectionMetadataType.DatetimeLessThanOrEqual:
129
+ if (typeof value !== "number")
130
+ throw new Error(`Expected number for ${metadata.key}`);
131
+ break;
132
+ case ApplicationRoleConnectionMetadataType.IntegerEqual:
133
+ case ApplicationRoleConnectionMetadataType.IntegerNotEqual:
134
+ case ApplicationRoleConnectionMetadataType.IntegerGreaterThanOrEqual:
135
+ case ApplicationRoleConnectionMetadataType.IntegerLessThanOrEqual:
136
+ if (!(typeof value === "number" && Number.isSafeInteger(value)))
137
+ throw new Error(`Expected integer for ${metadata.key}`);
138
+ break;
139
+ default:
140
+ throw new Error(`Unknown metadata type ${metadata.type}`);
141
+ }
142
+ result[metadata.key] = value;
143
+ }
144
+ return result;
145
+ }
146
+ async getOAuthTokens(code) {
147
+ const url = "https://discord.com/api/v10/oauth2/token";
148
+ const body = new URLSearchParams({
149
+ client_id: this.client.options.clientId,
150
+ client_secret: this.client.options.clientSecret,
151
+ grant_type: "authorization_code",
152
+ code,
153
+ redirect_uri: `${this.client.options.baseUrl}/linked-roles/verify-user/callback`
154
+ });
155
+ const response = await fetch(url, {
156
+ body,
157
+ method: "POST",
158
+ headers: {
159
+ "Content-Type": "application/x-www-form-urlencoded"
160
+ }
161
+ });
162
+ if (response.ok) {
163
+ const data = await response.json();
164
+ return data;
165
+ }
166
+ throw new Error(`Error fetching OAuth tokens: [${response.status}] ${JSON.stringify(await response.json())}`);
167
+ }
168
+ async updateMetadata(userId, metadata, tokens) {
169
+ const url = `https://discord.com/api/v10/users/@me/applications/${this.client.options.clientId}/role-connection`;
170
+ const response = await fetch(url, {
171
+ method: "PUT",
172
+ body: JSON.stringify({ metadata }),
173
+ headers: {
174
+ Authorization: `Bearer ${tokens.access_token}`,
175
+ "Content-Type": "application/json"
176
+ }
177
+ });
178
+ if (!response.ok) {
179
+ throw new Error(`Error pushing discord metadata for ${userId}: [${response.status}] ${JSON.stringify(await response.json())}`);
180
+ }
181
+ }
182
+ async setMetadata(data) {
183
+ const response = await fetch(`https://discord.com/api/v10/applications/${this.client.options.clientId}/role-connections/metadata`, {
184
+ method: "PUT",
185
+ body: JSON.stringify(data),
186
+ headers: {
187
+ "Content-Type": "application/json",
188
+ Authorization: `Bot ${this.client.options.token}`
189
+ }
190
+ });
191
+ if (!response.ok) {
192
+ throw new Error(`Error pushing discord metadata: [${response.status}] ${JSON.stringify(await response.json())}`);
193
+ }
194
+ }
195
+ }
196
+ //# sourceMappingURL=LinkedRoles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LinkedRoles.js","sourceRoot":"","sources":["../../../../src/plugins/linked-roles/LinkedRoles.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export * from "./LinkedRoles.js";
2
+ export * from "./types.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/plugins/linked-roles/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAA;AAChC,cAAc,YAAY,CAAA"}
@@ -0,0 +1,3 @@
1
+ export * from "./LinkedRoles.js";
2
+ export * from "./types.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/plugins/linked-roles/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAA;AAChC,cAAc,YAAY,CAAA"}
@@ -0,0 +1,94 @@
1
+ /**
2
+ * The type of metadata that you can check for
3
+ */
4
+ export declare enum ApplicationRoleConnectionMetadataType {
5
+ /**
6
+ * The metadata value (`integer`) is less than or equal to the guild's configured value (`integer`)
7
+ */
8
+ IntegerLessThanOrEqual = 1,
9
+ /**
10
+ * The metadata value (`integer`) is greater than or equal to the guild's configured value (`integer`)
11
+ */
12
+ IntegerGreaterThanOrEqual = 2,
13
+ /**
14
+ * The metadata value (`integer`) is equal to the guild's configured value (`integer`)
15
+ */
16
+ IntegerEqual = 3,
17
+ /**
18
+ * The metadata value (`integer`) is not equal to the guild's configured value (`integer`)
19
+ */
20
+ IntegerNotEqual = 4,
21
+ /**
22
+ * The metadata value (`ISO8601 string`) is less than or equal to the guild's configured value (`integer`; days before current date)
23
+ */
24
+ DatetimeLessThanOrEqual = 5,
25
+ /**
26
+ * The metadata value (`ISO8601 string`) is greater than or equal to the guild's configured value (`integer`; days before current date)
27
+ */
28
+ DatetimeGreaterThanOrEqual = 6,
29
+ /**
30
+ * The metadata value (`integer`) is equal to the guild's configured value (`integer`; `1`)
31
+ */
32
+ BooleanEqual = 7,
33
+ /**
34
+ * The metadata value (`integer`) is not equal to the guild's configured value (`integer`; `1`)
35
+ */
36
+ BooleanNotEqual = 8
37
+ }
38
+ /**
39
+ * The options for the linked roles package
40
+ */
41
+ export type LinkedRolesOptions = {
42
+ /**
43
+ * The metadata that you want to check for, and that should show to the end-user on Discord.
44
+ */
45
+ metadata: LinkedRoleCriteria[];
46
+ /**
47
+ * The functions that you want to use to check the metadata.
48
+ * @remarks
49
+ * If you are checking a boolean, you should return `true` or `false`.
50
+ * If you are checking an integer, you should return a number that is safe to use as an integer.
51
+ * If you are checking a datetime, you should return a Date.now() timestamp.
52
+ */
53
+ metadataCheckers: {
54
+ [name: string]: (userId: string) => Promise<number | boolean>;
55
+ };
56
+ /**
57
+ * Whether the deploy route should be disabled.
58
+ * @default false
59
+ */
60
+ disableDeployRoute?: boolean;
61
+ /**
62
+ * Whether the connect route should be disabled.
63
+ * @default false
64
+ */
65
+ disableVerifyUserRoute?: boolean;
66
+ /**
67
+ * Whether the connect callback route should be disabled.
68
+ * @default false
69
+ */
70
+ disableVerifyUserCallbackRoute?: boolean;
71
+ };
72
+ /**
73
+ * The metadata that you want to check for, and that should show to the end-user on Discord.
74
+ * @remarks You can only have 5 metadata per application, and they apply across all guilds your app is in.
75
+ */
76
+ export type LinkedRoleCriteria = {
77
+ /**
78
+ * The key of the metadata. This is only used on the code side, and is not seen by the end user.
79
+ */
80
+ key: string;
81
+ /**
82
+ * The type of metadata that you want to check for.
83
+ */
84
+ type: ApplicationRoleConnectionMetadataType;
85
+ /**
86
+ * The name of the metadata. This is what the end user will see.
87
+ */
88
+ name: string;
89
+ /**
90
+ * A description of the metadata.
91
+ */
92
+ description: string;
93
+ };
94
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/plugins/linked-roles/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,oBAAY,qCAAqC;IAChD;;OAEG;IACH,sBAAsB,IAAI;IAC1B;;OAEG;IACH,yBAAyB,IAAI;IAC7B;;OAEG;IACH,YAAY,IAAI;IAChB;;OAEG;IACH,eAAe,IAAI;IACnB;;OAEG;IACH,uBAAuB,IAAI;IAC3B;;OAEG;IACH,0BAA0B,IAAI;IAC9B;;OAEG;IACH,YAAY,IAAI;IAChB;;OAEG;IACH,eAAe,IAAI;CACnB;AAED;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAChC;;OAEG;IACH,QAAQ,EAAE,kBAAkB,EAAE,CAAA;IAC9B;;;;;;OAMG;IACH,gBAAgB,EAAE;QACjB,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,CAAA;KAC7D,CAAA;IACD;;;OAGG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B;;;OAGG;IACH,sBAAsB,CAAC,EAAE,OAAO,CAAA;IAChC;;;OAGG;IACH,8BAA8B,CAAC,EAAE,OAAO,CAAA;CACxC,CAAA;AAED;;;GAGG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAChC;;OAEG;IACH,GAAG,EAAE,MAAM,CAAA;IACX;;OAEG;IACH,IAAI,EAAE,qCAAqC,CAAA;IAC3C;;OAEG;IACH,IAAI,EAAE,MAAM,CAAA;IACZ;;OAEG;IACH,WAAW,EAAE,MAAM,CAAA;CACnB,CAAA"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * The type of metadata that you can check for
3
+ */
4
+ export var ApplicationRoleConnectionMetadataType;
5
+ (function (ApplicationRoleConnectionMetadataType) {
6
+ /**
7
+ * The metadata value (`integer`) is less than or equal to the guild's configured value (`integer`)
8
+ */
9
+ ApplicationRoleConnectionMetadataType[ApplicationRoleConnectionMetadataType["IntegerLessThanOrEqual"] = 1] = "IntegerLessThanOrEqual";
10
+ /**
11
+ * The metadata value (`integer`) is greater than or equal to the guild's configured value (`integer`)
12
+ */
13
+ ApplicationRoleConnectionMetadataType[ApplicationRoleConnectionMetadataType["IntegerGreaterThanOrEqual"] = 2] = "IntegerGreaterThanOrEqual";
14
+ /**
15
+ * The metadata value (`integer`) is equal to the guild's configured value (`integer`)
16
+ */
17
+ ApplicationRoleConnectionMetadataType[ApplicationRoleConnectionMetadataType["IntegerEqual"] = 3] = "IntegerEqual";
18
+ /**
19
+ * The metadata value (`integer`) is not equal to the guild's configured value (`integer`)
20
+ */
21
+ ApplicationRoleConnectionMetadataType[ApplicationRoleConnectionMetadataType["IntegerNotEqual"] = 4] = "IntegerNotEqual";
22
+ /**
23
+ * The metadata value (`ISO8601 string`) is less than or equal to the guild's configured value (`integer`; days before current date)
24
+ */
25
+ ApplicationRoleConnectionMetadataType[ApplicationRoleConnectionMetadataType["DatetimeLessThanOrEqual"] = 5] = "DatetimeLessThanOrEqual";
26
+ /**
27
+ * The metadata value (`ISO8601 string`) is greater than or equal to the guild's configured value (`integer`; days before current date)
28
+ */
29
+ ApplicationRoleConnectionMetadataType[ApplicationRoleConnectionMetadataType["DatetimeGreaterThanOrEqual"] = 6] = "DatetimeGreaterThanOrEqual";
30
+ /**
31
+ * The metadata value (`integer`) is equal to the guild's configured value (`integer`; `1`)
32
+ */
33
+ ApplicationRoleConnectionMetadataType[ApplicationRoleConnectionMetadataType["BooleanEqual"] = 7] = "BooleanEqual";
34
+ /**
35
+ * The metadata value (`integer`) is not equal to the guild's configured value (`integer`; `1`)
36
+ */
37
+ ApplicationRoleConnectionMetadataType[ApplicationRoleConnectionMetadataType["BooleanNotEqual"] = 8] = "BooleanNotEqual";
38
+ })(ApplicationRoleConnectionMetadataType || (ApplicationRoleConnectionMetadataType = {}));
39
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/plugins/linked-roles/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAN,IAAY,qCAiCX;AAjCD,WAAY,qCAAqC;IAChD;;OAEG;IACH,qIAA0B,CAAA;IAC1B;;OAEG;IACH,2IAA6B,CAAA;IAC7B;;OAEG;IACH,iHAAgB,CAAA;IAChB;;OAEG;IACH,uHAAmB,CAAA;IACnB;;OAEG;IACH,uIAA2B,CAAA;IAC3B;;OAEG;IACH,6IAA8B,CAAA;IAC9B;;OAEG;IACH,iHAAgB,CAAA;IAChB;;OAEG;IACH,uHAAmB,CAAA;AACpB,CAAC,EAjCW,qCAAqC,KAArC,qCAAqC,QAiChD"}
@@ -4,9 +4,7 @@ export declare const splitCustomId: (customId: string) => [string, Record<string
4
4
  export declare const subtleCrypto: SubtleCrypto;
5
5
  export declare function valueToUint8Array(value: Uint8Array | ArrayBuffer | Buffer | string, format?: string): Uint8Array;
6
6
  export declare function concatUint8Arrays(arr1: Uint8Array, arr2: Uint8Array): Uint8Array;
7
- export declare const serializePayload: (payload: MessagePayload) => {
8
- content: string;
9
- } | {
7
+ export declare const serializePayload: (payload: MessagePayload, defaultEphemeral?: boolean) => {
10
8
  embeds: import("discord-api-types/v10").APIEmbed[] | undefined;
11
9
  components: import("discord-api-types/v10").APIActionRowComponent<import("discord-api-types/v10").APIActionRowComponentTypes>[] | undefined;
12
10
  content?: string;
@@ -17,5 +15,8 @@ export declare const serializePayload: (payload: MessagePayload) => {
17
15
  };
18
16
  flags?: number;
19
17
  tts?: boolean;
18
+ } | {
19
+ content: string;
20
+ flags: number | undefined;
20
21
  };
21
22
  //# sourceMappingURL=utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,SAAS,IAAI,CAAC,SAAS,IAAI,GAAG,CAAC,GAAG,CAAC,CAAA;AACvE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAEhD,eAAO,MAAM,aAAa,aACf,MAAM,KACd,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAUjC,CAAA;AAsBD,eAAO,MAAM,YAAY,cAAoB,CAAA;AAE7C,wBAAgB,iBAAiB,CAChC,KAAK,EAAE,UAAU,GAAG,WAAW,GAAG,MAAM,GAAG,MAAM,EACjD,MAAM,CAAC,EAAE,MAAM,GACb,UAAU,CA8BZ;AAED,wBAAgB,iBAAiB,CAChC,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE,UAAU,GACd,UAAU,CAKZ;AAED,eAAO,MAAM,gBAAgB,YAAa,cAAc;;;;;;;aAhEZ,CAAC;aAG5C,CAAD;aAAoB,CAAC;;;;CAqEpB,CAAA"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,SAAS,IAAI,CAAC,SAAS,IAAI,GAAG,CAAC,GAAG,CAAC,CAAA;AACvE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAEhD,eAAO,MAAM,aAAa,aACf,MAAM,KACd,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAUjC,CAAA;AAsBD,eAAO,MAAM,YAAY,cAAoB,CAAA;AAE7C,wBAAgB,iBAAiB,CAChC,KAAK,EAAE,UAAU,GAAG,WAAW,GAAG,MAAM,GAAG,MAAM,EACjD,MAAM,CAAC,EAAE,MAAM,GACb,UAAU,CA4BZ;AAED,wBAAgB,iBAAiB,CAChC,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE,UAAU,GACd,UAAU,CAKZ;AAED,eAAO,MAAM,gBAAgB,YACnB,cAAc;;;;;aA/DoB,CAAC;aAG5C,CAAD;aAAoB,CAAC;;;;;;;CA2EpB,CAAA"}
package/dist/src/utils.js CHANGED
@@ -42,12 +42,9 @@ export function valueToUint8Array(value, format) {
42
42
  }
43
43
  return new TextEncoder().encode(value);
44
44
  }
45
- try {
46
- if (Buffer.isBuffer(value)) {
47
- return new Uint8Array(value);
48
- }
45
+ if (Buffer.isBuffer(value)) {
46
+ return new Uint8Array(value);
49
47
  }
50
- catch (_) { }
51
48
  if (value instanceof ArrayBuffer) {
52
49
  return new Uint8Array(value);
53
50
  }
@@ -62,13 +59,18 @@ export function concatUint8Arrays(arr1, arr2) {
62
59
  merged.set(arr2, arr1.length);
63
60
  return merged;
64
61
  }
65
- export const serializePayload = (payload) => {
66
- return typeof payload === "string"
67
- ? { content: payload }
68
- : {
69
- ...payload,
70
- embeds: payload.embeds?.map((embed) => embed.serialize()),
71
- components: payload.components?.map((row) => row.serialize())
72
- };
62
+ export const serializePayload = (payload, defaultEphemeral = false) => {
63
+ if (typeof payload === "string") {
64
+ return { content: payload, flags: defaultEphemeral ? 64 : undefined };
65
+ }
66
+ const data = {
67
+ ...payload,
68
+ embeds: payload.embeds?.map((embed) => embed.serialize()),
69
+ components: payload.components?.map((row) => row.serialize())
70
+ };
71
+ if (defaultEphemeral) {
72
+ data.flags = 64;
73
+ }
74
+ return data;
73
75
  };
74
76
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,aAAa,GAAG,CAC5B,QAAgB,EACmB,EAAE;IACrC,MAAM,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IACzC,IAAI,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAA;IAC1D,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,CAC9B,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QAChB,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QACnC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;IACpB,CAAC,CAAC,CACF,CAAA;IACD,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA;AAClB,CAAC,CAAA;AAED,+DAA+D;AAE/D,SAAS,eAAe;IACvB,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QACpD,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAA;IAC5B,CAAC;IACD,IAAI,OAAO,UAAU,KAAK,WAAW,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;QAC5D,OAAO,UAAU,CAAC,MAAM,CAAC,MAAM,CAAA;IAChC,CAAC;IACD,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;QACnC,OAAO,MAAM,CAAC,MAAM,CAAA;IACrB,CAAC;IACD,IAAI,OAAO,OAAO,KAAK,UAAU,EAAE,CAAC;QACnC,MAAM,aAAa,GAAG,aAAa,CAAA;QACnC,MAAM,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAAA;QACrC,OAAO,MAAM,CAAC,SAAS,CAAC,MAAM,CAAA;IAC/B,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAA;AAC1D,CAAC;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,eAAe,EAAE,CAAA;AAE7C,MAAM,UAAU,iBAAiB,CAChC,KAAiD,EACjD,MAAe;IAEf,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;QACnB,OAAO,IAAI,UAAU,EAAE,CAAA;IACxB,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC/B,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;YACtB,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;YACtC,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;gBACrB,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAA;YACnD,CAAC;YACD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAA;YACvE,OAAO,IAAI,UAAU,CAAC,MAAM,CAAC,CAAA;QAC9B,CAAC;QAED,OAAO,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IACvC,CAAC;IACD,IAAI,CAAC;QACJ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO,IAAI,UAAU,CAAC,KAAK,CAAC,CAAA;QAC7B,CAAC;IACF,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC,CAAA,CAAC;IACd,IAAI,KAAK,YAAY,WAAW,EAAE,CAAC;QAClC,OAAO,IAAI,UAAU,CAAC,KAAK,CAAC,CAAA;IAC7B,CAAC;IACD,IAAI,KAAK,YAAY,UAAU,EAAE,CAAC;QACjC,OAAO,KAAK,CAAA;IACb,CAAC;IACD,MAAM,IAAI,KAAK,CACd,kFAAkF,CAClF,CAAA;AACF,CAAC;AAED,MAAM,UAAU,iBAAiB,CAChC,IAAgB,EAChB,IAAgB;IAEhB,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAA;IACxD,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IAChB,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;IAC7B,OAAO,MAAM,CAAA;AACd,CAAC;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,OAAuB,EAAE,EAAE;IAC3D,OAAO,OAAO,OAAO,KAAK,QAAQ;QACjC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE;QACtB,CAAC,CAAC;YACA,GAAG,OAAO;YACV,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;YACzD,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;SAC7D,CAAA;AACJ,CAAC,CAAA"}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"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"}