wynham-games 1.0.0-beta.13 → 1.0.0-beta.14

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 (42) hide show
  1. package/README.md +93 -18
  2. package/dist/games/Connect4.d.ts +6 -0
  3. package/dist/games/Connect4.d.ts.map +1 -1
  4. package/dist/games/Connect4.js +45 -21
  5. package/dist/games/Connect4.js.map +1 -1
  6. package/dist/games/Hangman.d.ts +7 -1
  7. package/dist/games/Hangman.d.ts.map +1 -1
  8. package/dist/games/Hangman.js +50 -24
  9. package/dist/games/Hangman.js.map +1 -1
  10. package/dist/games/RPS.d.ts +13 -102
  11. package/dist/games/RPS.d.ts.map +1 -1
  12. package/dist/games/RPS.js +68 -154
  13. package/dist/games/RPS.js.map +1 -1
  14. package/dist/games/Snake.d.ts +4 -0
  15. package/dist/games/Snake.d.ts.map +1 -1
  16. package/dist/games/Snake.js +33 -20
  17. package/dist/games/Snake.js.map +1 -1
  18. package/dist/games/TicTacToe.d.ts +6 -0
  19. package/dist/games/TicTacToe.d.ts.map +1 -1
  20. package/dist/games/TicTacToe.js +40 -18
  21. package/dist/games/TicTacToe.js.map +1 -1
  22. package/dist/index.d.ts +1 -0
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/index.js +1 -0
  25. package/dist/index.js.map +1 -1
  26. package/dist/structures/Errors.d.ts +96 -0
  27. package/dist/structures/Errors.d.ts.map +1 -0
  28. package/dist/structures/Errors.js +263 -0
  29. package/dist/structures/Errors.js.map +1 -0
  30. package/dist/structures/GameManager.d.ts +4 -2
  31. package/dist/structures/GameManager.d.ts.map +1 -1
  32. package/dist/structures/GameManager.js +44 -68
  33. package/dist/structures/GameManager.js.map +1 -1
  34. package/dist/structures/Types.d.ts +66 -0
  35. package/dist/structures/Types.d.ts.map +1 -1
  36. package/dist/structures/Types.js +39 -1
  37. package/dist/structures/Types.js.map +1 -1
  38. package/dist/structures/Utils.d.ts +3 -2
  39. package/dist/structures/Utils.d.ts.map +1 -1
  40. package/dist/structures/Utils.js +20 -18
  41. package/dist/structures/Utils.js.map +1 -1
  42. package/package.json +1 -1
package/README.md CHANGED
@@ -123,13 +123,13 @@ Every option object shares the `players` field and most share `turnTimeout`, `lo
123
123
 
124
124
  ### `GameNameType.Connect4` — `Connect4Options`
125
125
 
126
- | Option | Type | Default | Description |
127
- | ---------------------- | ----------- | --------- | --------------------------------------------- |
128
- | `theme.emojis.player1` | `string` | `🔴` | Player 1 pieces. |
129
- | `theme.emojis.player2` | `string` | `🟡` | Player 2 pieces. |
130
- | `theme.emojis.empty` | `string` | `âŦ›` | Empty cells. |
131
- | `theme.emojis.win` | `string` | `âšĒ` | Winning pieces. |
132
- | `theme.inputType` | `InputType` | `Buttons` | Column input mode: `Buttons` or `SelectMenu`. |
126
+ | Option | Type | Default | Description |
127
+ | ---------------------- | ------------- | --------- | ---------------------------------------------------------------------------------- |
128
+ | `theme.emojis.player1` | `string` | `🔴` | Player 1 pieces. |
129
+ | `theme.emojis.player2` | `string` | `🟡` | Player 2 pieces. |
130
+ | `theme.emojis.empty` | `string` | `âŦ›` | Empty cells. |
131
+ | `theme.emojis.win` | `string` | `âšĒ` | Winning pieces. |
132
+ | `theme.inputType` | `InputType` | `Buttons` | Column input mode: `Buttons` or `SelectMenu`. |
133
133
  | `theme.buttonStyle` | `ButtonStyle` | `Primary` | Style of the column input buttons: `Primary`, `Secondary`, `Success`, or `Danger`. |
134
134
 
135
135
  ```ts
@@ -185,18 +185,18 @@ The bot opponent behaves differently per difficulty:
185
185
 
186
186
  > **Single-player.** Snake does **not** use the shared `players` / `lang.inviteTitle` fields. It takes a single `player` and starts immediately — no invite is sent.
187
187
 
188
- | Option | Type | Default | Description |
189
- | -------------------- | -------- | ------- | ------------------------------------------------------------------- |
190
- | `player` | `User` | — | **Required.** The player (must not be a bot). |
191
- | `turnTimeout` | `number` | `30` | Max seconds the player can stay idle between two moves (15–360). |
192
- | `boardWidth` | `number` | `10` | Board width in cells (clamped 5–12). |
193
- | `boardHeight` | `number` | `10` | Board height in cells (clamped 5–12). |
188
+ | Option | Type | Default | Description |
189
+ | -------------------- | -------- | ---------- | ---------------------------------------------------------------- |
190
+ | `player` | `User` | — | **Required.** The player (must not be a bot). |
191
+ | `turnTimeout` | `number` | `30` | Max seconds the player can stay idle between two moves (15–360). |
192
+ | `boardWidth` | `number` | `10` | Board width in cells (clamped 5–12). |
193
+ | `boardHeight` | `number` | `10` | Board height in cells (clamped 5–12). |
194
194
  | `theme.colors.lose` | `number` | `0x808080` | Color on game over / timeout (replaces the shared `draw` color). |
195
- | `theme.emojis.head` | `string` | `đŸŸĸ` | Snake head. |
196
- | `theme.emojis.body` | `string` | `🟩` | Snake body. |
197
- | `theme.emojis.food` | `string` | `🍎` | Food. |
198
- | `theme.emojis.empty` | `string` | `âŦ›` | Empty cells. |
199
- | `lang.title` | `string` | `"Snake"` | Title shown on the game board. |
195
+ | `theme.emojis.head` | `string` | `đŸŸĸ` | Snake head. |
196
+ | `theme.emojis.body` | `string` | `🟩` | Snake body. |
197
+ | `theme.emojis.food` | `string` | `🍎` | Food. |
198
+ | `theme.emojis.empty` | `string` | `âŦ›` | Empty cells. |
199
+ | `lang.title` | `string` | `"Snake"` | Title shown on the game board. |
200
200
 
