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
package/src/DiscordGateway/WS.ts
CHANGED
|
@@ -22,7 +22,10 @@ export class WebSocketError {
|
|
|
22
22
|
|
|
23
23
|
export class WebSocketCloseError {
|
|
24
24
|
readonly _tag = "WebSocketCloseError"
|
|
25
|
-
constructor(
|
|
25
|
+
constructor(
|
|
26
|
+
readonly code: number,
|
|
27
|
+
readonly reason: string,
|
|
28
|
+
) {}
|
|
26
29
|
}
|
|
27
30
|
|
|
28
31
|
const isReconnect = (
|
|
@@ -38,7 +41,7 @@ const socket = (urlRef: Ref.Ref<string>) =>
|
|
|
38
41
|
// eslint-disable-next-line no-extra-semi
|
|
39
42
|
;(ws as any).removeAllListeners?.()
|
|
40
43
|
ws.close()
|
|
41
|
-
})
|
|
44
|
+
}),
|
|
42
45
|
),
|
|
43
46
|
)
|
|
44
47
|
|
|
@@ -72,7 +75,7 @@ const offer = (
|
|
|
72
75
|
resume(Effect.fail(new WebSocketCloseError(e.code, e.reason)))
|
|
73
76
|
})
|
|
74
77
|
},
|
|
75
|
-
)
|
|
78
|
+
),
|
|
76
79
|
),
|
|
77
80
|
)
|
|
78
81
|
|
|
@@ -117,7 +120,7 @@ const send = (
|
|
|
117
120
|
Effect.forever,
|
|
118
121
|
)
|
|
119
122
|
|
|
120
|
-
const make = Effect.gen(function*(_) {
|
|
123
|
+
const make = Effect.gen(function* (_) {
|
|
121
124
|
const log = yield* _(Log)
|
|
122
125
|
|
|
123
126
|
const connect = (
|
|
@@ -126,7 +129,7 @@ const make = Effect.gen(function*(_) {
|
|
|
126
129
|
onConnecting = Effect.unit,
|
|
127
130
|
openTimeout = Duration.seconds(3),
|
|
128
131
|
) =>
|
|
129
|
-
Effect.gen(function*(_) {
|
|
132
|
+
Effect.gen(function* (_) {
|
|
130
133
|
const queue = yield* _(Queue.unbounded<WebSocket.Data>())
|
|
131
134
|
|
|
132
135
|
const run = onConnecting.pipe(
|
|
@@ -140,7 +143,7 @@ const make = Effect.gen(function*(_) {
|
|
|
140
143
|
),
|
|
141
144
|
],
|
|
142
145
|
{ concurrency: "unbounded", discard: true },
|
|
143
|
-
)
|
|
146
|
+
),
|
|
144
147
|
),
|
|
145
148
|
Effect.scoped,
|
|
146
149
|
Effect.retryWhile(isReconnect),
|
package/src/DiscordGateway.ts
CHANGED
|
@@ -11,13 +11,14 @@ import type { WebSocketCloseError, WebSocketError } from "dfx/DiscordGateway/WS"
|
|
|
11
11
|
import type * as Discord from "dfx/types"
|
|
12
12
|
import * as EffectUtils from "dfx/utils/Effect"
|
|
13
13
|
|
|
14
|
-
const fromDispatchFactory =
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
Stream.
|
|
14
|
+
const fromDispatchFactory =
|
|
15
|
+
<R, E>(
|
|
16
|
+
source: Stream.Stream<R, E, Discord.GatewayPayload<Discord.ReceiveEvent>>,
|
|
17
|
+
) =>
|
|
18
|
+
<K extends keyof Discord.ReceiveEvents>(
|
|
19
|
+
event: K,
|
|
20
|
+
): Stream.Stream<R, E, Discord.ReceiveEvents[K]> =>
|
|
21
|
+
Stream.filter(source, p => p.t === event).pipe(Stream.map(p => p.d! as any))
|
|
21
22
|
|
|
22
23
|
const handleDispatchFactory =
|
|
23
24
|
(hub: Hub.Hub<Discord.GatewayPayload<Discord.ReceiveEvent>>) =>
|
|
@@ -57,7 +58,7 @@ export interface DiscordGateway {
|
|
|
57
58
|
}
|
|
58
59
|
export const DiscordGateway = Tag<DiscordGateway>()
|
|
59
60
|
|
|
60
|
-
export const make = Effect.gen(function*(_) {
|
|
61
|
+
export const make = Effect.gen(function* (_) {
|
|
61
62
|
const sharder = yield* _(Sharder)
|
|
62
63
|
const hub = yield* _(
|
|
63
64
|
Hub.unbounded<Discord.GatewayPayload<Discord.ReceiveEvent>>(),
|
package/src/DiscordREST/utils.ts
CHANGED
|
@@ -9,10 +9,8 @@ export const routeFromConfig = (path: string, method: string) => {
|
|
|
9
9
|
// Only keep major ID's
|
|
10
10
|
const routeURL = path
|
|
11
11
|
.split("?")[0]
|
|
12
|
-
.replace(
|
|
13
|
-
|
|
14
|
-
(match, resource) =>
|
|
15
|
-
majorResources.includes(resource) ? match : `/${resource}`,
|
|
12
|
+
.replace(/\/([A-Za-z]+)\/(\d{16,21}|@me)/g, (match, resource) =>
|
|
13
|
+
majorResources.includes(resource) ? match : `/${resource}`,
|
|
16
14
|
)
|
|
17
15
|
// Strip reactions
|
|
18
16
|
.replace(/\/reactions\/(.*)/, "/reactions")
|
package/src/DiscordREST.ts
CHANGED
|
@@ -29,7 +29,7 @@ export class DiscordRESTError {
|
|
|
29
29
|
) {}
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
-
const make = Effect.gen(function*(_) {
|
|
32
|
+
const make = Effect.gen(function* (_) {
|
|
33
33
|
const { rest, token } = yield* _(DiscordConfig)
|
|
34
34
|
|
|
35
35
|
const http = yield* _(Http.client.Client)
|
|
@@ -65,7 +65,7 @@ const make = Effect.gen(function*(_) {
|
|
|
65
65
|
Effect.tap(invalid =>
|
|
66
66
|
invalid
|
|
67
67
|
? maybeWait("dfx.rest.invalid", Duration.minutes(10), 10000)
|
|
68
|
-
: Effect.unit
|
|
68
|
+
: Effect.unit,
|
|
69
69
|
),
|
|
70
70
|
Effect.asUnit,
|
|
71
71
|
)
|
|
@@ -90,7 +90,7 @@ const make = Effect.gen(function*(_) {
|
|
|
90
90
|
bucket.limit,
|
|
91
91
|
),
|
|
92
92
|
),
|
|
93
|
-
})
|
|
93
|
+
}),
|
|
94
94
|
),
|
|
95
95
|
)
|
|
96
96
|
|
|
@@ -102,9 +102,8 @@ const make = Effect.gen(function*(_) {
|
|
|
102
102
|
Effect.Do.pipe(
|
|
103
103
|
Effect.let("route", () => routeFromConfig(request.url, request.method)),
|
|
104
104
|
Effect.bind("rateLimit", () => rateLimitFromHeaders(response.headers)),
|
|
105
|
-
Effect.bind(
|
|
106
|
-
|
|
107
|
-
({ rateLimit }) => store.hasBucket(rateLimit.bucket),
|
|
105
|
+
Effect.bind("hasBucket", ({ rateLimit }) =>
|
|
106
|
+
store.hasBucket(rateLimit.bucket),
|
|
108
107
|
),
|
|
109
108
|
Effect.flatMap(({ hasBucket, rateLimit, route }) => {
|
|
110
109
|
const effectsToRun = [
|
|
@@ -118,9 +117,10 @@ const make = Effect.gen(function*(_) {
|
|
|
118
117
|
store.putBucket({
|
|
119
118
|
key: rateLimit.bucket,
|
|
120
119
|
resetAfter: Duration.toMillis(rateLimit.retryAfter),
|
|
121
|
-
limit:
|
|
122
|
-
|
|
123
|
-
|
|
120
|
+
limit:
|
|
121
|
+
!hasBucket && rateLimit.remaining > 0
|
|
122
|
+
? rateLimit.remaining
|
|
123
|
+
: rateLimit.limit,
|
|
124
124
|
}),
|
|
125
125
|
)
|
|
126
126
|
}
|
|
@@ -140,20 +140,19 @@ const make = Effect.gen(function*(_) {
|
|
|
140
140
|
Http.request.prependUrl(req, rest.baseUrl),
|
|
141
141
|
Http.request.setHeaders({
|
|
142
142
|
Authorization: `Bot ${ConfigSecret.value(token)}`,
|
|
143
|
-
"User-Agent":
|
|
144
|
-
`DiscordBot (https://github.com/tim-smart/dfx, ${LIB_VERSION})`,
|
|
143
|
+
"User-Agent": `DiscordBot (https://github.com/tim-smart/dfx, ${LIB_VERSION})`,
|
|
145
144
|
}),
|
|
146
|
-
)
|
|
145
|
+
),
|
|
147
146
|
),
|
|
148
147
|
Http.client.catchAll(error =>
|
|
149
148
|
error.reason === "StatusCode"
|
|
150
149
|
? error.response.json.pipe(
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
: Effect.fail(new DiscordRESTError(error))
|
|
150
|
+
Effect.mapError(_ => new DiscordRESTError(_)),
|
|
151
|
+
Effect.flatMap(body =>
|
|
152
|
+
Effect.fail(new DiscordRESTError(error, body)),
|
|
153
|
+
),
|
|
154
|
+
)
|
|
155
|
+
: Effect.fail(new DiscordRESTError(error)),
|
|
157
156
|
),
|
|
158
157
|
)
|
|
159
158
|
|
|
@@ -201,9 +200,8 @@ const make = Effect.gen(function*(_) {
|
|
|
201
200
|
Effect.zipRight(updateBuckets(request, response)),
|
|
202
201
|
Effect.zipRight(
|
|
203
202
|
Effect.sleep(
|
|
204
|
-
Option.getOrElse(
|
|
205
|
-
|
|
206
|
-
() => Duration.seconds(5),
|
|
203
|
+
Option.getOrElse(retryAfter(response.headers), () =>
|
|
204
|
+
Duration.seconds(5),
|
|
207
205
|
),
|
|
208
206
|
),
|
|
209
207
|
),
|
|
@@ -221,9 +219,10 @@ const make = Effect.gen(function*(_) {
|
|
|
221
219
|
options = {},
|
|
222
220
|
params,
|
|
223
221
|
url,
|
|
224
|
-
}: Discord.Route<
|
|
225
|
-
|
|
226
|
-
|
|
222
|
+
}: Discord.Route<
|
|
223
|
+
P,
|
|
224
|
+
Partial<Http.request.Options.NoUrl>
|
|
225
|
+
>): RestResponse<R> => {
|
|
227
226
|
const hasBody = method !== "GET" && method !== "DELETE"
|
|
228
227
|
let request = Http.request.make(method as any)(url, options)
|
|
229
228
|
|
|
@@ -248,8 +247,7 @@ const make = Effect.gen(function*(_) {
|
|
|
248
247
|
})
|
|
249
248
|
|
|
250
249
|
export interface DiscordREST
|
|
251
|
-
extends Discord.Endpoints<Partial<Http.request.Options.NoUrl>>
|
|
252
|
-
{
|
|
250
|
+
extends Discord.Endpoints<Partial<Http.request.Options.NoUrl>> {
|
|
253
251
|
readonly executor: <A = unknown>(
|
|
254
252
|
request: Http.request.ClientRequest,
|
|
255
253
|
) => Effect.Effect<never, DiscordRESTError, ResponseWithData<A>>
|
package/src/Helpers/flags.ts
CHANGED
|
@@ -33,14 +33,16 @@ export function toList<T extends Flags<any>>(
|
|
|
33
33
|
* Returns a function that converts a list of flags names to a bigint bitfield.
|
|
34
34
|
*/
|
|
35
35
|
export const fromListBigint =
|
|
36
|
-
<T extends Flags<bigint>>(flags: T) =>
|
|
36
|
+
<T extends Flags<bigint>>(flags: T) =>
|
|
37
|
+
(list: Array<keyof T>) =>
|
|
37
38
|
list.reduce((acc, key) => acc | flags[key], BigInt(0))
|
|
38
39
|
|
|
39
40
|
/**
|
|
40
41
|
* Returns a function that converts a list of flags names to a bitfield.
|
|
41
42
|
*/
|
|
42
43
|
export const fromList =
|
|
43
|
-
<T extends Flags<number>>(flags: T) =>
|
|
44
|
+
<T extends Flags<number>>(flags: T) =>
|
|
45
|
+
(list: Array<keyof T>) =>
|
|
44
46
|
list.reduce((acc, key) => acc | flags[key], 0)
|
|
45
47
|
|
|
46
48
|
/**
|
package/src/Helpers/intents.ts
CHANGED
|
@@ -9,9 +9,10 @@ export const ALL = Flags.all(Discord.GatewayIntents)
|
|
|
9
9
|
/**
|
|
10
10
|
* Privileged intents
|
|
11
11
|
*/
|
|
12
|
-
export const PRIVILEGED =
|
|
13
|
-
|
|
14
|
-
|
|
12
|
+
export const PRIVILEGED =
|
|
13
|
+
Discord.GatewayIntents.GUILD_PRESENCES |
|
|
14
|
+
Discord.GatewayIntents.GUILD_MEMBERS |
|
|
15
|
+
Discord.GatewayIntents.MESSAGE_CONTENT
|
|
15
16
|
|
|
16
17
|
/**
|
|
17
18
|
* Un-privileged intents
|
|
@@ -24,8 +24,8 @@ export const findSubCommand =
|
|
|
24
24
|
optionsWithNested(interaction),
|
|
25
25
|
Arr.findFirst(
|
|
26
26
|
o =>
|
|
27
|
-
o.type === Discord.ApplicationCommandOptionType.SUB_COMMAND
|
|
28
|
-
|
|
27
|
+
o.type === Discord.ApplicationCommandOptionType.SUB_COMMAND &&
|
|
28
|
+
o.name === name,
|
|
29
29
|
),
|
|
30
30
|
)
|
|
31
31
|
|
|
@@ -114,42 +114,46 @@ export const resolved = (data: Discord.Interaction) =>
|
|
|
114
114
|
/**
|
|
115
115
|
* Try find a matching option value from the interaction.
|
|
116
116
|
*/
|
|
117
|
-
export const resolveOptionValue =
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
) =>
|
|
121
|
-
|
|
122
|
-
Option.
|
|
123
|
-
Option.
|
|
124
|
-
Option.
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
(
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
117
|
+
export const resolveOptionValue =
|
|
118
|
+
<T>(
|
|
119
|
+
name: string,
|
|
120
|
+
f: (id: Discord.Snowflake, data: Discord.ResolvedDatum) => T | undefined,
|
|
121
|
+
) =>
|
|
122
|
+
(a: Discord.Interaction): Option.Option<T> =>
|
|
123
|
+
Option.Do.pipe(
|
|
124
|
+
Option.bind("data", () =>
|
|
125
|
+
Option.fromNullable(a.data as Discord.ApplicationCommandDatum),
|
|
126
|
+
),
|
|
127
|
+
Option.bind("id", ({ data }) =>
|
|
128
|
+
Option.flatMapNullable(
|
|
129
|
+
getOption(name)(data),
|
|
130
|
+
({ value }) => value as Discord.Snowflake,
|
|
131
|
+
),
|
|
132
|
+
),
|
|
133
|
+
Option.bind("r", () => resolved(a)),
|
|
134
|
+
Option.flatMapNullable(({ id, r }) => f(id, r)),
|
|
135
|
+
)
|
|
134
136
|
|
|
135
137
|
/**
|
|
136
138
|
* Try find matching option values from the interaction.
|
|
137
139
|
*/
|
|
138
|
-
export const resolveValues =
|
|
139
|
-
|
|
140
|
-
) =>
|
|
141
|
-
|
|
142
|
-
Option.
|
|
143
|
-
Option.
|
|
144
|
-
Option.
|
|
145
|
-
Option.
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
140
|
+
export const resolveValues =
|
|
141
|
+
<T>(
|
|
142
|
+
f: (id: Discord.Snowflake, data: Discord.ResolvedDatum) => T | undefined,
|
|
143
|
+
) =>
|
|
144
|
+
(a: Discord.Interaction): Option.Option<ReadonlyArray<T>> =>
|
|
145
|
+
Option.Do.pipe(
|
|
146
|
+
Option.bind("values", () =>
|
|
147
|
+
Option.flatMapNullable(
|
|
148
|
+
Option.fromNullable(a.data as Discord.MessageComponentDatum),
|
|
149
|
+
a => a.values as unknown as Array<string>,
|
|
150
|
+
),
|
|
151
|
+
),
|
|
152
|
+
Option.bind("r", () => resolved(a)),
|
|
153
|
+
Option.map(({ r, values }) =>
|
|
154
|
+
Arr.compact(values.map(a => Option.fromNullable(f(a as any, r)))),
|
|
155
|
+
),
|
|
156
|
+
)
|
|
153
157
|
|
|
154
158
|
const extractComponents = (c: Discord.Component): Array<Discord.Component> => {
|
|
155
159
|
if ("components" in c) {
|
|
@@ -211,27 +215,26 @@ export const componentValue =
|
|
|
211
215
|
|
|
212
216
|
export type InteractionResponse =
|
|
213
217
|
| {
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
218
|
+
type: Discord.InteractionCallbackType.CHANNEL_MESSAGE_WITH_SOURCE
|
|
219
|
+
data: Discord.InteractionCallbackMessage
|
|
220
|
+
}
|
|
217
221
|
| {
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
222
|
+
type: Discord.InteractionCallbackType.UPDATE_MESSAGE
|
|
223
|
+
data: Discord.InteractionCallbackMessage
|
|
224
|
+
}
|
|
221
225
|
| {
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
226
|
+
type: Discord.InteractionCallbackType.MODAL
|
|
227
|
+
data: Discord.InteractionCallbackModal
|
|
228
|
+
}
|
|
225
229
|
| {
|
|
226
|
-
|
|
227
|
-
|
|
230
|
+
type: Discord.InteractionCallbackType.DEFERRED_UPDATE_MESSAGE
|
|
231
|
+
}
|
|
228
232
|
| {
|
|
229
|
-
|
|
230
|
-
|
|
233
|
+
type: Discord.InteractionCallbackType.DEFERRED_CHANNEL_MESSAGE_WITH_SOURCE
|
|
234
|
+
}
|
|
231
235
|
| {
|
|
232
|
-
|
|
233
|
-
Discord.
|
|
234
|
-
|
|
235
|
-
}
|
|
236
|
+
type: Discord.InteractionCallbackType.APPLICATION_COMMAND_AUTOCOMPLETE_RESULT
|
|
237
|
+
data: Discord.InteractionCallbackAutocomplete
|
|
238
|
+
}
|
|
236
239
|
|
|
237
240
|
export const response = (r: InteractionResponse) => r
|
package/src/Helpers/members.ts
CHANGED
|
@@ -13,5 +13,5 @@ export const roles =
|
|
|
13
13
|
* Type-guard function for checking if the object is a guild member
|
|
14
14
|
*/
|
|
15
15
|
export const is = (thing: unknown): thing is Discord.GuildMember =>
|
|
16
|
-
Object.prototype.hasOwnProperty.call(thing, "roles")
|
|
17
|
-
|
|
16
|
+
Object.prototype.hasOwnProperty.call(thing, "roles") &&
|
|
17
|
+
Object.prototype.hasOwnProperty.call(thing, "joined_at")
|
|
@@ -84,8 +84,8 @@ export const forChannel =
|
|
|
84
84
|
} else {
|
|
85
85
|
const everyone = roles.find(role => role.name === "@everyone")
|
|
86
86
|
|
|
87
|
-
basePermissions =
|
|
88
|
-
| BigInt(memberOrRole.permissions)
|
|
87
|
+
basePermissions =
|
|
88
|
+
BigInt(everyone?.permissions || "0") | BigInt(memberOrRole.permissions)
|
|
89
89
|
filteredOverwrites = overwrites.filter(
|
|
90
90
|
overwriteIsForRole(guild_id)(memberOrRole),
|
|
91
91
|
)
|
|
@@ -8,8 +8,10 @@ import { DiscordREST, type DiscordRESTError } from "dfx/DiscordREST"
|
|
|
8
8
|
import type * as D from "dfx/Interactions/definitions"
|
|
9
9
|
import type * as Discord from "dfx/types"
|
|
10
10
|
|
|
11
|
-
type ExtractTag<A> = A extends { _tag: infer Tag }
|
|
12
|
-
|
|
11
|
+
type ExtractTag<A> = A extends { _tag: infer Tag }
|
|
12
|
+
? Tag extends string
|
|
13
|
+
? Tag
|
|
14
|
+
: never
|
|
13
15
|
: never
|
|
14
16
|
|
|
15
17
|
/**
|
|
@@ -130,17 +132,15 @@ export class InteractionBuilder<R, E, TE> {
|
|
|
130
132
|
Chunk.map(c => c.command),
|
|
131
133
|
)
|
|
132
134
|
|
|
133
|
-
return Effect.flatMap(
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
body: Http.body.unsafeJson(Chunk.toReadonlyArray(commands)),
|
|
141
|
-
})
|
|
142
|
-
),
|
|
135
|
+
return Effect.flatMap(DiscordREST, rest =>
|
|
136
|
+
rest.getCurrentBotApplicationInformation().pipe(
|
|
137
|
+
Effect.flatMap(r => r.json),
|
|
138
|
+
Effect.flatMap(app =>
|
|
139
|
+
rest.bulkOverwriteGlobalApplicationCommands(app.id, {
|
|
140
|
+
body: Http.body.unsafeJson(Chunk.toReadonlyArray(commands)),
|
|
141
|
+
}),
|
|
143
142
|
),
|
|
143
|
+
),
|
|
144
144
|
)
|
|
145
145
|
}
|
|
146
146
|
|
|
@@ -154,14 +154,12 @@ export class InteractionBuilder<R, E, TE> {
|
|
|
154
154
|
Chunk.map(c => c.command),
|
|
155
155
|
)
|
|
156
156
|
|
|
157
|
-
return Effect.flatMap(
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
Chunk.toReadonlyArray(commands) as any,
|
|
164
|
-
),
|
|
157
|
+
return Effect.flatMap(DiscordREST, rest =>
|
|
158
|
+
rest.bulkOverwriteGuildApplicationCommands(
|
|
159
|
+
appId,
|
|
160
|
+
guildId,
|
|
161
|
+
Chunk.toReadonlyArray(commands) as any,
|
|
162
|
+
),
|
|
165
163
|
)
|
|
166
164
|
}
|
|
167
165
|
}
|
|
@@ -23,7 +23,10 @@ export const SubCommandContext = Tag<SubCommandContext>()
|
|
|
23
23
|
|
|
24
24
|
export class ResolvedDataNotFound {
|
|
25
25
|
readonly _tag = "ResolvedDataNotFound"
|
|
26
|
-
constructor(
|
|
26
|
+
constructor(
|
|
27
|
+
readonly data: Discord.Interaction,
|
|
28
|
+
readonly name?: string,
|
|
29
|
+
) {}
|
|
27
30
|
}
|
|
28
31
|
|
|
29
32
|
export const resolvedValues = <A>(
|
|
@@ -33,7 +36,8 @@ export const resolvedValues = <A>(
|
|
|
33
36
|
Effect.mapError(
|
|
34
37
|
IxHelpers.resolveValues(f)(ix),
|
|
35
38
|
() => new ResolvedDataNotFound(ix),
|
|
36
|
-
)
|
|
39
|
+
),
|
|
40
|
+
)
|
|
37
41
|
|
|
38
42
|
export const resolved = <A>(
|
|
39
43
|
name: string,
|
|
@@ -43,7 +47,8 @@ export const resolved = <A>(
|
|
|
43
47
|
Effect.mapError(
|
|
44
48
|
IxHelpers.resolveOptionValue(name, f)(ix),
|
|
45
49
|
() => new ResolvedDataNotFound(ix, name),
|
|
46
|
-
)
|
|
50
|
+
),
|
|
51
|
+
)
|
|
47
52
|
|
|
48
53
|
export const focusedOptionValue = Effect.map(
|
|
49
54
|
FocusedOptionContext,
|
|
@@ -64,18 +69,20 @@ export const handleSubCommands = <
|
|
|
64
69
|
commands: NER,
|
|
65
70
|
): Effect.Effect<
|
|
66
71
|
| Exclude<
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
72
|
+
[NER[keyof NER]] extends [
|
|
73
|
+
{ [Effect.EffectTypeId]: { _R: (_: never) => infer R } },
|
|
74
|
+
]
|
|
75
|
+
? R
|
|
76
|
+
: never,
|
|
77
|
+
SubCommandContext
|
|
78
|
+
>
|
|
73
79
|
| Discord.Interaction
|
|
74
80
|
| Discord.ApplicationCommandDatum,
|
|
75
81
|
| ([NER[keyof NER]] extends [
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
82
|
+
{ [Effect.EffectTypeId]: { _E: (_: never) => infer E } },
|
|
83
|
+
]
|
|
84
|
+
? E
|
|
85
|
+
: never)
|
|
79
86
|
| SubCommandNotFound,
|
|
80
87
|
Discord.InteractionResponse
|
|
81
88
|
> =>
|
|
@@ -84,12 +91,12 @@ export const handleSubCommands = <
|
|
|
84
91
|
Effect.mapError(
|
|
85
92
|
Arr.findFirst(IxHelpers.allSubCommands(data), _ => !!commands[_.name]),
|
|
86
93
|
() => new SubCommandNotFound(data),
|
|
87
|
-
)
|
|
94
|
+
),
|
|
88
95
|
),
|
|
89
96
|
Effect.flatMap(command =>
|
|
90
97
|
Effect.provideService(commands[command.name], SubCommandContext, {
|
|
91
98
|
command,
|
|
92
|
-
})
|
|
99
|
+
}),
|
|
93
100
|
),
|
|
94
101
|
)
|
|
95
102
|
|
|
@@ -125,10 +132,12 @@ export const optionValue = (name: string) =>
|
|
|
125
132
|
{
|
|
126
133
|
onNone: () =>
|
|
127
134
|
Effect.flatMap(ApplicationCommand, data =>
|
|
128
|
-
Effect.fail(new RequiredOptionNotFound(data, name))
|
|
135
|
+
Effect.fail(new RequiredOptionNotFound(data, name)),
|
|
136
|
+
),
|
|
129
137
|
onSome: Effect.succeed,
|
|
130
138
|
},
|
|
131
|
-
)
|
|
139
|
+
),
|
|
140
|
+
)
|
|
132
141
|
|
|
133
142
|
export const optionValueOptional = (name: string) =>
|
|
134
143
|
Effect.map(
|
|
@@ -143,7 +152,10 @@ export const modalValueOption = (name: string) =>
|
|
|
143
152
|
|
|
144
153
|
export class ModalValueNotFound {
|
|
145
154
|
readonly _tag = "ModalValueNotFound"
|
|
146
|
-
constructor(
|
|
155
|
+
constructor(
|
|
156
|
+
readonly data: Discord.ModalSubmitDatum,
|
|
157
|
+
readonly name: string,
|
|
158
|
+
) {}
|
|
147
159
|
}
|
|
148
160
|
|
|
149
161
|
export const modalValue = (name: string) =>
|
|
@@ -151,4 +163,5 @@ export const modalValue = (name: string) =>
|
|
|
151
163
|
Effect.mapError(
|
|
152
164
|
IxHelpers.componentValue(name)(data),
|
|
153
165
|
() => new ModalValueNotFound(data, name),
|
|
154
|
-
)
|
|
166
|
+
),
|
|
167
|
+
)
|