dfx 0.51.0 → 0.51.2

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 (335) hide show
  1. package/Cache/driver.d.ts +17 -16
  2. package/Cache/driver.d.ts.map +1 -1
  3. package/Cache/driver.js +10 -2
  4. package/Cache/driver.js.map +1 -1
  5. package/Cache/memory.d.ts +3 -3
  6. package/Cache/memory.d.ts.map +1 -1
  7. package/Cache/memory.js +55 -45
  8. package/Cache/memory.js.map +1 -1
  9. package/Cache/memoryTTL.d.ts +7 -6
  10. package/Cache/memoryTTL.d.ts.map +1 -1
  11. package/Cache/memoryTTL.js +126 -118
  12. package/Cache/memoryTTL.js.map +1 -1
  13. package/Cache/prelude.d.ts +53 -47
  14. package/Cache/prelude.d.ts.map +1 -1
  15. package/Cache/prelude.js +125 -96
  16. package/Cache/prelude.js.map +1 -1
  17. package/Cache.d.ts +33 -32
  18. package/Cache.d.ts.map +1 -1
  19. package/Cache.js +137 -65
  20. package/Cache.js.map +1 -1
  21. package/DiscordConfig.d.ts +26 -20
  22. package/DiscordConfig.d.ts.map +1 -1
  23. package/DiscordConfig.js +43 -25
  24. package/DiscordConfig.js.map +1 -1
  25. package/DiscordGateway/DiscordWS.d.ts +17 -14
  26. package/DiscordGateway/DiscordWS.d.ts.map +1 -1
  27. package/DiscordGateway/DiscordWS.js +49 -30
  28. package/DiscordGateway/DiscordWS.js.map +1 -1
  29. package/DiscordGateway/Shard/heartbeats.d.ts +7 -3
  30. package/DiscordGateway/Shard/heartbeats.d.ts.map +1 -1
  31. package/DiscordGateway/Shard/heartbeats.js +28 -18
  32. package/DiscordGateway/Shard/heartbeats.js.map +1 -1
  33. package/DiscordGateway/Shard/identify.d.ts +10 -8
  34. package/DiscordGateway/Shard/identify.d.ts.map +1 -1
  35. package/DiscordGateway/Shard/identify.js +41 -24
  36. package/DiscordGateway/Shard/identify.js.map +1 -1
  37. package/DiscordGateway/Shard/invalidSession.d.ts +6 -3
  38. package/DiscordGateway/Shard/invalidSession.d.ts.map +1 -1
  39. package/DiscordGateway/Shard/invalidSession.js +14 -5
  40. package/DiscordGateway/Shard/invalidSession.js.map +1 -1
  41. package/DiscordGateway/Shard/sendEvents.d.ts +1 -1
  42. package/DiscordGateway/Shard/sendEvents.d.ts.map +1 -1
  43. package/DiscordGateway/Shard/sendEvents.js +30 -18
  44. package/DiscordGateway/Shard/sendEvents.js.map +1 -1
  45. package/DiscordGateway/Shard/utils.d.ts +7 -3
  46. package/DiscordGateway/Shard/utils.d.ts.map +1 -1
  47. package/DiscordGateway/Shard/utils.js +19 -9
  48. package/DiscordGateway/Shard/utils.js.map +1 -1
  49. package/DiscordGateway/Shard.d.ts +15 -10
  50. package/DiscordGateway/Shard.d.ts.map +1 -1
  51. package/DiscordGateway/Shard.js +109 -87
  52. package/DiscordGateway/Shard.js.map +1 -1
  53. package/DiscordGateway/ShardStore.d.ts +9 -6
  54. package/DiscordGateway/ShardStore.d.ts.map +1 -1
  55. package/DiscordGateway/ShardStore.js +30 -18
  56. package/DiscordGateway/ShardStore.js.map +1 -1
  57. package/DiscordGateway/Sharder.d.ts +17 -11
  58. package/DiscordGateway/Sharder.d.ts.map +1 -1
  59. package/DiscordGateway/Sharder.js +82 -52
  60. package/DiscordGateway/Sharder.js.map +1 -1
  61. package/DiscordGateway/WS.d.ts +13 -10
  62. package/DiscordGateway/WS.d.ts.map +1 -1
  63. package/DiscordGateway/WS.js +100 -74
  64. package/DiscordGateway/WS.js.map +1 -1
  65. package/DiscordGateway.d.ts +19 -13
  66. package/DiscordGateway.d.ts.map +1 -1
  67. package/DiscordGateway.js +45 -32
  68. package/DiscordGateway.js.map +1 -1
  69. package/DiscordREST/types.d.ts +5 -5
  70. package/DiscordREST/types.d.ts.map +1 -1
  71. package/DiscordREST/types.js +5 -1
  72. package/DiscordREST/types.js.map +1 -1
  73. package/DiscordREST/utils.d.ts +3 -2
  74. package/DiscordREST/utils.d.ts.map +1 -1
  75. package/DiscordREST/utils.js +27 -17
  76. package/DiscordREST/utils.js.map +1 -1
  77. package/DiscordREST.d.ts +11 -8
  78. package/DiscordREST.d.ts.map +1 -1
  79. package/DiscordREST.js +141 -127
  80. package/DiscordREST.js.map +1 -1
  81. package/Helpers/flags.js +31 -19
  82. package/Helpers/flags.js.map +1 -1
  83. package/Helpers/intents.d.ts.map +1 -1
  84. package/Helpers/intents.js +22 -10
  85. package/Helpers/intents.js.map +1 -1
  86. package/Helpers/interactions.d.ts +22 -21
  87. package/Helpers/interactions.d.ts.map +1 -1
  88. package/Helpers/interactions.js +75 -39
  89. package/Helpers/interactions.js.map +1 -1
  90. package/Helpers/members.d.ts +3 -3
  91. package/Helpers/members.d.ts.map +1 -1
  92. package/Helpers/members.js +10 -3
  93. package/Helpers/members.js.map +1 -1
  94. package/Helpers/permissions.d.ts +5 -4
  95. package/Helpers/permissions.d.ts.map +1 -1
  96. package/Helpers/permissions.js +69 -52
  97. package/Helpers/permissions.js.map +1 -1
  98. package/Helpers/ui.d.ts +1 -1
  99. package/Helpers/ui.d.ts.map +1 -1
  100. package/Helpers/ui.js +44 -29
  101. package/Helpers/ui.js.map +1 -1
  102. package/Interactions/builder.d.ts +20 -19
  103. package/Interactions/builder.d.ts.map +1 -1
  104. package/Interactions/builder.js +66 -63
  105. package/Interactions/builder.js.map +1 -1
  106. package/Interactions/context.d.ts +26 -23
  107. package/Interactions/context.d.ts.map +1 -1
  108. package/Interactions/context.js +86 -57
  109. package/Interactions/context.js.map +1 -1
  110. package/Interactions/definitions.d.ts +33 -30
  111. package/Interactions/definitions.d.ts.map +1 -1
  112. package/Interactions/definitions.js +61 -47
  113. package/Interactions/definitions.js.map +1 -1
  114. package/Interactions/gateway.d.ts +15 -10
  115. package/Interactions/gateway.d.ts.map +1 -1
  116. package/Interactions/gateway.js +55 -42
  117. package/Interactions/gateway.js.map +1 -1
  118. package/Interactions/handlers.d.ts +6 -4
  119. package/Interactions/handlers.d.ts.map +1 -1
  120. package/Interactions/handlers.js +68 -57
  121. package/Interactions/handlers.js.map +1 -1
  122. package/Interactions/index.d.ts +11 -10
  123. package/Interactions/index.d.ts.map +1 -1
  124. package/Interactions/index.js +95 -10
  125. package/Interactions/index.js.map +1 -1
  126. package/Interactions/utils.d.ts +42 -40
  127. package/Interactions/utils.d.ts.map +1 -1
  128. package/Interactions/utils.js +40 -32
  129. package/Interactions/utils.js.map +1 -1
  130. package/Interactions/webhook.d.ts +20 -16
  131. package/Interactions/webhook.d.ts.map +1 -1
  132. package/Interactions/webhook.js +73 -41
  133. package/Interactions/webhook.js.map +1 -1
  134. package/Log.d.ts +8 -5
  135. package/Log.d.ts.map +1 -1
  136. package/Log.js +23 -14
  137. package/Log.js.map +1 -1
  138. package/RateLimit/memory.d.ts +1 -1
  139. package/RateLimit/memory.d.ts.map +1 -1
  140. package/RateLimit/memory.js +46 -33
  141. package/RateLimit/memory.js.map +1 -1
  142. package/RateLimit/utils.d.ts +1 -1
  143. package/RateLimit/utils.d.ts.map +1 -1
  144. package/RateLimit/utils.js +23 -16
  145. package/RateLimit/utils.js.map +1 -1
  146. package/RateLimit.d.ts +18 -14
  147. package/RateLimit.d.ts.map +1 -1
  148. package/RateLimit.js +40 -26
  149. package/RateLimit.js.map +1 -1
  150. package/gateway.d.ts +20 -13
  151. package/gateway.d.ts.map +1 -1
  152. package/gateway.js +72 -25
  153. package/gateway.js.map +1 -1
  154. package/index.d.ts +14 -13
  155. package/index.d.ts.map +1 -1
  156. package/index.js +71 -13
  157. package/index.js.map +1 -1
  158. package/mjs/Cache/driver.mjs +3 -0
  159. package/mjs/Cache/driver.mjs.map +1 -0
  160. package/mjs/Cache/memory.mjs +48 -0
  161. package/mjs/Cache/memory.mjs.map +1 -0
  162. package/mjs/Cache/memoryTTL.mjs +119 -0
  163. package/mjs/Cache/memoryTTL.mjs.map +1 -0
  164. package/mjs/Cache/prelude.mjs +125 -0
  165. package/mjs/Cache/prelude.mjs.map +1 -0
  166. package/mjs/Cache.mjs +87 -0
  167. package/mjs/Cache.mjs.map +1 -0
  168. package/mjs/DiscordConfig.mjs +34 -0
  169. package/mjs/DiscordConfig.mjs.map +1 -0
  170. package/mjs/DiscordGateway/DiscordWS.mjs +39 -0
  171. package/mjs/DiscordGateway/DiscordWS.mjs.map +1 -0
  172. package/mjs/DiscordGateway/Shard/heartbeats.mjs +21 -0
  173. package/mjs/DiscordGateway/Shard/heartbeats.mjs.map +1 -0
  174. package/mjs/DiscordGateway/Shard/identify.mjs +37 -0
  175. package/mjs/DiscordGateway/Shard/identify.mjs.map +1 -0
  176. package/mjs/DiscordGateway/Shard/invalidSession.mjs +6 -0
  177. package/mjs/DiscordGateway/Shard/invalidSession.mjs.map +1 -0
  178. package/mjs/DiscordGateway/Shard/sendEvents.mjs +25 -0
  179. package/mjs/DiscordGateway/Shard/sendEvents.mjs.map +1 -0
  180. package/mjs/DiscordGateway/Shard/utils.mjs +11 -0
  181. package/mjs/DiscordGateway/Shard/utils.mjs.map +1 -0
  182. package/mjs/DiscordGateway/Shard.mjs +99 -0
  183. package/mjs/DiscordGateway/Shard.mjs.map +1 -0
  184. package/mjs/DiscordGateway/ShardStore.mjs +24 -0
  185. package/mjs/DiscordGateway/ShardStore.mjs.map +1 -0
  186. package/mjs/DiscordGateway/Sharder.mjs +73 -0
  187. package/mjs/DiscordGateway/Sharder.mjs.map +1 -0
  188. package/mjs/DiscordGateway/WS.mjs +94 -0
  189. package/mjs/DiscordGateway/WS.mjs.map +1 -0
  190. package/mjs/DiscordGateway.mjs +36 -0
  191. package/mjs/DiscordGateway.mjs.map +1 -0
  192. package/mjs/DiscordREST/types.mjs +2 -0
  193. package/mjs/DiscordREST/types.mjs.map +1 -0
  194. package/mjs/DiscordREST/utils.mjs +19 -0
  195. package/mjs/DiscordREST/utils.mjs.map +1 -0
  196. package/mjs/DiscordREST.mjs +129 -0
  197. package/mjs/DiscordREST.mjs.map +1 -0
  198. package/mjs/Helpers/flags.mjs +36 -0
  199. package/mjs/Helpers/flags.mjs.map +1 -0
  200. package/mjs/Helpers/intents.mjs +27 -0
  201. package/mjs/Helpers/intents.mjs.map +1 -0
  202. package/mjs/Helpers/interactions.mjs +104 -0
  203. package/mjs/Helpers/interactions.mjs.map +1 -0
  204. package/mjs/Helpers/members.mjs +9 -0
  205. package/mjs/Helpers/members.mjs.map +1 -0
  206. package/mjs/Helpers/permissions.mjs +82 -0
  207. package/mjs/Helpers/permissions.mjs.map +1 -0
  208. package/mjs/Helpers/ui.mjs +66 -0
  209. package/mjs/Helpers/ui.mjs.map +1 -0
  210. package/mjs/Interactions/builder.mjs +62 -0
  211. package/mjs/Interactions/builder.mjs.map +1 -0
  212. package/mjs/Interactions/context.mjs +63 -0
  213. package/mjs/Interactions/context.mjs.map +1 -0
  214. package/mjs/Interactions/definitions.mjs +51 -0
  215. package/mjs/Interactions/definitions.mjs.map +1 -0
  216. package/mjs/Interactions/gateway.mjs +48 -0
  217. package/mjs/Interactions/gateway.mjs.map +1 -0
  218. package/mjs/Interactions/handlers.mjs +61 -0
  219. package/mjs/Interactions/handlers.mjs.map +1 -0
  220. package/mjs/Interactions/index.mjs +12 -0
  221. package/mjs/Interactions/index.mjs.map +1 -0
  222. package/mjs/Interactions/utils.mjs +35 -0
  223. package/mjs/Interactions/utils.mjs.map +1 -0
  224. package/mjs/Interactions/webhook.mjs +73 -0
  225. package/mjs/Interactions/webhook.mjs.map +1 -0
  226. package/mjs/Log.mjs +15 -0
  227. package/mjs/Log.mjs.map +1 -0
  228. package/mjs/RateLimit/memory.mjs +39 -0
  229. package/mjs/RateLimit/memory.mjs.map +1 -0
  230. package/mjs/RateLimit/utils.mjs +18 -0
  231. package/mjs/RateLimit/utils.mjs.map +1 -0
  232. package/mjs/RateLimit.mjs +29 -0
  233. package/mjs/RateLimit.mjs.map +1 -0
  234. package/mjs/gateway.mjs +27 -0
  235. package/mjs/gateway.mjs.map +1 -0
  236. package/mjs/index.mjs +15 -0
  237. package/mjs/index.mjs.map +1 -0
  238. package/mjs/types.mjs +1211 -0
  239. package/mjs/types.mjs.map +1 -0
  240. package/mjs/utils/Effect.mjs +28 -0
  241. package/mjs/utils/Effect.mjs.map +1 -0
  242. package/mjs/utils/tsplus.mjs +2 -0
  243. package/mjs/utils/tsplus.mjs.map +1 -0
  244. package/mjs/version.mjs +2 -0
  245. package/mjs/version.mjs.map +1 -0
  246. package/mjs/webhooks.mjs +30 -0
  247. package/mjs/webhooks.mjs.map +1 -0
  248. package/package.json +46 -50
  249. package/src/Cache/driver.ts +27 -15
  250. package/src/Cache/memory.ts +9 -5
  251. package/src/Cache/memoryTTL.ts +69 -53
  252. package/src/Cache/prelude.ts +113 -91
  253. package/src/Cache.ts +73 -58
  254. package/src/DiscordConfig.ts +33 -19
  255. package/src/DiscordGateway/DiscordWS.ts +28 -25
  256. package/src/DiscordGateway/Shard/heartbeats.ts +47 -27
  257. package/src/DiscordGateway/Shard/identify.ts +29 -25
  258. package/src/DiscordGateway/Shard/invalidSession.ts +9 -7
  259. package/src/DiscordGateway/Shard/sendEvents.ts +1 -1
  260. package/src/DiscordGateway/Shard/utils.ts +33 -9
  261. package/src/DiscordGateway/Shard.ts +119 -99
  262. package/src/DiscordGateway/ShardStore.ts +12 -5
  263. package/src/DiscordGateway/Sharder.ts +95 -74
  264. package/src/DiscordGateway/WS.ts +85 -60
  265. package/src/DiscordGateway.ts +58 -18
  266. package/src/DiscordREST/types.ts +5 -5
  267. package/src/DiscordREST/utils.ts +10 -7
  268. package/src/DiscordREST.ts +152 -132
  269. package/src/Helpers/intents.ts +1 -0
  270. package/src/Helpers/interactions.ts +51 -38
  271. package/src/Helpers/members.ts +2 -0
  272. package/src/Helpers/permissions.ts +6 -5
  273. package/src/Helpers/ui.ts +1 -1
  274. package/src/Interactions/builder.ts +56 -43
  275. package/src/Interactions/context.ts +68 -38
  276. package/src/Interactions/definitions.ts +32 -24
  277. package/src/Interactions/gateway.ts +72 -47
  278. package/src/Interactions/handlers.ts +56 -39
  279. package/src/Interactions/index.ts +6 -5
  280. package/src/Interactions/utils.ts +32 -21
  281. package/src/Interactions/webhook.ts +78 -42
  282. package/src/Log.ts +4 -0
  283. package/src/RateLimit/memory.ts +10 -4
  284. package/src/RateLimit/utils.ts +1 -1
  285. package/src/RateLimit.ts +38 -25
  286. package/src/gateway.ts +62 -25
  287. package/src/index.ts +29 -15
  288. package/src/utils/Effect.ts +69 -0
  289. package/src/version.ts +1 -0
  290. package/src/webhooks.ts +47 -20
  291. package/tsconfig.base.json +48 -0
  292. package/tsconfig.build.json +10 -0
  293. package/tsconfig.examples.json +11 -0
  294. package/tsconfig.json +12 -8
  295. package/tsconfig.madge.json +12 -0
  296. package/tsconfig.test.json +10 -0
  297. package/types.d.ts.map +1 -1
  298. package/types.js +1216 -1200
  299. package/types.js.map +1 -1
  300. package/utils/Effect.d.ts +8 -0
  301. package/utils/Effect.d.ts.map +1 -0
  302. package/utils/Effect.js +38 -0
  303. package/utils/Effect.js.map +1 -0
  304. package/utils/tsplus.js +5 -1
  305. package/utils/tsplus.js.map +1 -1
  306. package/version.d.ts +2 -0
  307. package/version.d.ts.map +1 -0
  308. package/version.js +9 -0
  309. package/version.js.map +1 -0
  310. package/webhooks.d.ts +14 -9
  311. package/webhooks.d.ts.map +1 -1
  312. package/webhooks.js +76 -27
  313. package/webhooks.js.map +1 -1
  314. package/_common.d.ts +0 -37
  315. package/_common.d.ts.map +0 -1
  316. package/_common.js +0 -8
  317. package/_common.js.map +0 -1
  318. package/global.d.ts +0 -18
  319. package/global.d.ts.map +0 -1
  320. package/global.js +0 -2
  321. package/global.js.map +0 -1
  322. package/src/_common.ts +0 -43
  323. package/src/global.ts +0 -45
  324. package/src/package.json +0 -52
  325. package/src/utils/effect.ts +0 -0
  326. package/src/utils/hub.ts +0 -47
  327. package/tsplus.config.json +0 -8
  328. package/utils/effect.d.ts +0 -2
  329. package/utils/effect.d.ts.map +0 -1
  330. package/utils/effect.js +0 -2
  331. package/utils/effect.js.map +0 -1
  332. package/utils/hub.d.ts +0 -12
  333. package/utils/hub.d.ts.map +0 -1
  334. package/utils/hub.js +0 -26
  335. package/utils/hub.js.map +0 -1
