dfx 0.9.7 → 0.9.9

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 (208) hide show
  1. package/{dist/DiscordConfig → DiscordConfig}/index.d.ts +0 -1
  2. package/{dist/DiscordConfig → DiscordConfig}/index.js +0 -0
  3. package/{dist/DiscordConfig → DiscordConfig}/index.js.map +0 -0
  4. package/{dist/DiscordGateway → DiscordGateway}/DiscordWS/index.d.ts +0 -1
  5. package/{dist/DiscordGateway → DiscordGateway}/DiscordWS/index.js +0 -0
  6. package/{dist/DiscordGateway → DiscordGateway}/DiscordWS/index.js.map +0 -0
  7. package/{dist/DiscordGateway → DiscordGateway}/Shard/heartbeats.d.ts +0 -1
  8. package/{dist/DiscordGateway → DiscordGateway}/Shard/heartbeats.js +0 -0
  9. package/{dist/DiscordGateway → DiscordGateway}/Shard/heartbeats.js.map +0 -0
  10. package/{dist/DiscordGateway → DiscordGateway}/Shard/identify.d.ts +0 -1
  11. package/{dist/DiscordGateway → DiscordGateway}/Shard/identify.js +0 -0
  12. package/{dist/DiscordGateway → DiscordGateway}/Shard/identify.js.map +0 -0
  13. package/{dist/DiscordGateway → DiscordGateway}/Shard/index.d.ts +0 -1
  14. package/{dist/DiscordGateway → DiscordGateway}/Shard/index.js +0 -0
  15. package/{dist/DiscordGateway → DiscordGateway}/Shard/index.js.map +0 -0
  16. package/{dist/DiscordGateway → DiscordGateway}/Shard/invalidSession.d.ts +0 -1
  17. package/{dist/DiscordGateway → DiscordGateway}/Shard/invalidSession.js +0 -0
  18. package/{dist/DiscordGateway → DiscordGateway}/Shard/invalidSession.js.map +0 -0
  19. package/{dist/DiscordGateway → DiscordGateway}/Shard/sendEvents.d.ts +0 -1
  20. package/{dist/DiscordGateway → DiscordGateway}/Shard/sendEvents.js +0 -0
  21. package/{dist/DiscordGateway → DiscordGateway}/Shard/sendEvents.js.map +0 -0
  22. package/{dist/DiscordGateway → DiscordGateway}/Shard/utils.d.ts +0 -1
  23. package/{dist/DiscordGateway → DiscordGateway}/Shard/utils.js +0 -0
  24. package/{dist/DiscordGateway → DiscordGateway}/Shard/utils.js.map +0 -0
  25. package/{dist/DiscordGateway → DiscordGateway}/ShardStore/index.d.ts +0 -1
  26. package/{dist/DiscordGateway → DiscordGateway}/ShardStore/index.js +0 -0
  27. package/{dist/DiscordGateway → DiscordGateway}/ShardStore/index.js.map +0 -0
  28. package/{dist/DiscordGateway → DiscordGateway}/Sharder/index.d.ts +0 -1
  29. package/{dist/DiscordGateway → DiscordGateway}/Sharder/index.js +0 -0
  30. package/{dist/DiscordGateway → DiscordGateway}/Sharder/index.js.map +0 -0
  31. package/{dist/DiscordGateway → DiscordGateway}/WS/index.d.ts +0 -1
  32. package/{dist/DiscordGateway → DiscordGateway}/WS/index.js +0 -0
  33. package/{dist/DiscordGateway → DiscordGateway}/WS/index.js.map +0 -0
  34. package/{dist/DiscordGateway → DiscordGateway}/index.d.ts +0 -1
  35. package/{dist/DiscordGateway → DiscordGateway}/index.js +0 -0
  36. package/{dist/DiscordGateway → DiscordGateway}/index.js.map +0 -0
  37. package/{dist/DiscordREST → DiscordREST}/index.d.ts +0 -1
  38. package/{dist/DiscordREST → DiscordREST}/index.js +0 -0
  39. package/{dist/DiscordREST → DiscordREST}/index.js.map +0 -0
  40. package/{dist/DiscordREST → DiscordREST}/types.d.ts +0 -1
  41. package/{dist/DiscordREST → DiscordREST}/types.js +0 -0
  42. package/{dist/DiscordREST → DiscordREST}/types.js.map +0 -0
  43. package/{dist/DiscordREST → DiscordREST}/utils.d.ts +0 -1
  44. package/{dist/DiscordREST → DiscordREST}/utils.js +0 -0
  45. package/{dist/DiscordREST → DiscordREST}/utils.js.map +0 -0
  46. package/{dist/Helpers → Helpers}/flags.d.ts +0 -1
  47. package/{dist/Helpers → Helpers}/flags.js +0 -0
  48. package/{dist/Helpers → Helpers}/flags.js.map +0 -0
  49. package/{dist/Helpers → Helpers}/intents.d.ts +0 -1
  50. package/{dist/Helpers → Helpers}/intents.js +0 -0
  51. package/{dist/Helpers → Helpers}/intents.js.map +0 -0
  52. package/{dist/Helpers → Helpers}/interactions.d.ts +0 -1
  53. package/{dist/Helpers → Helpers}/interactions.js +0 -0
  54. package/{dist/Helpers → Helpers}/interactions.js.map +0 -0
  55. package/{dist/Helpers → Helpers}/members.d.ts +0 -1
  56. package/{dist/Helpers → Helpers}/members.js +0 -0
  57. package/{dist/Helpers → Helpers}/members.js.map +0 -0
  58. package/{dist/Helpers → Helpers}/permissions.d.ts +0 -1
  59. package/{dist/Helpers → Helpers}/permissions.js +0 -0
  60. package/{dist/Helpers → Helpers}/permissions.js.map +0 -0
  61. package/{dist/Helpers → Helpers}/ui.d.ts +0 -1
  62. package/{dist/Helpers → Helpers}/ui.js +0 -0
  63. package/{dist/Helpers → Helpers}/ui.js.map +0 -0
  64. package/{dist/Http → Http}/index.d.ts +0 -1
  65. package/{dist/Http → Http}/index.js +0 -0
  66. package/{dist/Http → Http}/index.js.map +0 -0
  67. package/{dist/Interactions → Interactions}/context.d.ts +0 -1
  68. package/{dist/Interactions → Interactions}/context.js +0 -0
  69. package/{dist/Interactions → Interactions}/context.js.map +0 -0
  70. package/{dist/Interactions → Interactions}/definitions.d.ts +0 -1
  71. package/{dist/Interactions → Interactions}/definitions.js +0 -0
  72. package/{dist/Interactions → Interactions}/definitions.js.map +0 -0
  73. package/{dist/Interactions → Interactions}/gateway.d.ts +0 -1
  74. package/{dist/Interactions → Interactions}/gateway.js +0 -0
  75. package/{dist/Interactions → Interactions}/gateway.js.map +0 -0
  76. package/{dist/Interactions → Interactions}/handlers.d.ts +0 -1
  77. package/{dist/Interactions → Interactions}/handlers.js +0 -0
  78. package/{dist/Interactions → Interactions}/handlers.js.map +0 -0
  79. package/{dist/Interactions → Interactions}/index.d.ts +0 -1
  80. package/{dist/Interactions → Interactions}/index.js +0 -0
  81. package/{dist/Interactions → Interactions}/index.js.map +0 -0
  82. package/{dist/Interactions → Interactions}/utils.d.ts +0 -1
  83. package/{dist/Interactions → Interactions}/utils.js +0 -0
  84. package/{dist/Interactions → Interactions}/utils.js.map +0 -0
  85. package/{dist/Interactions → Interactions}/webhook.d.ts +0 -1
  86. package/{dist/Interactions → Interactions}/webhook.js +0 -0
  87. package/{dist/Interactions → Interactions}/webhook.js.map +0 -0
  88. package/{dist/Log → Log}/index.d.ts +0 -1
  89. package/{dist/Log → Log}/index.js +0 -0
  90. package/{dist/Log → Log}/index.js.map +0 -0
  91. package/{dist/RateLimitStore → RateLimitStore}/index.d.ts +0 -1
  92. package/{dist/RateLimitStore → RateLimitStore}/index.js +0 -0
  93. package/{dist/RateLimitStore → RateLimitStore}/index.js.map +0 -0
  94. package/{dist/RateLimitStore → RateLimitStore}/memory.d.ts +0 -1
  95. package/{dist/RateLimitStore → RateLimitStore}/memory.js +0 -0
  96. package/{dist/RateLimitStore → RateLimitStore}/memory.js.map +0 -0
  97. package/{dist/RateLimitStore → RateLimitStore}/utils.d.ts +0 -1
  98. package/{dist/RateLimitStore → RateLimitStore}/utils.js +0 -0
  99. package/{dist/RateLimitStore → RateLimitStore}/utils.js.map +0 -0
  100. package/{dist/common-gateway.d.ts → common-gateway.d.ts} +0 -1
  101. package/{dist/common-gateway.js → common-gateway.js} +0 -0
  102. package/{dist/common-gateway.js.map → common-gateway.js.map} +0 -0
  103. package/{dist/common.d.ts → common.d.ts} +0 -1
  104. package/{dist/common.js → common.js} +0 -0
  105. package/{dist/common.js.map → common.js.map} +0 -0
  106. package/{dist/global.d.ts → global.d.ts} +0 -1
  107. package/{dist/global.js → global.js} +0 -0
  108. package/{dist/global.js.map → global.js.map} +0 -0
  109. package/{dist/index.d.ts → index.d.ts} +0 -1
  110. package/{dist/index.js → index.js} +0 -0
  111. package/{dist/index.js.map → index.js.map} +0 -0
  112. package/package.json +7 -10
  113. package/{dist/types.d.ts → types.d.ts} +0 -1
  114. package/{dist/types.js → types.js} +0 -0
  115. package/{dist/types.js.map → types.js.map} +0 -0
  116. package/{dist/utils → utils}/effect.d.ts +0 -1
  117. package/{dist/utils → utils}/effect.js +0 -0
  118. package/{dist/utils → utils}/effect.js.map +0 -0
  119. package/{dist/utils → utils}/tsplus.d.ts +0 -1
  120. package/{dist/utils → utils}/tsplus.js +0 -0
  121. package/{dist/utils → utils}/tsplus.js.map +0 -0
  122. package/{dist/webhooks.d.ts → webhooks.d.ts} +0 -1
  123. package/{dist/webhooks.js → webhooks.js} +0 -0
  124. package/{dist/webhooks.js.map → webhooks.js.map} +0 -0
  125. package/README.md +0 -41
  126. package/dist/DiscordConfig/index.d.ts.map +0 -1
  127. package/dist/DiscordGateway/DiscordWS/index.d.ts.map +0 -1
  128. package/dist/DiscordGateway/Shard/heartbeats.d.ts.map +0 -1
  129. package/dist/DiscordGateway/Shard/identify.d.ts.map +0 -1
  130. package/dist/DiscordGateway/Shard/index.d.ts.map +0 -1
  131. package/dist/DiscordGateway/Shard/invalidSession.d.ts.map +0 -1
  132. package/dist/DiscordGateway/Shard/sendEvents.d.ts.map +0 -1
  133. package/dist/DiscordGateway/Shard/utils.d.ts.map +0 -1
  134. package/dist/DiscordGateway/ShardStore/index.d.ts.map +0 -1
  135. package/dist/DiscordGateway/Sharder/index.d.ts.map +0 -1
  136. package/dist/DiscordGateway/WS/index.d.ts.map +0 -1
  137. package/dist/DiscordGateway/index.d.ts.map +0 -1
  138. package/dist/DiscordREST/index.d.ts.map +0 -1
  139. package/dist/DiscordREST/types.d.ts.map +0 -1
  140. package/dist/DiscordREST/utils.d.ts.map +0 -1
  141. package/dist/Helpers/flags.d.ts.map +0 -1
  142. package/dist/Helpers/intents.d.ts.map +0 -1
  143. package/dist/Helpers/interactions.d.ts.map +0 -1
  144. package/dist/Helpers/members.d.ts.map +0 -1
  145. package/dist/Helpers/permissions.d.ts.map +0 -1
  146. package/dist/Helpers/ui.d.ts.map +0 -1
  147. package/dist/Http/index.d.ts.map +0 -1
  148. package/dist/Interactions/context.d.ts.map +0 -1
  149. package/dist/Interactions/definitions.d.ts.map +0 -1
  150. package/dist/Interactions/gateway.d.ts.map +0 -1
  151. package/dist/Interactions/handlers.d.ts.map +0 -1
  152. package/dist/Interactions/index.d.ts.map +0 -1
  153. package/dist/Interactions/utils.d.ts.map +0 -1
  154. package/dist/Interactions/webhook.d.ts.map +0 -1
  155. package/dist/Log/index.d.ts.map +0 -1
  156. package/dist/RateLimitStore/index.d.ts.map +0 -1
  157. package/dist/RateLimitStore/memory.d.ts.map +0 -1
  158. package/dist/RateLimitStore/utils.d.ts.map +0 -1
  159. package/dist/common-gateway.d.ts.map +0 -1
  160. package/dist/common.d.ts.map +0 -1
  161. package/dist/global.d.ts.map +0 -1
  162. package/dist/index.d.ts.map +0 -1
  163. package/dist/types.d.ts.map +0 -1
  164. package/dist/utils/effect.d.ts.map +0 -1
  165. package/dist/utils/tsplus.d.ts.map +0 -1
  166. package/dist/webhooks.d.ts.map +0 -1
  167. package/src/DiscordConfig/index.ts +0 -52
  168. package/src/DiscordGateway/DiscordWS/index.ts +0 -50
  169. package/src/DiscordGateway/Shard/heartbeats.ts +0 -39
  170. package/src/DiscordGateway/Shard/identify.ts +0 -61
  171. package/src/DiscordGateway/Shard/index.ts +0 -90
  172. package/src/DiscordGateway/Shard/invalidSession.ts +0 -11
  173. package/src/DiscordGateway/Shard/sendEvents.ts +0 -35
  174. package/src/DiscordGateway/Shard/utils.ts +0 -14
  175. package/src/DiscordGateway/ShardStore/index.ts +0 -33
  176. package/src/DiscordGateway/Sharder/index.ts +0 -95
  177. package/src/DiscordGateway/WS/index.ts +0 -99
  178. package/src/DiscordGateway/index.ts +0 -55
  179. package/src/DiscordREST/index.ts +0 -132
  180. package/src/DiscordREST/types.ts +0 -14
  181. package/src/DiscordREST/utils.ts +0 -35
  182. package/src/Helpers/flags.ts +0 -68
  183. package/src/Helpers/intents.ts +0 -32
  184. package/src/Helpers/interactions.ts +0 -180
  185. package/src/Helpers/members.ts +0 -14
  186. package/src/Helpers/permissions.ts +0 -102
  187. package/src/Helpers/ui.ts +0 -103
  188. package/src/Http/index.ts +0 -65
  189. package/src/Interactions/context.ts +0 -100
  190. package/src/Interactions/definitions.ts +0 -144
  191. package/src/Interactions/gateway.ts +0 -55
  192. package/src/Interactions/handlers.ts +0 -139
  193. package/src/Interactions/index.ts +0 -83
  194. package/src/Interactions/utils.ts +0 -81
  195. package/src/Interactions/webhook.ts +0 -96
  196. package/src/Log/index.ts +0 -23
  197. package/src/RateLimitStore/index.ts +0 -65
  198. package/src/RateLimitStore/memory.ts +0 -48
  199. package/src/RateLimitStore/utils.ts +0 -27
  200. package/src/common-gateway.ts +0 -5
  201. package/src/common.ts +0 -30
  202. package/src/global.ts +0 -50
  203. package/src/index.ts +0 -36
  204. package/src/json.d.ts +0 -1
  205. package/src/types.ts +0 -6095
  206. package/src/utils/effect.ts +0 -7
  207. package/src/utils/tsplus.ts +0 -11
  208. package/src/webhooks.ts +0 -30
