dfx 0.61.5 → 0.61.6
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/Cache/memoryTTL.d.ts.map +1 -1
- package/Cache/memoryTTL.js.map +1 -1
- package/Cache/prelude.d.ts +3 -3
- package/Cache/prelude.d.ts.map +1 -1
- package/Cache/prelude.js.map +1 -1
- package/Cache.d.ts.map +1 -1
- package/Cache.js.map +1 -1
- package/DiscordGateway/DiscordWS.d.ts.map +1 -1
- package/DiscordGateway/DiscordWS.js.map +1 -1
- package/DiscordGateway/Shard/heartbeats.d.ts.map +1 -1
- package/DiscordGateway/Shard/heartbeats.js.map +1 -1
- package/DiscordGateway/Shard/sendEvents.js +9 -6
- package/DiscordGateway/Shard/sendEvents.js.map +1 -1
- package/DiscordGateway/Shard/utils.d.ts.map +1 -1
- package/DiscordGateway/Shard/utils.js.map +1 -1
- package/DiscordGateway/Shard.d.ts.map +1 -1
- package/DiscordGateway/Shard.js +8 -7
- package/DiscordGateway/Shard.js.map +1 -1
- package/DiscordGateway/Sharder.d.ts +2 -2
- package/DiscordGateway/Sharder.js.map +1 -1
- package/DiscordGateway/WS.d.ts.map +1 -1
- package/DiscordGateway/WS.js.map +1 -1
- package/DiscordGateway.d.ts +1 -1
- package/DiscordGateway.d.ts.map +1 -1
- package/DiscordGateway.js.map +1 -1
- package/DiscordREST/utils.d.ts.map +1 -1
- package/DiscordREST/utils.js.map +1 -1
- package/DiscordREST.d.ts +1 -1
- package/DiscordREST.d.ts.map +1 -1
- package/DiscordREST.js.map +1 -1
- package/Helpers/flags.d.ts.map +1 -1
- package/Helpers/flags.js.map +1 -1
- package/Helpers/intents.d.ts.map +1 -1
- package/Helpers/intents.js.map +1 -1
- package/Helpers/interactions.d.ts.map +1 -1
- package/Helpers/interactions.js +3 -2
- package/Helpers/interactions.js.map +1 -1
- package/Helpers/members.d.ts.map +1 -1
- package/Helpers/members.js.map +1 -1
- package/Helpers/permissions.js.map +1 -1
- package/Helpers/ui.js +12 -11
- package/Helpers/ui.js.map +1 -1
- package/Interactions/builder.d.ts.map +1 -1
- package/Interactions/builder.js.map +1 -1
- package/Interactions/context.d.ts.map +1 -1
- package/Interactions/context.js.map +1 -1
- package/Interactions/definitions.d.ts.map +1 -1
- package/Interactions/definitions.js.map +1 -1
- package/Interactions/gateway.d.ts +1 -1
- package/Interactions/gateway.d.ts.map +1 -1
- package/Interactions/gateway.js.map +1 -1
- package/Interactions/handlers.d.ts.map +1 -1
- package/Interactions/handlers.js +7 -7
- package/Interactions/handlers.js.map +1 -1
- package/Interactions/index.d.ts.map +1 -1
- package/Interactions/index.js.map +1 -1
- package/Interactions/utils.d.ts.map +1 -1
- package/Interactions/utils.js.map +1 -1
- package/Interactions/webhook.d.ts.map +1 -1
- package/Interactions/webhook.js.map +1 -1
- package/Log.js.map +1 -1
- package/RateLimit.d.ts.map +1 -1
- package/RateLimit.js.map +1 -1
- package/gateway.d.ts +1 -1
- package/mjs/Cache/memoryTTL.mjs.map +1 -1
- package/mjs/Cache/prelude.mjs.map +1 -1
- package/mjs/Cache.mjs.map +1 -1
- package/mjs/DiscordGateway/DiscordWS.mjs.map +1 -1
- package/mjs/DiscordGateway/Shard/heartbeats.mjs.map +1 -1
- package/mjs/DiscordGateway/Shard/sendEvents.mjs +7 -6
- package/mjs/DiscordGateway/Shard/sendEvents.mjs.map +1 -1
- package/mjs/DiscordGateway/Shard/utils.mjs.map +1 -1
- package/mjs/DiscordGateway/Shard.mjs +8 -7
- package/mjs/DiscordGateway/Shard.mjs.map +1 -1
- package/mjs/DiscordGateway/Sharder.mjs.map +1 -1
- package/mjs/DiscordGateway/WS.mjs.map +1 -1
- package/mjs/DiscordGateway.mjs.map +1 -1
- package/mjs/DiscordREST/utils.mjs.map +1 -1
- package/mjs/DiscordREST.mjs.map +1 -1
- package/mjs/Helpers/flags.mjs.map +1 -1
- package/mjs/Helpers/intents.mjs.map +1 -1
- package/mjs/Helpers/interactions.mjs +3 -2
- package/mjs/Helpers/interactions.mjs.map +1 -1
- package/mjs/Helpers/members.mjs.map +1 -1
- package/mjs/Helpers/permissions.mjs.map +1 -1
- package/mjs/Helpers/ui.mjs +12 -11
- package/mjs/Helpers/ui.mjs.map +1 -1
- package/mjs/Interactions/builder.mjs.map +1 -1
- package/mjs/Interactions/context.mjs.map +1 -1
- package/mjs/Interactions/definitions.mjs.map +1 -1
- package/mjs/Interactions/gateway.mjs.map +1 -1
- package/mjs/Interactions/handlers.mjs +7 -7
- package/mjs/Interactions/handlers.mjs.map +1 -1
- package/mjs/Interactions/index.mjs.map +1 -1
- package/mjs/Interactions/utils.mjs.map +1 -1
- package/mjs/Interactions/webhook.mjs.map +1 -1
- package/mjs/Log.mjs.map +1 -1
- package/mjs/RateLimit.mjs.map +1 -1
- package/mjs/types.mjs +733 -9
- package/mjs/types.mjs.map +1 -1
- package/mjs/utils/Effect.mjs.map +1 -1
- package/mjs/version.mjs +1 -1
- package/mjs/webhooks.mjs.map +1 -1
- package/package.json +2 -2
- package/src/Cache/memoryTTL.ts +4 -6
- package/src/Cache/prelude.ts +13 -15
- package/src/Cache.ts +5 -2
- package/src/DiscordGateway/DiscordWS.ts +6 -5
- package/src/DiscordGateway/Shard/heartbeats.ts +2 -3
- package/src/DiscordGateway/Shard/utils.ts +10 -9
- package/src/DiscordGateway/Shard.ts +13 -12
- package/src/DiscordGateway/Sharder.ts +8 -8
- package/src/DiscordGateway/WS.ts +9 -6
- package/src/DiscordGateway.ts +9 -8
- package/src/DiscordREST/utils.ts +2 -4
- package/src/DiscordREST.ts +24 -26
- package/src/Helpers/flags.ts +4 -2
- package/src/Helpers/intents.ts +4 -3
- package/src/Helpers/interactions.ts +54 -51
- package/src/Helpers/members.ts +2 -2
- package/src/Helpers/permissions.ts +2 -2
- package/src/Interactions/builder.ts +18 -20
- package/src/Interactions/context.ts +31 -18
- package/src/Interactions/definitions.ts +36 -27
- package/src/Interactions/gateway.ts +85 -82
- package/src/Interactions/handlers.ts +35 -34
- package/src/Interactions/index.ts +20 -16
- package/src/Interactions/utils.ts +17 -13
- package/src/Interactions/webhook.ts +15 -19
- package/src/Log.ts +2 -2
- package/src/RateLimit.ts +4 -5
- package/src/types.ts +172 -188
- package/src/utils/Effect.ts +19 -21
- package/src/version.ts +1 -1
- package/src/webhooks.ts +1 -4
- package/types.d.ts +140 -132
- package/types.d.ts.map +1 -1
- package/types.js +784 -10
- package/types.js.map +1 -1
- package/utils/Effect.d.ts.map +1 -1
- package/utils/Effect.js.map +1 -1
- package/version.d.ts +1 -1
- package/version.js +1 -1
- package/webhooks.d.ts +1 -1
- package/webhooks.d.ts.map +1 -1
- package/webhooks.js.map +1 -1
- package/tsconfig.tsbuildinfo +0 -1
|
@@ -25,9 +25,8 @@ export class GlobalApplicationCommand<R, E> {
|
|
|
25
25
|
export const global = <
|
|
26
26
|
R,
|
|
27
27
|
E,
|
|
28
|
-
const A extends
|
|
29
|
-
Discord.CreateGlobalApplicationCommandParams
|
|
30
|
-
>,
|
|
28
|
+
const A extends
|
|
29
|
+
DeepReadonlyObject<Discord.CreateGlobalApplicationCommandParams>,
|
|
31
30
|
>(
|
|
32
31
|
command: A,
|
|
33
32
|
handle: CommandHandler<R, E, A>,
|
|
@@ -48,9 +47,8 @@ export class GuildApplicationCommand<R, E> {
|
|
|
48
47
|
export const guild = <
|
|
49
48
|
R,
|
|
50
49
|
E,
|
|
51
|
-
const A extends
|
|
52
|
-
Discord.CreateGuildApplicationCommandParams
|
|
53
|
-
>,
|
|
50
|
+
const A extends
|
|
51
|
+
DeepReadonlyObject<Discord.CreateGuildApplicationCommandParams>,
|
|
54
52
|
>(
|
|
55
53
|
command: A,
|
|
56
54
|
handle: CommandHandler<R, E, A>,
|
|
@@ -123,9 +121,12 @@ export const autocomplete = <R1, R2, E1, E2>(
|
|
|
123
121
|
>(pred as any, handle as any)
|
|
124
122
|
|
|
125
123
|
// ==== Command handler helpers
|
|
126
|
-
type DeepReadonly<T> = T extends Array<infer R>
|
|
127
|
-
|
|
128
|
-
: T extends
|
|
124
|
+
type DeepReadonly<T> = T extends Array<infer R>
|
|
125
|
+
? ReadonlyArray<DeepReadonly<R>>
|
|
126
|
+
: T extends Function
|
|
127
|
+
? T
|
|
128
|
+
: T extends object
|
|
129
|
+
? DeepReadonlyObject<T>
|
|
129
130
|
: T
|
|
130
131
|
type DeepReadonlyObject<T> = {
|
|
131
132
|
readonly [P in keyof T]: DeepReadonly<T[P]>
|
|
@@ -162,26 +163,29 @@ export interface CommandHelper<A> {
|
|
|
162
163
|
>
|
|
163
164
|
|
|
164
165
|
subCommands: <
|
|
165
|
-
NER extends SubCommandNames<A> extends never
|
|
166
|
+
NER extends SubCommandNames<A> extends never
|
|
167
|
+
? never
|
|
166
168
|
: Record<
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
169
|
+
SubCommandNames<A>,
|
|
170
|
+
Effect.Effect<any, any, Discord.InteractionResponse>
|
|
171
|
+
>,
|
|
170
172
|
>(
|
|
171
173
|
commands: NER,
|
|
172
174
|
) => Effect.Effect<
|
|
173
175
|
| Exclude<
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
176
|
+
[NER[keyof NER]] extends [
|
|
177
|
+
{ [Effect.EffectTypeId]: { _R: (_: never) => infer R } },
|
|
178
|
+
]
|
|
179
|
+
? R
|
|
180
|
+
: never,
|
|
181
|
+
SubCommandContext
|
|
182
|
+
>
|
|
180
183
|
| Discord.Interaction
|
|
181
184
|
| Discord.ApplicationCommandDatum,
|
|
182
185
|
[NER[keyof NER]] extends [
|
|
183
186
|
{ [Effect.EffectTypeId]: { _E: (_: never) => infer E } },
|
|
184
|
-
]
|
|
187
|
+
]
|
|
188
|
+
? E
|
|
185
189
|
: never,
|
|
186
190
|
Discord.InteractionResponse
|
|
187
191
|
>
|
|
@@ -201,9 +205,10 @@ interface CommandOption {
|
|
|
201
205
|
type SubCommands<A> = A extends {
|
|
202
206
|
readonly type: Discord.ApplicationCommandOptionType.SUB_COMMAND
|
|
203
207
|
readonly options?: ReadonlyArray<CommandOption>
|
|
204
|
-
}
|
|
208
|
+
}
|
|
209
|
+
? A
|
|
205
210
|
: A extends { readonly options: ReadonlyArray<CommandOption> }
|
|
206
|
-
|
|
211
|
+
? SubCommands<A["options"][number]>
|
|
207
212
|
: never
|
|
208
213
|
|
|
209
214
|
type SubCommandNames<A> = Option<SubCommands<A>>["name"]
|
|
@@ -280,16 +285,20 @@ type SubCommandResolvables<A> = Extract<
|
|
|
280
285
|
type AllResolvables<A> = Resolvables<A> | SubCommandResolvables<A>
|
|
281
286
|
|
|
282
287
|
// == Utilities
|
|
283
|
-
type StringLiteral<T> = T extends string
|
|
284
|
-
|
|
288
|
+
type StringLiteral<T> = T extends string
|
|
289
|
+
? string extends T
|
|
290
|
+
? never
|
|
291
|
+
: T
|
|
285
292
|
: never
|
|
286
293
|
|
|
287
294
|
type Option<A> = A extends { readonly name: infer N }
|
|
288
|
-
? N extends StringLiteral<N>
|
|
289
|
-
|
|
295
|
+
? N extends StringLiteral<N>
|
|
296
|
+
? A
|
|
297
|
+
: never
|
|
290
298
|
: never
|
|
291
299
|
|
|
292
300
|
type OptionsWithLiteral<A, T> = A extends {
|
|
293
301
|
readonly options: ReadonlyArray<CommandOption>
|
|
294
|
-
}
|
|
302
|
+
}
|
|
303
|
+
? Extract<A["options"][number], Option<A["options"][number]> & T>
|
|
295
304
|
: never
|
|
@@ -29,88 +29,90 @@ export interface RunOpts {
|
|
|
29
29
|
/**
|
|
30
30
|
* @tsplus pipeable dfx/InteractionBuilder runGateway
|
|
31
31
|
*/
|
|
32
|
-
export const run =
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
(
|
|
54
|
-
_
|
|
55
|
-
|
|
56
|
-
Chunk.toReadonlyArray,
|
|
57
|
-
)
|
|
58
|
-
const GuildApplicationCommand = ix.definitions.pipe(
|
|
59
|
-
Chunk.map(_ => _[0]),
|
|
60
|
-
Chunk.filter(
|
|
61
|
-
(_): _ is GuildApplicationCommand<R, E> =>
|
|
62
|
-
_._tag === "GuildApplicationCommand",
|
|
63
|
-
),
|
|
64
|
-
Chunk.toReadonlyArray,
|
|
65
|
-
)
|
|
66
|
-
|
|
67
|
-
const gateway = yield* _(DiscordGateway)
|
|
68
|
-
const rest = yield* _(DiscordREST)
|
|
69
|
-
|
|
70
|
-
const application = yield* _(
|
|
71
|
-
rest.getCurrentBotApplicationInformation(),
|
|
72
|
-
Effect.flatMap(a => a.json),
|
|
73
|
-
)
|
|
74
|
-
|
|
75
|
-
const globalSync = rest.bulkOverwriteGlobalApplicationCommands(
|
|
76
|
-
application.id,
|
|
77
|
-
{
|
|
78
|
-
body: Http.body.unsafeJson(
|
|
79
|
-
GlobalApplicationCommand.map(_ => _.command),
|
|
32
|
+
export const run =
|
|
33
|
+
<R, R2, E, TE, E2>(
|
|
34
|
+
postHandler: (
|
|
35
|
+
effect: Effect.Effect<
|
|
36
|
+
R | DiscordREST | Discord.Interaction,
|
|
37
|
+
TE | DiscordRESTError | DefinitionNotFound,
|
|
38
|
+
void
|
|
39
|
+
>,
|
|
40
|
+
) => Effect.Effect<R2, E2, void>,
|
|
41
|
+
{ sync = true }: RunOpts = {},
|
|
42
|
+
) =>
|
|
43
|
+
(
|
|
44
|
+
ix: InteractionBuilder<R, E, TE>,
|
|
45
|
+
): Effect.Effect<
|
|
46
|
+
DiscordREST | DiscordGateway | Exclude<R2, Discord.Interaction>,
|
|
47
|
+
E2 | DiscordRESTError | Http.error.ResponseError,
|
|
48
|
+
never
|
|
49
|
+
> =>
|
|
50
|
+
Effect.gen(function* (_) {
|
|
51
|
+
const GlobalApplicationCommand = ix.definitions.pipe(
|
|
52
|
+
Chunk.map(_ => _[0]),
|
|
53
|
+
Chunk.filter(
|
|
54
|
+
(_): _ is GlobalApplicationCommand<R, E> =>
|
|
55
|
+
_._tag === "GlobalApplicationCommand",
|
|
80
56
|
),
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
57
|
+
Chunk.toReadonlyArray,
|
|
58
|
+
)
|
|
59
|
+
const GuildApplicationCommand = ix.definitions.pipe(
|
|
60
|
+
Chunk.map(_ => _[0]),
|
|
61
|
+
Chunk.filter(
|
|
62
|
+
(_): _ is GuildApplicationCommand<R, E> =>
|
|
63
|
+
_._tag === "GuildApplicationCommand",
|
|
64
|
+
),
|
|
65
|
+
Chunk.toReadonlyArray,
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
const gateway = yield* _(DiscordGateway)
|
|
69
|
+
const rest = yield* _(DiscordREST)
|
|
70
|
+
|
|
71
|
+
const application = yield* _(
|
|
72
|
+
rest.getCurrentBotApplicationInformation(),
|
|
73
|
+
Effect.flatMap(a => a.json),
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
const globalSync = rest.bulkOverwriteGlobalApplicationCommands(
|
|
77
|
+
application.id,
|
|
78
|
+
{
|
|
79
|
+
body: Http.body.unsafeJson(
|
|
80
|
+
GlobalApplicationCommand.map(_ => _.command),
|
|
81
|
+
),
|
|
82
|
+
},
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
const guildSync = GuildApplicationCommand.length
|
|
86
|
+
? gateway.handleDispatch("GUILD_CREATE", a =>
|
|
87
|
+
rest.bulkOverwriteGuildApplicationCommands(
|
|
88
|
+
application.id,
|
|
89
|
+
a.id,
|
|
90
|
+
GuildApplicationCommand.map(_ => _.command) as any,
|
|
91
|
+
),
|
|
92
|
+
)
|
|
93
|
+
: Effect.never
|
|
94
|
+
|
|
95
|
+
const handle = handlers(ix.definitions, (i, r) =>
|
|
96
|
+
rest.createInteractionResponse(i.id, i.token, r),
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
const run = gateway.handleDispatch("INTERACTION_CREATE", i =>
|
|
100
|
+
Effect.provideService(postHandler(handle[i.type](i)), Interaction, i),
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
return yield* _(
|
|
104
|
+
sync
|
|
105
|
+
? Effect.forever(
|
|
106
|
+
Effect.all([run, globalSync, guildSync], {
|
|
107
|
+
concurrency: "unbounded",
|
|
108
|
+
discard: true,
|
|
109
|
+
}),
|
|
110
|
+
)
|
|
111
|
+
: run,
|
|
112
|
+
)
|
|
113
|
+
})
|
|
114
|
+
|
|
115
|
+
const makeRegistry = Effect.gen(function* (_) {
|
|
114
116
|
const ref = yield* _(
|
|
115
117
|
Ref.make(builder as InteractionBuilder<never, never, never>),
|
|
116
118
|
)
|
|
@@ -134,7 +136,8 @@ const makeRegistry = Effect.gen(function*(_) {
|
|
|
134
136
|
Effect.delay(
|
|
135
137
|
pipe(ix, run(Effect.catchAllCause(onError), opts)),
|
|
136
138
|
Duration.seconds(0.1),
|
|
137
|
-
)
|
|
139
|
+
),
|
|
140
|
+
)
|
|
138
141
|
|
|
139
142
|
return { register, run: run_ } as const
|
|
140
143
|
})
|
|
@@ -61,28 +61,28 @@ export const handlers = <R, E, TE, A, B>(
|
|
|
61
61
|
[Discord.InteractionType.MODAL_SUBMIT]: i => {
|
|
62
62
|
const data = i.data as Discord.ModalSubmitDatum
|
|
63
63
|
|
|
64
|
-
return Effect.findFirst(ModalSubmit, _ =>
|
|
65
|
-
.
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
),
|
|
77
|
-
)
|
|
64
|
+
return Effect.findFirst(ModalSubmit, _ =>
|
|
65
|
+
_.predicate(data.custom_id),
|
|
66
|
+
).pipe(
|
|
67
|
+
Effect.flatMap(
|
|
68
|
+
Option.match({
|
|
69
|
+
onNone: () => Effect.fail(new DefinitionNotFound(i)),
|
|
70
|
+
onSome: match =>
|
|
71
|
+
Effect.provideService(
|
|
72
|
+
match.handle(i),
|
|
73
|
+
Ctx.ModalSubmitData,
|
|
74
|
+
data,
|
|
75
|
+
) as Handler<R, E, B>,
|
|
76
|
+
}),
|
|
77
|
+
),
|
|
78
|
+
)
|
|
78
79
|
},
|
|
79
80
|
|
|
80
81
|
[Discord.InteractionType.MESSAGE_COMPONENT]: i => {
|
|
81
82
|
const data = i.data as Discord.MessageComponentDatum
|
|
82
83
|
|
|
83
|
-
return Effect.findFirst(
|
|
84
|
-
|
|
85
|
-
_ => _.predicate(data.custom_id),
|
|
84
|
+
return Effect.findFirst(MessageComponent, _ =>
|
|
85
|
+
_.predicate(data.custom_id),
|
|
86
86
|
).pipe(
|
|
87
87
|
Effect.flatMap(
|
|
88
88
|
Option.match({
|
|
@@ -104,24 +104,25 @@ export const handlers = <R, E, TE, A, B>(
|
|
|
104
104
|
return Option.match(IxHelpers.focusedOption(data), {
|
|
105
105
|
onNone: () => Effect.fail(new DefinitionNotFound(i)),
|
|
106
106
|
onSome: focusedOption =>
|
|
107
|
-
Effect.findFirst(Autocomplete, _ =>
|
|
108
|
-
.
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
)
|
|
122
|
-
|
|
123
|
-
),
|
|
107
|
+
Effect.findFirst(Autocomplete, _ =>
|
|
108
|
+
_.predicate(data, focusedOption),
|
|
109
|
+
).pipe(
|
|
110
|
+
Effect.flatMap(
|
|
111
|
+
Option.match({
|
|
112
|
+
onNone: () => Effect.fail(new DefinitionNotFound(i)),
|
|
113
|
+
onSome: match =>
|
|
114
|
+
Effect.provideService(
|
|
115
|
+
match.handle(i),
|
|
116
|
+
Ctx.ApplicationCommand,
|
|
117
|
+
data,
|
|
118
|
+
).pipe(
|
|
119
|
+
Effect.provideService(Ctx.FocusedOptionContext, {
|
|
120
|
+
focusedOption,
|
|
121
|
+
}),
|
|
122
|
+
) as Handler<R, E, B>,
|
|
123
|
+
}),
|
|
124
124
|
),
|
|
125
|
+
),
|
|
125
126
|
})
|
|
126
127
|
},
|
|
127
128
|
}
|
|
@@ -23,20 +23,24 @@ export const idStartsWith = (query: string) => (customId: string) =>
|
|
|
23
23
|
export const idRegex = (query: RegExp) => (customId: string) =>
|
|
24
24
|
Effect.succeed(query.test(customId))
|
|
25
25
|
|
|
26
|
-
export const option =
|
|
27
|
-
(
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
26
|
+
export const option =
|
|
27
|
+
(command: string, optionName: string) =>
|
|
28
|
+
(
|
|
29
|
+
data: Pick<Discord.ApplicationCommandDatum, "name">,
|
|
30
|
+
focusedOption: Pick<
|
|
31
|
+
Discord.ApplicationCommandInteractionDataOption,
|
|
32
|
+
"name"
|
|
33
|
+
>,
|
|
34
|
+
) =>
|
|
35
|
+
Effect.succeed(data.name === command && focusedOption.name === optionName)
|
|
34
36
|
|
|
35
|
-
export const optionOnly =
|
|
36
|
-
(
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
37
|
+
export const optionOnly =
|
|
38
|
+
(optionName: string) =>
|
|
39
|
+
(
|
|
40
|
+
_: unknown,
|
|
41
|
+
focusedOption: Pick<
|
|
42
|
+
Discord.ApplicationCommandInteractionDataOption,
|
|
43
|
+
"name"
|
|
44
|
+
>,
|
|
45
|
+
) =>
|
|
46
|
+
Effect.succeed(focusedOption.name === optionName)
|
|
@@ -7,11 +7,12 @@ import type * as Discord from "dfx/types"
|
|
|
7
7
|
export type DefinitionFlattened<R, E, TE, A> = D.InteractionDefinition<
|
|
8
8
|
R,
|
|
9
9
|
E
|
|
10
|
-
> extends infer D
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
10
|
+
> extends infer D
|
|
11
|
+
? {
|
|
12
|
+
[K in keyof D]: K extends "handle"
|
|
13
|
+
? (_: Discord.Interaction) => Effect.Effect<R, TE, A>
|
|
14
|
+
: D[K]
|
|
15
|
+
}
|
|
15
16
|
: never
|
|
16
17
|
|
|
17
18
|
export type DefinitionFlattenedCommand<R, E, TE, A> = Extract<
|
|
@@ -44,11 +45,13 @@ export const flattenDefinitions = <R, E, TE, A, B>(
|
|
|
44
45
|
handle: (i: Discord.Interaction) =>
|
|
45
46
|
Effect.isEffect(definition.handle)
|
|
46
47
|
? transform(
|
|
47
|
-
|
|
48
|
-
|
|
48
|
+
Effect.flatMap(definition.handle, _ => handleResponse(i, _)),
|
|
49
|
+
)
|
|
49
50
|
: transform(
|
|
50
|
-
|
|
51
|
-
|
|
51
|
+
Effect.flatMap(definition.handle(context), _ =>
|
|
52
|
+
handleResponse(i, _),
|
|
53
|
+
),
|
|
54
|
+
),
|
|
52
55
|
}))
|
|
53
56
|
|
|
54
57
|
export const splitDefinitions = <R, E, TE, A>(
|
|
@@ -79,10 +82,11 @@ export const splitDefinitions = <R, E, TE, A>(
|
|
|
79
82
|
).pipe(
|
|
80
83
|
Chunk.reduce(
|
|
81
84
|
{} as Record<string, DefinitionFlattenedCommand<R, E, TE, A>>,
|
|
82
|
-
(acc, d) =>
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
85
|
+
(acc, d) =>
|
|
86
|
+
({
|
|
87
|
+
...acc,
|
|
88
|
+
[d.command.name]: d,
|
|
89
|
+
}) as any,
|
|
86
90
|
),
|
|
87
91
|
)
|
|
88
92
|
|
|
@@ -42,8 +42,8 @@ const checkSignature = (
|
|
|
42
42
|
publicKey,
|
|
43
43
|
crypto,
|
|
44
44
|
algorithm,
|
|
45
|
-
)
|
|
46
|
-
)
|
|
45
|
+
),
|
|
46
|
+
),
|
|
47
47
|
),
|
|
48
48
|
Effect.filterOrFail(identity, () => new BadWebhookSignature()),
|
|
49
49
|
Effect.catchAllCause(() => Effect.fail(new BadWebhookSignature())),
|
|
@@ -86,16 +86,14 @@ export class WebhookParseError {
|
|
|
86
86
|
}
|
|
87
87
|
|
|
88
88
|
const fromHeadersAndBody = (headers: Headers, body: string) =>
|
|
89
|
-
Effect.tap(
|
|
90
|
-
|
|
91
|
-
({ algorithm, crypto, publicKey }) =>
|
|
92
|
-
checkSignature(publicKey, headers, body, crypto, algorithm),
|
|
89
|
+
Effect.tap(WebhookConfig, ({ algorithm, crypto, publicKey }) =>
|
|
90
|
+
checkSignature(publicKey, headers, body, crypto, algorithm),
|
|
93
91
|
).pipe(
|
|
94
92
|
Effect.flatMap(() =>
|
|
95
93
|
Effect.try({
|
|
96
94
|
try: () => JSON.parse(body) as Discord.Interaction,
|
|
97
95
|
catch: reason => new WebhookParseError(reason),
|
|
98
|
-
})
|
|
96
|
+
}),
|
|
99
97
|
),
|
|
100
98
|
)
|
|
101
99
|
|
|
@@ -115,14 +113,12 @@ const run = <R, E>(
|
|
|
115
113
|
) => {
|
|
116
114
|
const handler = handlers(definitions, handleResponse)
|
|
117
115
|
return (headers: Headers, body: string) =>
|
|
118
|
-
Effect.flatMap(
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
interaction,
|
|
125
|
-
),
|
|
116
|
+
Effect.flatMap(fromHeadersAndBody(headers, body), interaction =>
|
|
117
|
+
Effect.provideService(
|
|
118
|
+
handler[interaction.type](interaction),
|
|
119
|
+
Interaction,
|
|
120
|
+
interaction,
|
|
121
|
+
),
|
|
126
122
|
)
|
|
127
123
|
}
|
|
128
124
|
|
|
@@ -138,14 +134,14 @@ export interface HandleWebhookOpts<E> {
|
|
|
138
134
|
*/
|
|
139
135
|
export const makeHandler = <R, E, TE>(
|
|
140
136
|
ix: InteractionBuilder<R, E, TE>,
|
|
141
|
-
): ({
|
|
137
|
+
): (({
|
|
142
138
|
body,
|
|
143
139
|
error,
|
|
144
140
|
headers,
|
|
145
141
|
success,
|
|
146
142
|
}: HandleWebhookOpts<
|
|
147
143
|
E | WebhookParseError | BadWebhookSignature | DefinitionNotFound
|
|
148
|
-
>) => Effect.Effect<WebhookConfig, never, void> => {
|
|
144
|
+
>) => Effect.Effect<WebhookConfig, never, void>) => {
|
|
149
145
|
const handle = run(
|
|
150
146
|
Chunk.map(ix.definitions, ([d]) => [d, identity] as any),
|
|
151
147
|
(_i, r) => Effect.succeed(r),
|
|
@@ -170,7 +166,7 @@ export const makeHandler = <R, E, TE>(
|
|
|
170
166
|
*/
|
|
171
167
|
export const makeSimpleHandler = <R, E, TE>(
|
|
172
168
|
ix: InteractionBuilder<R, E, TE>,
|
|
173
|
-
): ({
|
|
169
|
+
): (({
|
|
174
170
|
body,
|
|
175
171
|
headers,
|
|
176
172
|
}: {
|
|
@@ -180,7 +176,7 @@ export const makeSimpleHandler = <R, E, TE>(
|
|
|
180
176
|
WebhookConfig,
|
|
181
177
|
BadWebhookSignature | WebhookParseError | DefinitionNotFound,
|
|
182
178
|
Discord.InteractionResponse
|
|
183
|
-
> => {
|
|
179
|
+
>) => {
|
|
184
180
|
const handle = run(
|
|
185
181
|
Chunk.map(ix.definitions, ([d]) => [d, identity] as any),
|
|
186
182
|
(_i, r) => Effect.succeed(r),
|
package/src/Log.ts
CHANGED
package/src/RateLimit.ts
CHANGED
|
@@ -43,7 +43,7 @@ export interface RateLimitStore {
|
|
|
43
43
|
export const RateLimitStore = Tag<RateLimitStore>()
|
|
44
44
|
export const LiveMemoryRateLimitStore = Layer.sync(RateLimitStore, Memory.make)
|
|
45
45
|
|
|
46
|
-
const makeLimiter = Effect.gen(function*(_) {
|
|
46
|
+
const makeLimiter = Effect.gen(function* (_) {
|
|
47
47
|
const store = yield* _(RateLimitStore)
|
|
48
48
|
const log = yield* _(Log)
|
|
49
49
|
|
|
@@ -64,10 +64,10 @@ const makeLimiter = Effect.gen(function*(_) {
|
|
|
64
64
|
windowMs,
|
|
65
65
|
limit,
|
|
66
66
|
delay: Duration.toMillis(d),
|
|
67
|
-
})
|
|
67
|
+
}),
|
|
68
68
|
),
|
|
69
69
|
Effect.tap(_ =>
|
|
70
|
-
Duration.toMillis(_) === 0 ? Effect.unit : Effect.sleep(_)
|
|
70
|
+
Duration.toMillis(_) === 0 ? Effect.unit : Effect.sleep(_),
|
|
71
71
|
),
|
|
72
72
|
Effect.asUnit,
|
|
73
73
|
)
|
|
@@ -77,7 +77,6 @@ const makeLimiter = Effect.gen(function*(_) {
|
|
|
77
77
|
})
|
|
78
78
|
|
|
79
79
|
export interface RateLimiter
|
|
80
|
-
extends Effect.Effect.Success<typeof makeLimiter>
|
|
81
|
-
{}
|
|
80
|
+
extends Effect.Effect.Success<typeof makeLimiter> {}
|
|
82
81
|
export const RateLimiter = Tag<RateLimiter>()
|
|
83
82
|
export const LiveRateLimiter = Layer.effect(RateLimiter, makeLimiter)
|