201
201
  The player moves the snake one cell per button press (âŦ…ī¸ âŦ†ī¸ âŦ‡ī¸ âžĄī¸) and can quit with âšī¸. Eating the 🍎 grows the snake and increases the score; hitting a wall or the snake's own body ends the game.
202
202
 
@@ -231,6 +231,48 @@ const locale = locales[interaction.locale] ?? locales[Locale.EnglishUS];
231
231
 
232
232
  Or simply pass `interaction.locale` (or `interaction.guildLocale`) as the `locale` option when creating a game.
233
233
 
234
+ ## Error handling
235
+
236
+ Every Discord call the library makes (`editReply`, `followUp`, `reply`, `update`, `deferUpdate`) goes through `safeDiscordCall`, which turns a raw `DiscordAPIError` into a `WynhamGamesError` carrying a stable `code` — no need to compare Discord numbers by hand.
237
+
238
+ Two behaviours, depending on the failure:
239
+
240
+ - **Recoverable** (`10008` message deleted, `10062` unknown interaction, `50027` expired token, `10003` unknown channel, `40060` already acknowledged, `50083` archived thread): the call resolves to `null` and the game stops cleanly. Nothing is thrown.
241
+ - **Everything else** (`50013` missing permissions, `50001` missing access, `50035` invalid payload, rate limits, network errors): a `WynhamGamesError` is thrown, so `createGame()` rejects and your command handler sees it.
242
+
243
+ ```ts
244
+ import { GameManager, GameNameType, WynhamGamesError, WynhamErrorCode } from "wynham-games";
245
+
246
+ try {
247
+ await manager.createGame(GameNameType.Snake, interaction, { player: interaction.user });
248
+ } catch (error) {
249
+ if (error instanceof WynhamGamesError) {
250
+ console.error(error.code); // "MissingPermissions"
251
+ console.error(error.discordCode); // 50013
252
+ console.error(error.status); // 403
253
+ console.error(error.action); // "editReply"
254
+ console.error(error.game); // "Snake"
255
+ console.error(error.cause); // the original DiscordAPIError
256
+
257
+ if (error.code === WynhamErrorCode.MissingPermissions) {
258
+ await interaction.followUp({ content: "I need permission to edit my messages here.", flags: MessageFlags.Ephemeral });
259
+ }
260
+ }
261
+ }
262
+ ```
263
+
264
+ Errors raised **after** `createGame()` resolved — from a component collector or a turn timer — cannot be awaited by your code, so they are reported instead of crashing the process. They go to `console.error` by default; route them to your own logger with `setErrorHandler`:
265
+
266
+ ```ts
267
+ import { setErrorHandler } from "wynham-games";
268
+
269
+ setErrorHandler(error => logger.error({ code: error.code, discordCode: error.discordCode, game: error.game }, error.message));
270
+ ```
271
+
272
+ Configuration mistakes use the same error type, before any request is sent: `ClientMissing`, `LocaleNotSupported`, `InvalidAntiSpamTime`, `InvalidTurnTimeout`, `InvalidLifeCount`, `InteractionNotRepliable`.
273
+
274
+ The guarded helpers are exported too, if you want the same behaviour in your own code: `safeDiscordCall`, `safeEdit`, `safeFollowUp`, `safeReply`, `safeNotify`, `safeUpdate`, `safeDeferUpdate`, `safeMessageEdit`, plus `toWynhamError` and `isWynhamGamesError`.
275
+
234
276
  ## Enums reference
235
277
 
236
278
  ```ts
@@ -261,6 +303,39 @@ enum InviteResult {
261
303
  Declined,
262
304
  Timeout,
263
305
  }
306
+ enum WynhamErrorCode {
307
+ // configuration
308
+ ClientMissing,
309
+ LocaleNotSupported,
310
+ InvalidAntiSpamTime,
311
+ InvalidTurnTimeout,
312
+ InvalidLifeCount,
313
+ InteractionNotRepliable,
314
+ // Discord REST
315
+ UnknownChannel,
316
+ UnknownMessage,
317
+ UnknownWebhook,
318
+ UnknownInteraction,
319
+ InteractionAlreadyAcknowledged,
320
+ InvalidWebhookToken,
321
+ ArchivedThread,
322
+ MissingAccess,
323
+ MissingPermissions,
324
+ CannotSendEmptyMessage,
325
+ InvalidFormBody,
326
+ RateLimited,
327
+ NetworkError,
328
+ UnexpectedError,
329
+ UnknownDiscordError,
330
+ }
331
+ enum DiscordAction {
332
+ EditReply,
333
+ FollowUp,
334
+ Reply,
335
+ Update,
336
+ DeferUpdate,
337
+ EditMessage,
338
+ }
264
339
  ```
265
340
 
266
341
  ## Building from source
@@ -33,6 +33,12 @@ export default class Connect4 implements IGame {
33
33
  private handleTurnTimeout;
34
34
  launch(): Promise<void>;
35
35
  private playMove;
36
+ /** `editReply` on the game message, guarded by the library error handler. Resolves to `null` when the message is gone. */
37
+ private edit;
38
+ /** `followUp` guarded by the library error handler. */
39
+ private followUp;
40
+ /** Reports an error raised from a collector or a turn timer — nothing can `await` those. */
41
+ private report;
36
42
  private cleanup;
37
43
  }
38
44
  //# sourceMappingURL=Connect4.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Connect4.d.ts","sourceRoot":"","sources":["../../src/games/Connect4.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAa,KAAK,eAAe,EAAE,KAAK,KAAK,EAAE,KAAK,eAAe,EAAuB,KAAK,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAE3J,OAAO,EAcH,oBAAoB,EAEvB,MAAM,YAAY,CAAC;AAYpB,MAAM,CAAC,OAAO,OAAO,QAAS,YAAW,KAAK;IAC1C,SAAgB,QAAQ,yBAAyB;IACjD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkB;IAC1C,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;IACvC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA8C;IACrE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyD;IAChF,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAiB;IACrC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;IAEtC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA8B;IAEpD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsC;IAC9D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA+B;IACvD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,aAAa,CAAQ;IAC7B,OAAO,CAAC,SAAS,CAA8C;IAC/D,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,SAAS,CAA0C;IAC3D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IAErC,YAAY,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,oBAAoB,EAAE,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,UAAU,EA0BxH;IAED,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,WAAW;IAanB,OAAO,CAAC,IAAI;IASZ,OAAO,CAAC,MAAM;IAKd,OAAO,CAAC,QAAQ;IAyBhB,OAAO,CAAC,aAAa;IAkBrB,OAAO,CAAC,gBAAgB;IAWxB,OAAO,CAAC,cAAc;IAatB,OAAO,CAAC,cAAc;YAKR,iBAAiB;IAwBzB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAyC5B;YAEa,QAAQ;IAoDtB,OAAO,CAAC,OAAO;CAYlB"}
