dfx 0.126.1 → 1.0.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/.babel.cjs.json +11 -0
- package/.babel.mjs.json +10 -0
- package/.envrc +1 -0
- package/.gitmodules +3 -0
- package/.husky/pre-commit +2 -0
- package/.oxlintrc.json +72 -0
- package/.prettierignore +0 -0
- package/.prettierrc.json +5 -0
- package/.tool-versions +1 -0
- package/.vscode/debug.cjs +8 -0
- package/.vscode/launch.json +23 -0
- package/.vscode/settings.json +29 -0
- package/.vscode/tasks.json +44 -0
- package/AGENTS.md +15 -0
- package/CHANGELOG.md +1554 -0
- package/examples/.env.example +5 -0
- package/examples/interactions.ts +79 -0
- package/examples/readme.ts +56 -0
- package/examples/registry.ts +66 -0
- package/flake.lock +27 -0
- package/flake.nix +21 -0
- package/lerna.json +12 -0
- package/package.json +79 -36
- package/pnpm-workspace.yaml +7 -0
- package/scripts/generate-client.sh +10 -0
- package/scripts/worktree-setup.sh +8 -0
- package/src/Cache/memory.ts +5 -5
- package/src/Cache/memoryTTL.ts +11 -7
- package/src/Cache/prelude.ts +10 -8
- package/src/Cache.ts +31 -35
- package/src/DiscordConfig.ts +12 -16
- package/src/DiscordGateway/DiscordWS.ts +58 -32
- package/src/DiscordGateway/Messaging.ts +13 -15
- package/src/DiscordGateway/Shard/StateStore.ts +30 -25
- package/src/DiscordGateway/Shard/heartbeats.ts +25 -28
- package/src/DiscordGateway/Shard/identify.ts +11 -6
- package/src/DiscordGateway/Shard/sendEvents.ts +1 -1
- package/src/DiscordGateway/Shard/utils.ts +1 -1
- package/src/DiscordGateway/Shard.ts +39 -35
- package/src/DiscordGateway/ShardStore.ts +6 -7
- package/src/DiscordGateway/Sharder.ts +31 -29
- package/src/DiscordGateway.ts +15 -14
- package/src/DiscordREST/Generated.ts +660 -341
- package/src/DiscordREST/utils.ts +6 -3
- package/src/DiscordREST.ts +37 -41
- package/src/Helpers/flags.ts +10 -5
- package/src/Helpers/intents.ts +2 -2
- package/src/Helpers/interactions.ts +16 -14
- package/src/Helpers/members.ts +3 -3
- package/src/Helpers/permissions.ts +5 -5
- package/src/Helpers/ui.ts +16 -16
- package/src/Interactions/builder.ts +10 -10
- package/src/Interactions/commandHelper.ts +18 -29
- package/src/Interactions/context.ts +51 -65
- package/src/Interactions/definitions.ts +3 -3
- package/src/Interactions/gateway.ts +33 -45
- package/src/Interactions/handlers.ts +8 -5
- package/src/Interactions/index.ts +5 -5
- package/src/Interactions/utils.ts +6 -6
- package/src/Interactions/webhook.ts +31 -38
- package/src/RateLimit/memory.ts +3 -3
- package/src/RateLimit.ts +18 -15
- package/src/gateway.ts +21 -21
- package/src/index.ts +17 -17
- package/src/types.ts +18 -16
- package/src/utils/Effect.ts +38 -27
- package/src/webhooks.ts +7 -7
- package/test/index.test.ts +5 -0
- package/tsconfig.base.json +12 -6
- package/tsconfig.examples.json +0 -1
- package/vitest.config.ts +22 -0
- package/Cache/driver.d.ts +0 -24
- package/Cache/driver.d.ts.map +0 -1
- package/Cache/driver.js +0 -11
- package/Cache/driver.js.map +0 -1
- package/Cache/memory.d.ts +0 -5
- package/Cache/memory.d.ts.map +0 -1
- package/Cache/memory.js +0 -57
- package/Cache/memory.js.map +0 -1
- package/Cache/memoryTTL.d.ts +0 -23
- package/Cache/memoryTTL.d.ts.map +0 -1
- package/Cache/memoryTTL.js +0 -128
- package/Cache/memoryTTL.js.map +0 -1
- package/Cache/prelude.d.ts +0 -32
- package/Cache/prelude.d.ts.map +0 -1
- package/Cache/prelude.js +0 -143
- package/Cache/prelude.js.map +0 -1
- package/Cache.d.ts +0 -82
- package/Cache.d.ts.map +0 -1
- package/Cache.js +0 -144
- package/Cache.js.map +0 -1
- package/DiscordConfig.d.ts +0 -35
- package/DiscordConfig.d.ts.map +0 -1
- package/DiscordConfig.js +0 -42
- package/DiscordConfig.js.map +0 -1
- package/DiscordGateway/DiscordWS.d.ts +0 -37
- package/DiscordGateway/DiscordWS.d.ts.map +0 -1
- package/DiscordGateway/DiscordWS.js +0 -73
- package/DiscordGateway/DiscordWS.js.map +0 -1
- package/DiscordGateway/Messaging.d.ts +0 -393
- package/DiscordGateway/Messaging.d.ts.map +0 -1
- package/DiscordGateway/Messaging.js +0 -40
- package/DiscordGateway/Messaging.js.map +0 -1
- package/DiscordGateway/Shard/StateStore.d.ts +0 -24
- package/DiscordGateway/Shard/StateStore.d.ts.map +0 -1
- package/DiscordGateway/Shard/StateStore.js +0 -48
- package/DiscordGateway/Shard/StateStore.js.map +0 -1
- package/DiscordGateway/Shard/heartbeats.d.ts +0 -8
- package/DiscordGateway/Shard/heartbeats.d.ts.map +0 -1
- package/DiscordGateway/Shard/heartbeats.js +0 -28
- package/DiscordGateway/Shard/heartbeats.js.map +0 -1
- package/DiscordGateway/Shard/identify.d.ts +0 -12
- package/DiscordGateway/Shard/identify.d.ts.map +0 -1
- package/DiscordGateway/Shard/identify.js +0 -38
- package/DiscordGateway/Shard/identify.js.map +0 -1
- package/DiscordGateway/Shard/sendEvents.d.ts +0 -8
- package/DiscordGateway/Shard/sendEvents.d.ts.map +0 -1
- package/DiscordGateway/Shard/sendEvents.js +0 -39
- package/DiscordGateway/Shard/sendEvents.js.map +0 -1
- package/DiscordGateway/Shard/utils.d.ts +0 -6
- package/DiscordGateway/Shard/utils.d.ts.map +0 -1
- package/DiscordGateway/Shard/utils.js +0 -11
- package/DiscordGateway/Shard/utils.js.map +0 -1
- package/DiscordGateway/Shard.d.ts +0 -28
- package/DiscordGateway/Shard.d.ts.map +0 -1
- package/DiscordGateway/Shard.js +0 -149
- package/DiscordGateway/Shard.js.map +0 -1
- package/DiscordGateway/ShardStore.d.ts +0 -18
- package/DiscordGateway/ShardStore.d.ts.map +0 -1
- package/DiscordGateway/ShardStore.js +0 -31
- package/DiscordGateway/ShardStore.js.map +0 -1
- package/DiscordGateway/Sharder.d.ts +0 -13
- package/DiscordGateway/Sharder.d.ts.map +0 -1
- package/DiscordGateway/Sharder.js +0 -73
- package/DiscordGateway/Sharder.js.map +0 -1
- package/DiscordGateway.d.ts +0 -32
- package/DiscordGateway.d.ts.map +0 -1
- package/DiscordGateway.js +0 -28
- package/DiscordGateway.js.map +0 -1
- package/DiscordREST/Generated.d.ts +0 -5399
- package/DiscordREST/Generated.d.ts.map +0 -1
- package/DiscordREST/Generated.js +0 -2405
- package/DiscordREST/Generated.js.map +0 -1
- package/DiscordREST/utils.d.ts +0 -14
- package/DiscordREST/utils.d.ts.map +0 -1
- package/DiscordREST/utils.js +0 -31
- package/DiscordREST/utils.js.map +0 -1
- package/DiscordREST.d.ts +0 -23
- package/DiscordREST.d.ts.map +0 -1
- package/DiscordREST.js +0 -132
- package/DiscordREST.js.map +0 -1
- package/Helpers/flags.d.ts +0 -28
- package/Helpers/flags.d.ts.map +0 -1
- package/Helpers/flags.js +0 -48
- package/Helpers/flags.js.map +0 -1
- package/Helpers/intents.d.ts +0 -25
- package/Helpers/intents.d.ts.map +0 -1
- package/Helpers/intents.js +0 -34
- package/Helpers/intents.js.map +0 -1
- package/Helpers/interactions.d.ts +0 -116
- package/Helpers/interactions.d.ts.map +0 -1
- package/Helpers/interactions.js +0 -143
- package/Helpers/interactions.js.map +0 -1
- package/Helpers/members.d.ts +0 -10
- package/Helpers/members.d.ts.map +0 -1
- package/Helpers/members.js +0 -17
- package/Helpers/members.js.map +0 -1
- package/Helpers/permissions.d.ts +0 -42
- package/Helpers/permissions.d.ts.map +0 -1
- package/Helpers/permissions.js +0 -97
- package/Helpers/permissions.js.map +0 -1
- package/Helpers/ui.d.ts +0 -105
- package/Helpers/ui.d.ts.map +0 -1
- package/Helpers/ui.js +0 -162
- package/Helpers/ui.js.map +0 -1
- package/Interactions/builder.d.ts +0 -48
- package/Interactions/builder.d.ts.map +0 -1
- package/Interactions/builder.js +0 -64
- package/Interactions/builder.js.map +0 -1
- package/Interactions/commandHelper.d.ts +0 -99
- package/Interactions/commandHelper.d.ts.map +0 -1
- package/Interactions/commandHelper.js +0 -53
- package/Interactions/commandHelper.js.map +0 -1
- package/Interactions/context.d.ts +0 -54
- package/Interactions/context.d.ts.map +0 -1
- package/Interactions/context.js +0 -42
- package/Interactions/context.js.map +0 -1
- package/Interactions/definitions.d.ts +0 -44
- package/Interactions/definitions.d.ts.map +0 -1
- package/Interactions/definitions.js +0 -67
- package/Interactions/definitions.js.map +0 -1
- package/Interactions/error.d.ts +0 -2
- package/Interactions/error.d.ts.map +0 -1
- package/Interactions/error.js +0 -8
- package/Interactions/error.js.map +0 -1
- package/Interactions/gateway.d.ts +0 -21
- package/Interactions/gateway.d.ts.map +0 -1
- package/Interactions/gateway.js +0 -90
- package/Interactions/gateway.js.map +0 -1
- package/Interactions/handlers.d.ts +0 -15
- package/Interactions/handlers.d.ts.map +0 -1
- package/Interactions/handlers.js +0 -72
- package/Interactions/handlers.js.map +0 -1
- package/Interactions/index.d.ts +0 -16
- package/Interactions/index.d.ts.map +0 -1
- package/Interactions/index.js +0 -94
- package/Interactions/index.js.map +0 -1
- package/Interactions/utils.d.ts +0 -61
- package/Interactions/utils.d.ts.map +0 -1
- package/Interactions/utils.js +0 -35
- package/Interactions/utils.js.map +0 -1
- package/Interactions/webhook.d.ts +0 -73
- package/Interactions/webhook.d.ts.map +0 -1
- package/Interactions/webhook.js +0 -89
- package/Interactions/webhook.js.map +0 -1
- package/RateLimit/memory.d.ts +0 -3
- package/RateLimit/memory.d.ts.map +0 -1
- package/RateLimit/memory.js +0 -47
- package/RateLimit/memory.js.map +0 -1
- package/RateLimit/utils.d.ts +0 -3
- package/RateLimit/utils.d.ts.map +0 -1
- package/RateLimit/utils.js +0 -25
- package/RateLimit/utils.js.map +0 -1
- package/RateLimit.d.ts +0 -30
- package/RateLimit.d.ts.map +0 -1
- package/RateLimit.js +0 -35
- package/RateLimit.js.map +0 -1
- package/gateway.d.ts +0 -19
- package/gateway.d.ts.map +0 -1
- package/gateway.js +0 -72
- package/gateway.js.map +0 -1
- package/index.d.ts +0 -18
- package/index.d.ts.map +0 -1
- package/index.js +0 -71
- package/index.js.map +0 -1
- package/mjs/Cache/driver.mjs +0 -3
- package/mjs/Cache/driver.mjs.map +0 -1
- package/mjs/Cache/memory.mjs +0 -48
- package/mjs/Cache/memory.mjs.map +0 -1
- package/mjs/Cache/memoryTTL.mjs +0 -119
- package/mjs/Cache/memoryTTL.mjs.map +0 -1
- package/mjs/Cache/prelude.mjs +0 -131
- package/mjs/Cache/prelude.mjs.map +0 -1
- package/mjs/Cache.mjs +0 -89
- package/mjs/Cache.mjs.map +0 -1
- package/mjs/DiscordConfig.mjs +0 -32
- package/mjs/DiscordConfig.mjs.map +0 -1
- package/mjs/DiscordGateway/DiscordWS.mjs +0 -66
- package/mjs/DiscordGateway/DiscordWS.mjs.map +0 -1
- package/mjs/DiscordGateway/Messaging.mjs +0 -33
- package/mjs/DiscordGateway/Messaging.mjs.map +0 -1
- package/mjs/DiscordGateway/Shard/StateStore.mjs +0 -40
- package/mjs/DiscordGateway/Shard/StateStore.mjs.map +0 -1
- package/mjs/DiscordGateway/Shard/heartbeats.mjs +0 -20
- package/mjs/DiscordGateway/Shard/heartbeats.mjs.map +0 -1
- package/mjs/DiscordGateway/Shard/identify.mjs +0 -30
- package/mjs/DiscordGateway/Shard/identify.mjs.map +0 -1
- package/mjs/DiscordGateway/Shard/sendEvents.mjs +0 -26
- package/mjs/DiscordGateway/Shard/sendEvents.mjs.map +0 -1
- package/mjs/DiscordGateway/Shard/utils.mjs +0 -3
- package/mjs/DiscordGateway/Shard/utils.mjs.map +0 -1
- package/mjs/DiscordGateway/Shard.mjs +0 -142
- package/mjs/DiscordGateway/Shard.mjs.map +0 -1
- package/mjs/DiscordGateway/ShardStore.mjs +0 -24
- package/mjs/DiscordGateway/ShardStore.mjs.map +0 -1
- package/mjs/DiscordGateway/Sharder.mjs +0 -66
- package/mjs/DiscordGateway/Sharder.mjs.map +0 -1
- package/mjs/DiscordGateway.mjs +0 -21
- package/mjs/DiscordGateway.mjs.map +0 -1
- package/mjs/DiscordREST/Generated.mjs +0 -2396
- package/mjs/DiscordREST/Generated.mjs.map +0 -1
- package/mjs/DiscordREST/utils.mjs +0 -20
- package/mjs/DiscordREST/utils.mjs.map +0 -1
- package/mjs/DiscordREST.mjs +0 -124
- package/mjs/DiscordREST.mjs.map +0 -1
- package/mjs/Helpers/flags.mjs +0 -36
- package/mjs/Helpers/flags.mjs.map +0 -1
- package/mjs/Helpers/intents.mjs +0 -27
- package/mjs/Helpers/intents.mjs.map +0 -1
- package/mjs/Helpers/interactions.mjs +0 -115
- package/mjs/Helpers/interactions.mjs.map +0 -1
- package/mjs/Helpers/members.mjs +0 -9
- package/mjs/Helpers/members.mjs.map +0 -1
- package/mjs/Helpers/permissions.mjs +0 -84
- package/mjs/Helpers/permissions.mjs.map +0 -1
- package/mjs/Helpers/ui.mjs +0 -137
- package/mjs/Helpers/ui.mjs.map +0 -1
- package/mjs/Interactions/builder.mjs +0 -56
- package/mjs/Interactions/builder.mjs.map +0 -1
- package/mjs/Interactions/commandHelper.mjs +0 -45
- package/mjs/Interactions/commandHelper.mjs.map +0 -1
- package/mjs/Interactions/context.mjs +0 -29
- package/mjs/Interactions/context.mjs.map +0 -1
- package/mjs/Interactions/definitions.mjs +0 -51
- package/mjs/Interactions/definitions.mjs.map +0 -1
- package/mjs/Interactions/error.mjs +0 -2
- package/mjs/Interactions/error.mjs.map +0 -1
- package/mjs/Interactions/gateway.mjs +0 -81
- package/mjs/Interactions/gateway.mjs.map +0 -1
- package/mjs/Interactions/handlers.mjs +0 -63
- package/mjs/Interactions/handlers.mjs.map +0 -1
- package/mjs/Interactions/index.mjs +0 -11
- package/mjs/Interactions/index.mjs.map +0 -1
- package/mjs/Interactions/utils.mjs +0 -26
- package/mjs/Interactions/utils.mjs.map +0 -1
- package/mjs/Interactions/webhook.mjs +0 -76
- package/mjs/Interactions/webhook.mjs.map +0 -1
- package/mjs/RateLimit/memory.mjs +0 -39
- package/mjs/RateLimit/memory.mjs.map +0 -1
- package/mjs/RateLimit/utils.mjs +0 -18
- package/mjs/RateLimit/utils.mjs.map +0 -1
- package/mjs/RateLimit.mjs +0 -28
- package/mjs/RateLimit.mjs.map +0 -1
- package/mjs/gateway.mjs +0 -19
- package/mjs/gateway.mjs.map +0 -1
- package/mjs/index.mjs +0 -18
- package/mjs/index.mjs.map +0 -1
- package/mjs/types.mjs +0 -356
- package/mjs/types.mjs.map +0 -1
- package/mjs/utils/Effect.mjs +0 -18
- package/mjs/utils/Effect.mjs.map +0 -1
- package/mjs/version.mjs +0 -2
- package/mjs/version.mjs.map +0 -1
- package/mjs/webhooks.mjs +0 -6
- package/mjs/webhooks.mjs.map +0 -1
- package/src/version.ts +0 -1
- package/types.d.ts +0 -2457
- package/types.d.ts.map +0 -1
- package/types.js +0 -408
- package/types.js.map +0 -1
- package/utils/Effect.d.ts +0 -5
- package/utils/Effect.d.ts.map +0 -1
- package/utils/Effect.js +0 -27
- package/utils/Effect.js.map +0 -1
- package/version.d.ts +0 -2
- package/version.d.ts.map +0 -1
- package/version.js +0 -8
- package/version.js.map +0 -1
- package/webhooks.d.ts +0 -8
- package/webhooks.d.ts.map +0 -1
- package/webhooks.js +0 -55
- package/webhooks.js.map +0 -1
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { NodeHttpClient, NodeSocket } from "@effect/platform-node"
|
|
2
|
+
import { Discord, DiscordConfig, Ix } from "dfx"
|
|
3
|
+
import { DiscordLive, runIx } from "dfx/gateway"
|
|
4
|
+
import Dotenv from "dotenv"
|
|
5
|
+
import { Config, Effect, Layer, pipe } from "effect"
|
|
6
|
+
|
|
7
|
+
Dotenv.config()
|
|
8
|
+
|
|
9
|
+
// Create the dependencies layer
|
|
10
|
+
const DiscordConfigLive = DiscordConfig.layerConfig({
|
|
11
|
+
token: Config.redacted("DISCORD_BOT_TOKEN"),
|
|
12
|
+
})
|
|
13
|
+
|
|
14
|
+
// Create your interaction definitions.
|
|
15
|
+
// Here we are creating a global application command.
|
|
16
|
+
const hello = Ix.global(
|
|
17
|
+
{
|
|
18
|
+
name: "hello",
|
|
19
|
+
description: "A basic command",
|
|
20
|
+
},
|
|
21
|
+
Effect.succeed({
|
|
22
|
+
type: 4,
|
|
23
|
+
data: {
|
|
24
|
+
content: "Hello!",
|
|
25
|
+
},
|
|
26
|
+
}),
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
// Optionally use the type safe helpers
|
|
30
|
+
const greeting = Ix.global(
|
|
31
|
+
{
|
|
32
|
+
name: "greeting",
|
|
33
|
+
description: "A basic command",
|
|
34
|
+
options: [
|
|
35
|
+
{
|
|
36
|
+
type: Discord.ApplicationCommandOptionType.STRING,
|
|
37
|
+
name: "who",
|
|
38
|
+
description: "who to greet",
|
|
39
|
+
required: true,
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
type: Discord.ApplicationCommandOptionType.STRING,
|
|
43
|
+
name: "greeting",
|
|
44
|
+
description: "What kind of greeting?",
|
|
45
|
+
},
|
|
46
|
+
],
|
|
47
|
+
},
|
|
48
|
+
ix =>
|
|
49
|
+
Effect.succeed({
|
|
50
|
+
type: 4,
|
|
51
|
+
data: {
|
|
52
|
+
content: `${ix.optionValueOrElse("greeting", () => "Hello")} ${ix.optionValue("who")}!`,
|
|
53
|
+
},
|
|
54
|
+
// fail: ix.optionValue("fail"), // <- this would be a type error
|
|
55
|
+
}),
|
|
56
|
+
)
|
|
57
|
+
|
|
58
|
+
// Build your program use `Ix.builder`
|
|
59
|
+
const program = Effect.gen(function* () {
|
|
60
|
+
const interactions = pipe(
|
|
61
|
+
Ix.builder.add(hello).add(greeting),
|
|
62
|
+
runIx(Effect.catch(e => Effect.logError("CAUGHT INTERACTION ERROR", e))),
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
yield* Effect.asVoid(interactions)
|
|
66
|
+
})
|
|
67
|
+
|
|
68
|
+
const EnvLive = DiscordLive.pipe(
|
|
69
|
+
Layer.provide(NodeHttpClient.layerUndici),
|
|
70
|
+
Layer.provide(NodeSocket.layerWebSocketConstructor),
|
|
71
|
+
Layer.provide(DiscordConfigLive),
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
// Run it
|
|
75
|
+
program.pipe(
|
|
76
|
+
Effect.provide(EnvLive),
|
|
77
|
+
Effect.tapCause(Effect.logError),
|
|
78
|
+
Effect.runFork,
|
|
79
|
+
)
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { NodeHttpClient, NodeRuntime, NodeSocket } from "@effect/platform-node"
|
|
2
|
+
import { DiscordConfig, Ix } from "dfx"
|
|
3
|
+
import { DiscordIxLive, InteractionsRegistry } from "dfx/gateway"
|
|
4
|
+
import * as Dotenv from "dotenv"
|
|
5
|
+
import { Config, Effect, Layer } from "effect"
|
|
6
|
+
|
|
7
|
+
Dotenv.config()
|
|
8
|
+
|
|
9
|
+
// Create a layer for the discord services
|
|
10
|
+
const DiscordLayer = DiscordIxLive.pipe(
|
|
11
|
+
Layer.provide([
|
|
12
|
+
DiscordConfig.layerConfig({
|
|
13
|
+
token: Config.redacted("DISCORD_BOT_TOKEN"),
|
|
14
|
+
}),
|
|
15
|
+
NodeHttpClient.layerUndici,
|
|
16
|
+
NodeSocket.layerWebSocketConstructor,
|
|
17
|
+
]),
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
// Create hello service
|
|
21
|
+
const HelloLayer = Layer.effectDiscard(
|
|
22
|
+
Effect.gen(function* () {
|
|
23
|
+
const registry = yield* InteractionsRegistry
|
|
24
|
+
|
|
25
|
+
// Create hello command that responds with "Hello!"
|
|
26
|
+
const hello = Ix.global(
|
|
27
|
+
{
|
|
28
|
+
name: "hello",
|
|
29
|
+
description: "A basic command",
|
|
30
|
+
},
|
|
31
|
+
Effect.succeed({
|
|
32
|
+
type: 4,
|
|
33
|
+
data: {
|
|
34
|
+
content: "Hello!",
|
|
35
|
+
},
|
|
36
|
+
}),
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
// register the command(s) and handle errors
|
|
40
|
+
yield* registry.register(
|
|
41
|
+
Ix.builder.add(hello).catchAllCause(Effect.logError),
|
|
42
|
+
)
|
|
43
|
+
}),
|
|
44
|
+
).pipe(
|
|
45
|
+
// provide discord layer
|
|
46
|
+
Layer.provide(DiscordLayer),
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
// Construct the main layer
|
|
50
|
+
const MainLive = Layer.mergeAll(
|
|
51
|
+
// add your other services here
|
|
52
|
+
HelloLayer,
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
// run it
|
|
56
|
+
NodeRuntime.runMain(Layer.launch(MainLive))
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { NodeHttpClient, NodeRuntime, NodeSocket } from "@effect/platform-node"
|
|
2
|
+
import { Discord, DiscordConfig, Ix, UI } from "dfx"
|
|
3
|
+
import { DiscordIxLive, InteractionsRegistry } from "dfx/gateway"
|
|
4
|
+
import Dotenv from "dotenv"
|
|
5
|
+
import { Config, Effect, Layer } from "effect"
|
|
6
|
+
|
|
7
|
+
Dotenv.config()
|
|
8
|
+
|
|
9
|
+
// Create your service and register your interactions
|
|
10
|
+
const makeGreetService = Effect.gen(function* () {
|
|
11
|
+
const registry = yield* InteractionsRegistry
|
|
12
|
+
|
|
13
|
+
const greet = Ix.global(
|
|
14
|
+
{
|
|
15
|
+
name: "greet",
|
|
16
|
+
description: "A basic command",
|
|
17
|
+
options: [
|
|
18
|
+
{
|
|
19
|
+
name: "name",
|
|
20
|
+
description: "who to greet",
|
|
21
|
+
type: Discord.ApplicationCommandOptionType.STRING,
|
|
22
|
+
required: true,
|
|
23
|
+
},
|
|
24
|
+
],
|
|
25
|
+
},
|
|
26
|
+
ix =>
|
|
27
|
+
Effect.succeed(
|
|
28
|
+
Ix.response({
|
|
29
|
+
type: Discord.InteractionCallbackTypes.CHANNEL_MESSAGE_WITH_SOURCE,
|
|
30
|
+
data: UI.components([
|
|
31
|
+
UI.textDisplay(`Hello ${ix.optionValue("name")}!`),
|
|
32
|
+
UI.row([
|
|
33
|
+
UI.button({ custom_id: "one", label: "Click me!" }),
|
|
34
|
+
UI.button({ custom_id: "two", label: "Click me 2!" }),
|
|
35
|
+
]),
|
|
36
|
+
]),
|
|
37
|
+
}),
|
|
38
|
+
),
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
// create a builder
|
|
42
|
+
const ix = Ix.builder.add(greet).catchAllCause(Effect.logError)
|
|
43
|
+
|
|
44
|
+
// register the interactions
|
|
45
|
+
yield* registry.register(ix)
|
|
46
|
+
})
|
|
47
|
+
|
|
48
|
+
// Greet service layer
|
|
49
|
+
const GreetLive = Layer.effectDiscard(makeGreetService)
|
|
50
|
+
|
|
51
|
+
// Main layer
|
|
52
|
+
const MainLive = GreetLive.pipe(
|
|
53
|
+
Layer.provide(DiscordIxLive),
|
|
54
|
+
Layer.provide(NodeHttpClient.layerUndici),
|
|
55
|
+
Layer.provide(NodeSocket.layerWebSocketConstructor),
|
|
56
|
+
Layer.provide(
|
|
57
|
+
DiscordConfig.layerConfig({
|
|
58
|
+
token: Config.redacted("DISCORD_BOT_TOKEN"),
|
|
59
|
+
}),
|
|
60
|
+
),
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
Layer.launch(MainLive).pipe(
|
|
64
|
+
Effect.catchCause(Effect.logError),
|
|
65
|
+
NodeRuntime.runMain,
|
|
66
|
+
)
|
package/flake.lock
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
{
|
|
2
|
+
"nodes": {
|
|
3
|
+
"nixpkgs": {
|
|
4
|
+
"locked": {
|
|
5
|
+
"lastModified": 1747060738,
|
|
6
|
+
"narHash": "sha256-ByfPRQuqj+nhtVV0koinEpmJw0KLzNbgcgi9EF+NVow=",
|
|
7
|
+
"owner": "nixos",
|
|
8
|
+
"repo": "nixpkgs",
|
|
9
|
+
"rev": "eaeed9530c76ce5f1d2d8232e08bec5e26f18ec1",
|
|
10
|
+
"type": "github"
|
|
11
|
+
},
|
|
12
|
+
"original": {
|
|
13
|
+
"owner": "nixos",
|
|
14
|
+
"ref": "nixpkgs-unstable",
|
|
15
|
+
"repo": "nixpkgs",
|
|
16
|
+
"type": "github"
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
"root": {
|
|
20
|
+
"inputs": {
|
|
21
|
+
"nixpkgs": "nixpkgs"
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
"root": "root",
|
|
26
|
+
"version": 7
|
|
27
|
+
}
|
package/flake.nix
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
inputs = {
|
|
3
|
+
nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable";
|
|
4
|
+
};
|
|
5
|
+
outputs = {nixpkgs, ...}: let
|
|
6
|
+
forAllSystems = function:
|
|
7
|
+
nixpkgs.lib.genAttrs nixpkgs.lib.systems.flakeExposed (
|
|
8
|
+
system: function nixpkgs.legacyPackages.${system}
|
|
9
|
+
);
|
|
10
|
+
in {
|
|
11
|
+
formatter = forAllSystems (pkgs: pkgs.alejandra);
|
|
12
|
+
devShells = forAllSystems (pkgs: {
|
|
13
|
+
default = pkgs.mkShell {
|
|
14
|
+
packages = with pkgs; [
|
|
15
|
+
corepack
|
|
16
|
+
nodejs
|
|
17
|
+
];
|
|
18
|
+
};
|
|
19
|
+
});
|
|
20
|
+
};
|
|
21
|
+
}
|
package/lerna.json
ADDED
package/package.json
CHANGED
|
@@ -1,49 +1,92 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dfx",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"packageManager": "pnpm@10.11.0+sha512.6540583f41cc5f628eb3d9773ecee802f4f9ef9923cc45b69890fb47991d4b092964694ec3a4f738a420c918a333062c8b925d312f42e4f0c263eb603551f977",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"publishConfig": {
|
|
7
|
+
"access": "public",
|
|
8
|
+
"directory": "dist"
|
|
9
|
+
},
|
|
4
10
|
"description": "Effect-TS discord library",
|
|
5
|
-
"
|
|
11
|
+
"author": "Tim Smart <hello@timsmart.co>",
|
|
6
12
|
"repository": {
|
|
7
13
|
"type": "git",
|
|
8
14
|
"url": "https://github.com/tim-smart/dfx.git"
|
|
9
15
|
},
|
|
10
|
-
"
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
"
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
"
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
"default": "./index.js"
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
},
|
|
35
|
-
"sideEffects": [],
|
|
36
|
-
"author": "Tim Smart <hello@timsmart.co>",
|
|
37
|
-
"dependencies": {
|
|
38
|
-
"discord-api-types": "^0.38.26"
|
|
16
|
+
"license": "MIT",
|
|
17
|
+
"scripts": {
|
|
18
|
+
"example": "ts-node --project tsconfig.examples.json",
|
|
19
|
+
"prepublishOnly": "pnpm build",
|
|
20
|
+
"types": "./scripts/generate-client.sh",
|
|
21
|
+
"clean": "rimraf build tsbuildinfo dist .cache",
|
|
22
|
+
"prebuild": "node -p \"'export const LIB_VERSION = ' + JSON.stringify(require('./package.json').version) + ';'\" > src/version.ts",
|
|
23
|
+
"build": "pnpm prebuild && pnpm build-all && pnpm build-pack",
|
|
24
|
+
"build-cjs": "babel build/esm --config-file ./.babel.cjs.json --out-dir build/cjs --out-file-extension .js --source-maps",
|
|
25
|
+
"build-mjs": "babel build/esm --config-file ./.babel.mjs.json --out-dir build/mjs --out-file-extension .mjs --source-maps",
|
|
26
|
+
"build-post": "build-utils pack-v1",
|
|
27
|
+
"build-pack": "concurrently \"pnpm build-cjs\" \"pnpm build-mjs\" && pnpm build-post",
|
|
28
|
+
"build-all": "tsc -b tsconfig.json",
|
|
29
|
+
"build-watch": "tsc -b tsconfig.json --watch",
|
|
30
|
+
"check": "pnpm lint && pnpm tsgo -b tsconfig.json",
|
|
31
|
+
"lint": "oxlint src test examples",
|
|
32
|
+
"autofix": "pnpm lint --fix",
|
|
33
|
+
"circular": "madge --ts-config ./tsconfig.madge.json --circular --no-color --no-spinner --warning build/esm",
|
|
34
|
+
"test": "vitest",
|
|
35
|
+
"coverage": "vitest run --coverage",
|
|
36
|
+
"prepare": "husky && effect-language-service patch"
|
|
39
37
|
},
|
|
40
38
|
"peerDependencies": {
|
|
41
|
-
"
|
|
42
|
-
"effect": "^3.18"
|
|
39
|
+
"effect": "4.0.0-beta.6"
|
|
43
40
|
},
|
|
44
41
|
"optionalDependencies": {
|
|
45
42
|
"discord-verify": "^1.2.0"
|
|
46
43
|
},
|
|
47
|
-
"
|
|
48
|
-
|
|
49
|
-
|
|
44
|
+
"devDependencies": {
|
|
45
|
+
"@babel/cli": "^7.28.6",
|
|
46
|
+
"@babel/core": "^7.29.0",
|
|
47
|
+
"@babel/plugin-syntax-import-attributes": "^7.28.6",
|
|
48
|
+
"@babel/plugin-transform-modules-commonjs": "^7.28.6",
|
|
49
|
+
"@changesets/changelog-github": "^0.5.2",
|
|
50
|
+
"@changesets/cli": "^2.29.8",
|
|
51
|
+
"@effect/babel-plugin": "^0.2.0",
|
|
52
|
+
"@effect/build-utils": "^0.8.9",
|
|
53
|
+
"@effect/language-service": "^0.74.0",
|
|
54
|
+
"@effect/platform-node": "4.0.0-beta.6",
|
|
55
|
+
"@tim-smart/openapi-gen": "^1.0.0",
|
|
56
|
+
"@types/chai": "^5.2.3",
|
|
57
|
+
"@types/node": "^25.2.3",
|
|
58
|
+
"@types/ws": "^8.18.1",
|
|
59
|
+
"@typescript/native-preview": "7.0.0-dev.20260219.1",
|
|
60
|
+
"@vitejs/plugin-react": "^5.1.4",
|
|
61
|
+
"@vitest/coverage-v8": "^4.0.18",
|
|
62
|
+
"babel-plugin-annotate-pure-calls": "^0.5.0",
|
|
63
|
+
"concurrently": "^9.2.1",
|
|
64
|
+
"dotenv": "^17.3.1",
|
|
65
|
+
"effect": "4.0.0-beta.6",
|
|
66
|
+
"husky": "^9.1.7",
|
|
67
|
+
"lerna": "^9.0.4",
|
|
68
|
+
"lint-staged": "^16.2.7",
|
|
69
|
+
"madge": "^8.0.0",
|
|
70
|
+
"oxlint": "^1.48.0",
|
|
71
|
+
"prettier": "^3.8.1",
|
|
72
|
+
"rimraf": "^6.1.3",
|
|
73
|
+
"ts-node": "^10.9.2",
|
|
74
|
+
"tsx": "^4.21.0",
|
|
75
|
+
"typescript": "^5.9.3",
|
|
76
|
+
"vite": "^7.3.1",
|
|
77
|
+
"vitest": "4.0.18"
|
|
78
|
+
},
|
|
79
|
+
"gitHead": "8f299caa1306c17bef8fa3bd2528bda36e55c462",
|
|
80
|
+
"dependencies": {
|
|
81
|
+
"discord-api-types": "^0.38.39"
|
|
82
|
+
},
|
|
83
|
+
"lint-staged": {
|
|
84
|
+
"*.{ts,tsx}": [
|
|
85
|
+
"oxlint --fix",
|
|
86
|
+
"prettier --write"
|
|
87
|
+
],
|
|
88
|
+
"*.{json,md,yml,yaml}": [
|
|
89
|
+
"prettier --write"
|
|
90
|
+
]
|
|
91
|
+
}
|
|
92
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
|
|
3
|
+
mkdir -p tmp
|
|
4
|
+
curl https://raw.githubusercontent.com/discord/discord-api-spec/refs/heads/main/specs/openapi.json -o tmp/openapi.json
|
|
5
|
+
pnpm openapi-gen -n DiscordRest -s tmp/openapi.json > src/DiscordREST/Generated.ts
|
|
6
|
+
|
|
7
|
+
echo "// oxlint-disable no-shadow
|
|
8
|
+
$(cat src/DiscordREST/Generated.ts)" > src/DiscordREST/Generated.ts
|
|
9
|
+
|
|
10
|
+
pnpm prettier -w src/DiscordREST/Generated.ts
|
package/src/Cache/memory.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as Option from "effect/Option"
|
|
2
2
|
import * as Effect from "effect/Effect"
|
|
3
|
-
import type { CacheDriver, ParentCacheDriver } from "
|
|
4
|
-
import { createDriver, createParentDriver } from "
|
|
3
|
+
import type { CacheDriver, ParentCacheDriver } from "./driver.ts"
|
|
4
|
+
import { createDriver, createParentDriver } from "./driver.ts"
|
|
5
5
|
|
|
6
6
|
export const createWithParent = <T>(): Effect.Effect<
|
|
7
7
|
ParentCacheDriver<never, T>
|
|
@@ -24,11 +24,11 @@ export const createWithParent = <T>(): Effect.Effect<
|
|
|
24
24
|
get: (parentId, resourceId) =>
|
|
25
25
|
Effect.sync(
|
|
26
26
|
(): Option.Option<T> =>
|
|
27
|
-
Option.
|
|
27
|
+
Option.fromNullishOr(map.get(parentId)?.get(resourceId)),
|
|
28
28
|
),
|
|
29
29
|
|
|
30
30
|
getForParent: parentId =>
|
|
31
|
-
Effect.sync(() => Option.
|
|
31
|
+
Effect.sync(() => Option.fromNullishOr(map.get(parentId))),
|
|
32
32
|
|
|
33
33
|
set: (parentId, resourceId, resource) =>
|
|
34
34
|
Effect.sync(() => {
|
|
@@ -63,7 +63,7 @@ export const create = <T>(): Effect.Effect<CacheDriver<never, T>> =>
|
|
|
63
63
|
|
|
64
64
|
get: resourceId =>
|
|
65
65
|
Effect.sync(
|
|
66
|
-
(): Option.Option<T> => Option.
|
|
66
|
+
(): Option.Option<T> => Option.fromNullishOr(map.get(resourceId)),
|
|
67
67
|
),
|
|
68
68
|
|
|
69
69
|
set: (resourceId, resource) =>
|
package/src/Cache/memoryTTL.ts
CHANGED
|
@@ -1,10 +1,14 @@
|
|
|
1
|
-
import type { CacheDriver, ParentCacheDriver } from "
|
|
2
|
-
import { createDriver, createParentDriver } from "
|
|
1
|
+
import type { CacheDriver, ParentCacheDriver } from "./driver.ts"
|
|
2
|
+
import { createDriver, createParentDriver } from "./driver.ts"
|
|
3
3
|
import * as Array from "effect/Array"
|
|
4
4
|
import * as Duration from "effect/Duration"
|
|
5
5
|
import * as Effect from "effect/Effect"
|
|
6
6
|
import * as Option from "effect/Option"
|
|
7
7
|
|
|
8
|
+
declare const global: typeof globalThis & {
|
|
9
|
+
gc?: () => void
|
|
10
|
+
}
|
|
11
|
+
|
|
8
12
|
export interface MemoryTTLOpts {
|
|
9
13
|
/** The approx. number of milliseconds to keep items */
|
|
10
14
|
readonly ttl: Duration.Duration
|
|
@@ -99,7 +103,7 @@ const make = <T>({
|
|
|
99
103
|
|
|
100
104
|
get: resourceId =>
|
|
101
105
|
Effect.sync(
|
|
102
|
-
(): Option.Option<T> => Option.
|
|
106
|
+
(): Option.Option<T> => Option.fromNullishOr(getSync(resourceId)),
|
|
103
107
|
),
|
|
104
108
|
|
|
105
109
|
refreshTTL: id =>
|
|
@@ -153,7 +157,7 @@ export const createWithParent = <T>(
|
|
|
153
157
|
get: (_, id) => store.get(id),
|
|
154
158
|
|
|
155
159
|
getForParent: parentId =>
|
|
156
|
-
|
|
160
|
+
Effect.fromNullishOr(parentIds.get(parentId)).pipe(
|
|
157
161
|
Effect.flatMap(ids =>
|
|
158
162
|
Effect.forEach(
|
|
159
163
|
ids,
|
|
@@ -176,11 +180,11 @@ export const createWithParent = <T>(
|
|
|
176
180
|
item._tag === "Some" ? acc.set(id, item.value) : acc,
|
|
177
181
|
),
|
|
178
182
|
),
|
|
179
|
-
Effect.
|
|
183
|
+
Effect.catchNoSuchElement,
|
|
180
184
|
),
|
|
181
185
|
|
|
182
186
|
set: (parentId, resourceId, resource) =>
|
|
183
|
-
Effect.
|
|
187
|
+
Effect.andThen(
|
|
184
188
|
store.set(resourceId, resource),
|
|
185
189
|
Effect.sync(() => {
|
|
186
190
|
if (!parentIds.has(parentId)) {
|
|
@@ -191,7 +195,7 @@ export const createWithParent = <T>(
|
|
|
191
195
|
),
|
|
192
196
|
|
|
193
197
|
delete: (parentId, resourceId) =>
|
|
194
|
-
Effect.
|
|
198
|
+
Effect.andThen(
|
|
195
199
|
store.delete(resourceId),
|
|
196
200
|
Effect.sync(() => {
|
|
197
201
|
parentIds.get(parentId)?.delete(resourceId)
|
package/src/Cache/prelude.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import * as Effect from "effect/Effect"
|
|
2
2
|
import type * as Scope from "effect/Scope"
|
|
3
3
|
import * as Stream from "effect/Stream"
|
|
4
|
-
import type { DiscordRESTError } from "
|
|
5
|
-
import { DiscordREST } from "
|
|
4
|
+
import type { DiscordRESTError } from "../DiscordREST.ts"
|
|
5
|
+
import { DiscordREST } from "../DiscordREST.ts"
|
|
6
6
|
import type {
|
|
7
7
|
CacheDriver,
|
|
8
8
|
CacheOp,
|
|
@@ -10,10 +10,10 @@ import type {
|
|
|
10
10
|
ParentCacheOp,
|
|
11
11
|
Cache,
|
|
12
12
|
ParentCache,
|
|
13
|
-
} from "
|
|
14
|
-
import { CacheMissError, make, makeWithParent } from "
|
|
15
|
-
import { DiscordGateway } from "
|
|
16
|
-
import type * as Discord from "
|
|
13
|
+
} from "../Cache.ts"
|
|
14
|
+
import { CacheMissError, make, makeWithParent } from "../Cache.ts"
|
|
15
|
+
import { DiscordGateway } from "../DiscordGateway.ts"
|
|
16
|
+
import type * as Discord from "../types.ts"
|
|
17
17
|
|
|
18
18
|
export interface OptsWithParentOptions<E, A> {
|
|
19
19
|
readonly id: (a: A) => string
|
|
@@ -210,8 +210,10 @@ export const channels = <RM, EM, E>(
|
|
|
210
210
|
}),
|
|
211
211
|
onMiss: (_, id) => rest.getChannel(id),
|
|
212
212
|
onParentMiss: guildId =>
|
|
213
|
-
Effect.map(rest.listGuildChannels(guildId),
|
|
214
|
-
|
|
213
|
+
Effect.map(rest.listGuildChannels(guildId), guildChannels =>
|
|
214
|
+
guildChannels.map(
|
|
215
|
+
channel => [channel.id, channel as Discord.GetChannel200] as const,
|
|
216
|
+
),
|
|
215
217
|
),
|
|
216
218
|
})
|
|
217
219
|
})
|