dfx 0.9.3 → 0.9.5
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/README.md +39 -1
- package/dist/Interactions/gateway.d.ts +1 -1
- package/dist/Interactions/gateway.d.ts.map +1 -1
- package/dist/Interactions/gateway.js +1 -1
- package/dist/Interactions/gateway.js.map +1 -1
- package/dist/Interactions/index.d.ts +1 -1
- package/dist/Interactions/index.d.ts.map +1 -1
- package/dist/Interactions/index.js +1 -1
- package/dist/Interactions/index.js.map +1 -1
- package/dist/Interactions/utils.d.ts +1 -0
- package/dist/Interactions/utils.d.ts.map +1 -1
- package/dist/Interactions/utils.js +37 -0
- package/dist/Interactions/utils.js.map +1 -1
- package/dist/Interactions/webhook.d.ts +9 -2
- package/dist/Interactions/webhook.d.ts.map +1 -1
- package/dist/Interactions/webhook.js +15 -6
- package/dist/Interactions/webhook.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/webhooks.d.ts +1 -1
- package/dist/webhooks.d.ts.map +1 -1
- package/dist/webhooks.js.map +1 -1
- package/package.json +2 -2
- package/src/Interactions/gateway.ts +47 -46
- package/src/Interactions/index.ts +2 -1
- package/src/Interactions/utils.ts +38 -0
- package/src/Interactions/webhook.ts +21 -10
- package/src/index.ts +1 -1
- package/src/webhooks.ts +1 -1
package/README.md
CHANGED
|
@@ -1,3 +1,41 @@
|
|
|
1
1
|
# dfx
|
|
2
2
|
|
|
3
|
-
A Discord library
|
|
3
|
+
A Discord library built on top of @effect/io
|
|
4
|
+
|
|
5
|
+
- Supports both the gateway and webhooks
|
|
6
|
+
- Simple yet powerful abstractions to build Discord bots
|
|
7
|
+
|
|
8
|
+
## Example
|
|
9
|
+
|
|
10
|
+
```typescript
|
|
11
|
+
import * as Effect from "@effect/io/Effect"
|
|
12
|
+
import { pipe } from "@fp-ts/data/Function"
|
|
13
|
+
import { Ix, runIxGateway, makeLayer } from "dfx"
|
|
14
|
+
|
|
15
|
+
// Create the dependencies layer
|
|
16
|
+
const Dependencies = makeLayer({
|
|
17
|
+
token: "xxx",
|
|
18
|
+
})
|
|
19
|
+
|
|
20
|
+
// Create hello command that responds with "Hello!"
|
|
21
|
+
const hello = Ix.global(
|
|
22
|
+
{
|
|
23
|
+
name: "hello",
|
|
24
|
+
description: "A basic command",
|
|
25
|
+
},
|
|
26
|
+
Effect.succeedSome({
|
|
27
|
+
type: 4,
|
|
28
|
+
data: {
|
|
29
|
+
content: "Hello!",
|
|
30
|
+
},
|
|
31
|
+
}),
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
// Run it
|
|
35
|
+
pipe(
|
|
36
|
+
Ix.builder.add(hello),
|
|
37
|
+
runIxGateway((error) => Effect.fail(error)),
|
|
38
|
+
Effect.providerLayer(Dependencies),
|
|
39
|
+
Effect.unsafeRunPromise,
|
|
40
|
+
)
|
|
41
|
+
```
|
|
@@ -3,5 +3,5 @@ import { InteractionBuilder } from "./index.js";
|
|
|
3
3
|
export interface RunOpts {
|
|
4
4
|
sync?: boolean;
|
|
5
5
|
}
|
|
6
|
-
export declare const run: <
|
|
6
|
+
export declare const run: <R2, E, E2>(catchAll: (e: import("../Http/index.js").FetchError | import("../Http/index.js").StatusCodeError | import("../Http/index.js").JsonParseError | E) => import("../common.js").Effect<R2, E2, any>, { sync }?: RunOpts) => <R>(ix: InteractionBuilder<R, E>) => import("../common.js").Effect<import("../index.js").DiscordREST | import("../DiscordGateway/index.js").DiscordGateway | R2 | R, import("../Http/index.js").FetchError | import("../Http/index.js").StatusCodeError | import("../Http/index.js").JsonParseError | E2, void>;
|
|
7
7
|
//# sourceMappingURL=gateway.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gateway.d.ts","sourceRoot":"","sources":["../../src/Interactions/gateway.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAG/C,MAAM,WAAW,OAAO;IACtB,IAAI,CAAC,EAAE,OAAO,CAAA;CACf;AAED,eAAO,MAAM,GAAG,
|
|
1
|
+
{"version":3,"file":"gateway.d.ts","sourceRoot":"","sources":["../../src/Interactions/gateway.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAG/C,MAAM,WAAW,OAAO;IACtB,IAAI,CAAC,EAAE,OAAO,CAAA;CACf;AAED,eAAO,MAAM,GAAG,0NAKK,OAAO,oTAyCtB,CAAA"}
|
|
@@ -4,7 +4,7 @@ import * as tsplus_module_3 from "@fp-ts/data/Option";
|
|
|
4
4
|
import * as tsplus_module_4 from "dfx/common-gateway";
|
|
5
5
|
import { handlers } from "./handlers.js";
|
|
6
6
|
import { splitDefinitions } from "./utils.js";
|
|
7
|
-
export const run = (
|
|
7
|
+
export const run = (catchAll, { sync = true } = {}) => (ix) => (() => {
|
|
8
8
|
const { GlobalApplicationCommand, GuildApplicationCommand } = splitDefinitions(ix.definitions);
|
|
9
9
|
return tsplus_module_1.flatMap(application => {
|
|
10
10
|
const globalSync = tsplus_module_2.Rest.rest.bulkOverwriteGlobalApplicationCommands(application.id, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gateway.js","sourceRoot":"","sources":["../../src/Interactions/gateway.ts"],"names":[],"mappings":";;;;AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAExC,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAM7C,MAAM,CAAC,MAAM,GAAG,
|
|
1
|
+
{"version":3,"file":"gateway.js","sourceRoot":"","sources":["../../src/Interactions/gateway.ts"],"names":[],"mappings":";;;;AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAExC,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAM7C,MAAM,CAAC,MAAM,GAAG,GACd,CACE,QAEwB,EACxB,EAAE,IAAI,GAAG,IAAI,KAAc,EAAE,EAC7B,EAAE,CACJ,CAAI,EAA4B,EAAE,EAAE;IAEhC,MAAM,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,GACzD,gBAAgB,CAAC,EAAE,CAAC,WAAW,CAAC,CAAA;mCAE5B,WAAW;QAIjB,MAAM,UAAU,GAAG,gBAAA,IAAI,CAAC,IAAI,CAAC,sCAAsC,CACjE,WAAW,CAAC,EAAE,EACd;YACE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,wBAAwB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;SACrE,CACF,CAAA;QAED,MAAM,SAAS,GAAG,uBAAuB,CAAC,MAAM;YAC9C,CAAC,CAAC,gBAAA,OAAO,CAAC,cAAc,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,EAAE,CAC3C,gBAAA,IAAI,CAAC,IAAI,CAAC,qCAAqC,CAC7C,WAAW,CAAC,EAAE,EACd,CAAC,CAAC,EAAE,EACJ,uBAAuB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAQ,CACrD,CACF;YACH,CAAC,CAAC,sBAAa,CAAA;QAEjB,MAAM,MAAM,GAAG,QAAQ,CAAC,EAAE,CAAC,WAAW,CAAC,CAAA;QAEvC,MAAM,GAAG,GAAG,gBAAA,OAAO,CAAC,cAAc,CAAC,oBAAoB,EAAE,CAAC,CAAC,EAAE,EAAE,CAC7D,yBAMY,QAAQ,EANpB,oBACO,CAAC,CAAC,EAAE,EAAE,CACT,4CAAqB,CAAC,CAAC,EAAE,EAAE,CACzB,gBAAA,IAAI,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,EADvD,CAAC,CAEA,EAJL,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAKd,CACkB,CACtB,CAAA;iDAEC,IAAI,CAAC,CAAC,CAAC,uBAA8B,SAAS,EAAvC,uBAAW,UAAU,EAArB,GAAG,CAAmB,CAAkB,CAAC,CAAC,CAAC,GAAG;OAhCrD,wBAAwD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAArE,gBAAA,IAAI,CAAC,IAAI,CAAC,mCAAmC,EAAE,CAAuB;IAiCxE,CAAA"}
|
|
@@ -2,7 +2,7 @@ import { Rest, Discord } from "dfx/common";
|
|
|
2
2
|
import * as D from "./definitions.js";
|
|
3
3
|
export * from "./context.js";
|
|
4
4
|
export { global, guild, messageComponent, modalSubmit, autocomplete, InteractionDefinition, InteractionResponse, } from "./definitions.js";
|
|
5
|
-
export {
|
|
5
|
+
export { makeConfigLayer as makeWebhookConfig, makeHandler as makeWebhookHandler, MakeConfigOpts as MakeWebhookConfigOpts, WebhookConfig, WebhookParseError, BadWebhookSignature, } from "./webhook.js";
|
|
6
6
|
export declare class InteractionBuilder<R, E> {
|
|
7
7
|
readonly definitions: D.InteractionDefinition<R, E>[];
|
|
8
8
|
constructor(definitions: D.InteractionDefinition<R, E>[]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/Interactions/index.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,CAAC,MAAM,kBAAkB,CAAA;AAErC,cAAc,cAAc,CAAA;AAE5B,OAAO,EACL,MAAM,EACN,KAAK,EACL,gBAAgB,EAChB,WAAW,EACX,YAAY,EACZ,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,kBAAkB,CAAA;AAEzB,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/Interactions/index.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,CAAC,MAAM,kBAAkB,CAAA;AAErC,cAAc,cAAc,CAAA;AAE5B,OAAO,EACL,MAAM,EACN,KAAK,EACL,gBAAgB,EAChB,WAAW,EACX,YAAY,EACZ,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,kBAAkB,CAAA;AAEzB,OAAO,EACL,eAAe,IAAI,iBAAiB,EACpC,WAAW,IAAI,kBAAkB,EACjC,cAAc,IAAI,qBAAqB,EACvC,aAAa,EACb,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,cAAc,CAAA;AAErB,qBAAa,kBAAkB,CAAC,CAAC,EAAE,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC,qBAAqB,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;gBAA5C,WAAW,EAAE,CAAC,CAAC,qBAAqB,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;IAEjE,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC,qBAAqB,CAAC,EAAE,EAAE,EAAE,CAAC;IAOvD,IAAI,UAAU,qSAgBb;IAED,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,SAAS;CAc/D;AAED,eAAO,MAAM,OAAO,kCAA2C,CAAA;AAG/D,eAAO,MAAM,EAAE,UAAW,MAAM,gBAAgB,MAAM,yDAClB,CAAA;AAEpC,eAAO,MAAM,YAAY,UAAW,MAAM,gBAAgB,MAAM,yDACpB,CAAA;AAE5C,eAAO,MAAM,KAAK,UAAW,MAAM,gBAAgB,MAAM,yDACnB,CAAA;AAEtC,eAAO,MAAM,MAAM,SACV,MAAM,qBACG,QAAQ,uCAAuC,yDAClB,CAAA"}
|
|
@@ -2,7 +2,7 @@ import * as tsplus_module_1 from "dfx/common";
|
|
|
2
2
|
import * as tsplus_module_2 from "@effect/io/Effect";
|
|
3
3
|
export * from "./context.js";
|
|
4
4
|
export { global, guild, messageComponent, modalSubmit, autocomplete, } from "./definitions.js";
|
|
5
|
-
export {
|
|
5
|
+
export { makeConfigLayer as makeWebhookConfig, makeHandler as makeWebhookHandler, WebhookConfig, WebhookParseError, BadWebhookSignature, } from "./webhook.js";
|
|
6
6
|
export class InteractionBuilder {
|
|
7
7
|
definitions;
|
|
8
8
|
constructor(definitions) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/Interactions/index.ts"],"names":[],"mappings":";;AAEA,cAAc,cAAc,CAAA;AAE5B,OAAO,EACL,MAAM,EACN,KAAK,EACL,gBAAgB,EAChB,WAAW,EACX,YAAY,GAGb,MAAM,kBAAkB,CAAA;AAEzB,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/Interactions/index.ts"],"names":[],"mappings":";;AAEA,cAAc,cAAc,CAAA;AAE5B,OAAO,EACL,MAAM,EACN,KAAK,EACL,gBAAgB,EAChB,WAAW,EACX,YAAY,GAGb,MAAM,kBAAkB,CAAA;AAEzB,OAAO,EACL,eAAe,IAAI,iBAAiB,EACpC,WAAW,IAAI,kBAAkB,EAEjC,aAAa,EACb,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,cAAc,CAAA;AAErB,MAAM,OAAO,kBAAkB;IACR;IAArB,YAAqB,WAA4C;QAA5C,gBAAW,GAAX,WAAW,CAAiC;IAAG,CAAC;IAErE,GAAG,CAAS,UAA2C;QACrD,OAAO,IAAI,kBAAkB,CAAiB;YAC5C,GAAG,IAAI,CAAC,WAAW;YACnB,UAAU;SACX,CAAC,CAAA;IACJ,CAAC;IAED,IAAI,UAAU;QACZ,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW;aAC9B,MAAM,CACL,CAAC,CAAC,EAAyC,EAAE,CAC3C,CAAC,CAAC,IAAI,KAAK,0BAA0B,CACxC;aACA,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA;QAExB,OAAO,wBAGI,CAAC,GAAG,EAAE,EAAE,CACf,gBAAA,IAAI,CAAC,IAAI,CAAC,sCAAsC,CAAC,GAAG,CAAC,EAAE,EAAE;YACvD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;SAC/B,CAAC,EANC,wBAEI,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAFjB,gBAAA,IAAI,CAAC,IAAI;aACb,mCAAmC,EAAE,CACf,CAKtB,CAAA;IACL,CAAC;IAED,SAAS,CAAC,KAAwB,EAAE,OAA0B;QAC5D,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW;aAC9B,MAAM,CACL,CAAC,CAAC,EAAwC,EAAE,CAC1C,CAAC,CAAC,IAAI,KAAK,yBAAyB,CACvC;aACA,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA;QAExB,OAAO,gBAAA,IAAI,CAAC,IAAI,CAAC,qCAAqC,CACpD,KAAK,EACL,OAAO,EACP,QAAe,CAChB,CAAA;IACH,CAAC;CACF;AAED,MAAM,CAAC,MAAM,OAAO,GAAG,IAAI,kBAAkB,CAAe,EAAE,CAAC,CAAA;AAE/D,UAAU;AACV,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,CAAC,QAAgB,EAAE,EAAE,CACxD,wBAAe,KAAK,KAAK,QAAQ,CAAC,CAAA;AAEpC,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,CAAC,QAAgB,EAAE,EAAE,CAClE,wBAAe,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAA;AAE5C,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,CAAC,QAAgB,EAAE,EAAE,CAC3D,wBAAe,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAA;AAEtC,MAAM,CAAC,MAAM,MAAM,GACjB,CAAC,IAAY,EAAE,EAAE,CACjB,CAAC,aAA8D,EAAE,EAAE,CACjE,wBAAe,aAAa,CAAC,IAAI,KAAK,IAAI,CAAC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/Interactions/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,kBAAkB,CAAA;AAErC,eAAO,MAAM,gBAAgB;;;;;;;CAwC5B,CAAA"}
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/Interactions/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,kBAAkB,CAAA;AAErC,eAAO,MAAM,gBAAgB;;;;;;;CAwC5B,CAAA;AA0BD,wBAAgB,OAAO,CAAC,SAAS,EAAE,MAAM,cAYxC"}
|
|
@@ -21,4 +21,41 @@ export const splitDefinitions = (definitions) => {
|
|
|
21
21
|
Commands,
|
|
22
22
|
};
|
|
23
23
|
};
|
|
24
|
+
const MAP_HEX = {
|
|
25
|
+
0: 0,
|
|
26
|
+
1: 1,
|
|
27
|
+
2: 2,
|
|
28
|
+
3: 3,
|
|
29
|
+
4: 4,
|
|
30
|
+
5: 5,
|
|
31
|
+
6: 6,
|
|
32
|
+
7: 7,
|
|
33
|
+
8: 8,
|
|
34
|
+
9: 9,
|
|
35
|
+
a: 10,
|
|
36
|
+
b: 11,
|
|
37
|
+
c: 12,
|
|
38
|
+
d: 13,
|
|
39
|
+
e: 14,
|
|
40
|
+
f: 15,
|
|
41
|
+
A: 10,
|
|
42
|
+
B: 11,
|
|
43
|
+
C: 12,
|
|
44
|
+
D: 13,
|
|
45
|
+
E: 14,
|
|
46
|
+
F: 15,
|
|
47
|
+
};
|
|
48
|
+
export function fromHex(hexString) {
|
|
49
|
+
const bytes = new Uint8Array(Math.floor((hexString || "").length / 2));
|
|
50
|
+
let i;
|
|
51
|
+
for (i = 0; i < bytes.length; i++) {
|
|
52
|
+
const a = MAP_HEX[hexString[i * 2]];
|
|
53
|
+
const b = MAP_HEX[hexString[i * 2 + 1]];
|
|
54
|
+
if (a === undefined || b === undefined) {
|
|
55
|
+
break;
|
|
56
|
+
}
|
|
57
|
+
bytes[i] = (a << 4) | b;
|
|
58
|
+
}
|
|
59
|
+
return i === bytes.length ? bytes : bytes.slice(0, i);
|
|
60
|
+
}
|
|
24
61
|
//# sourceMappingURL=utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/Interactions/utils.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,WAA4C,EAC5C,EAAE;IACF,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,CAMhC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QACX,GAAG,GAAG;QACN,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;KACtC,CAAC,EACF;QACE,YAAY,EAAE,EAAE;QAChB,wBAAwB,EAAE,EAAE;QAC5B,uBAAuB,EAAE,EAAE;QAC3B,gBAAgB,EAAE,EAAE;QACpB,WAAW,EAAE,EAAE;KAChB,CACF,CAAA;IAED,MAAM,QAAQ,GAAG;QACf,GAAG,OAAO,CAAC,wBAAwB;QACnC,GAAG,OAAO,CAAC,uBAAuB;KACnC,CAAC,MAAM,CACN,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QACX,GAAG,GAAG;QACN,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;KACpB,CAAC,EACF,EAGC,CACF,CAAA;IAED,OAAO;QACL,GAAG,OAAO;QACV,QAAQ;KACT,CAAA;AACH,CAAC,CAAA"}
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/Interactions/utils.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,WAA4C,EAC5C,EAAE;IACF,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,CAMhC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QACX,GAAG,GAAG;QACN,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;KACtC,CAAC,EACF;QACE,YAAY,EAAE,EAAE;QAChB,wBAAwB,EAAE,EAAE;QAC5B,uBAAuB,EAAE,EAAE;QAC3B,gBAAgB,EAAE,EAAE;QACpB,WAAW,EAAE,EAAE;KAChB,CACF,CAAA;IAED,MAAM,QAAQ,GAAG;QACf,GAAG,OAAO,CAAC,wBAAwB;QACnC,GAAG,OAAO,CAAC,uBAAuB;KACnC,CAAC,MAAM,CACN,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QACX,GAAG,GAAG;QACN,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;KACpB,CAAC,EACF,EAGC,CACF,CAAA;IAED,OAAO;QACL,GAAG,OAAO;QACV,QAAQ;KACT,CAAA;AACH,CAAC,CAAA;AACD,MAAM,OAAO,GAA2B;IACtC,CAAC,EAAE,CAAC;IACJ,CAAC,EAAE,CAAC;IACJ,CAAC,EAAE,CAAC;IACJ,CAAC,EAAE,CAAC;IACJ,CAAC,EAAE,CAAC;IACJ,CAAC,EAAE,CAAC;IACJ,CAAC,EAAE,CAAC;IACJ,CAAC,EAAE,CAAC;IACJ,CAAC,EAAE,CAAC;IACJ,CAAC,EAAE,CAAC;IACJ,CAAC,EAAE,EAAE;IACL,CAAC,EAAE,EAAE;IACL,CAAC,EAAE,EAAE;IACL,CAAC,EAAE,EAAE;IACL,CAAC,EAAE,EAAE;IACL,CAAC,EAAE,EAAE;IACL,CAAC,EAAE,EAAE;IACL,CAAC,EAAE,EAAE;IACL,CAAC,EAAE,EAAE;IACL,CAAC,EAAE,EAAE;IACL,CAAC,EAAE,EAAE;IACL,CAAC,EAAE,EAAE;CACN,CAAA;AAED,MAAM,UAAU,OAAO,CAAC,SAAiB;IACvC,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAA;IACtE,IAAI,CAAC,CAAA;IACL,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACjC,MAAM,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QACnC,MAAM,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QACvC,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,SAAS,EAAE;YACtC,MAAK;SACN;QACD,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAA;KACxB;IACD,OAAO,CAAC,KAAK,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;AACvD,CAAC"}
|
|
@@ -4,12 +4,18 @@ export declare class BadWebhookSignature {
|
|
|
4
4
|
readonly _tag = "BadWebhookSignature";
|
|
5
5
|
}
|
|
6
6
|
export type Headers = Record<string, string | string[] | undefined>;
|
|
7
|
-
export interface
|
|
7
|
+
export interface MakeConfigOpts {
|
|
8
8
|
applicationId: string;
|
|
9
9
|
publicKey: string;
|
|
10
10
|
}
|
|
11
|
+
declare const makeConfig: ({ applicationId, publicKey }: MakeConfigOpts) => {
|
|
12
|
+
applicationId: string;
|
|
13
|
+
publicKey: Uint8Array;
|
|
14
|
+
};
|
|
15
|
+
export interface WebhookConfig extends ReturnType<typeof makeConfig> {
|
|
16
|
+
}
|
|
11
17
|
export declare const WebhookConfig: import("../common.js").Tag<WebhookConfig>;
|
|
12
|
-
export declare const
|
|
18
|
+
export declare const makeConfigLayer: (a_0: MakeConfigOpts) => import("../common.js").Layer<never, never, WebhookConfig>;
|
|
13
19
|
export declare class WebhookParseError {
|
|
14
20
|
readonly reason: unknown;
|
|
15
21
|
readonly _tag = "WebhookParseError";
|
|
@@ -23,4 +29,5 @@ export interface HandleWebhookOpts<E> {
|
|
|
23
29
|
empty: Effect<never, never, void>;
|
|
24
30
|
}
|
|
25
31
|
export declare const makeHandler: <R, E>(ix: InteractionBuilder<R, E>) => ({ headers, body, success, empty, error, }: HandleWebhookOpts<BadWebhookSignature | WebhookParseError | E>) => import("../common.js").Effect<WebhookConfig | R, never, void>;
|
|
32
|
+
export {};
|
|
26
33
|
//# sourceMappingURL=webhook.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhook.d.ts","sourceRoot":"","sources":["../../src/Interactions/webhook.ts"],"names":[],"mappings":";AAGA,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"webhook.d.ts","sourceRoot":"","sources":["../../src/Interactions/webhook.ts"],"names":[],"mappings":";AAGA,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAG/C,qBAAa,mBAAmB;IAC9B,QAAQ,CAAC,IAAI,yBAAwB;CACtC;AAED,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAA;AAqBnE,MAAM,WAAW,cAAc;IAC7B,aAAa,EAAE,MAAM,CAAA;IACrB,SAAS,EAAE,MAAM,CAAA;CAClB;AACD,QAAA,MAAM,UAAU,iCAAkC,cAAc;;;CAG9D,CAAA;AACF,MAAM,WAAW,aAAc,SAAQ,UAAU,CAAC,OAAO,UAAU,CAAC;CAAG;AACvE,eAAO,MAAM,aAAa,2CAAuB,CAAA;AACjD,eAAO,MAAM,eAAe,oFAAiD,CAAA;AAE7E,qBAAa,iBAAiB;IAEhB,QAAQ,CAAC,MAAM,EAAE,OAAO;IADpC,QAAQ,CAAC,IAAI,uBAAsB;gBACd,MAAM,EAAE,OAAO;CACrC;AAuBD,MAAM,WAAW,iBAAiB,CAAC,CAAC;IAClC,OAAO,EAAE,OAAO,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,mBAAmB,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,CAAA;IACvE,KAAK,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,CAAA;IAClD,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,CAAA;CAClC;AAED,eAAO,MAAM,WAAW,sNAkBvB,CAAA"}
|
|
@@ -2,18 +2,27 @@ import * as tsplus_module_1 from "@fp-ts/data/Option";
|
|
|
2
2
|
import * as tsplus_module_2 from "@fp-ts/data/Either";
|
|
3
3
|
import * as tsplus_module_3 from "dfx/common";
|
|
4
4
|
import * as tsplus_module_4 from "@effect/io/Layer";
|
|
5
|
-
import * as tsplus_module_5 from "@
|
|
5
|
+
import * as tsplus_module_5 from "@fp-ts/data/Function";
|
|
6
|
+
import * as tsplus_module_6 from "@effect/io/Effect";
|
|
6
7
|
import Nacl from "tweetnacl";
|
|
7
8
|
import { handlers } from "./handlers.js";
|
|
9
|
+
import { fromHex } from "./utils.js";
|
|
8
10
|
export class BadWebhookSignature {
|
|
9
11
|
_tag = "BadWebhookSignature";
|
|
10
12
|
}
|
|
11
|
-
const checkSignature = (publicKey, headers, body) => tsplus_module_2.asUnit(tsplus_module_1.toEither(() => new BadWebhookSignature())(tsplus_module_1.filter((a) =>
|
|
13
|
+
const checkSignature = (publicKey, headers, body) => tsplus_module_2.asUnit(tsplus_module_1.toEither(() => new BadWebhookSignature())(tsplus_module_1.filter((a) => {
|
|
14
|
+
const enc = new TextEncoder();
|
|
15
|
+
return Nacl.sign.detached.verify(enc.encode(a.timestamp + body), fromHex(`${a.signature}`), publicKey);
|
|
16
|
+
})(tsplus_module_1.struct({
|
|
12
17
|
signature: tsplus_module_1.fromNullable(headers["x-signature-ed25519"]),
|
|
13
18
|
timestamp: tsplus_module_1.fromNullable(headers["x-signature-timestamp"]),
|
|
14
19
|
}))));
|
|
20
|
+
const makeConfig = ({ applicationId, publicKey }) => ({
|
|
21
|
+
applicationId,
|
|
22
|
+
publicKey: fromHex(publicKey),
|
|
23
|
+
});
|
|
15
24
|
export const WebhookConfig = tsplus_module_3.Tag();
|
|
16
|
-
export const
|
|
25
|
+
export const makeConfigLayer = tsplus_module_5.flow(makeConfig, tsplus_module_4.succeed(WebhookConfig));
|
|
17
26
|
export class WebhookParseError {
|
|
18
27
|
reason;
|
|
19
28
|
_tag = "WebhookParseError";
|
|
@@ -21,13 +30,13 @@ export class WebhookParseError {
|
|
|
21
30
|
this.reason = reason;
|
|
22
31
|
}
|
|
23
32
|
}
|
|
24
|
-
const fromHeadersAndBody = (headers, body) =>
|
|
33
|
+
const fromHeadersAndBody = (headers, body) => tsplus_module_6.flatMap(({ publicKey }) => tsplus_module_6.flatMap(() => tsplus_module_6.tryCatch(() => JSON.parse(body), (reason) => new WebhookParseError(reason)))(tsplus_module_6.fromEither(checkSignature(publicKey, headers, body))))(tsplus_module_6.service(WebhookConfig));
|
|
25
34
|
const run = (definitions) => {
|
|
26
35
|
const handler = handlers(definitions);
|
|
27
|
-
return (headers, body) =>
|
|
36
|
+
return (headers, body) => tsplus_module_6.flatMap(interaction => handler[interaction.type](interaction))(fromHeadersAndBody(headers, body));
|
|
28
37
|
};
|
|
29
38
|
export const makeHandler = (ix) => {
|
|
30
39
|
const handle = run(ix.definitions);
|
|
31
|
-
return ({ headers, body, success, empty, error, }) =>
|
|
40
|
+
return ({ headers, body, success, empty, error, }) => tsplus_module_6.catchAllCause(error)(tsplus_module_6.flatMap((o) => tsplus_module_1.match(() => empty, (a) => success(a))(o))(handle(headers, body)));
|
|
32
41
|
};
|
|
33
42
|
//# sourceMappingURL=webhook.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhook.js","sourceRoot":"","sources":["../../src/Interactions/webhook.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"webhook.js","sourceRoot":"","sources":["../../src/Interactions/webhook.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -5,7 +5,7 @@ export * as DiscordWS from "./DiscordGateway/DiscordWS/index.js";
|
|
|
5
5
|
export * as Gateway from "./DiscordGateway/index.js";
|
|
6
6
|
export { DiscordREST, LiveDiscordREST, rest } from "./DiscordREST/index.js";
|
|
7
7
|
export * as Ix from "./Interactions/index.js";
|
|
8
|
-
export { run as
|
|
8
|
+
export { run as runIxGateway } from "./Interactions/gateway.js";
|
|
9
9
|
export * as Log from "./Log/index.js";
|
|
10
10
|
export * as RateLimitStore from "./RateLimitStore/index.js";
|
|
11
11
|
export * as Flags from "./Helpers/flags.js";
|
package/dist/index.js
CHANGED
|
@@ -7,7 +7,7 @@ export * as DiscordWS from "./DiscordGateway/DiscordWS/index.js";
|
|
|
7
7
|
export * as Gateway from "./DiscordGateway/index.js";
|
|
8
8
|
export { DiscordREST, LiveDiscordREST, rest } from "./DiscordREST/index.js";
|
|
9
9
|
export * as Ix from "./Interactions/index.js";
|
|
10
|
-
export { run as
|
|
10
|
+
export { run as runIxGateway } from "./Interactions/gateway.js";
|
|
11
11
|
export * as Log from "./Log/index.js";
|
|
12
12
|
export * as RateLimitStore from "./RateLimitStore/index.js";
|
|
13
13
|
export * as Flags from "./Helpers/flags.js";
|
package/dist/webhooks.d.ts
CHANGED
|
@@ -12,5 +12,5 @@ export * as Perms from "./Helpers/permissions.js";
|
|
|
12
12
|
export * as UI from "./Helpers/ui.js";
|
|
13
13
|
export declare const LiveRateLimit: import("./common.js").Layer<import("./Log/index.js").Log, never, import("./RateLimitStore/index.js").RateLimitStore | import("./RateLimitStore/index.js").RateLimiter>;
|
|
14
14
|
export declare const LiveREST: import("./common.js").Layer<import("./DiscordConfig/index.js").DiscordConfig | import("./Log/index.js").Log, never, import("./DiscordREST/index.js").DiscordREST | import("./RateLimitStore/index.js").RateLimitStore | import("./RateLimitStore/index.js").RateLimiter>;
|
|
15
|
-
export declare const makeLayer: (config: Config.MakeOpts & Ix.
|
|
15
|
+
export declare const makeLayer: (config: Config.MakeOpts & Ix.MakeWebhookConfigOpts, debug?: boolean) => import("./common.js").Layer<never, never, import("./DiscordREST/index.js").DiscordREST | import("./DiscordConfig/index.js").DiscordConfig | import("./Log/index.js").Log | import("./RateLimitStore/index.js").RateLimitStore | import("./RateLimitStore/index.js").RateLimiter | import("./Interactions/webhook.js").WebhookConfig>;
|
|
16
16
|
//# sourceMappingURL=webhooks.d.ts.map
|
package/dist/webhooks.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhooks.d.ts","sourceRoot":"","sources":["../src/webhooks.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,OAAO,MAAM,YAAY,CAAA;AAErC,OAAO,KAAK,MAAM,MAAM,0BAA0B,CAAA;AAClD,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAA;AAC3E,OAAO,KAAK,EAAE,MAAM,yBAAyB,CAAA;AAC7C,OAAO,KAAK,GAAG,MAAM,gBAAgB,CAAA;AACrC,OAAO,KAAK,cAAc,MAAM,2BAA2B,CAAA;AAE3D,OAAO,KAAK,KAAK,MAAM,oBAAoB,CAAA;AAC3C,OAAO,KAAK,SAAS,MAAM,2BAA2B,CAAA;AACtD,OAAO,KAAK,OAAO,MAAM,sBAAsB,CAAA;AAC/C,OAAO,KAAK,KAAK,MAAM,0BAA0B,CAAA;AACjD,OAAO,KAAK,EAAE,MAAM,iBAAiB,CAAA;AAErC,eAAO,MAAM,aAAa,wKACgD,CAAA;AAE1E,eAAO,MAAM,QAAQ,0QAAuC,CAAA;AAE5D,eAAO,MAAM,SAAS,WACZ,OAAO,QAAQ,GAAG,GAAG,
|
|
1
|
+
{"version":3,"file":"webhooks.d.ts","sourceRoot":"","sources":["../src/webhooks.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,OAAO,MAAM,YAAY,CAAA;AAErC,OAAO,KAAK,MAAM,MAAM,0BAA0B,CAAA;AAClD,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAA;AAC3E,OAAO,KAAK,EAAE,MAAM,yBAAyB,CAAA;AAC7C,OAAO,KAAK,GAAG,MAAM,gBAAgB,CAAA;AACrC,OAAO,KAAK,cAAc,MAAM,2BAA2B,CAAA;AAE3D,OAAO,KAAK,KAAK,MAAM,oBAAoB,CAAA;AAC3C,OAAO,KAAK,SAAS,MAAM,2BAA2B,CAAA;AACtD,OAAO,KAAK,OAAO,MAAM,sBAAsB,CAAA;AAC/C,OAAO,KAAK,KAAK,MAAM,0BAA0B,CAAA;AACjD,OAAO,KAAK,EAAE,MAAM,iBAAiB,CAAA;AAErC,eAAO,MAAM,aAAa,wKACgD,CAAA;AAE1E,eAAO,MAAM,QAAQ,0QAAuC,CAAA;AAE5D,eAAO,MAAM,SAAS,WACZ,OAAO,QAAQ,GAAG,GAAG,qBAAqB,0VASnD,CAAA"}
|
package/dist/webhooks.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhooks.js","sourceRoot":"","sources":["../src/webhooks.ts"],"names":[],"mappings":";;AAAA,OAAO,KAAK,OAAO,MAAM,YAAY,CAAA;AAErC,OAAO,KAAK,MAAM,MAAM,0BAA0B,CAAA;AAClD,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAA;AAC3E,OAAO,KAAK,EAAE,MAAM,yBAAyB,CAAA;AAC7C,OAAO,KAAK,GAAG,MAAM,gBAAgB,CAAA;AACrC,OAAO,KAAK,cAAc,MAAM,2BAA2B,CAAA;AAE3D,OAAO,KAAK,KAAK,MAAM,oBAAoB,CAAA;AAC3C,OAAO,KAAK,SAAS,MAAM,2BAA2B,CAAA;AACtD,OAAO,KAAK,OAAO,MAAM,sBAAsB,CAAA;AAC/C,OAAO,KAAK,KAAK,MAAM,0BAA0B,CAAA;AACjD,OAAO,KAAK,EAAE,MAAM,iBAAiB,CAAA;AAErC,MAAM,CAAC,MAAM,aAAa,qCACkB,gBAAA,cAAc,CAAC,eAAe,EAAxE,gBAAA,cAAc,CAAC,wBAAwB,CAAiC,CAAA;AAE1E,MAAM,CAAC,MAAM,QAAQ,qCAAmB,gBAAA,IAAI,CAAC,eAAe,EAApC,aAAa,CAAuB,CAAA;AAE5D,MAAM,CAAC,MAAM,SAAS,GAAG,CACvB,
|
|
1
|
+
{"version":3,"file":"webhooks.js","sourceRoot":"","sources":["../src/webhooks.ts"],"names":[],"mappings":";;AAAA,OAAO,KAAK,OAAO,MAAM,YAAY,CAAA;AAErC,OAAO,KAAK,MAAM,MAAM,0BAA0B,CAAA;AAClD,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAA;AAC3E,OAAO,KAAK,EAAE,MAAM,yBAAyB,CAAA;AAC7C,OAAO,KAAK,GAAG,MAAM,gBAAgB,CAAA;AACrC,OAAO,KAAK,cAAc,MAAM,2BAA2B,CAAA;AAE3D,OAAO,KAAK,KAAK,MAAM,oBAAoB,CAAA;AAC3C,OAAO,KAAK,SAAS,MAAM,2BAA2B,CAAA;AACtD,OAAO,KAAK,OAAO,MAAM,sBAAsB,CAAA;AAC/C,OAAO,KAAK,KAAK,MAAM,0BAA0B,CAAA;AACjD,OAAO,KAAK,EAAE,MAAM,iBAAiB,CAAA;AAErC,MAAM,CAAC,MAAM,aAAa,qCACkB,gBAAA,cAAc,CAAC,eAAe,EAAxE,gBAAA,cAAc,CAAC,wBAAwB,CAAiC,CAAA;AAE1E,MAAM,CAAC,MAAM,QAAQ,qCAAmB,gBAAA,IAAI,CAAC,eAAe,EAApC,aAAa,CAAuB,CAAA;AAE5D,MAAM,CAAC,MAAM,SAAS,GAAG,CACvB,MAAkD,EAClD,KAAK,GAAG,KAAK,EACb,EAAE;IACF,MAAM,WAAW,GAAG,gBAAA,EAAE,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAA;IAChD,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,gBAAA,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,gBAAA,GAAG,CAAC,OAAO,CAAA;IACtD,MAAM,UAAU,GAAG,gBAAA,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;IAC3C,MAAM,OAAO,qCAAwC,QAAQ,wBAAtB,WAAW,wBAAxB,UAAU,EAApB,OAAO,GAAsC,CAAA;IAE7D,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dfx",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.5",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
@@ -50,5 +50,5 @@
|
|
|
50
50
|
"@fp-ts/data": "^0.0.20"
|
|
51
51
|
}
|
|
52
52
|
},
|
|
53
|
-
"gitHead": "
|
|
53
|
+
"gitHead": "138bb3ca8bee27e8fb9b66916ed1b75c2751198b"
|
|
54
54
|
}
|
|
@@ -6,49 +6,50 @@ export interface RunOpts {
|
|
|
6
6
|
sync?: boolean
|
|
7
7
|
}
|
|
8
8
|
|
|
9
|
-
export const run =
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
) =>
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
.
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
9
|
+
export const run =
|
|
10
|
+
<R2, E, E2>(
|
|
11
|
+
catchAll: (
|
|
12
|
+
e: Http.FetchError | Http.StatusCodeError | Http.JsonParseError | E,
|
|
13
|
+
) => Effect<R2, E2, any>,
|
|
14
|
+
{ sync = true }: RunOpts = {},
|
|
15
|
+
) =>
|
|
16
|
+
<R>(ix: InteractionBuilder<R, E>) =>
|
|
17
|
+
Do(($) => {
|
|
18
|
+
const { GlobalApplicationCommand, GuildApplicationCommand } =
|
|
19
|
+
splitDefinitions(ix.definitions)
|
|
20
|
+
|
|
21
|
+
const application = $(
|
|
22
|
+
Rest.rest.getCurrentBotApplicationInformation().flatMap((a) => a.json),
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
const globalSync = Rest.rest.bulkOverwriteGlobalApplicationCommands(
|
|
26
|
+
application.id,
|
|
27
|
+
{
|
|
28
|
+
body: JSON.stringify(GlobalApplicationCommand.map((a) => a.command)),
|
|
29
|
+
},
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
const guildSync = GuildApplicationCommand.length
|
|
33
|
+
? Gateway.handleDispatch("GUILD_CREATE", (a) =>
|
|
34
|
+
Rest.rest.bulkOverwriteGuildApplicationCommands(
|
|
35
|
+
application.id,
|
|
36
|
+
a.id,
|
|
37
|
+
GuildApplicationCommand.map((a) => a.command) as any,
|
|
38
|
+
),
|
|
39
|
+
)
|
|
40
|
+
: Effect.unit()
|
|
41
|
+
|
|
42
|
+
const handle = handlers(ix.definitions)
|
|
43
|
+
|
|
44
|
+
const run = Gateway.handleDispatch("INTERACTION_CREATE", (i) =>
|
|
45
|
+
handle[i.type](i)
|
|
46
|
+
.tap((r) =>
|
|
47
|
+
r.match(Effect.unit, (r) =>
|
|
48
|
+
Rest.rest.createInteractionResponse(i.id, i.token, r),
|
|
49
|
+
),
|
|
50
|
+
)
|
|
51
|
+
.catchAll(catchAll),
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
$(sync ? run.zipPar(globalSync).zipPar(guildSync) : run)
|
|
55
|
+
})
|
|
@@ -13,8 +13,9 @@ export {
|
|
|
13
13
|
} from "./definitions.js"
|
|
14
14
|
|
|
15
15
|
export {
|
|
16
|
-
|
|
16
|
+
makeConfigLayer as makeWebhookConfig,
|
|
17
17
|
makeHandler as makeWebhookHandler,
|
|
18
|
+
MakeConfigOpts as MakeWebhookConfigOpts,
|
|
18
19
|
WebhookConfig,
|
|
19
20
|
WebhookParseError,
|
|
20
21
|
BadWebhookSignature,
|
|
@@ -41,3 +41,41 @@ export const splitDefinitions = <R, E>(
|
|
|
41
41
|
Commands,
|
|
42
42
|
}
|
|
43
43
|
}
|
|
44
|
+
const MAP_HEX: Record<string, number> = {
|
|
45
|
+
0: 0,
|
|
46
|
+
1: 1,
|
|
47
|
+
2: 2,
|
|
48
|
+
3: 3,
|
|
49
|
+
4: 4,
|
|
50
|
+
5: 5,
|
|
51
|
+
6: 6,
|
|
52
|
+
7: 7,
|
|
53
|
+
8: 8,
|
|
54
|
+
9: 9,
|
|
55
|
+
a: 10,
|
|
56
|
+
b: 11,
|
|
57
|
+
c: 12,
|
|
58
|
+
d: 13,
|
|
59
|
+
e: 14,
|
|
60
|
+
f: 15,
|
|
61
|
+
A: 10,
|
|
62
|
+
B: 11,
|
|
63
|
+
C: 12,
|
|
64
|
+
D: 13,
|
|
65
|
+
E: 14,
|
|
66
|
+
F: 15,
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export function fromHex(hexString: string) {
|
|
70
|
+
const bytes = new Uint8Array(Math.floor((hexString || "").length / 2))
|
|
71
|
+
let i
|
|
72
|
+
for (i = 0; i < bytes.length; i++) {
|
|
73
|
+
const a = MAP_HEX[hexString[i * 2]]
|
|
74
|
+
const b = MAP_HEX[hexString[i * 2 + 1]]
|
|
75
|
+
if (a === undefined || b === undefined) {
|
|
76
|
+
break
|
|
77
|
+
}
|
|
78
|
+
bytes[i] = (a << 4) | b
|
|
79
|
+
}
|
|
80
|
+
return i === bytes.length ? bytes : bytes.slice(0, i)
|
|
81
|
+
}
|
|
@@ -2,6 +2,7 @@ import Nacl from "tweetnacl"
|
|
|
2
2
|
import * as D from "./definitions.js"
|
|
3
3
|
import { handlers } from "./handlers.js"
|
|
4
4
|
import { InteractionBuilder } from "./index.js"
|
|
5
|
+
import { fromHex } from "./utils.js"
|
|
5
6
|
|
|
6
7
|
export class BadWebhookSignature {
|
|
7
8
|
readonly _tag = "BadWebhookSignature"
|
|
@@ -9,26 +10,36 @@ export class BadWebhookSignature {
|
|
|
9
10
|
|
|
10
11
|
export type Headers = Record<string, string | string[] | undefined>
|
|
11
12
|
|
|
12
|
-
const checkSignature = (
|
|
13
|
+
const checkSignature = (
|
|
14
|
+
publicKey: Uint8Array,
|
|
15
|
+
headers: Headers,
|
|
16
|
+
body: string,
|
|
17
|
+
) =>
|
|
13
18
|
Maybe.struct({
|
|
14
19
|
signature: Maybe.fromNullable(headers["x-signature-ed25519"]),
|
|
15
20
|
timestamp: Maybe.fromNullable(headers["x-signature-timestamp"]),
|
|
16
21
|
})
|
|
17
|
-
.filter((a) =>
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
22
|
+
.filter((a) => {
|
|
23
|
+
const enc = new TextEncoder()
|
|
24
|
+
return Nacl.sign.detached.verify(
|
|
25
|
+
enc.encode(a.timestamp + body),
|
|
26
|
+
fromHex(`${a.signature}`),
|
|
27
|
+
publicKey,
|
|
28
|
+
)
|
|
29
|
+
})
|
|
24
30
|
.toEither(() => new BadWebhookSignature()).asUnit
|
|
25
31
|
|
|
26
|
-
export interface
|
|
32
|
+
export interface MakeConfigOpts {
|
|
27
33
|
applicationId: string
|
|
28
34
|
publicKey: string
|
|
29
35
|
}
|
|
36
|
+
const makeConfig = ({ applicationId, publicKey }: MakeConfigOpts) => ({
|
|
37
|
+
applicationId,
|
|
38
|
+
publicKey: fromHex(publicKey),
|
|
39
|
+
})
|
|
40
|
+
export interface WebhookConfig extends ReturnType<typeof makeConfig> {}
|
|
30
41
|
export const WebhookConfig = Tag<WebhookConfig>()
|
|
31
|
-
export const
|
|
42
|
+
export const makeConfigLayer = flow(makeConfig, Layer.succeed(WebhookConfig))
|
|
32
43
|
|
|
33
44
|
export class WebhookParseError {
|
|
34
45
|
readonly _tag = "WebhookParseError"
|
package/src/index.ts
CHANGED
|
@@ -5,7 +5,7 @@ export * as DiscordWS from "./DiscordGateway/DiscordWS/index.js"
|
|
|
5
5
|
export * as Gateway from "./DiscordGateway/index.js"
|
|
6
6
|
export { DiscordREST, LiveDiscordREST, rest } from "./DiscordREST/index.js"
|
|
7
7
|
export * as Ix from "./Interactions/index.js"
|
|
8
|
-
export { run as
|
|
8
|
+
export { run as runIxGateway } from "./Interactions/gateway.js"
|
|
9
9
|
export * as Log from "./Log/index.js"
|
|
10
10
|
export * as RateLimitStore from "./RateLimitStore/index.js"
|
|
11
11
|
|
package/src/webhooks.ts
CHANGED
|
@@ -18,7 +18,7 @@ export const LiveRateLimit =
|
|
|
18
18
|
export const LiveREST = LiveRateLimit > Rest.LiveDiscordREST
|
|
19
19
|
|
|
20
20
|
export const makeLayer = (
|
|
21
|
-
config: Config.MakeOpts & Ix.
|
|
21
|
+
config: Config.MakeOpts & Ix.MakeWebhookConfigOpts,
|
|
22
22
|
debug = false,
|
|
23
23
|
) => {
|
|
24
24
|
const LiveWebhook = Ix.makeWebhookConfig(config)
|