dfx 1.0.5 → 1.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (194) hide show
  1. package/dist/Cache/driver.d.ts.map +1 -1
  2. package/dist/Cache/memory.d.ts.map +1 -1
  3. package/dist/Cache/memoryTTL.d.ts.map +1 -1
  4. package/dist/Cache/prelude.d.ts.map +1 -1
  5. package/dist/Cache.d.ts.map +1 -1
  6. package/dist/DiscordConfig.d.ts.map +1 -1
  7. package/dist/DiscordGateway/DiscordWS.d.ts.map +1 -1
  8. package/dist/DiscordGateway/Messaging.d.ts.map +1 -1
  9. package/dist/DiscordGateway/Shard/StateStore.d.ts.map +1 -1
  10. package/dist/DiscordGateway/Shard/heartbeats.d.ts.map +1 -1
  11. package/dist/DiscordGateway/Shard/identify.d.ts.map +1 -1
  12. package/dist/DiscordGateway/Shard/sendEvents.d.ts.map +1 -1
  13. package/dist/DiscordGateway/Shard/utils.d.ts.map +1 -1
  14. package/dist/DiscordGateway/Shard.d.ts.map +1 -1
  15. package/dist/DiscordGateway/ShardStore.d.ts.map +1 -1
  16. package/dist/DiscordGateway/Sharder.d.ts +1 -1
  17. package/dist/DiscordGateway/Sharder.d.ts.map +1 -1
  18. package/dist/DiscordGateway.d.ts.map +1 -1
  19. package/dist/DiscordREST/Generated.d.ts.map +1 -1
  20. package/dist/DiscordREST/utils.d.ts.map +1 -1
  21. package/dist/DiscordREST.d.ts.map +1 -1
  22. package/dist/Helpers/flags.d.ts.map +1 -1
  23. package/dist/Helpers/intents.d.ts.map +1 -1
  24. package/dist/Helpers/interactions.d.ts.map +1 -1
  25. package/dist/Helpers/members.d.ts.map +1 -1
  26. package/dist/Helpers/permissions.d.ts.map +1 -1
  27. package/dist/Helpers/ui.d.ts.map +1 -1
  28. package/dist/Interactions/builder.d.ts.map +1 -1
  29. package/dist/Interactions/commandHelper.d.ts.map +1 -1
  30. package/dist/Interactions/context.d.ts.map +1 -1
  31. package/dist/Interactions/definitions.d.ts.map +1 -1
  32. package/dist/Interactions/error.d.ts.map +1 -1
  33. package/dist/Interactions/gateway.d.ts.map +1 -1
  34. package/dist/Interactions/handlers.d.ts.map +1 -1
  35. package/dist/Interactions/index.d.ts.map +1 -1
  36. package/dist/Interactions/utils.d.ts.map +1 -1
  37. package/dist/Interactions/webhook.d.ts.map +1 -1
  38. package/dist/RateLimit/memory.d.ts.map +1 -1
  39. package/dist/RateLimit/utils.d.ts.map +1 -1
  40. package/dist/RateLimit.d.ts.map +1 -1
  41. package/dist/gateway.d.ts.map +1 -1
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/types.d.ts.map +1 -1
  44. package/dist/utils/Effect.d.ts.map +1 -1
  45. package/dist/version.d.ts +1 -1
  46. package/dist/version.d.ts.map +1 -1
  47. package/dist/version.js +1 -1
  48. package/dist/webhooks.d.ts.map +1 -1
  49. package/package.json +5 -5
  50. package/src/version.ts +1 -1
  51. package/dist/LICENSE +0 -21
  52. package/dist/README.md +0 -66
  53. package/dist/mjs/Cache/driver.mjs +0 -3
  54. package/dist/mjs/Cache/driver.mjs.map +0 -1
  55. package/dist/mjs/Cache/memory.mjs +0 -48
  56. package/dist/mjs/Cache/memory.mjs.map +0 -1
  57. package/dist/mjs/Cache/memoryTTL.mjs +0 -119
  58. package/dist/mjs/Cache/memoryTTL.mjs.map +0 -1
  59. package/dist/mjs/Cache/prelude.mjs +0 -131
  60. package/dist/mjs/Cache/prelude.mjs.map +0 -1
  61. package/dist/mjs/Cache.mjs +0 -90
  62. package/dist/mjs/Cache.mjs.map +0 -1
  63. package/dist/mjs/DiscordConfig.mjs +0 -32
  64. package/dist/mjs/DiscordConfig.mjs.map +0 -1
  65. package/dist/mjs/DiscordGateway/DiscordWS.mjs +0 -77
  66. package/dist/mjs/DiscordGateway/DiscordWS.mjs.map +0 -1
  67. package/dist/mjs/DiscordGateway/Messaging.mjs +0 -35
  68. package/dist/mjs/DiscordGateway/Messaging.mjs.map +0 -1
  69. package/dist/mjs/DiscordGateway/Shard/StateStore.mjs +0 -41
  70. package/dist/mjs/DiscordGateway/Shard/StateStore.mjs.map +0 -1
  71. package/dist/mjs/DiscordGateway/Shard/heartbeats.mjs +0 -25
  72. package/dist/mjs/DiscordGateway/Shard/heartbeats.mjs.map +0 -1
  73. package/dist/mjs/DiscordGateway/Shard/identify.mjs +0 -29
  74. package/dist/mjs/DiscordGateway/Shard/identify.mjs.map +0 -1
  75. package/dist/mjs/DiscordGateway/Shard/sendEvents.mjs +0 -26
  76. package/dist/mjs/DiscordGateway/Shard/sendEvents.mjs.map +0 -1
  77. package/dist/mjs/DiscordGateway/Shard/utils.mjs +0 -3
  78. package/dist/mjs/DiscordGateway/Shard/utils.mjs.map +0 -1
  79. package/dist/mjs/DiscordGateway/Shard.mjs +0 -147
  80. package/dist/mjs/DiscordGateway/Shard.mjs.map +0 -1
  81. package/dist/mjs/DiscordGateway/ShardStore.mjs +0 -24
  82. package/dist/mjs/DiscordGateway/ShardStore.mjs.map +0 -1
  83. package/dist/mjs/DiscordGateway/Sharder.mjs +0 -67
  84. package/dist/mjs/DiscordGateway/Sharder.mjs.map +0 -1
  85. package/dist/mjs/DiscordGateway.mjs +0 -21
  86. package/dist/mjs/DiscordGateway.mjs.map +0 -1
  87. package/dist/mjs/DiscordREST/Generated.mjs +0 -2471
  88. package/dist/mjs/DiscordREST/Generated.mjs.map +0 -1
  89. package/dist/mjs/DiscordREST/utils.mjs +0 -21
  90. package/dist/mjs/DiscordREST/utils.mjs.map +0 -1
  91. package/dist/mjs/DiscordREST.mjs +0 -119
  92. package/dist/mjs/DiscordREST.mjs.map +0 -1
  93. package/dist/mjs/Helpers/flags.mjs +0 -45
  94. package/dist/mjs/Helpers/flags.mjs.map +0 -1
  95. package/dist/mjs/Helpers/intents.mjs +0 -27
  96. package/dist/mjs/Helpers/intents.mjs.map +0 -1
  97. package/dist/mjs/Helpers/interactions.mjs +0 -115
  98. package/dist/mjs/Helpers/interactions.mjs.map +0 -1
  99. package/dist/mjs/Helpers/members.mjs +0 -9
  100. package/dist/mjs/Helpers/members.mjs.map +0 -1
  101. package/dist/mjs/Helpers/permissions.mjs +0 -84
  102. package/dist/mjs/Helpers/permissions.mjs.map +0 -1
  103. package/dist/mjs/Helpers/ui.mjs +0 -137
  104. package/dist/mjs/Helpers/ui.mjs.map +0 -1
  105. package/dist/mjs/Interactions/builder.mjs +0 -56
  106. package/dist/mjs/Interactions/builder.mjs.map +0 -1
  107. package/dist/mjs/Interactions/commandHelper.mjs +0 -49
  108. package/dist/mjs/Interactions/commandHelper.mjs.map +0 -1
  109. package/dist/mjs/Interactions/context.mjs +0 -28
  110. package/dist/mjs/Interactions/context.mjs.map +0 -1
  111. package/dist/mjs/Interactions/definitions.mjs +0 -51
  112. package/dist/mjs/Interactions/definitions.mjs.map +0 -1
  113. package/dist/mjs/Interactions/error.mjs +0 -2
  114. package/dist/mjs/Interactions/error.mjs.map +0 -1
  115. package/dist/mjs/Interactions/gateway.mjs +0 -82
  116. package/dist/mjs/Interactions/gateway.mjs.map +0 -1
  117. package/dist/mjs/Interactions/handlers.mjs +0 -64
  118. package/dist/mjs/Interactions/handlers.mjs.map +0 -1
  119. package/dist/mjs/Interactions/index.mjs +0 -11
  120. package/dist/mjs/Interactions/index.mjs.map +0 -1
  121. package/dist/mjs/Interactions/utils.mjs +0 -26
  122. package/dist/mjs/Interactions/utils.mjs.map +0 -1
  123. package/dist/mjs/Interactions/webhook.mjs +0 -75
  124. package/dist/mjs/Interactions/webhook.mjs.map +0 -1
  125. package/dist/mjs/RateLimit/memory.mjs +0 -39
  126. package/dist/mjs/RateLimit/memory.mjs.map +0 -1
  127. package/dist/mjs/RateLimit/utils.mjs +0 -18
  128. package/dist/mjs/RateLimit/utils.mjs.map +0 -1
  129. package/dist/mjs/RateLimit.mjs +0 -28
  130. package/dist/mjs/RateLimit.mjs.map +0 -1
  131. package/dist/mjs/gateway.mjs +0 -19
  132. package/dist/mjs/gateway.mjs.map +0 -1
  133. package/dist/mjs/index.mjs +0 -18
  134. package/dist/mjs/index.mjs.map +0 -1
  135. package/dist/mjs/types.mjs +0 -356
  136. package/dist/mjs/types.mjs.map +0 -1
  137. package/dist/mjs/utils/Effect.mjs +0 -44
  138. package/dist/mjs/utils/Effect.mjs.map +0 -1
  139. package/dist/mjs/version.mjs +0 -2
  140. package/dist/mjs/version.mjs.map +0 -1
  141. package/dist/mjs/webhooks.mjs +0 -6
  142. package/dist/mjs/webhooks.mjs.map +0 -1
  143. package/dist/package.json +0 -48
  144. package/dist/src/Cache/driver.ts +0 -37
  145. package/dist/src/Cache/memory.ts +0 -83
  146. package/dist/src/Cache/memoryTTL.ts +0 -225
  147. package/dist/src/Cache/prelude.ts +0 -279
  148. package/dist/src/Cache.ts +0 -261
  149. package/dist/src/DiscordConfig.ts +0 -67
  150. package/dist/src/DiscordGateway/DiscordWS.ts +0 -157
  151. package/dist/src/DiscordGateway/Messaging.ts +0 -71
  152. package/dist/src/DiscordGateway/Shard/StateStore.ts +0 -72
  153. package/dist/src/DiscordGateway/Shard/heartbeats.ts +0 -60
  154. package/dist/src/DiscordGateway/Shard/identify.ts +0 -50
  155. package/dist/src/DiscordGateway/Shard/sendEvents.ts +0 -43
  156. package/dist/src/DiscordGateway/Shard/utils.ts +0 -13
  157. package/dist/src/DiscordGateway/Shard.ts +0 -205
  158. package/dist/src/DiscordGateway/ShardStore.ts +0 -42
  159. package/dist/src/DiscordGateway/Sharder.ts +0 -118
  160. package/dist/src/DiscordGateway.ts +0 -79
  161. package/dist/src/DiscordREST/Generated.ts +0 -10832
  162. package/dist/src/DiscordREST/utils.ts +0 -42
  163. package/dist/src/DiscordREST.ts +0 -256
  164. package/dist/src/Helpers/flags.ts +0 -73
  165. package/dist/src/Helpers/intents.ts +0 -35
  166. package/dist/src/Helpers/interactions.ts +0 -317
  167. package/dist/src/Helpers/members.ts +0 -18
  168. package/dist/src/Helpers/permissions.ts +0 -145
  169. package/dist/src/Helpers/ui.ts +0 -253
  170. package/dist/src/Interactions/builder.ts +0 -171
  171. package/dist/src/Interactions/commandHelper.ts +0 -231
  172. package/dist/src/Interactions/context.ts +0 -104
  173. package/dist/src/Interactions/definitions.ts +0 -144
  174. package/dist/src/Interactions/error.ts +0 -3
  175. package/dist/src/Interactions/gateway.ts +0 -193
  176. package/dist/src/Interactions/handlers.ts +0 -108
  177. package/dist/src/Interactions/index.ts +0 -30
  178. package/dist/src/Interactions/utils.ts +0 -93
  179. package/dist/src/Interactions/webhook.ts +0 -204
  180. package/dist/src/RateLimit/memory.ts +0 -63
  181. package/dist/src/RateLimit/utils.ts +0 -28
  182. package/dist/src/RateLimit.ts +0 -90
  183. package/dist/src/gateway.ts +0 -50
  184. package/dist/src/index.ts +0 -44
  185. package/dist/src/types.ts +0 -3090
  186. package/dist/src/utils/Effect.ts +0 -65
  187. package/dist/src/version.ts +0 -1
  188. package/dist/src/webhooks.ts +0 -25
  189. package/dist/tsconfig.base.json +0 -54
  190. package/dist/tsconfig.build.json +0 -10
  191. package/dist/tsconfig.examples.json +0 -10
  192. package/dist/tsconfig.json +0 -14
  193. package/dist/tsconfig.madge.json +0 -12
  194. package/dist/tsconfig.test.json +0 -10