1
+ {"version":3,"file":"Connect4.d.ts","sourceRoot":"","sources":["../../src/games/Connect4.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAa,KAAK,eAAe,EAAE,KAAK,KAAK,EAAE,KAAK,eAAe,EAAuB,KAAK,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAE3J,OAAO,EAcH,oBAAoB,EAEvB,MAAM,YAAY,CAAC;AAYpB,MAAM,CAAC,OAAO,OAAO,QAAS,YAAW,KAAK;IAC1C,SAAgB,QAAQ,yBAAyB;IACjD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkB;IAC1C,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;IACvC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA8C;IACrE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyD;IAChF,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAiB;IACrC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;IAEtC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA8B;IAEpD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsC;IAC9D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA+B;IACvD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,aAAa,CAAQ;IAC7B,OAAO,CAAC,SAAS,CAA8C;IAC/D,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,SAAS,CAA0C;IAC3D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IAErC,YAAY,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,oBAAoB,EAAE,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,UAAU,EA0BxH;IAED,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,WAAW;IAanB,OAAO,CAAC,IAAI;IASZ,OAAO,CAAC,MAAM;IAKd,OAAO,CAAC,QAAQ;IAyBhB,OAAO,CAAC,aAAa;IAkBrB,OAAO,CAAC,gBAAgB;IAWxB,OAAO,CAAC,cAAc;IAatB,OAAO,CAAC,cAAc;YAKR,iBAAiB;IAwBzB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAgD5B;YAEa,QAAQ;IAqDtB,0HAA0H;IAC1H,OAAO,CAAC,IAAI;IAIZ,uDAAuD;IACvD,OAAO,CAAC,QAAQ;IAIhB,4FAA4F;IAC5F,OAAO,CAAC,MAAM;IAId,OAAO,CAAC,OAAO;CAalB"}
@@ -1,5 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ const Errors_1 = require("../structures/Errors");
3
4
  const Types_1 = require("../structures/Types");
4
5
  const discord_js_1 = require("discord.js");
5
6
  const DIRECTIONS = [
@@ -158,18 +159,18 @@ class Connect4 {
158
159
  .addTextDisplayComponents(text => text.setContent(this.renderBoard()))
159
160
  .addSeparatorComponents(sep => sep.setDivider(true).setSpacing(discord_js_1.SeparatorSpacingSize.Small))
160
161
  .addTextDisplayComponents(text => text.setContent(status));
161
- return this.inputType === "select" ? base.addActionRowComponents(...this.createSelectMenu(disabled)) : base.addActionRowComponents(...this.createButtons(disabled));
162
+ return this.inputType === Types_1.InputType.SelectMenu ? base.addActionRowComponents(...this.createSelectMenu(disabled)) : base.addActionRowComponents(...this.createButtons(disabled));
162
163
  }
163
164
  startTurnTimer() {
164
165
  if (this.turnTimer)
165
166
  clearTimeout(this.turnTimer);
166
- this.turnTimer = setTimeout(() => this.handleTurnTimeout(), this.turnTimeout);
167
+ this.turnTimer = setTimeout(() => void this.handleTurnTimeout().catch(error => this.report(error)), this.turnTimeout);
167
168
  }
168
169
  async handleTurnTimeout() {
169
170
  this.consecutiveMisses++;
170
171
  if (this.consecutiveMisses >= 2) {
171
172
  this.cleanup();
172
- await this.interaction.editReply({
173
+ await this.edit({
173
174
  components: [this.buildContainer(this.loc.cancelledBothMissed, this.colors.draw, true)],
174
175
  flags: discord_js_1.MessageFlags.IsComponentsV2,
175
176
  });
@@ -178,7 +179,7 @@ class Connect4 {
178
179
  this.currentPlayer = this.currentPlayer === 0 ? 1 : 0;
179
180
  const next = this.players[this.currentPlayer];
180
181
  const timestamp = String(Math.floor((Date.now() + this.turnTimeout) / 1000));
181
- await this.interaction.editReply({
182
+ await this.edit({
182
183
  components: [this.buildContainer(this.loc.turnTimeout(this.cellEmoji(this.currentPlayer + 1), next.username, timestamp), this.colors.play)],
183
184
  flags: discord_js_1.MessageFlags.IsComponentsV2,
184
185
  });
@@ -189,17 +190,19 @@ class Connect4 {
189
190
  const firstPlayer = this.players[this.currentPlayer];
190
191
  const firstTimestamp = String(Math.floor((Date.now() + this.turnTimeout) / 1000));
191
192
  const firstStatus = this.loc.firstTurn(this.cellEmoji(this.currentPlayer + 1), firstPlayer.username, firstTimestamp);
192
- const message = await this.interaction.editReply({
193
+ const message = await this.edit({
193
194
  components: [this.buildContainer(firstStatus, this.colors.play)],
194
195
  flags: discord_js_1.MessageFlags.IsComponentsV2,
195
196
  });
197
+ if (!message)
198
+ return void this.cleanup();
196
199
  this.collector = message.createMessageComponentCollector({
197
- componentType: this.inputType === "select" ? discord_js_1.ComponentType.StringSelect : discord_js_1.ComponentType.Button,
200
+ componentType: this.inputType === Types_1.InputType.SelectMenu ? discord_js_1.ComponentType.StringSelect : discord_js_1.ComponentType.Button,
198
201
  time: 300_000,
199
202
  filter: i => {
200
203
  if (this.players.some(p => p.id === i.user.id))
201
204
  return true;
202
- i.reply({
205
+ (0, Errors_1.safeNotify)(i, {
203
206
  embeds: [{ description: this.loc.notYourGame, color: discord_js_1.Colors.Red }],
204
207
  flags: discord_js_1.MessageFlags.Ephemeral,
205
208
  });
@@ -207,33 +210,42 @@ class Connect4 {
207
210
  },
208
211
  });
209
212
  this.collector.on("collect", async (interactionButton) => {
210
- const col = this.inputType === "select" ? Number(interactionButton.values[0]) : Number(interactionButton.customId.split("_")[1]);
211
- await this.playMove(col, interactionButton);
213
+ const col = this.inputType === Types_1.InputType.SelectMenu ? Number(interactionButton.values[0]) : Number(interactionButton.customId.split("_")[1]);
214
+ await this.playMove(col, interactionButton).catch(error => this.report(error));
212
215
  });
213
216
  this.collector.on("end", async (_, reason) => {
214
- this.cleanup();
215
- if (reason === "time") {
216
- await this.interaction.editReply({
217
- components: [this.buildContainer(this.loc.timeout, this.colors.draw, true)],
218
- flags: discord_js_1.MessageFlags.IsComponentsV2,
219
- });
217
+ if (reason === "time" || reason === "idle") {
218
+ try {
219
+ await this.edit({
220
+ components: [this.buildContainer(this.loc.timeout, this.colors.draw, true)],
221
+ flags: discord_js_1.MessageFlags.IsComponentsV2,
222
+ });
223
+ }
224
+ catch (error) {
225
+ this.report(error);
226
+ }
227
+ finally {
228
+ this.cleanup();
229
+ }
220
230
  }
221
231
  });
222
232
  this.startTurnTimer();
223
233
  }
224
234
  async playMove(col, component) {
225
- await component.deferUpdate();
235
+ // A dead interaction token cannot be acknowledged: skip this move.
236
+ if (!(await (0, Errors_1.safeDeferUpdate)(component, { game: this.gameName })))
237
+ return;
226
238
  this.interaction = component;
227
239
  const player = this.players[this.currentPlayer];
228
240
  if (component.user.id !== player.id) {
229
- return void (await component.followUp({
241
+ return void (await this.followUp(component, {
230
242
  embeds: [{ description: this.loc.notYourTurn, color: discord_js_1.Colors.Red }],
231
243
  flags: discord_js_1.MessageFlags.Ephemeral,
232
244
  }));
233
245
  }
234
246
  const row = this.drop(col);
235
247
  if (row === -1) {
236
- return void (await component.followUp({
248
+ return void (await this.followUp(component, {
237
249
  embeds: [{ description: this.loc.columnFull, color: discord_js_1.Colors.Red }],
238
250
  flags: discord_js_1.MessageFlags.Ephemeral,
239
251
  }));
@@ -242,14 +254,14 @@ class Connect4 {
242
254
  this.consecutiveMisses = 0;
243
255
  if (this.checkWin(row, col)) {
244
256
  this.cleanup();
245
- return void (await this.interaction.editReply({
257
+ return void (await this.edit({
246
258
  components: [this.buildContainer(this.loc.win(this.cellEmoji(this.currentPlayer + 1), player.username), this.colors.win, true)],
247
259
  flags: discord_js_1.MessageFlags.IsComponentsV2,
248
260
  }));
249
261
  }
250
262
  if (this.isDraw()) {
251
263
  this.cleanup();
252
- return void (await this.interaction.editReply({
264
+ return void (await this.edit({
253
265
  components: [this.buildContainer(this.loc.draw, this.colors.draw, true)],
254
266
  flags: discord_js_1.MessageFlags.IsComponentsV2,
255
267
  }));
@@ -259,12 +271,24 @@ class Connect4 {
259
271
  const timestamp = String(Math.floor((Date.now() + this.turnTimeout) / 1000));
260
272
  this.manager.cooldowns.reset(this.cooldownKey, 300_000);
261
273
  this.collector?.resetTimer();
262
- await this.interaction.editReply({
274
+ await this.edit({
263
275
  components: [this.buildContainer(this.loc.turn(this.cellEmoji(this.currentPlayer + 1), next.username, timestamp), this.colors.play)],
264
276
  flags: discord_js_1.MessageFlags.IsComponentsV2,
265
277
  });
266
278
  this.startTurnTimer();
267
279
  }
280
+ /** `editReply` on the game message, guarded by the library error handler. Resolves to `null` when the message is gone. */
281
+ edit(options) {
282
+ return (0, Errors_1.safeEdit)(this.interaction, options, { game: this.gameName });
283
+ }
284
+ /** `followUp` guarded by the library error handler. */
285
+ followUp(interaction, options) {
286
+ return (0, Errors_1.safeFollowUp)(interaction, options, { game: this.gameName });
287
+ }
288
+ /** Reports an error raised from a collector or a turn timer — nothing can `await` those. */
289
+ report(error) {
290
+ (0, Errors_1.reportError)(error, { game: this.gameName });
291
+ }
268
292
  cleanup() {
269
293
  if (this.turnTimer) {
270
294
  clearTimeout(this.turnTimer);
@@ -1 +1 @@
1
- {"version":3,"file":"Connect4.js","sourceRoot":"","sources":["../../src/games/Connect4.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Connect4.js","sourceRoot":"","sources":["../../src/games/Connect4.ts"],"names":[],"mappings":";;AAAA,gDAAuG;AACvG,8CAA2J;AAE3J,2CAgBoB;AAEpB,MAAM,UAAU,GAAG;IACf,CAAC,CAAC,EAAE,CAAC,CAAC;IACN,CAAC,CAAC,EAAE,CAAC,CAAC;IACN,CAAC,CAAC,EAAE,CAAC,CAAC;IACN,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;CACD,CAAC;AAEX,MAAM,IAAI,GAAG,CAAC,CAAC;AACf,MAAM,IAAI,GAAG,CAAC,CAAC;AAEf;IACoB,QAAQ,GAAG,oBAAY,CAAC,QAAQ,CAAC;IAChC,OAAO,CAAkB;IAClC,WAAW,CAAuB;IACzB,OAAO,CAAe;IACtB,MAAM,CAA8C;IACpD,MAAM,CAAyD;IAC/D,KAAK,CAAS;IACd,GAAG,CAAiB;IACpB,SAAS,CAAY;IACtC,yCAAyC;IACxB,KAAK,GAAG,IAAI,SAAS,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;IACpD,kEAAkE;IACjD,OAAO,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;IAC7C,OAAO,GAAG,IAAI,UAAU,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;IACtC,WAAW,CAAS;IAC7B,aAAa,CAAQ;IACrB,SAAS,GAAyC,IAAI,CAAC;IACvD,iBAAiB,GAAG,CAAC,CAAC;IACtB,SAAS,GAAqC,IAAI,CAAC;IAC1C,WAAW,CAAc;IACzB,WAAW,CAAS;IAErC,YAAY,OAAwB,EAAE,WAAiC,EAAE,OAAwB,EAAE,UAAsB;QACrH,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,WAAW,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClF,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACjD,IAAI,CAAC,WAAW,GAAG,CAAC,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;QAEtD,IAAI,CAAC,GAAG,GAAG,UAAU,CAAC,QAAQ,CAAC;QAC/B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;QAElC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,IAAI,iBAAS,CAAC,OAAO,CAAC;QACtD,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,IAAI,wBAAW,CAAC,OAAO,CAAC;QAC5D,IAAI,CAAC,MAAM,GAAG;YACV,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI,IAAI,QAAQ;YACpC,GAAG,EAAE,KAAK,CAAC,MAAM,EAAE,GAAG,IAAI,QAAQ;YAClC,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI,IAAI,QAAQ;SACvC,CAAC;QACF,IAAI,CAAC,MAAM,GAAG;YACV,EAAE,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,IAAI,IAAI;YACjC,EAAE,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,IAAI,IAAI;YACjC,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,IAAI,GAAG;YACjC,GAAG,EAAE,KAAK,CAAC,MAAM,EAAE,GAAG,IAAI,GAAG;SAChC,CAAC;QACF,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;IAC9C,CAAC;IAEO,SAAS,CAAC,IAAY;QAC1B,IAAI,IAAI,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACtC,IAAI,IAAI,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACtC,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;IAC7B,CAAC;IAEO,WAAW;QACf,IAAI,IAAI,GAAG,EAAE,CAAC;QACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5B,IAAI,CAAC,GAAG,CAAC;gBAAE,IAAI,IAAI,IAAI,CAAC;YACxB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC5B,IAAI,CAAC,GAAG,CAAC;oBAAE,IAAI,IAAI,GAAG,CAAC;gBACvB,MAAM,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;gBACzB,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAE,CAAC,CAAC;YACnF,CAAC;QACL,CAAC;QACD,OAAO,gCAAgC,IAAI,EAAE,CAAC;IAClD,CAAC;IAEO,IAAI,CAAC,GAAW;QACpB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAE,CAAC;QAC/B,IAAI,GAAG,GAAG,CAAC;YAAE,OAAO,CAAC,CAAC,CAAC;QACvB,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,aAAa,GAAG,CAAC,CAAU,CAAC;QAChD,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,GAAG,GAAG,CAAC,GAAG,KAAK,CAAC;QACrC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;QAC5B,OAAO,GAAG,CAAC;IACf,CAAC;IAEO,MAAM;QACV,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE;YAAE,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAE,IAAI,CAAC;gBAAE,OAAO,KAAK,CAAC;QACvE,OAAO,IAAI,CAAC;IAChB,CAAC;IAEO,QAAQ,CAAC,GAAW,EAAE,GAAW;QACrC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,GAAG,GAAG,CAAE,CAAC;QAC5C,IAAI,CAAC,KAAK;YAAE,OAAO,KAAK,CAAC;QACzB,KAAK,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,UAAU,EAAE,CAAC;YAChC,MAAM,KAAK,GAAa,CAAC,GAAG,GAAG,IAAI,GAAG,GAAG,CAAC,CAAC;YAC3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBACzB,MAAM,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,CAAC,EAClB,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,CAAC,CAAC;gBACrB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,KAAK;oBAAE,MAAM;gBAC1F,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC;YAC7B,CAAC;YACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBACzB,MAAM,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,CAAC,EAClB,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,CAAC,CAAC;gBACrB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,KAAK;oBAAE,MAAM;gBAC1F,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC;YAC7B,CAAC;YACD,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;gBACpB,KAAK,MAAM,GAAG,IAAI,KAAK;oBAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAC/C,OAAO,IAAI,CAAC;YAChB,CAAC;QACL,CAAC;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;IAEO,aAAa,CAAC,QAAQ,GAAG,KAAK;QAClC,MAAM,IAAI,GAAsC,EAAE,CAAC;QACnD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/B,MAAM,GAAG,GAAG,IAAI,6BAAgB,EAAiB,CAAC;YAClD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC7C,GAAG,CAAC,aAAa,CACb,IAAI,0BAAa,EAAE;qBACd,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;qBACtB,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;qBACpB,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC;qBAC1B,WAAW,CAAC,QAAQ,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CACrD,CAAC;YACN,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;IAEO,gBAAgB,CAAC,QAAQ,GAAG,KAAK;QACrC,MAAM,OAAO,GAAoC,EAAE,CAAC;QACpD,IAAI,QAAQ,EAAE,CAAC;YACX,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE;gBAAE,OAAO,CAAC,IAAI,CAAC,IAAI,0CAA6B,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QACvI,CAAC;aAAM,CAAC;YACJ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE;gBAAE,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAE,IAAI,CAAC;oBAAE,OAAO,CAAC,IAAI,CAAC,IAAI,0CAA6B,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QAClK,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,oCAAuB,EAAE,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QACzJ,OAAO,CAAC,IAAI,6BAAgB,EAA2B,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;IACjF,CAAC;IAEO,cAAc,CAAC,MAAc,EAAE,KAAa,EAAE,QAAQ,GAAG,KAAK;QAClE,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC;QAC9B,MAAM,IAAI,GAAG,IAAI,6BAAgB,EAAE;aAC9B,cAAc,CAAC,KAAK,CAAC;aACrB,wBAAwB,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;aACrE,wBAAwB,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,QAAQ,WAAW,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,QAAQ,IAAI,CAAC,CAAC;aACnI,sBAAsB,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,iCAAoB,CAAC,KAAK,CAAC,CAAC;aAC1F,wBAAwB,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;aACrE,sBAAsB,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,iCAAoB,CAAC,KAAK,CAAC,CAAC;aAC1F,wBAAwB,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;QAC/D,OAAO,IAAI,CAAC,SAAS,KAAK,iBAAS,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC;IACpL,CAAC;IAEO,cAAc;QAClB,IAAI,IAAI,CAAC,SAAS;YAAE,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACjD,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,CAAC,iBAAiB,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IAC1H,CAAC;IAEO,KAAK,CAAC,iBAAiB;QAC3B,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAEzB,IAAI,IAAI,CAAC,iBAAiB,IAAI,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,MAAM,IAAI,CAAC,IAAI,CAAC;gBACZ,UAAU,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,mBAAmB,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBACvF,KAAK,EAAE,yBAAY,CAAC,cAAc;aACrC,CAAC,CAAC;YACH,OAAO;QACX,CAAC;QAED,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACtD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAE,CAAC;QAC/C,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;QAE7E,MAAM,IAAI,CAAC,IAAI,CAAC;YACZ,UAAU,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC3I,KAAK,EAAE,yBAAY,CAAC,cAAc;SACrC,CAAC,CAAC;QAEH,IAAI,CAAC,cAAc,EAAE,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,MAAM;QACR,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAE1D,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAE,CAAC;QACtD,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;QAClF,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;QAErH,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC;YAC5B,UAAU,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAChE,KAAK,EAAE,yBAAY,CAAC,cAAc;SACrC,CAAC,CAAC;QAEH,IAAI,CAAC,OAAO;YAAE,OAAO,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC;QAEzC,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,+BAA+B,CAAC;YACrD,aAAa,EAAE,IAAI,CAAC,SAAS,KAAK,iBAAS,CAAC,UAAU,CAAC,CAAC,CAAC,0BAAa,CAAC,YAAY,CAAC,CAAC,CAAC,0BAAa,CAAC,MAAM;YAC1G,IAAI,EAAE,OAAO;YACb,MAAM,EAAE,CAAC,CAAC,EAAE;gBACR,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;oBAAE,OAAO,IAAI,CAAC;gBAC5D,IAAA,mBAAU,EAAC,CAAC,EAAE;oBACV,MAAM,EAAE,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,EAAE,mBAAM,CAAC,GAAG,EAAE,CAAC;oBAClE,KAAK,EAAE,yBAAY,CAAC,SAAS;iBAChC,CAAC,CAAC;gBACH,OAAO,KAAK,CAAC;YACjB,CAAC;SACJ,CAAC,CAAC;QAEH,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,EAAC,iBAAiB,EAAC,EAAE;YACnD,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,KAAK,iBAAS,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7I,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACnF,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE;YACzC,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;gBACzC,IAAI,CAAC;oBACD,MAAM,IAAI,CAAC,IAAI,CAAC;wBACZ,UAAU,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;wBAC3E,KAAK,EAAE,yBAAY,CAAC,cAAc;qBACrC,CAAC,CAAC;gBACP,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACb,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACvB,CAAC;wBAAS,CAAC;oBACP,IAAI,CAAC,OAAO,EAAE,CAAC;gBACnB,CAAC;YACL,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,cAAc,EAAE,CAAC;IAC1B,CAAC;IAEO,KAAK,CAAC,QAAQ,CAAC,GAAW,EAAE,SAA0D;QAC1F,mEAAmE;QACnE,IAAI,CAAC,CAAC,MAAM,IAAA,wBAAe,EAAC,SAAS,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;YAAE,OAAO;QACzE,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC;QAE7B,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAE,CAAC;QACjD,IAAI,SAAS,CAAC,IAAI,CAAC,EAAE,KAAK,MAAM,CAAC,EAAE,EAAE,CAAC;YAClC,OAAO,KAAK,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE;gBACxC,MAAM,EAAE,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,EAAE,mBAAM,CAAC,GAAG,EAAE,CAAC;gBAClE,KAAK,EAAE,yBAAY,CAAC,SAAS;aAChC,CAAC,CAAC,CAAC;QACR,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC3B,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;YACb,OAAO,KAAK,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE;gBACxC,MAAM,EAAE,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,EAAE,mBAAM,CAAC,GAAG,EAAE,CAAC;gBACjE,KAAK,EAAE,yBAAY,CAAC,SAAS;aAChC,CAAC,CAAC,CAAC;QACR,CAAC;QACD,IAAI,IAAI,CAAC,iBAAiB;YAAE,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC;QAEvD,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;YAC1B,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,OAAO,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC;gBACzB,UAAU,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;gBAC/H,KAAK,EAAE,yBAAY,CAAC,cAAc;aACrC,CAAC,CAAC,CAAC;QACR,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;YAChB,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,OAAO,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC;gBACzB,UAAU,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBACxE,KAAK,EAAE,yBAAY,CAAC,cAAc;aACrC,CAAC,CAAC,CAAC;QACR,CAAC;QAED,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACtD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAE,CAAC;QAC/C,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;QAE7E,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACxD,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,CAAC;QAE7B,MAAM,IAAI,CAAC,IAAI,CAAC;YACZ,UAAU,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACpI,KAAK,EAAE,yBAAY,CAAC,cAAc;SACrC,CAAC,CAAC;QAEH,IAAI,CAAC,cAAc,EAAE,CAAC;IAC1B,CAAC;IAED,0HAA0H;IAClH,IAAI,CAAC,OAAuC;QAChD,OAAO,IAAA,iBAAQ,EAAC,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;IACxE,CAAC;IAED,uDAAuD;IAC/C,QAAQ,CAAC,WAA+C,EAAE,OAA2C;QACzG,OAAO,IAAA,qBAAY,EAAC,WAAW,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,4FAA4F;IACpF,MAAM,CAAC,KAAc;QACzB,IAAA,oBAAW,EAAC,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;IAChD,CAAC;IAEO,OAAO;QACX,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACjB,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC7B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QAC1B,CAAC;QAED,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACjB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC/B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QAC1B,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACpD,CAAC;CACJ"}
@@ -1,4 +1,4 @@
1
- import { GameNameType, type HangmanOptions, type IGame, type GameLocale, type GameManagerType } from "../structures/Types";
1
+ import { GameNameType, type GameLocale, type GameManagerType, type HangmanOptions, type IGame } from "../structures/Types";
2
2
  import { RepliableInteraction } from "discord.js";
3
3
  export default class Hangman implements IGame {
4
4
  readonly gameName = GameNameType.Hangman;
@@ -25,6 +25,12 @@ export default class Hangman implements IGame {
25
25
  private buildLetterMenu;
26
26
  private buildModalWord;
27
27
  launch(): Promise<void>;
28
+ /** `editReply` on the game message, guarded by the library error handler. Resolves to `null` when the message is gone. */
29
+ private edit;
30
+ /** `followUp` guarded by the library error handler. */
31
+ private followUp;
32
+ /** Reports an error raised from a collector — nothing can `await` it. */
33
+ private report;
28
34
  private cleanup;
29
35
  }
30
36
  //# sourceMappingURL=Hangman.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Hangman.d.ts","sourceRoot":"","sources":["../../src/games/Hangman.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,KAAK,cAAc,EAAE,KAAK,KAAK,EAAE,KAAK,UAAU,EAAsB,KAAK,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE9I,OAAO,EASH,oBAAoB,EAWvB,MAAM,YAAY,CAAC;AAEpB,MAAM,CAAC,OAAO,OAAO,OAAQ,YAAW,KAAK;IACzC,SAAgB,QAAQ,wBAAwB;IAChD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkB;IAC1C,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;IACvC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA8C;IACrE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAgB;IACpC,OAAO,CAAC,aAAa,CAAY;IACjC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAoB;IAEhD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;IAC7C,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,SAAS,CAA0C;IAC3D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IAErC,YAAY,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,oBAAoB,EAAE,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,UAAU,EAsBvH;IAGD,OAAO,CAAC,QAAQ;YAMF,gBAAgB;IA2G9B,OAAO,CAAC,cAAc;IA8BtB,OAAO,CAAC,eAAe;IAYvB,OAAO,CAAC,cAAc;IAOhB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAgC5B;IAED,OAAO,CAAC,OAAO;CAQlB"}
1
+ {"version":3,"file":"Hangman.d.ts","sourceRoot":"","sources":["../../src/games/Hangman.ts"],"names":[],"mappings":"AACA,OAAO,EAAiB,YAAY,EAAmB,KAAK,UAAU,EAAE,KAAK,eAAe,EAAsB,KAAK,cAAc,EAAE,KAAK,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE9K,OAAO,EASH,oBAAoB,EAWvB,MAAM,YAAY,CAAC;AAEpB,MAAM,CAAC,OAAO,OAAO,OAAQ,YAAW,KAAK;IACzC,SAAgB,QAAQ,wBAAwB;IAChD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkB;IAC1C,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;IACvC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA8C;IACrE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAgB;IACpC,OAAO,CAAC,aAAa,CAAY;IACjC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAoB;IAEhD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;IAC7C,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,SAAS,CAA0C;IAC3D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IAErC,YAAY,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,oBAAoB,EAAE,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,UAAU,EAsBvH;IAGD,OAAO,CAAC,QAAQ;YAMF,gBAAgB;IA8G9B,OAAO,CAAC,cAAc;IA8BtB,OAAO,CAAC,eAAe;IAYvB,OAAO,CAAC,cAAc;IAMhB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAsC5B;IAED,0HAA0H;IAC1H,OAAO,CAAC,IAAI;IAIZ,uDAAuD;IACvD,OAAO,CAAC,QAAQ;IAIhB,yEAAyE;IACzE,OAAO,CAAC,MAAM;IAId,OAAO,CAAC,OAAO;CAQlB"}
@@ -33,6 +33,7 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
+ const Errors_1 = require("../structures/Errors");
36
37
  const Types_1 = require("../structures/Types");
37
38
  const varHang = __importStar(require("../variables"));
38
39
  const discord_js_1 = require("discord.js");
@@ -70,7 +71,7 @@ class Hangman {
70
71
  };
71
72
  this.lifeCount = options?.lifeCount ?? 6;
72
73
  if (this.lifeCount >= 10)
73
- throw new Error(`The parameter "lifeCount" must be lower than 10 (received: ${this.lifeCount})`);
74
+ throw new Errors_1.WynhamGamesError(Types_1.WynhamErrorCode.InvalidLifeCount, { detail: `(received: ${this.lifeCount})`, game: this.gameName });
74
75
  this.title = options.lang?.title ?? this.loc.title;
75
76
  this.word = this.loc.words[Math.floor(Math.random() * this.loc.words.length)];
76
77
  this.wordLetters = this.word.split("");
@@ -84,17 +85,19 @@ class Hangman {
84
85
  async handleComponents(components) {
85
86
  const player = this.players[this.currentPlayer];
86
87
  if (components.user.id !== player.id) {
87
- return void (await components.reply({
88
+ return void (await (0, Errors_1.safeReply)(components, {
88
89
  embeds: [{ description: this.loc.notYourTurn, color: discord_js_1.Colors.Red }],
89
90
  flags: discord_js_1.MessageFlags.Ephemeral,
90
91
  }));
91
92
  }
92
93
  if (components.isStringSelectMenu()) {
93
- await components.deferUpdate();
94
+ // A dead interaction token cannot be acknowledged: skip this guess.
95
+ if (!(await (0, Errors_1.safeDeferUpdate)(components, { game: this.gameName })))
96
+ return;
94
97
  this.interaction = components;
95
98
  const letter = components.values[0].toUpperCase();
96
99
  if (this.guessed.has(letter)) {
97
- return void (await components.followUp({
100
+ return void (await this.followUp(components, {
98
101
  embeds: [{ description: this.loc.alreadyGuessed(letter), color: discord_js_1.Colors.Red }],
99
102
  flags: discord_js_1.MessageFlags.Ephemeral,
100
103
  }));
@@ -105,14 +108,14 @@ class Hangman {
105
108
  const wordKnown = this.wordLetters.every(l => this.guessed.has(l));
106
109
  if (wordKnown) {
107
110
  this.cleanup();
108
- return void (await this.interaction.editReply({
111
+ return void (await this.edit({
109
112
  components: [this.buildContainer(this.loc.win(player.username, this.word), this.colors.win, true)],
110
113
  flags: discord_js_1.MessageFlags.IsComponentsV2,
111
114
  }));
112
115
  }
113
116
  if (this.wrongCount >= this.lifeCount) {
114
117
  this.cleanup();
115
- return void (await this.interaction.editReply({
118
+ return void (await this.edit({
116
119
  components: [this.buildContainer(this.loc.lose(this.word), this.colors.lose, true)],
117
120
  flags: discord_js_1.MessageFlags.IsComponentsV2,
118
121
  }));
@@ -121,13 +124,16 @@ class Hangman {
121
124
  this.collector?.resetTimer();
122
125
  this.currentPlayer = this.currentPlayer === 0 ? 1 : 0;
123
126
  const next = this.players[this.currentPlayer];
124
- await this.interaction.editReply({
127
+ await this.edit({
125
128
  components: [this.buildContainer(this.loc.turn(next.username))],
126
129
  flags: discord_js_1.MessageFlags.IsComponentsV2,
127
130
  });
128
131
  }
129
132
  else if (components.isButton()) {
130
- await components.showModal(this.buildModalWord());
133
+ // `showModal` acknowledges the interaction: if that token is dead, there is no modal to wait for.
134
+ const shown = await (0, Errors_1.safeDiscordCall)(() => components.showModal(this.buildModalWord()), { action: Types_1.DiscordAction.Reply, game: this.gameName });
135
+ if (shown === null)
136
+ return;
131
137
  if (this.isModal)
132
138
  return;
133
139
  this.isModal = true;
@@ -135,18 +141,19 @@ class Hangman {
135
141
  if (!modalSubmit)
136
142
  return;
137
143
  this.isModal = false;
138
- await modalSubmit.deferUpdate();
144
+ if (!(await (0, Errors_1.safeDeferUpdate)(modalSubmit, { game: this.gameName })))
145
+ return;
139
146
  const guess = modalSubmit.fields.getTextInputValue("value").toUpperCase().trim();
140
147
  if (guess === this.word) {
141
148
  this.cleanup();
142
- return void (await this.interaction.editReply({
149
+ return void (await this.edit({
143
150
  components: [this.buildContainer(this.loc.win(player.username, this.word), this.colors.win, true)],
144
151
  flags: discord_js_1.MessageFlags.IsComponentsV2,
145
152
  }));
146
153
  }
147
154
  else {
148
155
  if (this.guessed.has(guess)) {
149
- return void (await modalSubmit.followUp({
156
+ return void (await this.followUp(modalSubmit, {
150
157
  embeds: [{ description: this.loc.alreadyGuessedWord(guess), color: discord_js_1.Colors.Red }],
151
158
  flags: discord_js_1.MessageFlags.Ephemeral,
152
159
  }));
@@ -157,7 +164,7 @@ class Hangman {
157
164
  this.guessed.add(guess);
158
165
  if (this.wrongCount >= this.lifeCount) {
159
166
  this.cleanup();
160
- return void (await this.interaction.editReply({
167
+ return void (await this.edit({
161
168
  components: [this.buildContainer(this.loc.lose(this.word), this.colors.lose, true)],
162
169
  flags: discord_js_1.MessageFlags.IsComponentsV2,
163
170
  }));
@@ -166,7 +173,7 @@ class Hangman {
166
173
  this.collector?.resetTimer();
167
174
  this.currentPlayer = this.currentPlayer === 0 ? 1 : 0;
168
175
  const next = this.players[this.currentPlayer];
169
- await this.interaction.editReply({
176
+ await this.edit({
170
177
  components: [this.buildContainer(this.loc.turn(next.username))],
171
178
  flags: discord_js_1.MessageFlags.IsComponentsV2,
172
179
  });
@@ -213,40 +220,59 @@ class Hangman {
213
220
  buildModalWord() {
214
221
  const textInputWord = new discord_js_1.TextInputBuilder().setCustomId("value").setStyle(discord_js_1.TextInputStyle.Paragraph).setMaxLength(50).setMinLength(1);
215
222
  const labelWord = new discord_js_1.LabelBuilder().setLabel(this.loc.modalLabel).setTextInputComponent(textInputWord);
216
- const modal = new discord_js_1.ModalBuilder().setTitle(this.loc.modalTitle).setCustomId("hangman_mdl").setLabelComponents(labelWord);
217
- return modal;
223
+ return new discord_js_1.ModalBuilder().setTitle(this.loc.modalTitle).setCustomId("hangman_mdl").setLabelComponents(labelWord);
218
224
  }
219
225
  async launch() {
220
226
  this.manager.cooldowns.replace(this.cooldownKey, 300_000);
221
- const message = await this.interaction.editReply({
227
+ const message = await this.edit({
222
228
  components: [this.buildContainer(this.loc.firstTurn(this.players[this.currentPlayer].username))],
223
229
  flags: discord_js_1.MessageFlags.IsComponentsV2,
224
230
  });
231
+ if (!message)
232
+ return void this.cleanup();
225
233
  this.collector = message.createMessageComponentCollector({
226
234
  time: 300_000,
227
235
  idle: this.turnTimeout,
228
236
  filter: i => {
229
237
  if (this.players.some(p => p.id === i.user.id))
230
238
  return true;
231
- i.reply({
239
+ (0, Errors_1.safeNotify)(i, {
232
240
  embeds: [{ description: this.loc.notYourGame, color: discord_js_1.Colors.Red }],
233
241
  flags: discord_js_1.MessageFlags.Ephemeral,
234
242
  });
235
243
  return false;
236
244
  },
237
245
  });
238
- this.collector.on("collect", (i) => this.handleComponents(i));
246
+ this.collector.on("collect", (i) => void this.handleComponents(i).catch(error => this.report(error)));
239
247
  this.collector.on("end", async (_, reason) => {
240
248
  if (reason === "time" || reason === "idle") {
241
- await this.interaction
242
- .editReply({
243
- components: [this.buildContainer(this.loc.timeout(this.word), this.colors.lose, true)],
244
- flags: discord_js_1.MessageFlags.IsComponentsV2,
245
- })
246
- .catch(() => { });
249
+ try {
250
+ await this.edit({
251
+ components: [this.buildContainer(this.loc.timeout(this.word), this.colors.lose, true)],
252
+ flags: discord_js_1.MessageFlags.IsComponentsV2,
253
+ });
254
+ }
255
+ catch (error) {
256
+ this.report(error);
257
+ }
258
+ finally {
259
+ this.cleanup();
260
+ }
247
261
  }
248
262
  });
249
263
  }
264
+ /** `editReply` on the game message, guarded by the library error handler. Resolves to `null` when the message is gone. */
265
+ edit(options) {
266
+ return (0, Errors_1.safeEdit)(this.interaction, options, { game: this.gameName });
267
+ }
268
+ /** `followUp` guarded by the library error handler. */
269
+ followUp(interaction, options) {
270
+ return (0, Errors_1.safeFollowUp)(interaction, options, { game: this.gameName });
271
+ }
272
+ /** Reports an error raised from a collector — nothing can `await` it. */
273
+ report(error) {
274
+ (0, Errors_1.reportError)(error, { game: this.gameName });
275
+ }
250
276
  cleanup() {
251
277
  if (this.collector) {
252
278
  this.collector.stop("cleanup");