@@ -1,144 +0,0 @@
1
- export type InteractionResponse =
2
- | {
3
- type: Discord.InteractionCallbackType.CHANNEL_MESSAGE_WITH_SOURCE
4
- data: Discord.InteractionCallbackMessage
5
- }
6
- | {
7
- type: Discord.InteractionCallbackType.UPDATE_MESSAGE
8
- data: Discord.InteractionCallbackMessage
9
- }
10
- | {
11
- type: Discord.InteractionCallbackType.MODAL
12
- data: Discord.InteractionCallbackModal
13
- }
14
- | {
15
- type: Discord.InteractionCallbackType.DEFERRED_UPDATE_MESSAGE
16
- }
17
- | {
18
- type: Discord.InteractionCallbackType.DEFERRED_CHANNEL_MESSAGE_WITH_SOURCE
19
- }
20
- | {
21
- type: Discord.InteractionCallbackType.APPLICATION_COMMAND_AUTOCOMPLETE_RESULT
22
- data: Discord.InteractionCallbackAutocomplete
23
- }
24
-
25
- type DescriptionMissing<A> = A extends {
26
- type: Exclude<Discord.ApplicationCommandType, 1>
27
- }
28
- ? false
29
- : A extends { description: string }
30
- ? false
31
- : true
32
-
33
- export type InteractionDefinition<R, E> =
34
- | GlobalApplicationCommand<R, E>
35
- | GuildApplicationCommand<R, E>
36
- | MessageComponent<R, E>
37
- | ModalSubmit<R, E>
38
- | Autocomplete<R, E>
39
-
40
- export class GlobalApplicationCommand<R, E> {
41
- readonly _tag = "GlobalApplicationCommand"
42
- constructor(
43
- readonly command: Discord.CreateGlobalApplicationCommandParams,
44
- readonly handle: Effect<R, E, Maybe<InteractionResponse>>,
45
- ) {}
46
- }
47
-
48
- export const global = <
49
- R,
50
- E,
51
- A extends Discord.CreateGlobalApplicationCommandParams,
52
- >(
53
- command: A,
54
- handle: DescriptionMissing<A> extends true
55
- ? "command description is missing"
56
- : Effect<R, E, Maybe<InteractionResponse>>,
57
- ) =>
58
- new GlobalApplicationCommand<
59
- Exclude<R, Discord.Interaction | Discord.ApplicationCommandDatum>,
60
- E
61
- >(command, handle as any)
62
-
63
- export class GuildApplicationCommand<R, E> {
64
- readonly _tag = "GuildApplicationCommand"
65
- constructor(
66
- readonly command: Discord.CreateGuildApplicationCommandParams,
67
- readonly handle: Effect<R, E, Maybe<InteractionResponse>>,
68
- ) {}
69
- }
70
-
71
- export const guild = <
72
- R,
73
- E,
74
- A extends Discord.CreateGuildApplicationCommandParams,
75
- >(
76
- command: A,
77
- handle: DescriptionMissing<A> extends true
78
- ? "command description is missing"
79
- : Effect<R, E, Maybe<InteractionResponse>>,
80
- ) =>
81
- new GuildApplicationCommand<
82
- Exclude<R, Discord.Interaction | Discord.ApplicationCommandDatum>,
83
- E
84
- >(command, handle as any)
85
-
86
- export class MessageComponent<R, E> {
87
- readonly _tag = "MessageComponent"
88
- constructor(
89
- readonly predicate: (customId: string) => Effect<R, E, boolean>,
90
- readonly handle: Effect<R, E, Maybe<InteractionResponse>>,
91
- ) {}
92
- }
93
-
94
- export const messageComponent = <R1, R2, E1, E2>(
95
- pred: (customId: string) => Effect<R1, E1, boolean>,
96
- handle: Effect<R2, E2, Maybe<InteractionResponse>>,
97
- ) =>
98
- new MessageComponent<
99
- Exclude<R1 | R2, Discord.Interaction | Discord.MessageComponentDatum>,
100
- E1 | E2
101
- >(pred as any, handle as any)
102
-
103
- export class ModalSubmit<R, E> {
104
- readonly _tag = "ModalSubmit"
105
- constructor(
106
- readonly predicate: (customId: string) => Effect<R, E, boolean>,
107
- readonly handle: Effect<R, E, Maybe<InteractionResponse>>,
108
- ) {}
109
- }
110
-
111
- export const modalSubmit = <R1, R2, E1, E2>(
112
- pred: (customId: string) => Effect<R1, E1, boolean>,
113
- handle: Effect<R2, E2, Maybe<InteractionResponse>>,
114
- ) =>
115
- new ModalSubmit<
116
- Exclude<R1 | R2, Discord.Interaction | Discord.ModalSubmitDatum>,
117
- E1 | E2
118
- >(pred as any, handle as any)
119
-
120
- export class Autocomplete<R, E> {
121
- readonly _tag = "Autocomplete"
122
- constructor(
123
- readonly predicate: (
124
- focusedOption: Discord.ApplicationCommandInteractionDataOption,
125
- ) => Effect<R, E, boolean>,
126
- readonly handle: Effect<R, E, Maybe<InteractionResponse>>,
127
- ) {}
128
- }
129
-
130
- export const autocomplete = <R1, R2, E1, E2>(
131
- pred: (
132
- focusedOption: Discord.ApplicationCommandInteractionDataOption,
133
- ) => Effect<R1, E1, boolean>,
134
- handle: Effect<R2, E2, Maybe<InteractionResponse>>,
135
- ) =>
136
- new Autocomplete<
137
- Exclude<
138
- R1 | R2,
139
- | Discord.Interaction
140
- | Discord.ApplicationCommandDatum
141
- | Discord.ApplicationCommandInteractionDataOption
142
- >,
143
- E1 | E2
144
- >(pred as any, handle as any)
@@ -1,55 +0,0 @@
1
- import { handlers } from "./handlers.js"
2
- import { InteractionBuilder } from "./index.js"
3
- import { splitDefinitions } from "./utils.js"
4
-
5
- export interface RunOpts {
6
- sync?: boolean
7
- }
8
-
9
- export const run =
10
- <R2, E, E2>(
11
- catchAll: (
12
- e: Http.FetchError | Http.StatusCodeError | Http.JsonParseError | E,
13
- ) => Effect<R2, E2, any>,
14
- { sync = true }: RunOpts = {},
15
- ) =>
16
- <R>(ix: InteractionBuilder<R, E>) =>
17
- Do(($) => {
18
- const { GlobalApplicationCommand, GuildApplicationCommand } =
19
- splitDefinitions(ix.definitions)
20
-
21
- const application = $(
22
- Rest.rest.getCurrentBotApplicationInformation().flatMap((a) => a.json),
23
- )
24
-
25
- const globalSync = Rest.rest.bulkOverwriteGlobalApplicationCommands(
26
- application.id,
27
- {
28
- body: JSON.stringify(GlobalApplicationCommand.map((a) => a.command)),
29
- },
30
- )
31
-
32
- const guildSync = GuildApplicationCommand.length
33
- ? Gateway.handleDispatch("GUILD_CREATE", (a) =>
34
- Rest.rest.bulkOverwriteGuildApplicationCommands(
35
- application.id,
36
- a.id,
37
- GuildApplicationCommand.map((a) => a.command) as any,
38
- ),
39
- )
40
- : Effect.unit()
41
-
42
- const handle = handlers(ix.definitions)
43
-
44
- const run = Gateway.handleDispatch("INTERACTION_CREATE", (i) =>
45
- handle[i.type](i)
46
- .tap((r) =>
47
- r.match(Effect.unit, (r) =>
48
- Rest.rest.createInteractionResponse(i.id, i.token, r),
49
- ),
50
- )
51
- .catchAll(catchAll),
52
- )
53
-
54
- $(sync ? run.zipPar(globalSync).zipPar(guildSync) : run)
55
- })
@@ -1,139 +0,0 @@
1
- import * as Ctx from "./context.js"
2
- import * as D from "./definitions.js"
3
- import * as Arr from "@fp-ts/data/ReadonlyArray"
4
- import { splitDefinitions } from "./utils.js"
5
-
6
- export class InteractionNotFound {
7
- readonly _tag = "InteractionNotFound"
8
- constructor(readonly interaction: Discord.Interaction) {}
9
- }
10
-
11
- export const handlers = <R, E>(
12
- definitions: D.InteractionDefinition<R, E>[],
13
- ): Record<
14
- Discord.InteractionType,
15
- (i: Discord.Interaction) => Effect<R, E, Maybe<Discord.InteractionResponse>>
16
- > => {
17
- const { Commands, Autocomplete, MessageComponent, ModalSubmit } =
18
- splitDefinitions(definitions)
19
-
20
- return {
21
- [Discord.InteractionType.PING]: () =>
22
- Effect.succeed({
23
- type: Discord.InteractionCallbackType.PONG,
24
- }).asSome,
25
-
26
- [Discord.InteractionType.APPLICATION_COMMAND]: (i) => {
27
- const data = i.data as Discord.ApplicationCommandDatum
28
-
29
- return pipe(
30
- Maybe.fromNullable(Commands[data.name]).match(
31
- () =>
32
- Effect.fail(new InteractionNotFound(i)) as any as Effect<
33
- R,
34
- E,
35
- Maybe<Discord.InteractionResponse>
36
- >,
37
- (command) => command.handle,
38
- ),
39
- Effect.provideService(Ctx.InteractionContext)(i),
40
- Effect.provideService(Ctx.ApplicationCommandContext)(data),
41
- )
42
- },
43
-
44
- [Discord.InteractionType.MODAL_SUBMIT]: (i: Discord.Interaction) => {
45
- const data = i.data as Discord.ModalSubmitDatum
46
-
47
- return pipe(
48
- ModalSubmit,
49
- Arr.map((a) =>
50
- Effect.struct({
51
- command: Effect.succeed(a),
52
- match: a.predicate(data.custom_id),
53
- }),
54
- ),
55
- (a) =>
56
- a.collectAllPar.flatMap((a) =>
57
- a
58
- .findFirst((a) => a.match)
59
- .match(
60
- () =>
61
- Effect.fail(new InteractionNotFound(i)) as any as Effect<
62
- R,
63
- E,
64
- Maybe<Discord.InteractionResponse>
65
- >,
66
- (a) => a.command.handle,
67
- ),
68
- ),
69
- Effect.provideService(Ctx.InteractionContext)(i),
70
- Effect.provideService(Ctx.ModalSubmitContext)(data),
71
- )
72
- },
73
-
74
- [Discord.InteractionType.MESSAGE_COMPONENT]: (i) => {
75
- const data = i.data as Discord.MessageComponentDatum
76
-
77
- return pipe(
78
- MessageComponent,
79
- Arr.map((a) =>
80
- Effect.struct({
81
- command: Effect.succeed(a),
82
- match: a.predicate(data.custom_id),
83
- }),
84
- ),
85
- (a) =>
86
- a.collectAllPar.flatMap((a) =>
87
- a
88
- .findFirst((a) => a.match)
89
- .match(
90
- () =>
91
- Effect.fail(new InteractionNotFound(i)) as any as Effect<
92
- R,
93
- E,
94
- Maybe<Discord.InteractionResponse>
95
- >,
96
- (a) => a.command.handle,
97
- ),
98
- ),
99
- Effect.provideService(Ctx.InteractionContext)(i),
100
- Effect.provideService(Ctx.MessageComponentContext)(data),
101
- )
102
- },
103
-
104
- [Discord.InteractionType.APPLICATION_COMMAND_AUTOCOMPLETE]: (i) => {
105
- const data = i.data as Discord.ApplicationCommandDatum
106
-
107
- return IxHelpers.focusedOption(data)
108
- .map((focusedOption) =>
109
- pipe(
110
- Autocomplete,
111
- Arr.map((a) =>
112
- Effect.struct({
113
- command: Effect.succeed(a),
114
- match: a.predicate(focusedOption),
115
- }),
116
- ),
117
- (a) =>
118
- a.collectAllPar.flatMap((a) =>
119
- a
120
- .findFirst((a) => a.match)
121
- .match(
122
- () =>
123
- Effect.fail(new InteractionNotFound(i)) as any as Effect<
124
- R,
125
- E,
126
- Maybe<Discord.InteractionResponse>
127
- >,
128
- (a) => a.command.handle,
129
- ),
130
- ),
131
- Effect.provideService(Ctx.InteractionContext)(i),
132
- Effect.provideService(Ctx.ApplicationCommandContext)(data),
133
- Effect.provideService(Ctx.FocusedOptionContext)({ focusedOption }),
134
- ),
135
- )
136
- .getOrElse(() => Effect.fail(new InteractionNotFound(i)) as any)
137
- },
138
- }
139
- }
@@ -1,83 +0,0 @@
1
- import * as D from "./definitions.js"
2
-
3
- export * from "./context.js"
4
-
5
- export {
6
- global,
7
- guild,
8
- messageComponent,
9
- modalSubmit,
10
- autocomplete,
11
- InteractionDefinition,
12
- InteractionResponse,
13
- } from "./definitions.js"
14
-
15
- export {
16
- makeConfigLayer as makeWebhookConfig,
17
- makeHandler as makeWebhookHandler,
18
- MakeConfigOpts as MakeWebhookConfigOpts,
19
- WebhookConfig,
20
- WebhookParseError,
21
- BadWebhookSignature,
22
- } from "./webhook.js"
23
-
24
- export class InteractionBuilder<R, E> {
25
- constructor(readonly definitions: D.InteractionDefinition<R, E>[]) {}
26
-
27
- add<R1, E1>(definition: D.InteractionDefinition<R1, E1>) {
28
- return new InteractionBuilder<R | R1, E | E1>([
29
- ...this.definitions,
30
- definition,
31
- ])
32
- }
33
-
34
- get syncGlobal() {
35
- const commands = this.definitions
36
- .filter(
37
- (c): c is D.GlobalApplicationCommand<R, E> =>
38
- c._tag === "GlobalApplicationCommand",
39
- )
40
- .map((c) => c.command)
41
-
42
- return Rest.rest
43
- .getCurrentBotApplicationInformation()
44
- .flatMap((r) => r.json)
45
- .flatMap((app) =>
46
- Rest.rest.bulkOverwriteGlobalApplicationCommands(app.id, {
47
- body: JSON.stringify(commands),
48
- }),
49
- )
50
- }
51
-
52
- syncGuild(appId: Discord.Snowflake, guildId: Discord.Snowflake) {
53
- const commands = this.definitions
54
- .filter(
55
- (c): c is D.GuildApplicationCommand<R, E> =>
56
- c._tag === "GuildApplicationCommand",
57
- )
58
- .map((c) => c.command)
59
-
60
- return Rest.rest.bulkOverwriteGuildApplicationCommands(
61
- appId,
62
- guildId,
63
- commands as any,
64
- )
65
- }
66
- }
67
-
68
- export const builder = new InteractionBuilder<never, never>([])
69
-
70
- // Filters
71
- export const id = (query: string) => (customId: string) =>
72
- Effect.succeed(query === customId)
73
-
74
- export const idStartsWith = (query: string) => (customId: string) =>
75
- Effect.succeed(customId.startsWith(query))
76
-
77
- export const regex = (query: RegExp) => (customId: string) =>
78
- Effect.succeed(query.test(customId))
79
-
80
- export const option =
81
- (name: string) =>
82
- (focusedOption: Discord.ApplicationCommandInteractionDataOption) =>
83
- Effect.succeed(focusedOption.name === name)
@@ -1,81 +0,0 @@
1
- import * as D from "./definitions.js"
2
-
3
- export const splitDefinitions = <R, E>(
4
- definitions: D.InteractionDefinition<R, E>[],
5
- ) => {
6
- const grouped = definitions.reduce<{
7
- [K in D.InteractionDefinition<R, E>["_tag"]]: Extract<
8
- D.InteractionDefinition<R, E>,
9
- { _tag: K }
10
- >[]
11
- }>(
12
- (acc, a) => ({
13
- ...acc,
14
- [a._tag]: [...(acc[a._tag] ?? []), a],
15
- }),
16
- {
17
- Autocomplete: [],
18
- GlobalApplicationCommand: [],
19
- GuildApplicationCommand: [],
20
- MessageComponent: [],
21
- ModalSubmit: [],
22
- },
23
- )
24
-
25
- const Commands = [
26
- ...grouped.GlobalApplicationCommand,
27
- ...grouped.GuildApplicationCommand,
28
- ].reduce(
29
- (acc, a) => ({
30
- ...acc,
31
- [a.command.name]: a,
32
- }),
33
- {} as Record<
34
- string,
35
- D.GlobalApplicationCommand<R, E> | D.GuildApplicationCommand<R, E>
36
- >,
37
- )
38
-
39
- return {
40
- ...grouped,
41
- Commands,
42
- }
43
- }
44
- const MAP_HEX: Record<string, number> = {
45
- 0: 0,
46
- 1: 1,
47
- 2: 2,
48
- 3: 3,
49
- 4: 4,
50
- 5: 5,
51
- 6: 6,
52
- 7: 7,
53
- 8: 8,
54
- 9: 9,
55
- a: 10,
56
- b: 11,
57
- c: 12,
58
- d: 13,
59
- e: 14,
60
- f: 15,
61
- A: 10,
62
- B: 11,
63
- C: 12,
64
- D: 13,
65
- E: 14,
66
- F: 15,
67
- }
68
-
69
- export function fromHex(hexString: string) {
70
- const bytes = new Uint8Array(Math.floor((hexString || "").length / 2))
71
- let i
72
- for (i = 0; i < bytes.length; i++) {
73
- const a = MAP_HEX[hexString[i * 2]]
74
- const b = MAP_HEX[hexString[i * 2 + 1]]
75
- if (a === undefined || b === undefined) {
76
- break
77
- }
78
- bytes[i] = (a << 4) | b
79
- }
80
- return i === bytes.length ? bytes : bytes.slice(0, i)
81
- }
@@ -1,96 +0,0 @@
1
- import Nacl from "tweetnacl"
2
- import * as D from "./definitions.js"
3
- import { handlers } from "./handlers.js"
4
- import { InteractionBuilder } from "./index.js"
5
- import { fromHex } from "./utils.js"
6
-
7
- export class BadWebhookSignature {
8
- readonly _tag = "BadWebhookSignature"
9
- }
10
-
11
- export type Headers = Record<string, string | string[] | undefined>
12
-
13
- const checkSignature = (
14
- publicKey: Uint8Array,
15
- headers: Headers,
16
- body: string,
17
- ) =>
18
- Maybe.struct({
19
- signature: Maybe.fromNullable(headers["x-signature-ed25519"]),
20
- timestamp: Maybe.fromNullable(headers["x-signature-timestamp"]),
21
- })
22
- .filter((a) => {
23
- const enc = new TextEncoder()
24
- return Nacl.sign.detached.verify(
25
- enc.encode(a.timestamp + body),
26
- fromHex(`${a.signature}`),
27
- publicKey,
28
- )
29
- })
30
- .toEither(() => new BadWebhookSignature()).asUnit
31
-
32
- export interface MakeConfigOpts {
33
- applicationId: string
34
- publicKey: string
35
- }
36
- const makeConfig = ({ applicationId, publicKey }: MakeConfigOpts) => ({
37
- applicationId,
38
- publicKey: fromHex(publicKey),
39
- })
40
- export interface WebhookConfig extends ReturnType<typeof makeConfig> {}
41
- export const WebhookConfig = Tag<WebhookConfig>()
42
- export const makeConfigLayer = flow(makeConfig, Layer.succeed(WebhookConfig))
43
-
44
- export class WebhookParseError {
45
- readonly _tag = "WebhookParseError"
46
- constructor(readonly reason: unknown) {}
47
- }
48
-
49
- const fromHeadersAndBody = (headers: Headers, body: string) =>
50
- Do(($) => {
51
- const { publicKey } = $(Effect.service(WebhookConfig))
52
- $(Effect.fromEither(checkSignature(publicKey, headers, body)))
53
- return $(
54
- Effect.tryCatch(
55
- () => JSON.parse(body) as Discord.Interaction,
56
- (reason) => new WebhookParseError(reason),
57
- ),
58
- )
59
- })
60
-
61
- const run = <R, E>(definitions: D.InteractionDefinition<R, E>[]) => {
62
- const handler = handlers(definitions)
63
- return (headers: Headers, body: string) =>
64
- Do(($) => {
65
- const interaction = $(fromHeadersAndBody(headers, body))
66
- return $(handler[interaction.type](interaction))
67
- })
68
- }
69
-
70
- export interface HandleWebhookOpts<E> {
71
- headers: Headers
72
- body: string
73
- success: (a: Discord.InteractionResponse) => Effect<never, never, void>
74
- error: (e: Cause<E>) => Effect<never, never, void>
75
- empty: Effect<never, never, void>
76
- }
77
-
78
- export const makeHandler = <R, E>(ix: InteractionBuilder<R, E>) => {
79
- const handle = run(ix.definitions)
80
-
81
- return ({
82
- headers,
83
- body,
84
- success,
85
- empty,
86
- error,
87
- }: HandleWebhookOpts<E | WebhookParseError | BadWebhookSignature>) =>
88
- handle(headers, body)
89
- .flatMap((o) =>
90
- o.match(
91
- () => empty,
92
- (a) => success(a),
93
- ),
94
- )
95
- .catchAllCause(error)
96
- }
package/src/Log/index.ts DELETED
@@ -1,23 +0,0 @@
1
- const make = (debug = false) => ({
2
- info: (...args: any[]) =>
3
- Effect.sync(() => {
4
- console.error("INFO", ...args)
5
- }),
6
- debug: (...args: any[]) =>
7
- debug
8
- ? Effect.sync(() => {
9
- console.error("DEBUG", ...args)
10
- })
11
- : Effect.unit(),
12
- })
13
-
14
- export interface Log extends ReturnType<typeof make> {}
15
- export const Log = Tag<Log>()
16
- export const LiveLog = Layer.succeed(Log)(make(false))
17
- export const LiveLogDebug = Layer.succeed(Log)(make(true))
18
-
19
- export const info = (...args: any[]) =>
20
- Effect.serviceWithEffect(Log)(({ info: log }) => log(...args))
21
-
22
- export const debug = (...args: any[]) =>
23
- Effect.serviceWithEffect(Log)(({ debug }) => debug(...args))
@@ -1,65 +0,0 @@
1
- import { delayFrom } from "./utils.js"
2
- import * as Memory from "./memory.js"
3
-
4
- export type BucketDetails = {
5
- key: "global" | string
6
- resetAfter: number
7
- limit: number
8
- }
9
-
10
- export interface RateLimitStore {
11
- hasBucket: (bucketKey: string) => Effect<never, never, boolean>
12
-
13
- putBucket: (bucket: BucketDetails) => Effect<never, never, void>
14
-
15
- getBucketForRoute: (
16
- route: string,
17
- ) => Effect<never, never, Maybe<BucketDetails>>
18
-
19
- putBucketRoute: (
20
- route: string,
21
- bucketKey: string,
22
- ) => Effect<never, never, void>
23
-
24
- incrementCounter: (
25
- key: string,
26
- window: number,
27
- limit: number,
28
- ) => Effect<never, never, readonly [count: number, ttl: number]>
29
- }
30
-
31
- export const RateLimitStore = Tag<RateLimitStore>()
32
- export const LiveMemoryRateLimitStore = Layer.sync(RateLimitStore)(Memory.make)
33
-
34
- const makeLimiter = Do(($) => {
35
- const store = $(Effect.service(RateLimitStore))
36
- const log = $(Effect.service(Log.Log))
37
-
38
- const maybeWait = (
39
- key: string,
40
- window: Duration,
41
- limit: number,
42
- multiplier = 1.05,
43
- ) => {
44
- const windowMs = window.millis * multiplier
45
- return store
46
- .incrementCounter(key, windowMs, limit)
47
- .map(([count, ttl]) => delayFrom(windowMs, limit, count, ttl))
48
- .tap((d) =>
49
- log.debug("RateLimitStore maybeWait", {
50
- key,
51
- window: window.millis,
52
- windowMs,
53
- limit,
54
- delay: d.millis,
55
- }),
56
- )
57
- .tap(Effect.sleep).asUnit
58
- }
59
-
60
- return { maybeWait }
61
- })
62
-
63
- export interface RateLimiter extends Success<typeof makeLimiter> {}
64
- export const RateLimiter = Tag<RateLimiter>()
65
- export const LiveRateLimiter = Layer.fromEffect(RateLimiter)(makeLimiter)