@@ -1,253 +0,0 @@
1
- import type {
2
- ActionRowComponentForMessageRequest,
3
- ActionRowComponentForModalRequest,
4
- ButtonComponentForMessageRequest,
5
- ChannelSelectComponentForMessageRequest,
6
- ContainerComponentForMessageRequest,
7
- FileComponentForMessageRequest,
8
- MediaGalleryComponentForMessageRequest,
9
- MentionableSelectComponentForMessageRequest,
10
- MessageCreateRequest,
11
- PollAnswerCreateRequest,
12
- PollCreateRequest,
13
- PollMediaCreateRequest,
14
- RoleSelectComponentForMessageRequest,
15
- SectionComponentForMessageRequest,
16
- SeparatorComponentForMessageRequest,
17
- StringSelectComponentForMessageRequest,
18
- TextDisplayComponentForMessageRequest,
19
- TextInputComponentForModalRequest,
20
- ThumbnailComponentForMessageRequest,
21
- UserSelectComponentForMessageRequest,
22
- } from "../types.ts"
23
- import {
24
- TextInputStyleTypes,
25
- ButtonStyleTypes,
26
- MessageComponentTypes,
27
- MessageFlags,
28
- } from "../types.ts"
29
-
30
- type ActionRowComponents = ReadonlyArray<
31
- | ActionRowComponentForMessageRequest["components"][number]
32
- | ActionRowComponentForModalRequest["components"][number]
33
- >
34
-
35
- /**
36
- * Helper to create an Action Row.
37
- */
38
- export const row = <const C extends ActionRowComponents>(
39
- components: C,
40
- ): {
41
- readonly type: typeof MessageComponentTypes.ACTION_ROW
42
- readonly components: C
43
- } => ({
44
- type: MessageComponentTypes.ACTION_ROW,
45
- components,
46
- })
47
-
48
- /**
49
- * Helper to create an Action Row grid.
50
- */
51
- export const grid = <C extends ActionRowComponents>(
52
- items: ReadonlyArray<C>,
53
- ): ReadonlyArray<{
54
- readonly type: typeof MessageComponentTypes.ACTION_ROW
55
- readonly components: C
56
- }> => items.map(row)
57
-
58
- /**
59
- * Helper to create a single column of components
60
- */
61
- export const singleColumn = <C extends ActionRowComponents>(
62
- items: C,
63
- ): ReadonlyArray<{
64
- readonly type: typeof MessageComponentTypes.ACTION_ROW
65
- readonly components: C
66
- }> => items.map(c => row([c as any])) as any
67
-
68
- /**
69
- * Helper to create a button component.
70
- */
71
- export const button = (
72
- options: Partial<ButtonComponentForMessageRequest>,
73
- ): ButtonComponentForMessageRequest => ({
74
- type: MessageComponentTypes.BUTTON,
75
- style: ButtonStyleTypes.PRIMARY,
76
- ...options,
77
- })
78
-
79
- /**
80
- * Helper to create a select component.
81
- */
82
- export const select = (
83
- options: Omit<StringSelectComponentForMessageRequest, "type">,
84
- ): StringSelectComponentForMessageRequest => ({
85
- type: MessageComponentTypes.STRING_SELECT,
86
- ...options,
87
- })
88
-
89
- /**
90
- * Helper to create a select component.
91
- */
92
- export const userSelect = (
93
- options: Omit<UserSelectComponentForMessageRequest, "type">,
94
- ): UserSelectComponentForMessageRequest => ({
95
- type: MessageComponentTypes.USER_SELECT,
96
- ...options,
97
- })
98
-
99
- /**
100
- * Helper to create a select component.
101
- */
102
- export const roleSelect = (
103
- options: Omit<RoleSelectComponentForMessageRequest, "type">,
104
- ): RoleSelectComponentForMessageRequest => ({
105
- type: MessageComponentTypes.ROLE_SELECT,
106
- ...options,
107
- })
108
-
109
- /**
110
- * Helper to create a select component.
111
- */
112
- export const mentionableSelect = (
113
- options: Omit<MentionableSelectComponentForMessageRequest, "type">,
114
- ): MentionableSelectComponentForMessageRequest => ({
115
- type: MessageComponentTypes.MENTIONABLE_SELECT,
116
- ...options,
117
- })
118
-
119
- /**
120
- * Helper to create a select component.
121
- */
122
- export const channelSelect = (
123
- options: Omit<ChannelSelectComponentForMessageRequest, "type">,
124
- ): ChannelSelectComponentForMessageRequest => ({
125
- type: MessageComponentTypes.CHANNEL_SELECT,
126
- ...options,
127
- })
128
-
129
- type TextInputOpts = Omit<
130
- TextInputComponentForModalRequest,
131
- "type" | "style"
132
- > & {
133
- style?: TextInputStyleTypes
134
- }
135
-
136
- /**
137
- * Helper to create a text input
138
- */
139
- export const textInput = (
140
- input: TextInputOpts,
141
- ): TextInputComponentForModalRequest => ({
142
- type: MessageComponentTypes.TEXT_INPUT,
143
- style: TextInputStyleTypes.SHORT,
144
- ...input,
145
- })
146
-
147
- /**
148
- * Helper to create a poll
149
- */
150
- export const poll = (
151
- input: Omit<PollCreateRequest, "answers"> & {
152
- readonly answers: ReadonlyArray<PollMediaCreateRequest>
153
- },
154
- ): PollCreateRequest => ({
155
- ...input,
156
- answers: input.answers.map(
157
- poll_media => ({ poll_media }) as PollAnswerCreateRequest,
158
- ),
159
- })
160
-
161
- /**
162
- * Helper to create a media gallery
163
- */
164
- export const mediaGallery = (
165
- options: Omit<MediaGalleryComponentForMessageRequest, "type">,
166
- ): MediaGalleryComponentForMessageRequest => ({
167
- type: MessageComponentTypes.MEDIA_GALLERY,
168
- ...options,
169
- })
170
-
171
- /**
172
- * Helper to create a file component
173
- */
174
- export const file = (
175
- options: Omit<FileComponentForMessageRequest, "type">,
176
- ): FileComponentForMessageRequest => ({
177
- type: MessageComponentTypes.FILE,
178
- ...options,
179
- })
180
-
181
- /**
182
- * Helper to create a container component
183
- */
184
- export const container = (
185
- options: Omit<ContainerComponentForMessageRequest, "type">,
186
- ): ContainerComponentForMessageRequest => ({
187
- type: MessageComponentTypes.CONTAINER,
188
- ...options,
189
- })
190
-
191
- /**
192
- * Helper to create a section component
193
- */
194
- export const section = (
195
- options: Omit<SectionComponentForMessageRequest, "type">,
196
- ): SectionComponentForMessageRequest => ({
197
- type: MessageComponentTypes.SECTION,
198
- ...options,
199
- })
200
-
201
- /**
202
- * Helper to create a thumbnail component
203
- */
204
- export const thumbnail = (options: {
205
- readonly url: string
206
- readonly description?: string | undefined
207
- readonly spoiler?: boolean | undefined
208
- }): ThumbnailComponentForMessageRequest => ({
209
- type: MessageComponentTypes.THUMBNAIL,
210
- description: options.description,
211
- spoiler: options.spoiler,
212
- media: { url: options.url },
213
- })
214
-
215
- /**
216
- * Helper to create a separator component
217
- */
218
- export const seperator = (
219
- options?: Omit<SeparatorComponentForMessageRequest, "type">,
220
- ): SeparatorComponentForMessageRequest => ({
221
- type: MessageComponentTypes.SEPARATOR,
222
- ...options,
223
- })
224
-
225
- /**
226
- * Helper to create a text display component
227
- */
228
- export const textDisplay = (
229
- content: string,
230
- ): TextDisplayComponentForMessageRequest => ({
231
- type: MessageComponentTypes.TEXT_DISPLAY,
232
- content,
233
- })
234
-
235
- type MessageComponents = NonNullable<MessageCreateRequest["components"]>[number]
236
-
237
- /**
238
- * Create a components v2 message
239
- */
240
- export const components = <const C extends ReadonlyArray<MessageComponents>>(
241
- items: C,
242
- options?: {
243
- readonly ephemeral?: boolean | undefined
244
- },
245
- ): {
246
- readonly flags: MessageFlags
247
- readonly components: C
248
- } => ({
249
- flags: options?.ephemeral
250
- ? MessageFlags.Ephemeral | MessageFlags.IsComponentsV2
251
- : MessageFlags.IsComponentsV2,
252
- components: items,
253
- })
@@ -1,171 +0,0 @@
1
- import * as Chunk from "effect/Chunk"
2
- import { identity } from "effect/Function"
3
- import type * as Cause from "effect/Cause"
4
- import * as Effect from "effect/Effect"
5
- import { catchTag } from "effect/Effect"
6
- import type { DiscordRESTError } from "../DiscordREST.ts"
7
- import { DiscordREST } from "../DiscordREST.ts"
8
- import type * as D from "./definitions.ts"
9
- import type * as Discord from "../types.ts"
10
-
11
- type ExtractTag<A> = A extends { _tag: infer Tag }
12
- ? Tag extends string
13
- ? Tag
14
- : never
15
- : never
16
-
17
- export class InteractionBuilder<R, E, TE> {
18
- constructor(
19
- readonly definitions: Chunk.Chunk<
20
- readonly [
21
- handler: D.InteractionDefinition<R, E>,
22
- transform: (
23
- self: Effect.Effect<any, any, any>,
24
- ) => Effect.Effect<void, TE, R>,
25
- ]
26
- >,
27
- readonly transform: (
28
- self: Effect.Effect<any, any, any>,
29
- ) => Effect.Effect<void, TE, R>,
30
- ) {}
31
-
32
- add<R1, E1>(definition: D.InteractionDefinition<R1, E1>) {
33
- return new InteractionBuilder<R | R1, E | E1, TE | E1>(
34
- Chunk.append(this.definitions, [definition, this.transform] as const),
35
- this.transform,
36
- )
37
- }
38
-
39
- concat<R1, E1, TE1>(builder: InteractionBuilder<R1, E1, TE1>) {
40
- return new InteractionBuilder<R | R1, E | E1, TE | TE1>(
41
- Chunk.appendAll(this.definitions, builder.definitions),
42
- this.transform,
43
- )
44
- }
45
-
46
- private transformTransform<R1, E1>(
47
- f: (selr: Effect.Effect<void, TE, R>) => Effect.Effect<void, E1, R1>,
48
- ) {
49
- return new InteractionBuilder<R1, E, E1>(
50
- Chunk.map(this.definitions, ([d, t]) => [d as any, _ => f(t(_)) as any]),
51
- _ => f(this.transform(_)) as any,
52
- )
53
- }
54
-
55
- private transformHandlers<R1, E1>(
56
- f: (
57
- self: Effect.Effect<Discord.CreateInteractionResponseRequest, E, R>,
58
- ) => Effect.Effect<Discord.CreateInteractionResponseRequest, E1, R1>,
59
- ) {
60
- return new InteractionBuilder<
61
- R1,
62
- E1,
63
- Exclude<TE, Exclude<E, E1>> | Exclude<E1, E>
64
- >(
65
- Chunk.map(this.definitions, ([d, t]) => [
66
- {
67
- ...d,
68
- handle: Effect.isEffect(d.handle)
69
- ? f(d.handle)
70
- : (_: any) => f((d.handle as any)(_)),
71
- } as any,
72
- t as any,
73
- ]),
74
- this.transform as any,
75
- )
76
- }
77
-
78
- catchAllCause<R1, E1>(
79
- f: (cause: Cause.Cause<TE>) => Effect.Effect<void, E1, R1>,
80
- ) {
81
- return this.transformTransform<R | R1, E1>(Effect.catchCause(f))
82
- }
83
-
84
- catchAllCauseRespond<R1, E1>(
85
- f: (
86
- cause: Cause.Cause<E>,
87
- ) => Effect.Effect<Discord.CreateInteractionResponseRequest, E1, R1>,
88
- ) {
89
- return this.transformHandlers<R | R1, E1>(Effect.catchCause(f))
90
- }
91
-
92
- catchAll<R1, E1>(f: (error: TE) => Effect.Effect<void, E1, R1>) {
93
- return this.transformTransform<R | R1, E1>(Effect.catch(f))
94
- }
95
-
96
- catchAllRespond<R1, E1>(
97
- f: (
98
- error: E,
99
- ) => Effect.Effect<Discord.CreateInteractionResponseRequest, E1, R1>,
100
- ) {
101
- return this.transformHandlers<R | R1, E1>(Effect.catch(f))
102
- }
103
-
104
- catchTag<T extends ExtractTag<E>, R1, E1>(
105
- tag: T,
106
- f: (error: Extract<TE, { _tag: T }>) => Effect.Effect<void, E1, R1>,
107
- ) {
108
- return this.transformTransform<R | R1, Exclude<TE, { _tag: T }> | E1>(
109
- _ => catchTag(_ as any, tag, f as any) as any,
110
- )
111
- }
112
-
113
- catchTagRespond<T extends ExtractTag<E>, R1, E1>(
114
- tag: T,
115
- f: (
116
- error: Extract<E, { _tag: T }>,
117
- ) => Effect.Effect<Discord.CreateInteractionResponseRequest, E1, R1>,
118
- ) {
119
- return this.transformHandlers<R | R1, Exclude<E, { _tag: T }> | E1>(
120
- _ => catchTag(_ as any, tag, f as any) as any,
121
- )
122
- }
123
-
124
- get syncGlobal() {
125
- const commands = this.definitions.pipe(
126
- Chunk.map(([d, _]) => d),
127
- Chunk.filter(
128
- (c): c is D.GlobalApplicationCommand<R, E> =>
129
- c._tag === "GlobalApplicationCommand",
130
- ),
131
- Chunk.map(c => c.command),
132
- )
133
-
134
- return DiscordREST.use(rest =>
135
- rest
136
- .getMyApplication()
137
- .pipe(
138
- Effect.flatMap(app =>
139
- rest.bulkSetApplicationCommands(
140
- app.id,
141
- Chunk.toReadonlyArray(commands),
142
- ),
143
- ),
144
- ),
145
- )
146
- }
147
-
148
- syncGuild(appId: Discord.Snowflake, guildId: Discord.Snowflake) {
149
- const commands = this.definitions.pipe(
150
- Chunk.map(([d, _]) => d),
151
- Chunk.filter(
152
- (c): c is D.GuildApplicationCommand<R, E> =>
153
- c._tag === "GuildApplicationCommand",
154
- ),
155
- Chunk.map(c => c.command),
156
- )
157
-
158
- return DiscordREST.use(rest =>
159
- rest.bulkSetGuildApplicationCommands(
160
- appId,
161
- guildId,
162
- Chunk.toReadonlyArray(commands),
163
- ),
164
- )
165
- }
166
- }
167
-
168
- export const builder = new InteractionBuilder<never, never, DiscordRESTError>(
169
- Chunk.empty(),
170
- identity as any,
171
- )
@@ -1,231 +0,0 @@
1
- import * as Option from "effect/Option"
2
- import * as Effect from "effect/Effect"
3
- import {
4
- type DiscordSubCommand,
5
- SubCommandContext,
6
- SubCommandNotFound,
7
- type DiscordApplicationCommand,
8
- type DiscordInteraction,
9
- } from "./context.ts"
10
- import type * as Discord from "../types.ts"
11
- import * as Helpers from "../Helpers/interactions.ts"
12
- import * as Arr from "effect/Array"
13
- import type { HashMap } from "effect/HashMap"
14
-
15
- export class CommandHelper<A> {
16
- constructor(readonly interaction: Discord.APIInteraction) {
17
- this.target = Helpers.target(interaction.data as any) as any
18
- this.data = interaction.data as any
19
- }
20
- readonly data: Discord.APIApplicationCommandInteraction["data"]
21
- readonly target: CommandTypeMap<
22
- A,
23
- {
24
- [Discord.ApplicationCommandType
25
- .CHAT]: Discord.APIChatInputApplicationCommandGuildInteraction["data"]
26
- [Discord.ApplicationCommandType.MESSAGE]: Discord.MessageResponse
27
- [Discord.ApplicationCommandType.USER]: Discord.UserResponse
28
- [Discord.ApplicationCommandType.PRIMARY_ENTRY_POINT]: undefined
29
- }
30
- >
31
-
32
- resolve<T>(
33
- name: AllResolvables<A>["name"],
34
- f: (
35
- id: Discord.Snowflake,
36
- data: Discord.InteractionDataResolved,
37
- ) => T | undefined,
38
- ): Option.Option<T> {
39
- return Helpers.resolveOptionValue(name, f)(this.interaction)
40
- }
41
-
42
- resolvedValues<T>(
43
- f: (
44
- id: Discord.Snowflake,
45
- data: Discord.InteractionDataResolved,
46
- ) => T | undefined,
47
- ): Option.Option<ReadonlyArray<T>> {
48
- return Helpers.resolveValues(f)(this.interaction)
49
- }
50
-
51
- option(
52
- name: AllCommandOptions<A>["name"],
53
- ): Option.Option<Discord.APIApplicationCommandInteractionDataOption> {
54
- return Helpers.getOption(name)(this.data as any)
55
- }
56
-
57
- optionValue<N extends AllRequiredCommandOptions<A>["name"]>(
58
- name: N,
59
- ): CommandValue<A, N> {
60
- return Option.getOrThrow(this.optionValueOptional(name))
61
- }
62
-
63
- optionValueOptional<N extends AllCommandOptions<A>["name"]>(
64
- name: N,
65
- ): Option.Option<CommandValue<A, N>> {
66
- return Option.map(this.option(name), _ => (_ as any).value) as any
67
- }
68
-
69
- optionValueOrElse<N extends AllCommandOptions<A>["name"], const OrElse>(
70
- name: N,
71
- orElse: () => OrElse,
72
- ): CommandValue<A, N> {
73
- return Option.getOrElse(this.optionValueOptional(name), orElse) as any
74
- }
75
-
76
- subCommands<
77
- NER extends SubCommandNames<A> extends never
78
- ? never
79
- : Record<
80
- SubCommandNames<A>,
81
- Effect.Effect<Discord.CreateInteractionResponseRequest, any, any>
82
- >,
83
- >(
84
- commands: NER,
85
- ): Effect.Effect<
86
- Effect.Success<NER[keyof NER]>,
87
- Effect.Error<NER[keyof NER]>,
88
- | Exclude<Effect.Services<NER[keyof NER]>, DiscordSubCommand>
89
- | DiscordInteraction
90
- | DiscordApplicationCommand
91
- > {
92
- const commands_ = commands as Record<string, any>
93
- const matchedCommand = Arr.findFirst(
94
- Helpers.allSubCommands(this.data),
95
- _ => !!commands_[_.name],
96
- )
97
-
98
- return Option.match(matchedCommand, {
99
- onNone: () => Effect.fail(new SubCommandNotFound({ data: this.data })),
100
- onSome: subCommand =>
101
- Effect.provideService(commands_[subCommand.name], SubCommandContext, {
102
- command: subCommand,
103
- }),
104
- }) as any
105
- }
106
-
107
- get optionsMap(): HashMap<string, string | undefined> {
108
- return Helpers.optionsMap(this.data as any)
109
- }
110
- }
111
-
112
- export type CommandHandlerFn<R, E, A> = (
113
- i: CommandHelper<A>,
114
- ) => Effect.Effect<Discord.CreateInteractionResponseRequest, E, R>
115
-
116
- interface CommandOption {
117
- readonly type: any
118
- readonly name: string
119
- readonly options?: ReadonlyArray<CommandOption>
120
- }
121
-
122
- type CommandTypeMap<
123
- A,
124
- Options extends Record<Discord.ApplicationCommandType, any>,
125
- > = A extends { readonly type: infer T }
126
- ? T extends keyof Options
127
- ? Options[T]
128
- : never
129
- : Options[typeof Discord.ApplicationCommandType.CHAT]
130
-
131
- // == Sub commands
132
- type SubCommands<A> = A extends {
133
- readonly type: typeof Discord.ApplicationCommandOptionType.SUB_COMMAND
134
- readonly options?: ReadonlyArray<CommandOption>
135
- }
136
- ? A
137
- : A extends { readonly options: ReadonlyArray<CommandOption> }
138
- ? SubCommands<A["options"][number]>
139
- : never
140
-
141
- type SubCommandNames<A> = Option<SubCommands<A>>["name"]
142
-
143
- // == Command options
144
- type CommandOptionType = Exclude<
145
- Discord.ApplicationCommandOptionType,
146
- | typeof Discord.ApplicationCommandOptionType.SUB_COMMAND
147
- | typeof Discord.ApplicationCommandOptionType.SUB_COMMAND_GROUP
148
- >
149
-
150
- type CommandOptions<A> = OptionsWithLiteral<
151
- A,
152
- {
153
- readonly type: CommandOptionType
154
- }
155
- >
156
-
157
- type SubCommandOptions<A> = Extract<
158
- Option<Exclude<SubCommands<A>["options"], undefined>[number]>,
159
- {
160
- readonly type: CommandOptionType
161
- }
162
- >
163
-
164
- type AllCommandOptions<A> = CommandOptions<A> | SubCommandOptions<A>
165
-
166
- type CommandWithName<A, N> = Extract<AllCommandOptions<A>, { readonly name: N }>
167
-
168
- type OptionTypeValue = {
169
- [Discord.ApplicationCommandOptionType.BOOLEAN]: boolean
170
- [Discord.ApplicationCommandOptionType.INTEGER]: number
171
- [Discord.ApplicationCommandOptionType.NUMBER]: number
172
- }
173
- type CommandValue<A, N> = CommandWithName<
174
- A,
175
- N
176
- >["type"] extends keyof OptionTypeValue
177
- ? OptionTypeValue[CommandWithName<A, N>["type"]]
178
- : string
179
-
180
- // == Required options
181
- type RequiredCommandOptions<A> = OptionsWithLiteral<
182
- A,
183
- {
184
- readonly type: CommandOptionType
185
- readonly required: true
186
- }
187
- >
188
-
189
- type RequiredSubCommandOptions<A> = Extract<
190
- SubCommandOptions<A>,
191
- { readonly required: true }
192
- >
193
-
194
- type AllRequiredCommandOptions<A> =
195
- | RequiredCommandOptions<A>
196
- | RequiredSubCommandOptions<A>
197
-
198
- // == Resolveables
199
- type ResolvableType =
200
- | typeof Discord.ApplicationCommandOptionType.ROLE
201
- | typeof Discord.ApplicationCommandOptionType.USER
202
- | typeof Discord.ApplicationCommandOptionType.MENTIONABLE
203
- | typeof Discord.ApplicationCommandOptionType.CHANNEL
204
-
205
- type Resolvables<A> = OptionsWithLiteral<A, { readonly type: ResolvableType }>
206
- type SubCommandResolvables<A> = Extract<
207
- Option<Exclude<SubCommands<A>["options"], undefined>[number]>,
208
- {
209
- readonly type: ResolvableType
210
- }
211
- >
212
- type AllResolvables<A> = Resolvables<A> | SubCommandResolvables<A>
213
-
214
- // == Utilities
215
- type StringLiteral<T> = T extends string
216
- ? string extends T
217
- ? never
218
- : T
219
- : never
220
-
221
- type Option<A> = A extends { readonly name: infer N }
222
- ? N extends StringLiteral<N>
223
- ? A
224
- : never
225
- : never
226
-
227
- type OptionsWithLiteral<A, T> = A extends {
228
- readonly options: ReadonlyArray<CommandOption>
229
- }
230
- ? Extract<A["options"][number], Option<A["options"][number]> & T>
231
- : never