@@ -0,0 +1,129 @@
1
+ import * as Http from "@effect-http/client";
2
+ import { Tag } from "@effect/data/Context";
3
+ import * as Duration from "@effect/data/Duration";
4
+ import { millis } from "@effect/data/Duration";
5
+ import * as HashSet from "@effect/data/HashSet";
6
+ import * as Option from "@effect/data/Option";
7
+ import * as ConfigSecret from "@effect/io/Config/Secret";
8
+ import * as Effect from "@effect/io/Effect";
9
+ import * as Layer from "@effect/io/Layer";
10
+ import * as Ref from "@effect/io/Ref";
11
+ import { DiscordConfig } from "dfx/DiscordConfig";
12
+ import { rateLimitFromHeaders, retryAfter, routeFromConfig } from "dfx/DiscordREST/utils";
13
+ import { Log } from "dfx/Log";
14
+ import { LiveRateLimiter, RateLimitStore, RateLimiter } from "dfx/RateLimit";
15
+ import * as Discord from "dfx/types";
16
+ import { LIB_VERSION } from "dfx/version";
17
+ export class DiscordRESTError {
18
+ error;
19
+ body;
20
+ _tag = "DiscordRESTError";
21
+ constructor(error, body) {
22
+ this.error = error;
23
+ this.body = body;
24
+ }
25
+ }
26
+ export { ResponseDecodeError } from "@effect-http/client";
27
+ const make = /*#__PURE__*/Effect.gen(function* (_) {
28
+ const {
29
+ rest,
30
+ token
31
+ } = yield* _(DiscordConfig);
32
+ const http = yield* _(Http.HttpRequestExecutor);
33
+ const log = yield* _(Log);
34
+ const store = yield* _(RateLimitStore);
35
+ const {
36
+ maybeWait
37
+ } = yield* _(RateLimiter);
38
+ const globalRateLimit = maybeWait("dfx.rest.global", Duration.decode(rest.globalRateLimit.window), rest.globalRateLimit.limit);
39
+ // Invalid route handling (40x)
40
+ const badRoutesRef = yield* _(Ref.make(HashSet.empty()));
41
+ const tenMinutes = Duration.toMillis(Duration.minutes(10));
42
+ const addBadRoute = route => Effect.all(log.info("DiscordREST", "addBadRoute", route), Ref.update(badRoutesRef, HashSet.add(route)), store.incrementCounter("dfx.rest.invalid", tenMinutes, 10000), {
43
+ discard: true,
44
+ concurrency: "unbounded"
45
+ });
46
+ const isBadRoute = route => Effect.map(Ref.get(badRoutesRef), HashSet.has(route));
47
+ const removeBadRoute = route => Ref.update(badRoutesRef, HashSet.remove(route));
48
+ const invalidRateLimit = route => isBadRoute(route).pipe(Effect.tap(invalid => invalid ? maybeWait("dfx.rest.invalid", Duration.minutes(10), 10000) : Effect.unit), Effect.asUnit);
49
+ // Request rate limiting
50
+ const requestRateLimit = (path, request) => Effect.Do.pipe(Effect.let("route", () => routeFromConfig(path, request.method)), Effect.bind("maybeBucket", ({
51
+ route
52
+ }) => store.getBucketForRoute(route)), Effect.flatMap(({
53
+ maybeBucket,
54
+ route
55
+ }) => Option.match(maybeBucket, {
56
+ onNone: () => invalidRateLimit(route),
57
+ onSome: bucket => Effect.zipRight(invalidRateLimit(route), maybeWait(`dfx.rest.${bucket.key}`, millis(bucket.resetAfter), bucket.limit))
58
+ })));
59
+ // Update rate limit buckets
60
+ const updateBuckets = (request, response) => Effect.Do.pipe(Effect.let("route", () => routeFromConfig(request.url, request.method)), Effect.bind("rateLimit", () => rateLimitFromHeaders(response.headers)), Effect.bind("hasBucket", ({
61
+ rateLimit
62
+ }) => store.hasBucket(rateLimit.bucket)), Effect.flatMap(({
63
+ hasBucket,
64
+ rateLimit,
65
+ route
66
+ }) => {
67
+ const effectsToRun = [removeBadRoute(route), store.putBucketRoute(route, rateLimit.bucket)];
68
+ if (!hasBucket || rateLimit.limit - 1 === rateLimit.remaining) {
69
+ effectsToRun.push(store.removeCounter(`dfx.rest.?.${route}`), store.putBucket({
70
+ key: rateLimit.bucket,
71
+ resetAfter: Duration.toMillis(rateLimit.retryAfter),
72
+ limit: !hasBucket && rateLimit.remaining > 0 ? rateLimit.remaining : rateLimit.limit
73
+ }));
74
+ }
75
+ return Effect.all(effectsToRun, {
76
+ concurrency: "unbounded",
77
+ discard: true
78
+ });
79
+ }), Effect.ignore);
80
+ const httpExecutor = Http.executor.catchAll(error => error._tag === "StatusCodeError" ? error.response.json.pipe(Effect.mapError(_ => new DiscordRESTError(_)), Effect.flatMap(body => Effect.fail(new DiscordRESTError(error, body)))) : Effect.fail(new DiscordRESTError(error)))(Http.executor.contramap(req => Http.setHeaders({
81
+ Authorization: `Bot ${ConfigSecret.value(token)}`,
82
+ "User-Agent": `DiscordBot (https://github.com/tim-smart/dfx, ${LIB_VERSION})`
83
+ })(Http.updateUrl(req, _ => `${rest.baseUrl}${_}`)))(Http.executor.filterStatusOk(http.execute)));
84
+ const executor = request => requestRateLimit(request.url, request).pipe(Effect.zipLeft(globalRateLimit), Effect.zipRight(httpExecutor(request)), Effect.tap(response => updateBuckets(request, response)), Effect.catchTag("DiscordRESTError", e => {
85
+ if (e.error._tag !== "StatusCodeError") {
86
+ return Effect.fail(e);
87
+ }
88
+ const response = e.error.response;
89
+ switch (e.error.status) {
90
+ case 403:
91
+ return Effect.zipRight(Effect.all([log.info("DiscordREST", "403", request.url), addBadRoute(routeFromConfig(request.url, request.method)), updateBuckets(request, response)], {
92
+ concurrency: "unbounded",
93
+ discard: true
94
+ }), Effect.fail(e));
95
+ case 429:
96
+ return Effect.zipRight(Effect.all(log.info("DiscordREST", "429", request.url), addBadRoute(routeFromConfig(request.url, request.method)), updateBuckets(request, response), Effect.sleep(Option.getOrElse(retryAfter(response.headers), () => Duration.seconds(5))), {
97
+ concurrency: "unbounded",
98
+ discard: true
99
+ }), executor(request));
100
+ }
101
+ return Effect.fail(e);
102
+ }));
103
+ const routes = Discord.createRoutes(({
104
+ method,
105
+ options = {},
106
+ params,
107
+ url
108
+ }) => {
109
+ const hasBody = method !== "GET" && method !== "DELETE";
110
+ let request = Http.make(method)(url, options);
111
+ if (!hasBody) {
112
+ if (params) {
113
+ request = Http.appendParams(request, params);
114
+ }
115
+ } else if (params && request.body._tag === "Some" && request.body.value._tag === "FormDataBody") {
116
+ request.body.value.value.append("payload_json", JSON.stringify(params));
117
+ } else if (params) {
118
+ request = Http.jsonBody(request, params);
119
+ }
120
+ return executor(request);
121
+ });
122
+ return {
123
+ ...routes,
124
+ executor
125
+ };
126
+ });
127
+ export const DiscordREST = /*#__PURE__*/Tag();
128
+ export const LiveDiscordREST = /*#__PURE__*/Layer.provide(LiveRateLimiter, /*#__PURE__*/Layer.effect(DiscordREST, make));
129
+ //# sourceMappingURL=DiscordREST.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DiscordREST.mjs","names":["Http","Tag","Duration","millis","HashSet","Option","ConfigSecret","Effect","Layer","Ref","DiscordConfig","rateLimitFromHeaders","retryAfter","routeFromConfig","Log","LiveRateLimiter","RateLimitStore","RateLimiter","Discord","LIB_VERSION","DiscordRESTError","error","body","_tag","constructor","ResponseDecodeError","make","gen","_","rest","token","http","HttpRequestExecutor","log","store","maybeWait","globalRateLimit","decode","window","limit","badRoutesRef","empty","tenMinutes","toMillis","minutes","addBadRoute","route","all","info","update","add","incrementCounter","discard","concurrency","isBadRoute","map","get","has","removeBadRoute","remove","invalidRateLimit","pipe","tap","invalid","unit","asUnit","requestRateLimit","path","request","Do","let","method","bind","getBucketForRoute","flatMap","maybeBucket","match","onNone","onSome","bucket","zipRight","key","resetAfter","updateBuckets","response","url","headers","rateLimit","hasBucket","effectsToRun","putBucketRoute","remaining","push","removeCounter","putBucket","ignore","httpExecutor","executor","catchAll","json","mapError","fail","contramap","req","setHeaders","Authorization","value","updateUrl","baseUrl","filterStatusOk","execute","zipLeft","catchTag","e","status","sleep","getOrElse","seconds","routes","createRoutes","options","params","hasBody","appendParams","append","JSON","stringify","jsonBody","DiscordREST","LiveDiscordREST","provide","effect"],"sources":["../src/DiscordREST.ts"],"sourcesContent":[null],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ export function all(flags) {
2
+ return Object.values(flags).reduce((acc, flag) => acc | flag);
3
+ }
4
+ export function toList(flags) {
5
+ const entries = Object.entries(flags);
6
+ return val => entries.reduce((acc, [key, flag]) => (val & flag) === flag ? [...acc, key] : acc, []);
7
+ }
8
+ /**
9
+ * Returns a function that converts a list of flags names to a bigint bitfield.
10
+ */
11
+ export const fromListBigint = flags => list => list.reduce((acc, key) => acc | flags[key], BigInt(0));
12
+ /**
13
+ * Returns a function that converts a list of flags names to a bitfield.
14
+ */
15
+ export const fromList = flags => list => list.reduce((acc, key) => acc | flags[key], 0);
16
+ /**
17
+ * Checks if a bigint bitfield contains and a flag value.
18
+ */
19
+ export const hasBigInt = flag => {
20
+ const flagBigInt = BigInt(flag);
21
+ return bits => {
22
+ const bitsBigInt = BigInt(bits);
23
+ return (bitsBigInt & flagBigInt) === flagBigInt;
24
+ };
25
+ };
26
+ /**
27
+ * Checks if a bitfield contains and a flag value.
28
+ */
29
+ export const has = flag => {
30
+ const flagNumber = +flag;
31
+ return bits => {
32
+ const bitsNumber = +bits;
33
+ return (bitsNumber & flagNumber) === flagNumber;
34
+ };
35
+ };
36
+ //# sourceMappingURL=flags.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flags.mjs","names":["all","flags","Object","values","reduce","acc","flag","toList","entries","val","key","fromListBigint","list","BigInt","fromList","hasBigInt","flagBigInt","bits","bitsBigInt","has","flagNumber","bitsNumber"],"sources":["../../src/Helpers/flags.ts"],"sourcesContent":[null],"mappings":"AAOA,OAAM,SAAUA,GAAGA,CAACC,KAAiB;EACnC,OAAOC,MAAM,CAACC,MAAM,CAACF,KAAK,CAAC,CAACG,MAAM,CAAC,CAACC,GAAG,EAAEC,IAAI,KAAKD,GAAG,GAAGC,IAAI,CAAC;AAC/D;AAWA,OAAM,SAAUC,MAAMA,CACpBN,KAAQ;EAER,MAAMO,OAAO,GAAGN,MAAM,CAACM,OAAO,CAACP,KAAK,CAAC;EACrC,OAAOQ,GAAG,IACRD,OAAO,CAACJ,MAAM,CACZ,CAACC,GAAG,EAAE,CAACK,GAAG,EAAEJ,IAAI,CAAC,KAAM,CAACG,GAAG,GAAGH,IAAI,MAAMA,IAAI,GAAG,CAAC,GAAGD,GAAG,EAAEK,GAAG,CAAC,GAAGL,GAAI,EACnE,EAAiB,CAClB;AACL;AAEA;;;AAGA,OAAO,MAAMM,cAAc,GACCV,KAAQ,IACjCW,IAAiB,IAChBA,IAAI,CAACR,MAAM,CAAC,CAACC,GAAG,EAAEK,GAAG,KAAKL,GAAG,GAAGJ,KAAK,CAACS,GAAG,CAAC,EAAEG,MAAM,CAAC,CAAC,CAAC,CAAC;AAE1D;;;AAGA,OAAO,MAAMC,QAAQ,GACOb,KAAQ,IACjCW,IAAiB,IAChBA,IAAI,CAACR,MAAM,CAAC,CAACC,GAAG,EAAEK,GAAG,KAAKL,GAAG,GAAGJ,KAAK,CAACS,GAAG,CAAC,EAAE,CAAC,CAAC;AAElD;;;AAGA,OAAO,MAAMK,SAAS,GAAIT,IAAqB,IAAI;EACjD,MAAMU,UAAU,GAAGH,MAAM,CAACP,IAAI,CAAC;EAC/B,OAAQW,IAAqB,IAAI;IAC/B,MAAMC,UAAU,GAAGL,MAAM,CAACI,IAAI,CAAC;IAC/B,OAAO,CAACC,UAAU,GAAGF,UAAU,MAAMA,UAAU;EACjD,CAAC;AACH,CAAC;AAED;;;AAGA,OAAO,MAAMG,GAAG,GAAIb,IAAqB,IAAI;EAC3C,MAAMc,UAAU,GAAG,CAACd,IAAI;EACxB,OAAQW,IAAqB,IAAI;IAC/B,MAAMI,UAAU,GAAG,CAACJ,IAAI;IACxB,OAAO,CAACI,UAAU,GAAGD,UAAU,MAAMA,UAAU;EACjD,CAAC;AACH,CAAC"}
@@ -0,0 +1,27 @@
1
+ import * as Flags from "dfx/Helpers/flags";
2
+ import * as Discord from "dfx/types";
3
+ /**
4
+ * All the intents
5
+ */
6
+ export const ALL = /*#__PURE__*/Flags.all(Discord.GatewayIntents);
7
+ /**
8
+ * Privileged intents
9
+ */
10
+ export const PRIVILEGED = Discord.GatewayIntents.GUILD_PRESENCES | Discord.GatewayIntents.GUILD_MEMBERS | Discord.GatewayIntents.MESSAGE_CONTENT;
11
+ /**
12
+ * Un-privileged intents
13
+ */
14
+ export const UNPRIVILEGED = ALL ^ PRIVILEGED;
15
+ /**
16
+ * Function that converts a intents bitfield value to a list of intent names.
17
+ */
18
+ export const toList = /*#__PURE__*/Flags.toList(Discord.GatewayIntents);
19
+ /**
20
+ * Function that converts a list of intent names to a bitfield value.
21
+ */
22
+ export const fromList = /*#__PURE__*/Flags.fromList(Discord.GatewayIntents);
23
+ /**
24
+ * Check if an intent flag exists in the permissions.
25
+ */
26
+ export const has = Flags.has;
27
+ //# sourceMappingURL=intents.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intents.mjs","names":["Flags","Discord","ALL","all","GatewayIntents","PRIVILEGED","GUILD_PRESENCES","GUILD_MEMBERS","MESSAGE_CONTENT","UNPRIVILEGED","toList","fromList","has"],"sources":["../../src/Helpers/intents.ts"],"sourcesContent":[null],"mappings":"AAAA,OAAO,KAAKA,KAAK,MAAM,mBAAmB;AAC1C,OAAO,KAAKC,OAAO,MAAM,WAAW;AAEpC;;;AAGA,OAAO,MAAMC,GAAG,gBAAGF,KAAK,CAACG,GAAG,CAACF,OAAO,CAACG,cAAc,CAAC;AAEpD;;;AAGA,OAAO,MAAMC,UAAU,GACrBJ,OAAO,CAACG,cAAc,CAACE,eAAe,GACtCL,OAAO,CAACG,cAAc,CAACG,aAAa,GACpCN,OAAO,CAACG,cAAc,CAACI,eAAe;AAExC;;;AAGA,OAAO,MAAMC,YAAY,GAAGP,GAAG,GAAGG,UAAU;AAE5C;;;AAGA,OAAO,MAAMK,MAAM,gBAAGV,KAAK,CAACU,MAAM,CAACT,OAAO,CAACG,cAAc,CAAC;AAE1D;;;AAGA,OAAO,MAAMO,QAAQ,gBAAGX,KAAK,CAACW,QAAQ,CAACV,OAAO,CAACG,cAAc,CAAC;AAE9D;;;AAGA,OAAO,MAAMQ,GAAG,GAAGZ,KAAK,CAACY,GAAG"}
@@ -0,0 +1,104 @@
1
+ import * as Option from "@effect/data/Option";
2
+ import * as Arr from "@effect/data/ReadonlyArray";
3
+ import { identity } from "@effect/data/Function";
4
+ import * as HashMap from "@effect/data/HashMap";
5
+ /**
6
+ * Option find a sub-command within the interaction options.
7
+ */
8
+ export const allSubCommands = interaction => Arr.filter(o => o.type === 1 /* Discord.ApplicationCommandOptionType.SUB_COMMAND */)(optionsWithNested(interaction));
9
+ /**
10
+ * Option find a sub-command within the interaction options.
11
+ */
12
+ export const findSubCommand = name => interaction => Arr.findFirst(o => o.type === 1 /* Discord.ApplicationCommandOptionType.SUB_COMMAND */ && o.name === name)(optionsWithNested(interaction));
13
+ /**
14
+ * If the sub-command exists return `true`, else `false`.
15
+ */
16
+ export const isSubCommand = name => _ => Option.isSome(findSubCommand(name)(_));
17
+ /**
18
+ * Option get the options for a sub-command
19
+ */
20
+ export const subCommandOptions = name => _ => Option.flatMapNullable(findSubCommand(name)(_), o => o.options);
21
+ /**
22
+ * A lens for accessing nested options in a interaction.
23
+ */
24
+ export const optionsWithNested = data => {
25
+ const optsFromOption = opt => Option.fromNullable(opt.options).pipe(Option.map(opts => [...opts, ...opts.flatMap(optsFromOption)]), Option.match({
26
+ onNone: () => [],
27
+ onSome: identity
28
+ }));
29
+ return Option.fromNullable(data.options).pipe(Option.map(opts => [...opts, ...opts.flatMap(optsFromOption)]), Option.getOrElse(() => []));
30
+ };
31
+ /**
32
+ * Return the interaction options as a name / value map.
33
+ */
34
+ export const transformOptions = options => options.reduce((map, option) => HashMap.set(map, option.name, option.value), HashMap.empty());
35
+ /**
36
+ * Return the interaction options as a name / value map.
37
+ */
38
+ export const optionsMap = data => transformOptions(optionsWithNested(data));
39
+ /**
40
+ * Try find a matching option from the interaction.
41
+ */
42
+ export const getOption = name => data => Arr.findFirst(optionsWithNested(data), o => o.name === name);
43
+ /**
44
+ * Try find a matching option from the interaction.
45
+ */
46
+ export const focusedOption = data => Arr.findFirst(optionsWithNested(data), o => o.focused === true);
47
+ /**
48
+ * Try find a matching option value from the interaction.
49
+ */
50
+ export const optionValue = name => data => Option.flatMapNullable(getOption(name)(data), o => o.value);
51
+ /**
52
+ * Try extract resolved data
53
+ */
54
+ export const resolved = data => Option.flatMapNullable(Option.fromNullable(data.data), a => a.resolved);
55
+ /**
56
+ * Try find a matching option value from the interaction.
57
+ */
58
+ export const resolveOptionValue = (name, f) => a => Option.Do().pipe(Option.bind("data", () => Option.fromNullable(a.data)), Option.bind("id", ({
59
+ data
60
+ }) => Option.flatMapNullable(getOption(name)(data), ({
61
+ value
62
+ }) => value)), Option.bind("r", () => resolved(a)), Option.flatMapNullable(({
63
+ id,
64
+ r
65
+ }) => f(id, r)));
66
+ /**
67
+ * Try find matching option values from the interaction.
68
+ */
69
+ export const resolveValues = f => a => Option.Do().pipe(Option.bind("values", () => Option.flatMapNullable(Option.fromNullable(a.data), a => a.values)), Option.bind("r", () => resolved(a)), Option.map(({
70
+ values,
71
+ r
72
+ }) => Arr.compact(values.map(a => Option.fromNullable(f(a, r))))));
73
+ const extractComponents = c => {
74
+ if ("components" in c) {
75
+ return [...c.components, ...c.components.flatMap(extractComponents)];
76
+ }
77
+ return [];
78
+ };
79
+ /**
80
+ * A lens for accessing the components in a interaction.
81
+ */
82
+ export const components = a => [...a.components, ...a.components.flatMap(extractComponents)];
83
+ /**
84
+ * A lens for accessing the components in a interaction.
85
+ */
86
+ export const componentsWithValue = data => Arr.filter(components(data), c => "value" in c && c.value !== undefined);
87
+ /**
88
+ * Return the interaction components as an id / value map.
89
+ */
90
+ export const transformComponents = options => options.reduce((map, c) => c.custom_id ? HashMap.set(map, c.custom_id, c.value) : map, HashMap.empty());
91
+ /**
92
+ * Return the interaction components as an id / value map.
93
+ */
94
+ export const componentsMap = data => transformComponents(components(data));
95
+ /**
96
+ * Try find a matching component from the interaction.
97
+ */
98
+ export const getComponent = id => data => Arr.findFirst(components(data), o => o.custom_id === id);
99
+ /**
100
+ * Try find a matching component value from the interaction.
101
+ */
102
+ export const componentValue = id => data => Option.flatMapNullable(getComponent(id)(data), o => o.value);
103
+ export const response = r => r;
104
+ //# sourceMappingURL=interactions.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interactions.mjs","names":["Option","Arr","identity","HashMap","allSubCommands","interaction","filter","o","type","optionsWithNested","findSubCommand","name","findFirst","isSubCommand","_","isSome","subCommandOptions","flatMapNullable","options","data","optsFromOption","opt","fromNullable","pipe","map","opts","flatMap","match","onNone","onSome","getOrElse","transformOptions","reduce","option","set","value","empty","optionsMap","getOption","focusedOption","focused","optionValue","resolved","a","resolveOptionValue","f","Do","bind","id","r","resolveValues","values","compact","extractComponents","c","components","componentsWithValue","undefined","transformComponents","custom_id","componentsMap","getComponent","componentValue","response"],"sources":["../../src/Helpers/interactions.ts"],"sourcesContent":[null],"mappings":"AAAA,OAAO,KAAKA,MAAM,MAAM,qBAAqB;AAC7C,OAAO,KAAKC,GAAG,MAAM,4BAA4B;AAEjD,SAASC,QAAQ,QAAc,uBAAuB;AACtD,OAAO,KAAKC,OAAO,MAAM,sBAAsB;AAE/C;;;AAGA,OAAO,MAAMC,cAAc,GAAIC,WAA4C,IAGvEJ,GAAG,CAACK,MAAM,CACRC,CAAC,IAAIA,CAAC,CAACC,IAAI,6DAAqD,CACjE,CAHDC,iBAAiB,CAACJ,WAAW,CAAC,CAI/B;AAEH;;;AAGA,OAAO,MAAMK,cAAc,GACxBC,IAAY,IAAMN,WAA4C,IAG3DJ,GAAG,CAACW,SAAS,CACXL,CAAC,IACCA,CAAC,CAACC,IAAI,iEACND,CAAC,CAACI,IAAI,KAAKA,IAAI,CAClB,CALDF,iBAAiB,CAACJ,WAAW,CAAC,CAM/B;AAEL;;;AAGA,OAAO,MAAMQ,YAAY,GACtBF,IAAY,IAAMG,CAAkC,IACnDd,MAAM,CAACe,MAAM,CAACL,cAAc,CAACC,IAAI,CAAC,CAACG,CAAC,CAAC,CAAC;AAE1C;;;AAGA,OAAO,MAAME,iBAAiB,GAC3BL,IAAY,IAAMG,CAAkC,IACnDd,MAAM,CAACiB,eAAe,CAACP,cAAc,CAACC,IAAI,CAAC,CAACG,CAAC,CAAC,EAAEP,CAAC,IAAIA,CAAC,CAACW,OAAO,CAAC;AAEnE;;;AAGA,OAAO,MAAMT,iBAAiB,GAC5BU,IAAsD,IACD;EACrD,MAAMC,cAAc,GAClBC,GAAoD,IAEpDrB,MAAM,CAACsB,YAAY,CAACD,GAAG,CAACH,OAAO,CAAC,CAACK,IAAI,CACnCvB,MAAM,CAACwB,GAAG,CAACC,IAAI,IAAI,CAAC,GAAGA,IAAI,EAAE,GAAGA,IAAI,CAACC,OAAO,CAACN,cAAc,CAAC,CAAC,CAAC,EAC9DpB,MAAM,CAAC2B,KAAK,CAAC;IAAEC,MAAM,EAAEA,CAAA,KAAM,EAAE;IAAEC,MAAM,EAAE3B;EAAQ,CAAE,CAAC,CACrD;EAEH,OAAOF,MAAM,CAACsB,YAAY,CAACH,IAAI,CAACD,OAAO,CAAC,CAACK,IAAI,CAC3CvB,MAAM,CAACwB,GAAG,CAACC,IAAI,IAAI,CAAC,GAAGA,IAAI,EAAE,GAAGA,IAAI,CAACC,OAAO,CAACN,cAAc,CAAC,CAAC,CAAC,EAC9DpB,MAAM,CAAC8B,SAAS,CAAC,MAAM,EAAE,CAAC,CAC3B;AACH,CAAC;AAED;;;AAGA,OAAO,MAAMC,gBAAgB,GAC3Bb,OAA0D,IAE1DA,OAAO,CAACc,MAAM,CACZ,CAACR,GAAG,EAAES,MAAM,KAAK9B,OAAO,CAAC+B,GAAG,CAACV,GAAG,EAAES,MAAM,CAACtB,IAAI,EAAEsB,MAAM,CAACE,KAAK,CAAC,EAC5DhC,OAAO,CAACiC,KAAK,EAA8B,CAC5C;AAEH;;;AAGA,OAAO,MAAMC,UAAU,GACrBlB,IAAsD,IACnDY,gBAAgB,CAACtB,iBAAiB,CAACU,IAAI,CAAC,CAAC;AAE9C;;;AAGA,OAAO,MAAMmB,SAAS,GACnB3B,IAAY,IAAMQ,IAAsD,IACvElB,GAAG,CAACW,SAAS,CAACH,iBAAiB,CAACU,IAAI,CAAC,EAAEZ,CAAC,IAAIA,CAAC,CAACI,IAAI,KAAKA,IAAI,CAAC;AAEhE;;;AAGA,OAAO,MAAM4B,aAAa,GACxBpB,IAAsD,IACnDlB,GAAG,CAACW,SAAS,CAACH,iBAAiB,CAACU,IAAI,CAAC,EAAEZ,CAAC,IAAIA,CAAC,CAACiC,OAAO,KAAK,IAAI,CAAC;AAEpE;;;AAGA,OAAO,MAAMC,WAAW,GACrB9B,IAAY,IAAMQ,IAAsD,IACvEnB,MAAM,CAACiB,eAAe,CAACqB,SAAS,CAAC3B,IAAI,CAAC,CAACQ,IAAI,CAAC,EAAEZ,CAAC,IAAIA,CAAC,CAAC4B,KAAK,CAAC;AAE/D;;;AAGA,OAAO,MAAMO,QAAQ,GAAIvB,IAAyB,IAChDnB,MAAM,CAACiB,eAAe,CACpBjB,MAAM,CAACsB,YAAY,CAACH,IAAI,CAACA,IAAI,CAAC,EAC9BwB,CAAC,IAAKA,CAAqC,CAACD,QAAQ,CACrD;AAEH;;;AAGA,OAAO,MAAME,kBAAkB,GAC7BA,CACEjC,IAAY,EACZkC,CAAwE,KAEzEF,CAAsB,IACrB3C,MAAM,CAAC8C,EAAE,EAAE,CAACvB,IAAI,CACdvB,MAAM,CAAC+C,IAAI,CAAC,MAAM,EAAE,MAClB/C,MAAM,CAACsB,YAAY,CAACqB,CAAC,CAACxB,IAAuC,CAAC,CAC/D,EACDnB,MAAM,CAAC+C,IAAI,CAAC,IAAI,EAAE,CAAC;EAAE5B;AAAI,CAAE,KACzBnB,MAAM,CAACiB,eAAe,CACpBqB,SAAS,CAAC3B,IAAI,CAAC,CAACQ,IAAI,CAAC,EACrB,CAAC;EAAEgB;AAAK,CAAE,KAAKA,KAA0B,CAC1C,CACF,EACDnC,MAAM,CAAC+C,IAAI,CAAC,GAAG,EAAE,MAAML,QAAQ,CAACC,CAAC,CAAC,CAAC,EACnC3C,MAAM,CAACiB,eAAe,CAAC,CAAC;EAAE+B,EAAE;EAAEC;AAAC,CAAE,KAAKJ,CAAC,CAACG,EAAE,EAAEC,CAAC,CAAC,CAAC,CAChD;AAEL;;;AAGA,OAAO,MAAMC,aAAa,GAEtBL,CAAwE,IAEzEF,CAAsB,IACrB3C,MAAM,CAAC8C,EAAE,EAAE,CAACvB,IAAI,CACdvB,MAAM,CAAC+C,IAAI,CAAC,QAAQ,EAAE,MACpB/C,MAAM,CAACiB,eAAe,CACpBjB,MAAM,CAACsB,YAAY,CAACqB,CAAC,CAACxB,IAAqC,CAAC,EAC5DwB,CAAC,IAAIA,CAAC,CAACQ,MAA6B,CACrC,CACF,EACDnD,MAAM,CAAC+C,IAAI,CAAC,GAAG,EAAE,MAAML,QAAQ,CAACC,CAAC,CAAC,CAAC,EACnC3C,MAAM,CAACwB,GAAG,CAAC,CAAC;EAAE2B,MAAM;EAAEF;AAAC,CAAE,KACvBhD,GAAG,CAACmD,OAAO,CAACD,MAAM,CAAC3B,GAAG,CAACmB,CAAC,IAAI3C,MAAM,CAACsB,YAAY,CAACuB,CAAC,CAACF,CAAQ,EAAEM,CAAC,CAAC,CAAC,CAAC,CAAC,CAClE,CACF;AAEL,MAAMI,iBAAiB,GAAIC,CAAoB,IAAyB;EACtE,IAAI,YAAY,IAAIA,CAAC,EAAE;IACrB,OAAO,CAAC,GAAGA,CAAC,CAACC,UAAU,EAAE,GAAGD,CAAC,CAACC,UAAU,CAAC7B,OAAO,CAAC2B,iBAAiB,CAAC,CAAC;;EAGtE,OAAO,EAAE;AACX,CAAC;AAED;;;AAGA,OAAO,MAAME,UAAU,GACrBZ,CAA2B,IACH,CACxB,GAAGA,CAAC,CAACY,UAAU,EACf,GAAGZ,CAAC,CAACY,UAAU,CAAC7B,OAAO,CAAC2B,iBAAiB,CAAC,CAC3C;AAED;;;AAGA,OAAO,MAAMG,mBAAmB,GAAIrC,IAA8B,IAChElB,GAAG,CAACK,MAAM,CAACiD,UAAU,CAACpC,IAAI,CAAC,EAAEmC,CAAC,IAAI,OAAO,IAAIA,CAAC,IAAIA,CAAC,CAACnB,KAAK,KAAKsB,SAAS,CAAC;AAE1E;;;AAGA,OAAO,MAAMC,mBAAmB,GAAIxC,OAA4B,IAC7DA,OAA+B,CAACc,MAAM,CACrC,CAACR,GAAG,EAAE8B,CAAC,KAAMA,CAAC,CAACK,SAAS,GAAGxD,OAAO,CAAC+B,GAAG,CAACV,GAAG,EAAE8B,CAAC,CAACK,SAAS,EAAEL,CAAC,CAACnB,KAAK,CAAC,GAAGX,GAAI,EACxErB,OAAO,CAACiC,KAAK,EAA8B,CAC5C;AAEH;;;AAGA,OAAO,MAAMwB,aAAa,GAAIzC,IAA8B,IAC1DuC,mBAAmB,CAACH,UAAU,CAACpC,IAAI,CAAC,CAAC;AAEvC;;;AAGA,OAAO,MAAM0C,YAAY,GAAIb,EAAU,IAAM7B,IAA8B,IACzElB,GAAG,CAACW,SAAS,CACX2C,UAAU,CAACpC,IAAI,CAAC,EAChBZ,CAAC,IAAKA,CAAuB,CAACoD,SAAS,KAAKX,EAAE,CAC/C;AAEH;;;AAGA,OAAO,MAAMc,cAAc,GACxBd,EAAU,IAAM7B,IAA8B,IAC7CnB,MAAM,CAACiB,eAAe,CACpB4C,YAAY,CAACb,EAAE,CAAC,CAAC7B,IAAI,CAAC,EACtBZ,CAAC,IAAKA,CAAuB,CAAC4B,KAAK,CACpC;AA0BL,OAAO,MAAM4B,QAAQ,GAAId,CAAsB,IAAKA,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * From a list of roles, filter out the ones the guild member has.
3
+ */
4
+ export const roles = roles => member => roles.filter(role => member.roles.includes(role.id) || role.name === "@everyone");
5
+ /**
6
+ * Type-guard function for checking if the object is a guild member
7
+ */
8
+ export const is = thing => Object.prototype.hasOwnProperty.call(thing, "roles") && Object.prototype.hasOwnProperty.call(thing, "joined_at");
9
+ //# sourceMappingURL=members.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"members.mjs","names":["roles","member","filter","role","includes","id","name","is","thing","Object","prototype","hasOwnProperty","call"],"sources":["../../src/Helpers/members.ts"],"sourcesContent":[null],"mappings":"AAEA;;;AAGA,OAAO,MAAMA,KAAK,GAAIA,KAAqB,IAAMC,MAA2B,IAC1ED,KAAK,CAACE,MAAM,CACVC,IAAI,IAAIF,MAAM,CAACD,KAAK,CAACI,QAAQ,CAACD,IAAI,CAACE,EAAE,CAAC,IAAIF,IAAI,CAACG,IAAI,KAAK,WAAW,CACpE;AAEH;;;AAGA,OAAO,MAAMC,EAAE,GAAIC,KAAc,IAC/BC,MAAM,CAACC,SAAS,CAACC,cAAc,CAACC,IAAI,CAACJ,KAAK,EAAE,OAAO,CAAC,IACpDC,MAAM,CAACC,SAAS,CAACC,cAAc,CAACC,IAAI,CAACJ,KAAK,EAAE,WAAW,CAAC"}
@@ -0,0 +1,82 @@
1
+ import * as Effect from "@effect/io/Effect";
2
+ import * as Flags from "dfx/Helpers/flags";
3
+ import * as Members from "dfx/Helpers/members";
4
+ import * as Discord from "dfx/types";
5
+ /**
6
+ * A constant of all the permissions
7
+ */
8
+ export const ALL = /*#__PURE__*/Flags.all(Discord.PermissionFlag);
9
+ /**
10
+ * Check if a flag exists in the permissions.
11
+ */
12
+ export const has = Flags.hasBigInt;
13
+ /**
14
+ * Convert a permissions bitfield to a list of flag names.
15
+ */
16
+ export const toList = /*#__PURE__*/Flags.toList(Discord.PermissionFlag);
17
+ /**
18
+ * Convert a list of flag names to a bitfield.
19
+ */
20
+ export const fromList = /*#__PURE__*/Flags.fromListBigint(Discord.PermissionFlag);
21
+ /**
22
+ * Reduce a list of roles to a bitfield of all the permissions added together.
23
+ */
24
+ export const forRoles = roles => roles.reduce((permissions, role) => permissions | BigInt(role.permissions), BigInt(0));
25
+ /**
26
+ * From a list of roles, calculate the permissions bitfield for the member.
27
+ */
28
+ export const forMember = roles => member => forRoles(Members.roles(roles)(member));
29
+ const overwriteIsForMember = guildId => member => overwrite => {
30
+ if (overwrite.type === 0) {
31
+ return overwrite.id === guildId || member.roles.includes(overwrite.id);
32
+ }
33
+ return overwrite.id === member.user?.id;
34
+ };
35
+ const overwriteIsForRole = guildId => role => overwrite => {
36
+ if (overwrite.type === 0) {
37
+ return overwrite.id === guildId || overwrite.id === role.id;
38
+ }
39
+ return false;
40
+ };
41
+ /**
42
+ * From a list of roles and a channel, calculate the permission bitfield for
43
+ * the guild member or role for that channel.
44
+ */
45
+ export const forChannel = roles => ({
46
+ guild_id,
47
+ permission_overwrites: overwrites = []
48
+ }) => memberOrRole => {
49
+ const hasAdmin = has(Discord.PermissionFlag.ADMINISTRATOR);
50
+ let basePermissions;
51
+ let filteredOverwrites;
52
+ if (Members.is(memberOrRole)) {
53
+ if (memberOrRole.permissions) return BigInt(memberOrRole.permissions);
54
+ const memberRoles = Members.roles(roles)(memberOrRole);
55
+ basePermissions = forRoles(memberRoles);
56
+ filteredOverwrites = overwrites.filter(overwriteIsForMember(guild_id)(memberOrRole));
57
+ } else {
58
+ const everyone = roles.find(role => role.name === "@everyone");
59
+ basePermissions = BigInt(everyone?.permissions || "0") | BigInt(memberOrRole.permissions);
60
+ filteredOverwrites = overwrites.filter(overwriteIsForRole(guild_id)(memberOrRole));
61
+ }
62
+ if (hasAdmin(basePermissions)) {
63
+ return ALL;
64
+ }
65
+ return applyOverwrites(basePermissions)(filteredOverwrites);
66
+ };
67
+ /**
68
+ * Apply permission overwrites to a bitfield.
69
+ */
70
+ export const applyOverwrites = permissions => overwrites => overwrites.reduce((permissions, overwrite) => permissions & ~BigInt(overwrite.deny) | BigInt(overwrite.allow), permissions);
71
+ export const hasInChannel = (rolesCache, permission) => (channel, memberOrRole) => Effect.map(rolesCache.getForParent(channel.guild_id), roles => {
72
+ const channelPerms = forChannel([...roles.values()])(channel)(memberOrRole);
73
+ return has(permission)(channelPerms);
74
+ });
75
+ export const hasInGuild = (rolesCache, permission) => (guildId, member) => Effect.map(rolesCache.getForParent(guildId), roles => {
76
+ const hasPerm = has(permission);
77
+ return member.roles.some(id => {
78
+ const role = roles.get(id);
79
+ return role ? hasPerm(role.permissions) : false;
80
+ });
81
+ });
82
+ //# sourceMappingURL=permissions.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permissions.mjs","names":["Effect","Flags","Members","Discord","ALL","all","PermissionFlag","has","hasBigInt","toList","fromList","fromListBigint","forRoles","roles","reduce","permissions","role","BigInt","forMember","member","overwriteIsForMember","guildId","overwrite","type","id","includes","user","overwriteIsForRole","forChannel","guild_id","permission_overwrites","overwrites","memberOrRole","hasAdmin","ADMINISTRATOR","basePermissions","filteredOverwrites","is","memberRoles","filter","everyone","find","name","applyOverwrites","deny","allow","hasInChannel","rolesCache","permission","channel","map","getForParent","channelPerms","values","hasInGuild","hasPerm","some","get"],"sources":["../../src/Helpers/permissions.ts"],"sourcesContent":[null],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Helper to create an Action Row grid.
3
+ */
4
+ export const grid = items => items.map(components => ({
5
+ type: 1 /* ComponentType.ACTION_ROW */,
6
+ components
7
+ }));
8
+ /**
9
+ * Helper to create a single column of components
10
+ */
11
+ export const singleColumn = items => items.map(c => ({
12
+ type: 1 /* ComponentType.ACTION_ROW */,
13
+ components: [c]
14
+ }));
15
+ /**
16
+ * Helper to create a button component.
17
+ */
18
+ export const button = button => ({
19
+ type: 2 /* ComponentType.BUTTON */,
20
+ style: 1 /* ButtonStyle.PRIMARY */,
21
+ ...button
22
+ });
23
+ /**
24
+ * Helper to create a select component.
25
+ */
26
+ export const select = select => ({
27
+ type: 3 /* ComponentType.STRING_SELECT */,
28
+ ...select
29
+ });
30
+ /**
31
+ * Helper to create a select component.
32
+ */
33
+ export const userSelect = select => ({
34
+ type: 5 /* ComponentType.USER_SELECT */,
35
+ ...select
36
+ });
37
+ /**
38
+ * Helper to create a select component.
39
+ */
40
+ export const roleSelect = select => ({
41
+ type: 6 /* ComponentType.ROLE_SELECT */,
42
+ ...select
43
+ });
44
+ /**
45
+ * Helper to create a select component.
46
+ */
47
+ export const mentionableSelect = select => ({
48
+ type: 7 /* ComponentType.MENTIONABLE_SELECT */,
49
+ ...select
50
+ });
51
+ /**
52
+ * Helper to create a select component.
53
+ */
54
+ export const channelSelect = select => ({
55
+ type: 8 /* ComponentType.CHANNEL_SELECT */,
56
+ ...select
57
+ });
58
+ /**
59
+ * Helper to create a text input
60
+ */
61
+ export const textInput = input => ({
62
+ type: 4 /* ComponentType.TEXT_INPUT */,
63
+ style: 1 /* TextInputStyle.SHORT */,
64
+ ...input
65
+ });
66
+ //# sourceMappingURL=ui.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.mjs","names":["grid","items","map","components","type","singleColumn","c","button","style","select","userSelect","roleSelect","mentionableSelect","channelSelect","textInput","input"],"sources":["../../src/Helpers/ui.ts"],"sourcesContent":[null],"mappings":"AAcA;;;AAGA,OAAO,MAAMA,IAAI,GAAIC,KAAsB,IACzCA,KAAK,CAACC,GAAG,CACNC,UAAU,KAAiB;EAC1BC,IAAI;EACJD;CACD,CAAC,CACH;AAEH;;;AAGA,OAAO,MAAME,YAAY,GAAIJ,KAAoB,IAC/CA,KAAK,CAACC,GAAG,CAACI,CAAC,KAAK;EACdF,IAAI;EACJD,UAAU,EAAE,CAACG,CAAC;CACf,CAAC,CAAC;AAEL;;;AAGA,OAAO,MAAMC,MAAM,GAAIA,MAAuB,KAAc;EAC1DH,IAAI;EACJI,KAAK;EACL,GAAGD;CACJ,CAAC;AAUF;;;AAGA,OAAO,MAAME,MAAM,GAAIA,MAAoB,KAAkB;EAC3DL,IAAI;EACJ,GAAGK;CACJ,CAAC;AAEF;;;AAGA,OAAO,MAAMC,UAAU,GAAID,MAAmB,KAAkB;EAC9DL,IAAI;EACJ,GAAGK;CACJ,CAAC;AAEF;;;AAGA,OAAO,MAAME,UAAU,GAAIF,MAAmB,KAAkB;EAC9DL,IAAI;EACJ,GAAGK;CACJ,CAAC;AAEF;;;AAGA,OAAO,MAAMG,iBAAiB,GAAIH,MAAmB,KAAkB;EACrEL,IAAI;EACJ,GAAGK;CACJ,CAAC;AAEF;;;AAGA,OAAO,MAAMI,aAAa,GAAIJ,MAAqB,KAAkB;EACnEL,IAAI;EACJ,GAAGK;CACJ,CAAC;AAMF;;;AAGA,OAAO,MAAMK,SAAS,GAAIC,KAAoB,KAAiB;EAC7DX,IAAI;EACJI,KAAK;EACL,GAAGO;CACJ,CAAC"}
@@ -0,0 +1,62 @@
1
+ import * as Http from "@effect-http/client";
2
+ import * as Chunk from "@effect/data/Chunk";
3
+ import { identity } from "@effect/data/Function";
4
+ import * as Effect from "@effect/io/Effect";
5
+ import { catchTag } from "@effect/io/Effect";
6
+ import { DiscordREST } from "dfx/DiscordREST";
7
+ /**
8
+ * @tsplus type dfx/InteractionBuilder
9
+ */
10
+ export class InteractionBuilder {
11
+ definitions;
12
+ transform;
13
+ constructor(definitions, transform) {
14
+ this.definitions = definitions;
15
+ this.transform = transform;
16
+ }
17
+ add(definition) {
18
+ return new InteractionBuilder(Chunk.append(this.definitions, [definition, this.transform]), this.transform);
19
+ }
20
+ concat(builder) {
21
+ return new InteractionBuilder(Chunk.appendAll(this.definitions, builder.definitions), this.transform);
22
+ }
23
+ transformTransform(f) {
24
+ return new InteractionBuilder(Chunk.map(this.definitions, ([d, t]) => [d, _ => f(t(_))]), _ => f(this.transform(_)));
25
+ }
26
+ transformHandlers(f) {
27
+ return new InteractionBuilder(Chunk.map(this.definitions, ([d, t]) => [{
28
+ ...d,
29
+ handle: Effect.isEffect(d.handle) ? f(d.handle) : _ => f(d.handle(_))
30
+ }, t]), this.transform);
31
+ }
32
+ catchAllCause(f) {
33
+ return this.transformTransform(Effect.catchAllCause(f));
34
+ }
35
+ catchAllCauseRespond(f) {
36
+ return this.transformHandlers(Effect.catchAllCause(f));
37
+ }
38
+ catchAll(f) {
39
+ return this.transformTransform(Effect.catchAll(f));
40
+ }
41
+ catchAllRespond(f) {
42
+ return this.transformHandlers(Effect.catchAll(f));
43
+ }
44
+ catchTag(tag, f) {
45
+ return this.transformTransform(_ => catchTag(_, tag, f));
46
+ }
47
+ catchTagRespond(tag, f) {
48
+ return this.transformHandlers(_ => catchTag(_, tag, f));
49
+ }
50
+ get syncGlobal() {
51
+ const commands = this.definitions.pipe(Chunk.map(([d, _]) => d), Chunk.filter(c => c._tag === "GlobalApplicationCommand"), Chunk.map(c => c.command));
52
+ return Effect.flatMap(DiscordREST, rest => rest.getCurrentBotApplicationInformation().pipe(Effect.flatMap(r => r.json), Effect.flatMap(app => rest.bulkOverwriteGlobalApplicationCommands(app.id, {
53
+ body: Http.body.json(Chunk.toReadonlyArray(commands))
54
+ }))));
55
+ }
56
+ syncGuild(appId, guildId) {
57
+ const commands = this.definitions.pipe(Chunk.map(([d, _]) => d), Chunk.filter(c => c._tag === "GuildApplicationCommand"), Chunk.map(c => c.command));
58
+ return Effect.flatMap(DiscordREST, rest => rest.bulkOverwriteGuildApplicationCommands(appId, guildId, Chunk.toReadonlyArray(commands)));
59
+ }
60
+ }
61
+ export const builder = /*#__PURE__*/new InteractionBuilder( /*#__PURE__*/Chunk.empty(), identity);
62
+ //# sourceMappingURL=builder.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builder.mjs","names":["Http","Chunk","identity","Effect","catchTag","DiscordREST","InteractionBuilder","definitions","transform","constructor","add","definition","append","concat","builder","appendAll","transformTransform","f","map","d","t","_","transformHandlers","handle","isEffect","catchAllCause","catchAllCauseRespond","catchAll","catchAllRespond","tag","catchTagRespond","syncGlobal","commands","pipe","filter","c","_tag","command","flatMap","rest","getCurrentBotApplicationInformation","r","json","app","bulkOverwriteGlobalApplicationCommands","id","body","toReadonlyArray","syncGuild","appId","guildId","bulkOverwriteGuildApplicationCommands","empty"],"sources":["../../src/Interactions/builder.ts"],"sourcesContent":[null],"mappings":"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"}