@sodiumlabs/gamecord 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +58 -0
- package/dist/index.d.mts +2145 -0
- package/dist/index.d.ts +2145 -0
- package/dist/index.js +2614 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +2561 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +66 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/games/2048.ts","../src/core/Game.ts","../src/utils/games.ts","../src/utils/schemas.ts","../src/utils/constants.ts","../src/utils/random.ts","../src/games/Connect4.ts","../src/core/VersusGame.ts","../src/games/FastType.ts","../src/games/Flood.ts","../src/games/Memory.ts","../src/games/Minesweeper.ts","../src/games/RockPaperScissors.ts","../src/games/TicTacToe.ts","../src/games/Trivia.ts","../src/games/Wordle.ts","../src/data/wordle.json"],"sourcesContent":["export * from \"@/games/2048\";\nexport * from \"@/games/Connect4\";\nexport * from \"@/games/FastType\";\nexport * from \"@/games/Flood\";\nexport * from \"@/games/Memory\";\nexport * from \"@/games/Minesweeper\";\nexport * from \"@/games/RockPaperScissors\";\nexport * from \"@/games/TicTacToe\";\nexport * from \"@/games/Trivia\";\nexport * from \"@/games/Wordle\";\n","import z from \"zod/v4\";\nimport { createCanvas } from \"@napi-rs/canvas\";\nimport { ActionRowBuilder, AttachmentBuilder, ButtonBuilder, ButtonStyle, Message, MessageFlags } from \"discord.js\";\nimport { Game, GameContext, GameResult } from \"@/core/Game\";\nimport { moveInDirection, getOppositeDirection, Position } from \"@/utils/games\";\nimport { embedBuilder, gameMessage } from \"@/utils/schemas\";\nimport { colors } from \"@/utils/constants\";\nimport { getRandomInt } from \"@/utils/random\";\nimport { Embed1, Embed2 } from \"@/utils/types\";\n\n/**\n * The 2048 game result.\n */\nexport interface Game2048Result extends GameResult {\n outcome: \"over\" | \"timeout\";\n score: number;\n /**\n * If the player reached 2048 or more.\n */\n hasWon: boolean;\n}\n\nconst defaultOptions = {\n embed: {\n title: \"2048\",\n color: colors.blurple,\n },\n notPlayerMessage: (game: Game2048) => `Only ${game.player} can use this menu.`,\n timeout: 60_000,\n buttonStyle: ButtonStyle.Secondary,\n emojis: {\n up: \"🔼\",\n down: \"🔽\",\n right: \"▶️\",\n left: \"◀️\",\n },\n};\n\nexport interface Game2048Options extends z.input<typeof game2048Options> {\n embed?: Embed1<Game2048>;\n endEmbed?: Embed2<Game2048, Game2048Result>;\n /**\n * The max amount of time the player can be idle.\n */\n timeout?: number;\n}\n\nexport const game2048Options = z.object({\n embed: embedBuilder<[Game2048]>().optional().default(defaultOptions.embed),\n endEmbed: embedBuilder<[Game2048, Game2048Result]>().optional(),\n notPlayerMessage: gameMessage<Game2048>()\n .optional()\n .default(() => defaultOptions.notPlayerMessage),\n timeout: z.number().int().optional().default(defaultOptions.timeout),\n buttonStyle: z.number().int().optional().default(ButtonStyle.Secondary),\n emojis: z\n .object({\n up: z.string().optional().default(defaultOptions.emojis.up),\n down: z.string().optional().default(defaultOptions.emojis.down),\n right: z.string().optional().default(defaultOptions.emojis.right),\n left: z.string().optional().default(defaultOptions.emojis.left),\n })\n .optional()\n .default(defaultOptions.emojis),\n});\n\n/**\n * A game where the player needs to merge numbers until reaching 2048.\n *\n * # Custom Display\n *\n * If you are using functions to create the embeds, use `attachment://board.png`\n * in the embed image URL to display the board.\n *\n * # Example\n *\n * ```js\n * const game = new Game2048(interaction, {\n * timeout: 120_000\n * });\n *\n * game.on(\"error\", err => console.error(err));\n * game.on(\"gameOver\", result => console.log(result));\n *\n * await game.start();\n * ```\n */\nexport class Game2048 extends Game<Game2048Result> {\n readonly options: z.output<typeof game2048Options>;\n\n /**\n * The numbers are stored as exponents (1 => 2, 2 => 4, etc.).\n */\n readonly gameboard: number[] = [];\n readonly length = 4;\n score = 0;\n\n message: Message | null = null;\n\n private mergedPos: Position[] = [];\n\n constructor(context: GameContext, options?: Game2048Options) {\n super(context);\n this.options = game2048Options.parse(options || {});\n\n for (let y = 0; y < this.length; y++) {\n for (let x = 0; x < this.length; x++) {\n this.gameboard[y * this.length + x] = 0;\n }\n }\n }\n\n override async start() {\n this.placeRandomTile();\n this.placeRandomTile();\n\n const embed = await this.buildEmbed(this.options.embed, {\n image: {\n url: \"attachment://board.png\",\n },\n fields: [\n {\n name: \"Current Score\",\n value: this.score.toString(),\n },\n ],\n });\n\n this.message = await this.sendMessage({\n embeds: [embed],\n components: this.getComponents(),\n files: [await this.getBoardAttachment()],\n });\n this.handleButtons(this.message);\n }\n\n private handleButtons(message: Message) {\n const collector = message.createMessageComponentCollector({ idle: this.options.timeout });\n\n collector.on(\"collect\", async i => {\n if (!i.customId.startsWith(\"$gamecord\")) return;\n\n if (i.user.id !== this.player.id) {\n if (this.options.notPlayerMessage) {\n try {\n await i.reply({\n content: this.options.notPlayerMessage(this),\n flags: MessageFlags.Ephemeral,\n });\n } catch (err) {\n this.emit(\"error\", err);\n }\n }\n return;\n }\n\n let moved = false;\n this.mergedPos = [];\n const direction = i.customId.split(\"-\").at(-1);\n\n try {\n await i.deferUpdate();\n } catch (err) {\n this.emit(\"error\", err);\n return;\n }\n\n if (direction === \"up\" || direction === \"down\") moved = this.shiftVertical(direction);\n if (direction === \"left\" || direction === \"right\") moved = this.shiftHorizontal(direction);\n\n if (moved) this.placeRandomTile();\n if (this.isGameOver()) return collector.stop(\"$over\");\n\n const embed = await this.buildEmbed(this.options.embed, {\n image: {\n url: \"attachment://board.png\",\n },\n fields: [\n {\n name: \"Current Score\",\n value: this.score.toString(),\n },\n ],\n });\n\n try {\n await i.editReply({ embeds: [embed], files: [await this.getBoardAttachment()] });\n } catch (err) {\n this.emit(\"error\", err);\n }\n });\n\n collector.on(\"end\", async (_, reason) => {\n this.emit(\"end\");\n\n if (reason === \"idle\" || reason === \"$over\") {\n await this.gameOver(message, reason === \"$over\" ? \"over\" : \"timeout\");\n }\n });\n }\n\n private async gameOver(message: Message, outcome: \"over\" | \"timeout\") {\n const result = this.result({ outcome, score: this.score, hasWon: !!this.gameboard.find(n => n >= 11) });\n this.emit(\"gameOver\", result);\n\n const embed = await this.buildEndEmbed(this.options.embed, this.options.endEmbed, result, {\n image: {\n url: \"attachment://board.png\",\n },\n fields: [\n {\n name: \"Total Score\",\n value: this.score.toString(),\n },\n ],\n });\n\n try {\n await this.editContextOrMessage(message, {\n embeds: [embed],\n components: this.getComponents(true),\n files: [await this.getBoardAttachment()],\n });\n } catch (err) {\n this.emit(\"error\", err);\n }\n }\n\n private isGameOver() {\n let boardFull = true;\n let numMoves = 0;\n\n for (let y = 0; y < this.length; y++) {\n for (let x = 0; x < this.length; x++) {\n if (this.gameboard[y * this.length + x] === 0) boardFull = false;\n const posNum = this.gameboard[y * this.length + x];\n\n for (const dir of [\"down\", \"left\", \"right\", \"up\"]) {\n const newPos = moveInDirection({ x, y }, dir);\n if (\n this.isInsideBlock(newPos) &&\n (this.gameboard[newPos.y * this.length + newPos.x] === 0 ||\n this.gameboard[newPos.y * this.length + newPos.x] === posNum)\n ) {\n numMoves++;\n }\n }\n }\n }\n return boardFull && numMoves === 0;\n }\n\n private placeRandomTile() {\n let tilePos = { x: 0, y: 0 };\n\n do {\n tilePos = { x: getRandomInt(this.length), y: getRandomInt(this.length) };\n } while (this.gameboard[tilePos.y * this.length + tilePos.x] != 0);\n\n this.gameboard[tilePos.y * this.length + tilePos.x] = Math.random() > 0.8 ? 2 : 1;\n }\n\n /**\n * @returns Has moved\n */\n private shiftVertical(dir: string): boolean {\n let moved = false;\n for (let x = 0; x < this.length; x++) {\n if (dir === \"up\") {\n for (let y = 1; y < this.length; y++) moved = this.shift({ x, y }, \"up\") || moved;\n } else {\n for (let y = this.length - 2; y >= 0; y--) moved = this.shift({ x, y }, \"down\") || moved;\n }\n }\n return moved;\n }\n\n /**\n * @returns Has moved\n */\n private shiftHorizontal(dir: string): boolean {\n let moved = false;\n for (let y = 0; y < this.length; y++) {\n if (dir === \"left\") {\n for (let x = 1; x < this.length; x++) {\n moved = this.shift({ x, y }, \"left\") || moved;\n }\n } else {\n for (let x = this.length - 2; x >= 0; x--) {\n moved = this.shift({ x, y }, \"right\") || moved;\n }\n }\n }\n return moved;\n }\n\n private isInsideBlock(pos: Position) {\n return pos.x >= 0 && pos.y >= 0 && pos.x < this.length && pos.y < this.length;\n }\n\n /**\n * @returns Has moved\n */\n private shift(pos: Position, dir: string): boolean {\n let moved = false;\n const movingTile = this.gameboard[pos.y * this.length + pos.x];\n if (movingTile === 0) return false;\n\n let set = false;\n let moveTo = pos;\n while (!set) {\n moveTo = moveInDirection(moveTo, dir);\n const moveToTile = this.gameboard[moveTo.y * this.length + moveTo.x];\n\n if (\n !this.isInsideBlock(moveTo) ||\n (moveToTile !== 0 && moveToTile !== movingTile) ||\n !!this.mergedPos.find(p => p.x === moveTo.x && p.y === moveTo.y)\n ) {\n const moveBack = moveInDirection(moveTo, getOppositeDirection(dir));\n if (!(moveBack.x === pos.x && moveBack.y === pos.y)) {\n this.gameboard[pos.y * this.length + pos.x] = 0;\n this.gameboard[moveBack.y * this.length + moveBack.x] = movingTile;\n moved = true;\n }\n set = true;\n } else if (moveToTile === movingTile) {\n moved = true;\n this.gameboard[moveTo.y * this.length + moveTo.x] += 1;\n this.score += Math.floor(Math.pow(this.gameboard[moveTo.y * this.length + moveTo.x], 2));\n this.gameboard[pos.y * this.length + pos.x] = 0;\n this.mergedPos.push(moveTo);\n set = true;\n }\n }\n\n return moved;\n }\n\n private getComponents(disabled = false) {\n const row1 = new ActionRowBuilder<ButtonBuilder>().setComponents(\n new ButtonBuilder()\n .setDisabled(true)\n .setLabel(\"\\u200b\")\n .setStyle(this.options.buttonStyle)\n .setCustomId(\"$gamecord-2048-none1\"),\n new ButtonBuilder()\n .setDisabled(disabled)\n .setEmoji(this.options.emojis.up)\n .setStyle(this.options.buttonStyle)\n .setCustomId(\"$gamecord-2048-up\"),\n new ButtonBuilder()\n .setDisabled(true)\n .setLabel(\"\\u200b\")\n .setStyle(this.options.buttonStyle)\n .setCustomId(\"$gamecord-2048-none2\"),\n );\n\n const row2 = new ActionRowBuilder<ButtonBuilder>().setComponents(\n new ButtonBuilder()\n .setDisabled(disabled)\n .setEmoji(this.options.emojis.left)\n .setStyle(this.options.buttonStyle)\n .setCustomId(\"$gamecord-2048-left\"),\n new ButtonBuilder()\n .setDisabled(disabled)\n .setEmoji(this.options.emojis.down)\n .setStyle(this.options.buttonStyle)\n .setCustomId(\"$gamecord-2048-down\"),\n new ButtonBuilder()\n .setDisabled(disabled)\n .setEmoji(this.options.emojis.right)\n .setStyle(this.options.buttonStyle)\n .setCustomId(\"$gamecord-2048-right\"),\n );\n\n return [row1, row2];\n }\n\n private async getBoardAttachment(): Promise<AttachmentBuilder> {\n return new AttachmentBuilder(await this.getBoardImage(), { name: \"board.png\" });\n }\n\n private async getBoardImage(): Promise<Buffer> {\n const rows = this.length;\n const cols = this.length;\n const tile = 88;\n const gap = 12;\n const padding = 20;\n const width = padding * 2 + cols * tile + (cols - 1) * gap;\n const height = padding * 2 + rows * tile + (rows - 1) * gap;\n\n const canvas = createCanvas(width, height);\n const ctx = canvas.getContext(\"2d\");\n\n // 2048 palette\n const PALETTE = {\n bg: \"#faf8ef\",\n board: \"#bbada0\",\n empty: \"#cdc1b4\",\n textDark: \"#776e65\",\n textLight: \"#f9f6f2\",\n tiles: new Map<number, string>([\n [2, \"#eee4da\"],\n [4, \"#ede0c8\"],\n [8, \"#f2b179\"],\n [16, \"#f59563\"],\n [32, \"#f67c5f\"],\n [64, \"#f65e3b\"],\n [128, \"#edcf72\"],\n [256, \"#edcc61\"],\n [512, \"#edc850\"],\n [1024, \"#edc53f\"],\n [2048, \"#edc22e\"],\n ]),\n };\n\n // Fill background + board area\n ctx.fillStyle = PALETTE.bg;\n ctx.fillRect(0, 0, width, height);\n\n // board background\n const boardRadius = 8;\n const boardX = padding - 8;\n const boardY = padding - 8;\n const boardWidth = cols * tile + (cols - 1) * gap + 16;\n const boardHeight = rows * tile + (rows - 1) * gap + 16;\n\n // rounded rect helper\n function roundRect(x: number, y: number, w: number, h: number, r: number) {\n ctx.beginPath();\n ctx.moveTo(x + r, y);\n ctx.lineTo(x + w - r, y);\n ctx.quadraticCurveTo(x + w, y, x + w, y + r);\n ctx.lineTo(x + w, y + h - r);\n ctx.quadraticCurveTo(x + w, y + h, x + w - r, y + h);\n ctx.lineTo(x + r, y + h);\n ctx.quadraticCurveTo(x, y + h, x, y + h - r);\n ctx.lineTo(x, y + r);\n ctx.quadraticCurveTo(x, y, x + r, y);\n ctx.closePath();\n }\n\n ctx.fillStyle = PALETTE.board;\n roundRect(boardX, boardY, boardWidth, boardHeight, boardRadius);\n ctx.fill();\n\n // draw tiles\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n\n for (let r = 0; r < rows; r++) {\n for (let c = 0; c < cols; c++) {\n const x = padding + c * (tile + gap);\n const y = padding + r * (tile + gap);\n\n // game stores exponents (1 => 2, 2 => 4, etc.)\n const exponent = this.gameboard[r * this.length + c] ?? 0;\n const value = exponent > 0 ? 2 ** exponent : 0;\n\n // tile background\n const bgColor = value === 0 ? PALETTE.empty : (PALETTE.tiles.get(value) ?? \"#3c3a32\");\n const radius = 6;\n ctx.fillStyle = bgColor;\n roundRect(x, y, tile, tile, radius);\n ctx.fill();\n\n // subtle inner stroke for empty tiles\n ctx.lineWidth = 2;\n ctx.strokeStyle = value === 0 ? \"rgba(0,0,0,0.06)\" : \"rgba(0,0,0,0.08)\";\n ctx.stroke();\n\n // number\n if (value !== 0) {\n const digits = value.toString().length;\n // adjust font size based on digits\n let fontSize = Math.floor(tile * 0.54);\n if (digits >= 3) fontSize = Math.floor(tile * 0.46);\n if (digits >= 4) fontSize = Math.floor(tile * 0.36);\n ctx.font = `700 ${fontSize}px sans-serif`;\n\n ctx.fillStyle = value <= 4 ? PALETTE.textDark : PALETTE.textLight;\n ctx.fillText(value.toString(), x + tile / 2, y + tile / 2 + 2);\n }\n }\n }\n\n // return PNG buffer\n return canvas.toBuffer(\"image/png\");\n }\n}\n","import { EventEmitter } from \"node:events\";\nimport {\n APIEmbed,\n Awaitable,\n InteractionEditReplyOptions,\n InteractionReplyOptions,\n Message,\n MessageCreateOptions,\n MessageEditOptions,\n RepliableInteraction,\n SendableChannels,\n User,\n} from \"discord.js\";\n\nexport type GameContext = RepliableInteraction | Message;\n\nexport interface GameResult {\n /**\n * The player who started the game.\n */\n player: User;\n /**\n * The timestamp at which the game started.\n */\n gameStartedAt: number;\n /**\n * The duration of the game in milliseconds.\n */\n gameDuration: number;\n}\n\n// oxlint-disable-next-line no-unused-vars\nexport declare interface Game<Res, Ctx extends GameContext = GameContext> {\n /**\n * Emitted when an error occurred.\n */\n on(event: \"error\", listener: (err: unknown) => Awaitable<void>): this;\n /**\n * Emitted when a fatal error occurred. The \"end\" event will be emitted at the same time.\n * For example, this let you tell the players that the game stopped.\n *\n * This can only happens in some games, see their docs to know more.\n */\n on(event: \"fatalError\", listener: (err: unknown) => Awaitable<void>): this;\n /**\n * Only emitted on instances of {@link VersusGame}.\n *\n * Emitted if the versus is rejected, either manually by the opponent or because\n * he took too long to respond. In that case, the `gameOver` event\n * is not emitted.\n */\n on(event: \"versusReject\", listener: (reason: \"user\" | \"time\") => Awaitable<void>): this;\n /**\n * Emitted with the result when the game finishes.\n */\n on(event: \"gameOver\", listener: (result: Res) => Awaitable<void>): this;\n /**\n * Emitted when the game ends. Not necessarily emitted last (e.g. can be emitted just before `gameOver`).\n *\n * This event is guaranteed to be emitted after {@link Game#start} was successfully called, even after errors (fatal or not).\n */\n on(event: \"end\", listener: () => Awaitable<void>): this;\n}\n\n/**\n * The base class of a game.\n */\n// oxlint-disable-next-line no-unused-vars\nexport abstract class Game<Res extends GameResult, Ctx extends GameContext = GameContext> extends EventEmitter {\n /**\n * The initial context that started this game, either an interaction or a message.\n */\n readonly context: Ctx;\n /**\n * If the {@link Game#context} is a `Message` or not.\n */\n readonly isMessage: boolean;\n /**\n * The player that started the game.\n */\n readonly player: User;\n\n /**\n * The timestamp at which the class was instantiated. Not when {@link Game#start} was called.\n */\n readonly gameStartedAt: number;\n\n constructor(context: Ctx) {\n super();\n\n this.context = context;\n const isMessage = context instanceof Message;\n this.isMessage = isMessage;\n this.player = isMessage ? context.author : context.user;\n this.gameStartedAt = Date.now();\n\n if (isMessage && !context.channel.isSendable()) {\n throw new Error(\"The context channel must be a sendable channel\");\n }\n }\n\n /**\n * Returns the current duration of the game.\n */\n public getGameDuration() {\n return Date.now() - this.gameStartedAt;\n }\n\n /**\n * Start the game.\n */\n public abstract start(): Promise<void>;\n\n protected async sendMessage(options: MessageCreateOptions | InteractionEditReplyOptions): Promise<Message> {\n if (this.isMessage) {\n // The cast is valid since isMessage is a runtime check in the constructor.\n const message = this.context as Message;\n // The cast is valid since the channel is checked in the constructor.\n const channel = message.channel as SendableChannels;\n\n return await channel.send(options as MessageCreateOptions);\n } else {\n // The cast is valid since isMessage is a runtime check in the constructor.\n const interaction = this.context as RepliableInteraction;\n\n if (interaction.deferred || interaction.replied) {\n return await interaction.editReply(options as InteractionEditReplyOptions);\n } else {\n const result = await interaction.reply({ ...(options as InteractionReplyOptions), withResponse: true });\n return result.resource!.message!;\n }\n }\n }\n\n /**\n * Edit the context message if it was an interaction,\n * or edit the given message.\n *\n * Since the original context is only valid 15 minutes,\n * we need the message reference if the interaction died.\n */\n protected async editContextOrMessage(message: Message, options: MessageEditOptions): Promise<Message> {\n if (!this.isMessage) {\n const interaction = this.context as RepliableInteraction;\n if (Date.now() - interaction.createdTimestamp < 60000 * 15) {\n return await interaction.editReply(options);\n }\n }\n\n return await message.edit(options);\n }\n\n /**\n * Utility to build an embed from the options.\n */\n protected async buildEmbed(\n embed: APIEmbed | ((game: this) => Awaitable<APIEmbed>),\n props?: APIEmbed,\n ): Promise<APIEmbed> {\n return typeof embed === \"function\"\n ? await embed(this)\n : {\n author: {\n name: this.player.displayName,\n icon_url: this.player.displayAvatarURL(),\n },\n ...props,\n ...embed,\n };\n }\n\n /**\n * Utility to build an end embed from the options.\n */\n protected async buildEndEmbed(\n embed: APIEmbed | ((game: this) => Awaitable<APIEmbed>),\n endEmbed: APIEmbed | ((game: this, result: Res) => Awaitable<APIEmbed>) | undefined,\n result: Res,\n props?: APIEmbed,\n ): Promise<APIEmbed> {\n let built;\n if (endEmbed) {\n built = typeof endEmbed === \"function\" ? await endEmbed(this, result) : endEmbed;\n } else {\n built =\n typeof embed === \"function\"\n ? await embed(this)\n : {\n author: {\n name: this.player.displayName,\n icon_url: this.player.displayAvatarURL(),\n },\n ...embed,\n ...props,\n };\n }\n return built;\n }\n\n /**\n * Utility to build the result of a game.\n */\n protected result(data: Omit<Res, keyof GameResult>): Res {\n return {\n player: this.player,\n gameStartedAt: this.gameStartedAt,\n gameDuration: this.getGameDuration(),\n ...data,\n } as Res;\n }\n}\n","import assert from \"node:assert\";\nimport { ButtonBuilder } from \"discord.js\";\n\nconst numberEmojis = [\"0️⃣\", \"1️⃣\", \"2️⃣\", \"3️⃣\", \"4️⃣\", \"5️⃣\", \"6️⃣\", \"7️⃣\", \"8️⃣\", \"9️⃣\", \"🔟\"];\n\nexport interface Position {\n x: number;\n y: number;\n}\n\nexport const getNumberEmoji = (number: number): string => {\n assert(number >= 0 && number <= 9);\n return numberEmojis[number];\n};\n\nexport const removeEmoji = (button: ButtonBuilder): ButtonBuilder => {\n if (\"emoji\" in button.data) {\n button.data.emoji = undefined;\n }\n\n return button;\n};\n\nexport const moveInDirection = (pos: Position, direction: string): Position => {\n if (direction === \"up\") return { x: pos.x, y: pos.y - 1 };\n if (direction === \"down\") return { x: pos.x, y: pos.y + 1 };\n if (direction === \"left\") return { x: pos.x - 1, y: pos.y };\n if (direction === \"right\") return { x: pos.x + 1, y: pos.y };\n return pos;\n};\n\nexport const getOppositeDirection = (direction: string): string => {\n if (direction === \"up\") return \"down\";\n if (direction === \"down\") return \"up\";\n if (direction === \"left\") return \"right\";\n return \"left\";\n};\n","import z from \"zod/v4\";\n// oxlint-disable-next-line no-unused-vars\nimport { APIEmbed } from \"discord.js\";\nimport { Awaitable } from \"./types\";\n\n/**\n * A discord.js {@link APIEmbed} schema. The `color` property can be an hex string.\n */\nexport const apiEmbed = () =>\n z\n .object({\n author: z.object({\n name: z.string(),\n url: z.string().optional(),\n icon_url: z.string().optional(),\n }),\n thumbnail: z.object({\n url: z.string(),\n }),\n title: z.string(),\n color: z.union([\n z.string().transform(val => {\n return parseInt(val.slice(1), 16);\n }),\n z.number().int(),\n ]),\n description: z.string(),\n image: z.object({\n url: z.string(),\n }),\n footer: z.object({\n text: z.string(),\n icon_url: z.string().optional(),\n }),\n })\n .partial();\n\n/**\n * Make a value also valid as a function return value.\n *\n * e.g.\n *\n * `functionable(z.string())<[A, B]>()` = `z.string() | ((args_0: A, args_1: B) => z.string())`\n */\nexport const functionable =\n <T extends z.ZodType>(schema: T) =>\n <Args extends unknown[], Async = true>() =>\n z.union([schema, z.custom<(...args: Args) => Async extends true ? Awaitable<z.infer<T>> : z.infer<T>>()]);\n\nexport const embedBuilder = <Args extends unknown[]>() => functionable(apiEmbed())<Args>();\n\nexport const gameMessage = <T>() => z.union([z.string().transform(val => () => val), z.custom<(game: T) => string>()]);\n\nexport const resultMessage = <R, T>() =>\n z.union([z.string().transform(val => () => val), z.custom<(result: R, game: T) => string>()]);\n\nexport const var2Message = <D, T>() =>\n z.union([z.string().transform(val => () => val), z.custom<(data: D, game: T) => string>()]);\n","export const colors = {\n green: 0x27ae60,\n red: 0xe74c3c,\n yellow: 0xf7bf65,\n blue: 0x2980b9,\n blurple: 0x5865f2,\n};\n","/**\n * Get a random integer in [min;max]\n */\nexport const getRandomInt = (max: number, min = 0): number => {\n if (min >= max) throw new RangeError(\"`min` should be less than `max`\");\n return Math.floor(Math.random() * (min ? max + 1 - min : max + 1)) + min;\n};\n\nexport const getRandomElement = <T>(array: T[]): T => {\n if (!array.length) throw new RangeError(\"The array should not be empty\");\n return array[Math.floor(Math.random() * array.length)]!;\n};\n\nexport const shuffleArray = <T>(array: T[]): T[] => {\n for (let i = array.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [array[i], array[j]] = [array[j], array[i]];\n }\n return array;\n};\n","import z from \"zod/v4\";\nimport { ActionRowBuilder, ButtonBuilder, ButtonStyle, Message, MessageFlags, User } from \"discord.js\";\nimport { GameContext } from \"@/core/Game\";\nimport { VersusGame, VersusGameResult, VersusOptions, versusOptions } from \"@/core/VersusGame\";\nimport { embedBuilder, gameMessage, resultMessage, var2Message } from \"@/utils/schemas\";\nimport { colors } from \"@/utils/constants\";\nimport { Embed1, Embed2 } from \"@/utils/types\";\n\n/**\n * The Connect 4 game result.\n */\nexport interface Connect4Result extends VersusGameResult {\n outcome: \"win\" | \"tie\" | \"timeout\";\n /**\n * Only if `outcome` is `win`.\n */\n winner: User | null;\n winnerEmoji: string | null;\n}\n\n/**\n * The data of a Connect 4 turn.\n */\nexport interface Connect4Turn {\n player: User;\n emoji: string;\n}\n\nconst defaultOptions = {\n embed: {\n title: \"Connect 4\",\n color: colors.blurple,\n },\n winMessage: (res: Connect4Result) => `${res.winnerEmoji} | **${res.winner}** won the TicTacToe Game.`,\n tieMessage: () => \"The Game tied! No one won the Game!\",\n timeoutMessage: () => \"The Game went unfinished! No one won the Game!\",\n turnMessage: (turn: Connect4Turn) => `${turn.emoji} | It's player **${turn.player.displayName}**'s turn.`,\n notPlayerMessage: (game: Connect4) => `Only ${game.player} and ${game.opponent} can use this menu.`,\n statusText: \"Game Status\",\n emojis: {\n board: \"⚫\",\n player1: \"🔴\",\n player2: \"🟡\",\n },\n buttonStyle: ButtonStyle.Secondary,\n timeout: 60_000,\n};\n\nexport interface Connect4Options extends z.input<typeof connect4Options> {\n versus: VersusOptions;\n embed?: Embed1<Connect4>;\n endEmbed?: Embed2<Connect4, Connect4Result>;\n /**\n * The max amount of time the player can be idle.\n */\n timeout?: number;\n}\n\nexport const connect4Options = z.object({\n versus: versusOptions(\"Connect 4\"),\n embed: embedBuilder<[Connect4]>().optional().default(defaultOptions.embed),\n endEmbed: embedBuilder<[Connect4, Connect4Result]>().optional(),\n winMessage: resultMessage<Connect4Result, Connect4>()\n .optional()\n .default(() => defaultOptions.winMessage),\n tieMessage: resultMessage<Connect4Result, Connect4>()\n .optional()\n .default(() => defaultOptions.tieMessage),\n timeoutMessage: resultMessage<Connect4Result, Connect4>()\n .optional()\n .default(() => defaultOptions.timeoutMessage),\n turnMessage: var2Message<Connect4Turn, Connect4>()\n .optional()\n .default(() => defaultOptions.turnMessage),\n notPlayerMessage: gameMessage<Connect4>()\n .optional()\n .default(() => defaultOptions.notPlayerMessage),\n statusText: z.string().optional().default(defaultOptions.statusText),\n emojis: z\n .object({\n board: z.string().optional().default(defaultOptions.emojis.board),\n player1: z.string().optional().default(defaultOptions.emojis.player1),\n player2: z.string().optional().default(defaultOptions.emojis.player2),\n })\n .optional()\n .default(defaultOptions.emojis),\n buttonStyle: z.number().int().optional().default(defaultOptions.buttonStyle),\n timeout: z.number().int().optional().default(defaultOptions.timeout),\n});\n\n/**\n * The Connect 4 game.\n *\n * # Errors\n *\n * Can emit `fatalError` if it fails to edit from the invitation embed to the game message.\n *\n * # Example\n *\n * ```js\n * const opponent = // The opponent (must be a discord.js User)\n *\n * const game = new Connect4(interaction, {\n * versus: {\n * opponent\n * }\n * });\n *\n * game.on(\"error\", err => console.error(err));\n * game.on(\"versusReject\", () => console.log(\"Opponent rejected the invitation to play\"));\n * game.on(\"gameOver\", result => console.log(result));\n *\n * await game.start();\n * ```\n */\nexport class Connect4 extends VersusGame<Connect4Result> {\n readonly options: z.output<typeof connect4Options>;\n\n /**\n * A 6*7 elements array.\n *\n * - `0` : empty\n * - `1` : player 1\n * - `2` : player 2\n */\n readonly gameboard: number[] = [];\n isPlayer1Turn = true;\n\n message: Message | null = null;\n\n private locked = false;\n\n constructor(context: GameContext, options?: Connect4Options) {\n const parsed = connect4Options.parse(options || {});\n super(context, parsed.versus);\n this.options = parsed;\n\n for (let y = 0; y < 6; y++) {\n for (let x = 0; x < 7; x++) {\n this.gameboard[y * 7 + x] = 0;\n }\n }\n }\n\n override async start() {\n this.message = await this.requestVersus();\n if (this.message) this.runGame(this.message);\n }\n\n private async runGame(message: Message) {\n try {\n const embed = await this.buildEmbed(this.options.embed, {\n description: this.getBoardContent(),\n fields: [\n {\n name: this.options.statusText,\n value: this.options.turnMessage(this.getPlayerTurnData(), this),\n },\n ],\n });\n\n await this.editContextOrMessage(message, {\n content: null,\n embeds: [embed],\n components: this.getComponents(),\n });\n } catch (err) {\n this.emit(\"fatalError\", err);\n this.emit(\"end\");\n return;\n }\n\n this.handleButtons(message);\n }\n\n private handleButtons(message: Message) {\n const collector = message.createMessageComponentCollector({ idle: this.options.timeout });\n\n collector.on(\"collect\", async i => {\n if (!i.customId.startsWith(\"$gamecord\")) return;\n\n if (i.user.id !== this.player.id && i.user.id !== this.opponent.id) {\n if (this.options.notPlayerMessage) {\n try {\n await i.reply({\n content: this.options.notPlayerMessage(this),\n flags: MessageFlags.Ephemeral,\n });\n } catch (err) {\n this.emit(\"error\", err);\n }\n }\n return;\n }\n\n try {\n await i.deferUpdate();\n } catch (err) {\n this.emit(\"error\", err);\n return;\n }\n\n if (this.locked) return;\n this.locked = true;\n\n try {\n if (i.user.id !== (this.isPlayer1Turn ? this.player : this.opponent).id) return;\n\n const column = Number(i.customId.split(\"-\").at(-1));\n const block = { x: -1, y: -1 };\n\n for (let y = 6 - 1; y >= 0; y--) {\n const number = this.gameboard[column + y * 7];\n if (number === 0) {\n this.gameboard[column + y * 7] = this.getPlayerNumber();\n block.x = column;\n block.y = y;\n break;\n }\n }\n\n if (this.isWinAt(block.x, block.y)) return collector.stop(\"$win\");\n if (this.isBoardFull()) return collector.stop(\"$tie\");\n this.isPlayer1Turn = !this.isPlayer1Turn;\n\n const embed = await this.buildEmbed(this.options.embed, {\n description: this.getBoardContent(),\n fields: [\n {\n name: this.options.statusText,\n value: this.options.turnMessage(this.getPlayerTurnData(), this),\n },\n ],\n });\n\n try {\n await i.editReply({ embeds: [embed], components: this.getComponents() });\n } catch (err) {\n this.emit(\"error\", err);\n }\n } finally {\n this.locked = false;\n }\n });\n\n collector.on(\"end\", async (_, reason) => {\n this.emit(\"end\");\n\n if (reason === \"$win\" || reason === \"$tie\") {\n return await this.gameOver(message, reason === \"$win\" ? \"win\" : \"tie\");\n }\n\n if (reason === \"idle\") {\n return await this.gameOver(message, \"timeout\");\n }\n });\n }\n\n private async gameOver(message: Message, outcome: \"win\" | \"tie\" | \"timeout\") {\n const winner = this.isPlayer1Turn ? this.player : this.opponent;\n const winnerEmoji = this.isPlayer1Turn ? this.options.emojis.player1 : this.options.emojis.player2;\n\n const result = this.result({\n opponent: this.opponent,\n outcome,\n winner: outcome === \"win\" ? winner : null,\n winnerEmoji: outcome === \"win\" ? winnerEmoji : null,\n });\n this.emit(\"gameOver\", result);\n\n let getMessage;\n switch (outcome) {\n case \"win\": {\n getMessage = this.options.winMessage;\n break;\n }\n case \"tie\": {\n getMessage = this.options.tieMessage;\n break;\n }\n case \"timeout\": {\n getMessage = this.options.timeoutMessage;\n break;\n }\n }\n\n const embed = await this.buildEndEmbed(this.options.embed, this.options.endEmbed, result, {\n description: this.getBoardContent(),\n fields: [\n {\n name: this.options.statusText,\n value: getMessage(result, this),\n },\n ],\n });\n\n try {\n await this.editContextOrMessage(message, {\n embeds: [embed],\n components: this.getComponents(true),\n });\n } catch (err) {\n this.emit(\"error\", err);\n }\n }\n\n private getPlayerTurnData() {\n return this.isPlayer1Turn\n ? { player: this.player, emoji: this.options.emojis.player1 }\n : { player: this.opponent, emoji: this.options.emojis.player2 };\n }\n\n getBoardContent() {\n let board = \"\";\n for (let y = 0; y < 6; y++) {\n for (let x = 0; x < 7; x++) {\n board += this.getEmoji(this.gameboard[y * 7 + x]);\n }\n board += \"\\n\";\n }\n board += \"1️⃣2️⃣3️⃣4️⃣5️⃣6️⃣7️⃣\";\n return board;\n }\n\n /**\n * Get the current player number (`1` or `2`).\n */\n getPlayerNumber() {\n return this.isPlayer1Turn ? 1 : 2;\n }\n\n isBoardFull() {\n for (let y = 0; y < 6; y++) {\n for (let x = 0; x < 7; x++) {\n if (this.gameboard[y * 7 + x] === 0) return false;\n }\n }\n return true;\n }\n\n /**\n * Get the emoji of a number of the game board (`0`, `1` or `2`).\n */\n getEmoji(number: number) {\n if (number === 1) return this.options.emojis.player1;\n if (number === 2) return this.options.emojis.player2;\n return this.options.emojis.board;\n }\n\n isWinAt(x: number, y: number) {\n const number = this.getPlayerNumber();\n\n // Horizontal Check\n for (let i = Math.max(0, x - 3); i <= x; i++) {\n const adj = i + y * 7;\n if (i + 3 < 7) {\n if (\n this.gameboard[adj] === number &&\n this.gameboard[adj + 1] === number &&\n this.gameboard[adj + 2] === number &&\n this.gameboard[adj + 3] === number\n )\n return true;\n }\n }\n\n // Vertical Check\n for (let i = Math.max(0, y - 3); i <= y; i++) {\n const adj = x + i * 7;\n if (i + 3 < 6) {\n if (\n this.gameboard[adj] === number &&\n this.gameboard[adj + 7] === number &&\n this.gameboard[adj + 2 * 7] === number &&\n this.gameboard[adj + 3 * 7] === number\n )\n return true;\n }\n }\n\n // Ascending Check\n for (let i = -3; i <= 0; i++) {\n const block = { x: x + i, y: y + i };\n const adj = block.x + block.y * 7;\n if (block.x + 3 < 7 && block.y + 3 < 6) {\n if (\n this.gameboard[adj] === number &&\n this.gameboard[adj + 7 + 1] === number &&\n this.gameboard[adj + 2 * 7 + 2] === number &&\n this.gameboard[adj + 3 * 7 + 3] === number\n )\n return true;\n }\n }\n\n // Descending Check\n for (let i = -3; i <= 0; i++) {\n const block = { x: x + i, y: y - i };\n const adj = block.x + block.y * 7;\n if (block.x + 3 < 7 && block.y - 3 >= 0 && block.x >= 0) {\n if (\n this.gameboard[adj] === number &&\n this.gameboard[adj - 7 + 1] === number &&\n this.gameboard[adj - 2 * 7 + 2] === number &&\n this.gameboard[adj - 3 * 7 + 3] === number\n )\n return true;\n }\n }\n return false;\n }\n\n isColumnFilled(x: number) {\n return this.gameboard[x] !== 0;\n }\n\n getComponents(disabled = false) {\n const row1 = new ActionRowBuilder<ButtonBuilder>().setComponents(\n [\"1️⃣\", \"2️⃣\", \"3️⃣\", \"4️⃣\"].map((e, i) =>\n new ButtonBuilder()\n .setStyle(this.options.buttonStyle)\n .setEmoji(e)\n .setCustomId(`$gamecord-connect4-${i}`)\n .setDisabled(disabled || this.isColumnFilled(i)),\n ),\n );\n const row2 = new ActionRowBuilder<ButtonBuilder>().setComponents(\n [\"5️⃣\", \"6️⃣\", \"7️⃣\"].map((e, i) =>\n new ButtonBuilder()\n .setStyle(this.options.buttonStyle)\n .setEmoji(e)\n .setCustomId(`$gamecord-connect4-${i + 4}`)\n .setDisabled(disabled || this.isColumnFilled(i + 4)),\n ),\n );\n\n return [row1, row2];\n }\n}\n","import z from \"zod\";\nimport { ActionRowBuilder, APIEmbed, Awaitable, ButtonBuilder, ButtonStyle, Message, User } from \"discord.js\";\nimport { Game, GameContext, GameResult } from \"./Game\";\nimport { colors } from \"@/utils/constants\";\n\nexport interface VersusPlayers {\n player: User;\n opponent: User;\n}\n\nconst defaultOptions = {\n timeout: 60_000,\n requestEmbed:\n (name: string) =>\n ({ player }: VersusPlayers) => ({\n color: colors.blue,\n description: `${player} has invited you for a round of **${name}**.`,\n }),\n rejectEmbed:\n (name: string) =>\n ({ opponent }: VersusPlayers) => ({\n color: colors.red,\n description: `The player ${opponent} denied your request for a round of **${name}**.`,\n }),\n timeoutEmbed: ({ opponent }: VersusPlayers) => ({\n color: colors.yellow,\n description: `Dropped the game as the player ${opponent} did not respond.`,\n }),\n buttons: {\n accept: \"Accept\",\n reject: \"Reject\",\n },\n};\n\nexport interface VersusOptions extends z.input<ReturnType<typeof versusOptions>> {\n /**\n * The opponent.\n */\n opponent: User;\n /**\n * The amount of time the opponent has to accept or deny the versus request.\n */\n timeout?: number;\n}\n\ntype VersusOptionsOutput = z.output<ReturnType<typeof versusOptions>>;\n\nexport const versusOptions = (name: string) =>\n z.object({\n opponent: z.custom<User>(val => val instanceof User, {\n error: \"The opponent must be an instance of a discord.js User\",\n }),\n timeout: z.number().int().optional().default(defaultOptions.timeout),\n requestEmbed: z\n .custom<(ctx: VersusPlayers) => APIEmbed>()\n .optional()\n .default(() => defaultOptions.requestEmbed(name)),\n rejectEmbed: z\n .custom<(ctx: VersusPlayers) => APIEmbed>()\n .optional()\n .default(() => defaultOptions.rejectEmbed(name)),\n timeoutEmbed: z\n .custom<(ctx: VersusPlayers) => APIEmbed>()\n .optional()\n .default(() => defaultOptions.timeoutEmbed),\n buttons: z\n .object({\n accept: z.string().optional().default(defaultOptions.buttons.accept),\n reject: z.string().optional().default(defaultOptions.buttons.reject),\n })\n .optional()\n .default(defaultOptions.buttons),\n });\n\nexport interface VersusGameResult extends GameResult {\n opponent: User;\n}\n\nexport abstract class VersusGame<Res extends VersusGameResult, Ctx extends GameContext = GameContext> extends Game<\n Res,\n Ctx\n> {\n readonly versusOptions: VersusOptionsOutput;\n\n /**\n * The opponent user.\n */\n readonly opponent: User;\n\n constructor(context: Ctx, options: VersusOptionsOutput) {\n super(context);\n this.versusOptions = options;\n this.opponent = options.opponent;\n }\n\n protected async requestVersus(): Promise<Message | null> {\n const players = { player: this.player, opponent: this.opponent };\n\n // oxlint-disable-next-line no-async-promise-executor\n return new Promise(async resolve => {\n const row = new ActionRowBuilder<ButtonBuilder>().setComponents(\n new ButtonBuilder()\n .setLabel(this.versusOptions.buttons.accept)\n .setCustomId(\"$gamecord-versus-accept\")\n .setStyle(ButtonStyle.Success),\n new ButtonBuilder()\n .setLabel(this.versusOptions.buttons.reject)\n .setCustomId(\"$gamecord-versus-reject\")\n .setStyle(ButtonStyle.Danger),\n );\n\n const msg = await this.sendMessage({\n content: this.opponent.toString(),\n embeds: [this.versusOptions.requestEmbed(players)],\n components: [row],\n allowedMentions: { parse: [\"users\"] },\n });\n\n const collector = msg.createMessageComponentCollector({ time: this.versusOptions.timeout });\n\n collector.on(\"collect\", async i => {\n try {\n await i.deferUpdate();\n } catch (err) {\n this.emit(\"error\", err);\n }\n\n if (i.user.id === this.opponent.id) {\n collector.stop(i.customId.split(\"-\").at(-1));\n }\n });\n\n collector.on(\"end\", async (_, reason) => {\n if (reason === \"accept\") return resolve(msg);\n\n const isTime = reason === \"time\";\n const embed = isTime ? this.versusOptions.timeoutEmbed : this.versusOptions.rejectEmbed;\n\n this.emit(\"versusReject\", isTime);\n this.emit(\"end\");\n\n try {\n for (const btn of row.components) {\n btn.setDisabled(true);\n }\n\n await this.editContextOrMessage(msg, {\n embeds: [embed(players)],\n components: [row],\n });\n } catch (err) {\n this.emit(\"error\", err);\n }\n\n return resolve(null);\n });\n });\n }\n\n /**\n * Utility to build an embed from the options.\n */\n protected override async buildEmbed(\n embed: APIEmbed | ((game: this) => Awaitable<APIEmbed>),\n props?: APIEmbed,\n ): Promise<APIEmbed> {\n return await super.buildEmbed(embed, {\n author: undefined,\n footer: {\n text: `${this.player.displayName} vs ${this.opponent.displayName}`,\n },\n ...props,\n });\n }\n\n /**\n * Utility to build an end embed from the options.\n */\n protected override async buildEndEmbed(\n embed: APIEmbed | ((game: this) => Awaitable<APIEmbed>),\n endEmbed: APIEmbed | ((game: this, result: Res) => Awaitable<APIEmbed>) | undefined,\n result: Res,\n props?: APIEmbed,\n ): Promise<APIEmbed> {\n return await super.buildEndEmbed(embed, endEmbed, result, {\n author: undefined,\n footer: {\n text: `${this.player.displayName} vs ${this.opponent.displayName}`,\n },\n ...props,\n });\n }\n}\n","import z from \"zod/v4\";\nimport { Message } from \"discord.js\";\nimport { embedBuilder, resultMessage } from \"@/utils/schemas\";\nimport { Game, GameContext, GameResult } from \"@/core/Game\";\nimport { colors } from \"@/utils/constants\";\nimport { Embed1, Embed2 } from \"@/utils/types\";\n\n/**\n * The fast type game result.\n */\nexport interface FastTypeResult extends GameResult {\n outcome: \"win\" | \"lose\" | \"timeout\";\n timeTaken: number;\n secondsTaken: number;\n /**\n * Words per minute. Will be `0` if the player has lost.\n */\n wpm: number;\n}\n\nconst defaultOptions = {\n embed: {\n title: \"Fast Type\",\n color: colors.blurple,\n description: `You have 30 seconds to type the sentence below.`,\n },\n winMessage: (res: FastTypeResult) =>\n `You won! You finished the type race in ${res.secondsTaken} seconds with word per minute of ${res.wpm}.`,\n loseMessage: () => \"You lost! You didn't type the correct sentence in time.\",\n sentence: \"Some really cool sentence to fast type.\",\n timeout: 30_000,\n};\n\nexport interface FastTypeOptions extends z.input<typeof fastTypeOptions> {\n embed?: Embed1<FastType>;\n endEmbed?: Embed2<FastType, FastTypeResult>;\n /**\n * The sentence the player has to type.\n */\n sentence?: string;\n /**\n * The max amount of time the player can be idle.\n */\n timeout?: number;\n}\n\nexport const fastTypeOptions = z.object({\n embed: embedBuilder<[FastType]>()\n .optional()\n .default(() => defaultOptions.embed),\n endEmbed: embedBuilder<[FastType, FastTypeResult]>().optional(),\n winMessage: resultMessage<FastTypeResult, FastType>()\n .optional()\n .default(() => defaultOptions.winMessage),\n loseMessage: resultMessage<FastTypeResult, FastType>()\n .optional()\n .default(() => defaultOptions.loseMessage),\n sentence: z.string().optional().default(defaultOptions.sentence),\n timeout: z.number().int().optional().default(defaultOptions.timeout),\n});\n\n/**\n * A game where the player needs to write a sentence as fast as possible.\n *\n * # Permissions\n *\n * The bot needs to be able to read the messages of the current channel.\n *\n * # Example\n * ```js\n * const game = new FastType(interaction, {\n * // See the full list of options in the docs\n * sentence: \"Some really cool sentence to fast type.\",\n * winMessage: res => `You won! You finished the type race in ${res.secondsTaken} seconds with word per minute of ${res.wpm}.`\n * timeout: 20_000\n * });\n *\n * game.on(\"error\", err => console.error(err));\n * game.on(\"gameOver\", result => console.log(result));\n *\n * await game.start();\n * ```\n */\nexport class FastType extends Game<FastTypeResult> {\n readonly options: z.output<typeof fastTypeOptions>;\n\n timeTaken = 0;\n wpm = 0;\n\n constructor(context: GameContext, options: FastTypeOptions) {\n super(context);\n this.options = fastTypeOptions.parse(options || {});\n }\n\n override async start() {\n const embed =\n typeof this.options.embed === \"function\"\n ? await this.options.embed(this)\n : {\n author: {\n name: this.player.displayName,\n icon_url: this.player.displayAvatarURL(),\n },\n fields: [\n {\n name: \"Sentence\",\n value: this.options.sentence\n .split(\" \")\n .map(e => \"`\" + e.split(\"\").join(\" \") + \"`\")\n .join(\" \"),\n },\n ],\n ...this.options.embed,\n };\n\n const message = await this.sendMessage({ embeds: [embed] });\n if (!message.channel.isSendable()) return;\n\n const startTime = Date.now();\n\n const collector = message.channel.createMessageCollector({\n time: this.options.timeout,\n filter: m => m.author.id === this.player.id,\n });\n\n collector.on(\"collect\", async msg => {\n this.timeTaken = Math.floor(Date.now() - startTime);\n this.wpm = Math.floor(msg.content.trim().length / ((this.timeTaken / 60000) % 60) / 5);\n\n const hasWon = msg.content?.toLowerCase().trim() === this.options.sentence.toLowerCase();\n collector.stop(hasWon ? \"$win\" : \"$lose\");\n });\n\n collector.on(\"end\", async (_, reason) => {\n this.emit(\"end\");\n\n if (!this.timeTaken) {\n this.timeTaken = Math.floor(Date.now() - startTime);\n }\n\n if (reason === \"$win\" || reason === \"$lose\" || reason === \"time\") {\n await this.gameOver(message, reason === \"$win\" ? \"win\" : reason === \"$lose\" ? \"lose\" : \"timeout\");\n }\n });\n }\n\n private async gameOver(message: Message, outcome: \"win\" | \"lose\" | \"timeout\") {\n const result = this.result({\n outcome,\n timeTaken: this.timeTaken,\n secondsTaken: Math.floor(this.timeTaken / 1000),\n wpm: this.wpm,\n });\n this.emit(\"gameOver\", result);\n\n const embed = await this.buildEndEmbed(this.options.embed, this.options.endEmbed, result, {\n description:\n result.outcome === \"win\"\n ? this.options.winMessage(result, this)\n : this.options.loseMessage(result, this),\n });\n\n try {\n await this.editContextOrMessage(message, { embeds: [embed] });\n } catch (err) {\n this.emit(\"error\", err);\n }\n }\n}\n","import z from \"zod/v4\";\nimport { ActionRowBuilder, ButtonBuilder, ButtonStyle, Message, MessageFlags } from \"discord.js\";\nimport { Game, GameContext, GameResult } from \"@/core/Game\";\nimport { embedBuilder, gameMessage, resultMessage } from \"@/utils/schemas\";\nimport { getRandomInt } from \"@/utils/random\";\nimport { colors } from \"@/utils/constants\";\nimport { Embed1, Embed2 } from \"@/utils/types\";\n\n/**\n * The flood game result.\n */\nexport interface FloodResult extends GameResult {\n outcome: \"win\" | \"lose\" | \"timeout\";\n turns: number;\n maxTurns: number;\n /**\n * The index (in `options.emojis`) of the last emoji that was chosen by the player.\n */\n boardEmojiIndex: number;\n}\n\nconst defaultOptions = {\n embed: {\n title: \"Flood\",\n color: colors.blurple,\n },\n winMessage: (res: FloodResult) => `You won! You took **${res.turns}** turns.`,\n loseMessage: (res: FloodResult) => `You lost! You took **${res.turns}** turns.`,\n notPlayerMessage: (game: Flood) => `Only ${game.player} can use these buttons.`,\n size: 13,\n maxTurns: 25,\n timeout: 120_000,\n buttonStyle: ButtonStyle.Primary,\n emojis: [\"🟥\", \"🟦\", \"🟧\", \"🟪\", \"🟩\"],\n};\n\nexport interface FloodOptions extends z.input<typeof floodOptions> {\n embed?: Embed1<Flood>;\n endEmbed?: Embed2<Flood, FloodResult>;\n /**\n * The size (width) of the game board.\n */\n size?: number;\n /**\n * The max amount of time the player can be idle.\n */\n timeout?: number;\n}\n\nexport const floodOptions = z.object({\n embed: embedBuilder<[Flood]>().optional().default(defaultOptions.embed),\n endEmbed: embedBuilder<[Flood, FloodResult]>().optional(),\n winMessage: resultMessage<FloodResult, Flood>()\n .optional()\n .default(() => defaultOptions.winMessage),\n loseMessage: resultMessage<FloodResult, Flood>()\n .optional()\n .default(() => defaultOptions.loseMessage),\n notPlayerMessage: gameMessage<Flood>()\n .optional()\n .default(() => defaultOptions.notPlayerMessage),\n size: z.number().int().optional().default(defaultOptions.size),\n maxTurns: z.number().int().optional().default(defaultOptions.maxTurns),\n timeout: z.number().int().optional().default(defaultOptions.timeout),\n buttonStyle: z.number().int().optional().default(defaultOptions.buttonStyle),\n emojis: z.array(z.string()).length(5).optional().default(defaultOptions.emojis),\n});\n\n/**\n * A game where the player needs to make the whole board a single emoji.\n *\n * # Custom display\n *\n * If you are using functions to create the embeds, use {@link Flood#getBoardContent} to get the game board.\n *\n * # Example\n *\n * ```js\n * const game = new Flood(interaction, {\n * winMessage: \"You won the Game! You successfully avoided all the mines.\"\n * timeout: 120_000\n * });\n *\n * game.on(\"error\", err => console.error(err));\n * game.on(\"gameOver\", result => console.log(result));\n *\n * await game.start();\n * ```\n */\nexport class Flood extends Game<FloodResult> {\n readonly options: z.output<typeof floodOptions>;\n\n readonly board: number[] = [];\n turns = 0;\n\n message: Message | null = null;\n\n constructor(context: GameContext, options: FloodOptions) {\n super(context);\n this.options = floodOptions.parse(options || {});\n\n for (let y = 0; y < this.options.size; y++) {\n for (let x = 0; x < this.options.size; x++) {\n this.board[y * this.options.size + x] = getRandomInt(this.options.emojis.length - 1);\n }\n }\n }\n\n override async start() {\n this.message = await this.sendMessage({ embeds: [await this.getEmbed()], components: [this.getActionRow()] });\n this.handleButtons(this.message);\n }\n\n private handleButtons(message: Message) {\n const collector = message.createMessageComponentCollector({ idle: this.options.timeout });\n\n collector.on(\"collect\", async i => {\n if (!i.customId.startsWith(\"$gamecord\")) return;\n\n if (i.user.id !== this.player.id) {\n if (this.options.notPlayerMessage) {\n try {\n await i.reply({\n content: this.options.notPlayerMessage(this),\n flags: MessageFlags.Ephemeral,\n });\n } catch (err) {\n this.emit(\"error\", err);\n }\n }\n return;\n }\n\n try {\n await i.deferUpdate();\n } catch (err) {\n this.emit(\"error\", err);\n return;\n }\n\n const index = Number(i.customId.split(\"-\").at(-1));\n const updateResult = this.updateGame(index);\n\n if (updateResult === \"win\") return collector.stop(\"$win\");\n if (updateResult === \"lose\") return collector.stop(\"$lose\");\n\n try {\n await i.editReply({ embeds: [await this.getEmbed()], components: [this.getActionRow()] });\n } catch (err) {\n this.emit(\"error\", err);\n }\n });\n\n collector.on(\"end\", async (_, reason) => {\n this.emit(\"end\");\n\n if (reason === \"$win\" || reason == \"$lose\" || reason === \"idle\") {\n await this.gameOver(message, reason === \"$win\" ? \"win\" : reason === \"$lose\" ? \"lose\" : \"timeout\");\n }\n });\n }\n\n getBoardContent() {\n let board = \"\";\n for (let y = 0; y < this.options.size; y++) {\n for (let x = 0; x < this.options.size; x++) {\n const index = this.board[y * this.options.size + x];\n board += this.options.emojis[index];\n }\n board += \"\\n\";\n }\n return board;\n }\n\n getActionRow(disabled = false) {\n const row = new ActionRowBuilder<ButtonBuilder>();\n for (let i = 0; i < 5; i++) {\n row.addComponents(\n new ButtonBuilder()\n .setStyle(this.options.buttonStyle)\n .setEmoji(this.options.emojis[i])\n .setCustomId(`$gamecord-flood-${i}`)\n .setDisabled(disabled),\n );\n }\n return row;\n }\n\n private async getEmbed() {\n return typeof this.options.embed === \"function\"\n ? await this.options.embed(this)\n : {\n author: {\n name: this.player.displayName,\n icon_url: this.player.displayAvatarURL(),\n },\n fields: [{ name: \"Turns\", value: `${this.turns}/${this.options.maxTurns}` }],\n ...this.options.embed,\n description: this.getBoardContent(),\n };\n }\n\n private async gameOver(message: Message, outcome: \"win\" | \"lose\" | \"timeout\") {\n const result = this.result({\n outcome,\n turns: this.turns,\n maxTurns: this.options.maxTurns,\n boardEmojiIndex: this.board[0],\n });\n this.emit(\"gameOver\", result);\n\n const embed = await this.buildEndEmbed(this.options.embed, this.options.endEmbed, result, {\n description: this.getBoardContent(),\n fields: [\n {\n name: \"Game Over\",\n value:\n result.outcome === \"win\"\n ? this.options.winMessage(result, this)\n : this.options.loseMessage(result, this),\n },\n ],\n });\n\n try {\n await this.editContextOrMessage(message, { embeds: [embed], components: [this.getActionRow(true)] });\n } catch (err) {\n this.emit(\"error\", err);\n }\n }\n\n private updateGame(selected: number): \"win\" | \"lose\" | \"none\" {\n if (selected === this.board[0]) return \"none\";\n const firstBlock = this.board[0];\n const queue = [{ x: 0, y: 0 }];\n const visited: { x: number; y: number }[] = [];\n this.turns += 1;\n\n while (queue.length > 0) {\n const block = queue.shift();\n if (!block || visited.some(v => v.x === block.x && v.y === block.y)) continue;\n const index = block.y * this.options.size + block.x;\n\n visited.push(block);\n if (this.board[index] === firstBlock) {\n this.board[index] = selected;\n\n const up = { x: block.x, y: block.y - 1 };\n if (!visited.some(v => v.x === up.x && v.y === up.y) && up.y >= 0) queue.push(up);\n\n const down = { x: block.x, y: block.y + 1 };\n if (!visited.some(v => v.x === down.x && v.y === down.y) && down.y < this.options.size)\n queue.push(down);\n\n const left = { x: block.x - 1, y: block.y };\n if (!visited.some(v => v.x === left.x && v.y === left.y) && left.x >= 0) queue.push(left);\n\n const right = { x: block.x + 1, y: block.y };\n if (!visited.some(v => v.x === right.x && v.y === right.y) && right.x < this.options.size)\n queue.push(right);\n }\n }\n\n let gameOver = true;\n for (let y = 0; y < this.options.size; y++) {\n for (let x = 0; x < this.options.size; x++) {\n if (this.board[y * this.options.size + x] !== selected) gameOver = false;\n }\n }\n\n if (this.turns >= this.options.maxTurns && !gameOver) return \"lose\";\n if (gameOver) return \"win\";\n return \"none\";\n }\n}\n","import z from \"zod/v4\";\nimport { ActionRowBuilder, ButtonBuilder, ButtonStyle, Message, MessageFlags } from \"discord.js\";\nimport { embedBuilder, gameMessage, resultMessage } from \"@/utils/schemas\";\nimport { Game, GameContext, GameResult } from \"@/core/Game\";\nimport { shuffleArray } from \"@/utils/random\";\nimport { removeEmoji } from \"@/utils/games\";\nimport { colors } from \"@/utils/constants\";\nimport { Embed1, Embed2 } from \"@/utils/types\";\n\nexport const jokerEmoji = \"🃏\";\n\nexport interface MemoryEmojiPosition {\n x: number;\n y: number;\n index: number;\n}\n\n/**\n * The memory game result.\n */\nexport interface MemoryResult extends GameResult {\n outcome: \"win\" | \"timeout\";\n tilesTurned: number;\n remainingPairs: number;\n}\n\nconst defaultOptions = {\n embed: {\n title: \"Memory\",\n color: colors.blurple,\n description: \"**Click on the buttons to match emojis with their pairs.**\",\n },\n winMessage: (res: MemoryResult) => `**You won the Game! You turned a total of \\`${res.tilesTurned}\\` tiles.**`,\n loseMessage: (res: MemoryResult) => `**You lost the Game! You turned a total of \\`${res.tilesTurned}\\` tiles.**`,\n notPlayerMessage: (game: Memory) => `Only ${game.player} can use this menu.`,\n timeout: 120_000,\n emojis: [\n \"🍉\",\n \"🍇\",\n \"🍊\",\n \"🍋\",\n \"🥭\",\n \"🍎\",\n \"🍏\",\n \"🥝\",\n \"🥥\",\n \"🍓\",\n \"🍒\",\n \"🫐\",\n \"🍍\",\n \"🍅\",\n \"🍐\",\n \"🥔\",\n \"🌽\",\n \"🥕\",\n \"🥬\",\n \"🥦\",\n ],\n};\n\nexport interface MemoryOptions extends z.input<typeof memoryOptions> {\n embed?: Embed1<Memory>;\n endEmbed?: Embed2<Memory, MemoryResult>;\n /**\n * The max amount of time the player can be idle.\n */\n timeout?: number;\n}\n\nexport const memoryOptions = z.object({\n embed: embedBuilder<[Memory]>().optional().default(defaultOptions.embed),\n endEmbed: embedBuilder<[Memory, MemoryResult]>().optional(),\n winMessage: resultMessage<MemoryResult, Memory>()\n .optional()\n .default(() => defaultOptions.winMessage),\n loseMessage: resultMessage<MemoryResult, Memory>()\n .optional()\n .default(() => defaultOptions.loseMessage),\n notPlayerMessage: gameMessage<Memory>()\n .optional()\n .default(() => defaultOptions.notPlayerMessage),\n timeout: z.number().int().optional().default(defaultOptions.timeout),\n emojis: z.array(z.string()).length(20).optional().default(defaultOptions.emojis),\n});\n\n/**\n * A game where the player to find all the pairs.\n *\n * # Example\n *\n * ```js\n * const game = new Memory(interaction, {\n * winMessage: res => `**You won the Game! You turned a total of \\`${res.tilesTurned}\\` tiles.**`\n * timeout: 120_000\n * });\n *\n * game.on(\"error\", err => console.error(err));\n * game.on(\"gameOver\", result => console.log(result));\n *\n * await game.start();\n * ```\n */\nexport class Memory extends Game<MemoryResult> {\n readonly options: z.output<typeof memoryOptions>;\n\n readonly emojis: string[];\n components: ActionRowBuilder<ButtonBuilder>[] = [];\n selected: MemoryEmojiPosition | null = null;\n remainingPairs = 12;\n tilesTurned = 0;\n readonly size = 5;\n\n message: Message | null = null;\n\n constructor(context: GameContext, options: MemoryOptions) {\n super(context);\n this.options = memoryOptions.parse(options || {});\n\n this.emojis = [...this.options.emojis];\n this.emojis = shuffleArray(this.emojis).slice(0, 12);\n this.emojis.push(...this.emojis, jokerEmoji);\n this.emojis = shuffleArray(this.emojis);\n }\n\n override async start() {\n this.components = this.getComponents();\n\n const embed = await this.buildEmbed(this.options.embed);\n\n this.message = await this.sendMessage({ embeds: [embed], components: this.components });\n this.handleButtons(this.message);\n }\n\n /**\n * Get the positions of this emoji.\n */\n public getPairEmojiPositions(emoji: string): MemoryEmojiPosition[] {\n const emojis = [];\n for (let y = 0; y < this.size; y++) {\n for (let x = 0; x < this.size; x++) {\n const index = y * this.size + x;\n if (this.emojis[index] === emoji) emojis.push({ x, y, index });\n }\n }\n return emojis;\n }\n\n public getComponents(): ActionRowBuilder<ButtonBuilder>[] {\n const components = [];\n for (let y = 0; y < this.size; y++) {\n const row = new ActionRowBuilder<ButtonBuilder>();\n\n for (let x = 0; x < this.size; x++) {\n row.addComponents(\n new ButtonBuilder()\n .setStyle(ButtonStyle.Secondary)\n .setLabel(\"\\u200b\")\n .setCustomId(`$gamecord-memory-${x}-${y}`),\n );\n }\n\n components.push(row);\n }\n return components;\n }\n\n private async gameOver(message: Message, hasTimedOut: boolean) {\n const result = this.result({\n outcome: hasTimedOut ? \"timeout\" : \"win\",\n tilesTurned: this.tilesTurned,\n remainingPairs: this.remainingPairs,\n });\n this.emit(\"gameOver\", result);\n\n const embed = await this.buildEndEmbed(this.options.embed, this.options.endEmbed, result, {\n description:\n result.outcome === \"win\"\n ? this.options.winMessage(result, this)\n : this.options.loseMessage(result, this),\n });\n\n try {\n for (const btn of this.components[0].components) {\n btn.setDisabled(true);\n }\n\n await this.editContextOrMessage(message, {\n embeds: [embed],\n components: this.components,\n });\n } catch (err) {\n this.emit(\"error\", err);\n }\n }\n\n private async handleButtons(message: Message) {\n const collector = message.createMessageComponentCollector({ idle: this.options.timeout });\n\n collector.on(\"collect\", async i => {\n if (!i.customId.startsWith(\"$gamecord\")) return;\n\n if (i.user.id !== this.player.id) {\n if (this.options.notPlayerMessage) {\n try {\n await i.reply({\n content: this.options.notPlayerMessage(this),\n flags: MessageFlags.Ephemeral,\n });\n } catch (err) {\n this.emit(\"error\", err);\n }\n }\n return;\n }\n\n const x = Number(i.customId.split(\"-\").at(-2));\n const y = Number(i.customId.split(\"-\").at(-1));\n const index = y * this.size + x;\n\n try {\n await i.deferUpdate();\n } catch (err) {\n this.emit(\"error\", err);\n return;\n }\n\n const emoji = this.emojis[index];\n const emojiBtn = this.components[y].components[x];\n this.tilesTurned += 1;\n\n if (!this.selected) {\n this.selected = { x, y, index };\n emojiBtn.setEmoji(emoji).setStyle(ButtonStyle.Primary);\n } else if (this.selected.index === index) {\n this.selected = null;\n removeEmoji(emojiBtn).setStyle(ButtonStyle.Secondary);\n } else {\n const selectedEmoji = this.emojis[this.selected.index];\n const selectedBtn = this.components[this.selected.y].components[this.selected.x];\n const matched = emoji === selectedEmoji || selectedEmoji === jokerEmoji || emoji === jokerEmoji;\n\n if (selectedEmoji === jokerEmoji || emoji === jokerEmoji) {\n const joker = emoji === jokerEmoji ? this.selected : { x, y, index };\n const pair = this.getPairEmojiPositions(this.emojis[joker.index]).filter(\n b => b.index !== joker.index,\n )[0];\n const pairBtn = this.components[pair.y].components[pair.x];\n\n pairBtn.setEmoji(this.emojis[pair.index]).setStyle(ButtonStyle.Success).setDisabled(true);\n }\n\n emojiBtn\n .setEmoji(emoji)\n .setStyle(matched ? ButtonStyle.Success : ButtonStyle.Danger)\n .setDisabled(matched);\n selectedBtn\n .setEmoji(selectedEmoji)\n .setStyle(matched ? ButtonStyle.Success : ButtonStyle.Danger)\n .setDisabled(matched);\n\n if (!matched) {\n try {\n await i.editReply({ components: this.components });\n } catch (err) {\n this.emit(\"error\", err);\n }\n\n removeEmoji(emojiBtn).setStyle(ButtonStyle.Secondary);\n removeEmoji(selectedBtn).setStyle(ButtonStyle.Secondary);\n\n this.selected = null;\n return;\n }\n\n this.remainingPairs -= 1;\n this.selected = null;\n }\n\n if (this.remainingPairs === 0) return collector.stop(\"$win\");\n\n try {\n await i.editReply({ components: this.components });\n } catch (err) {\n this.emit(\"error\", err);\n }\n });\n\n collector.on(\"end\", async (_, reason) => {\n this.emit(\"end\");\n\n if (reason === \"$win\" || reason === \"idle\") {\n await this.gameOver(message, reason === \"idle\");\n }\n });\n }\n}\n","import z from \"zod/v4\";\nimport { ActionRowBuilder, ButtonBuilder, ButtonStyle, Message, MessageFlags } from \"discord.js\";\nimport { Game, GameContext, GameResult } from \"@/core/Game\";\nimport { embedBuilder, gameMessage, resultMessage } from \"@/utils/schemas\";\nimport { getNumberEmoji } from \"@/utils/games\";\nimport { colors } from \"@/utils/constants\";\nimport { Embed1, Embed2 } from \"@/utils/types\";\n\n/**\n * The minesweeper game result.\n */\nexport interface MinesweeperResult extends GameResult {\n outcome: \"win\" | \"lose\" | \"timeout\";\n tilesTurned: number;\n}\n\nconst defaultOptions = {\n embed: {\n title: \"Minesweeper\",\n color: colors.blurple,\n description: \"Click on the buttons to reveal the blocks except mines.\",\n },\n timeout: 120_000,\n winMessage: () => \"You won the Game! You successfully avoided all the mines.\",\n loseMessage: () => \"You lost the Game! Beaware of the mines next time.\",\n notPlayerMessage: (game: Minesweeper) => `Only ${game.player} can use this menu.`,\n mines: 5,\n emojis: {\n flag: \"🚩\",\n mine: \"💣\",\n },\n};\n\nexport interface MinesweeperOptions extends z.input<typeof minesweeperOptions> {\n embed?: Embed1<Minesweeper>;\n endEmbed?: Embed2<Minesweeper, MinesweeperResult>;\n /**\n * The max amount of time the player can be idle.\n */\n timeout?: number;\n}\n\nexport const minesweeperOptions = z.object({\n embed: embedBuilder<[Minesweeper]>().optional().default(defaultOptions.embed),\n endEmbed: embedBuilder<[Minesweeper, MinesweeperResult]>().optional(),\n winMessage: resultMessage<MinesweeperResult, Minesweeper>()\n .optional()\n .default(() => defaultOptions.winMessage),\n loseMessage: resultMessage<MinesweeperResult, Minesweeper>()\n .optional()\n .default(() => defaultOptions.loseMessage),\n notPlayerMessage: gameMessage<Minesweeper>()\n .optional()\n .default(() => defaultOptions.notPlayerMessage),\n timeout: z.number().int().optional().default(defaultOptions.timeout),\n mines: z.number().int().min(1).max(24).optional().default(defaultOptions.mines),\n emojis: z\n .object({\n flag: z.string().optional().default(defaultOptions.emojis.flag),\n mine: z.string().optional().default(defaultOptions.emojis.mine),\n })\n .optional()\n .default(defaultOptions.emojis),\n});\n\n/**\n * A game where the player needs to click on all tiles except the mines.\n *\n * # Example\n *\n * ```js\n * const game = new Minesweeper(interaction, {\n * winMessage: \"You won the Game! You successfully avoided all the mines.\"\n * timeout: 120_000\n * });\n *\n * game.on(\"error\", err => console.error(err));\n * game.on(\"gameOver\", result => console.log(result));\n *\n * await game.start();\n * ```\n */\nexport class Minesweeper extends Game<MinesweeperResult> {\n readonly options: z.output<typeof minesweeperOptions>;\n\n /**\n * The board of the game.\n *\n * - `true` : empty\n * - `false` : mine\n * - `number` : empty, with `n` mines around it\n */\n readonly board: (number | boolean)[] = [];\n /**\n * The width/height of the board\n */\n readonly size = 5;\n\n message: Message | null = null;\n\n constructor(context: GameContext, options?: MinesweeperOptions) {\n super(context);\n this.options = minesweeperOptions.parse(options || {});\n\n for (let y = 0; y < this.size; y++) {\n for (let x = 0; x < this.size; x++) {\n this.board[y * this.size + x] = false;\n }\n }\n }\n\n override async start() {\n this.plantMines();\n this.showFirstBlock();\n\n const embed = await this.buildEmbed(this.options.embed);\n\n this.message = await this.sendMessage({ embeds: [embed], components: this.getComponents() });\n this.handleButtons(this.message);\n }\n\n private handleButtons(message: Message) {\n const collector = message.createMessageComponentCollector({ idle: this.options.timeout });\n\n collector.on(\"collect\", async i => {\n if (!i.customId.startsWith(\"$gamecord\")) return;\n\n if (i.user.id !== this.player.id) {\n if (this.options.notPlayerMessage) {\n try {\n await i.reply({\n content: this.options.notPlayerMessage(this),\n flags: MessageFlags.Ephemeral,\n });\n } catch (err) {\n this.emit(\"error\", err);\n }\n }\n return;\n }\n\n const x = Number(i.customId.split(\"-\").at(-2));\n const y = Number(i.customId.split(\"-\").at(-1));\n const index = y * this.size + x;\n\n try {\n await i.deferUpdate();\n } catch (err) {\n this.emit(\"error\", err);\n return;\n }\n\n if (this.board[index] === true) return collector.stop(\"$end\");\n const mines = this.getMinesAround(x, y);\n this.board[index] = mines;\n\n if (this.hasFoundAllMines()) return collector.stop(\"$end\");\n\n try {\n await i.editReply({ components: this.getComponents() });\n } catch (err) {\n this.emit(\"error\", err);\n }\n });\n\n collector.on(\"end\", async (_, reason) => {\n this.emit(\"end\");\n\n if (reason === \"$end\" || reason === \"idle\") {\n await this.gameOver(message, reason === \"idle\");\n }\n });\n }\n\n private async gameOver(message: Message, hasTimedOut: boolean) {\n const result = this.result({\n outcome: hasTimedOut ? \"timeout\" : this.hasFoundAllMines() ? \"win\" : \"lose\",\n tilesTurned: this.board.filter(Number.isInteger).length,\n });\n this.emit(\"gameOver\", result);\n\n for (let y = 0; y < this.size; y++) {\n for (let x = 0; x < this.size; x++) {\n const index = y * this.size + x;\n if (this.board[index] !== true) this.board[index] = this.getMinesAround(x, y);\n }\n }\n\n const embed = await this.buildEndEmbed(this.options.embed, this.options.endEmbed, result, {\n description:\n result.outcome === \"win\"\n ? this.options.winMessage(result, this)\n : this.options.loseMessage(result, this),\n });\n\n try {\n await this.editContextOrMessage(message, {\n embeds: [embed],\n components: this.getComponents(true, result.outcome === \"win\", true),\n });\n } catch (err) {\n this.emit(\"error\", err);\n }\n }\n\n private plantMines() {\n for (let i = 0; i <= this.options.mines; i++) {\n const x = Math.floor(Math.random() * 5);\n const y = Math.floor(Math.random() * 5);\n const index = y * this.size + x;\n\n if (this.board[index] !== true) {\n this.board[index] = true;\n } else {\n i -= 1;\n }\n }\n }\n\n private getMinesAround(x: number, y: number): number {\n let minesAround = 0;\n\n for (let row = -1; row < 2; row++) {\n for (let col = -1; col < 2; col++) {\n const block = { x: x + col, y: y + row };\n if (block.x < 0 || block.x >= 5 || block.y < 0 || block.y >= 5) continue;\n if (row === 0 && col === 0) continue;\n\n if (this.board[block.y * this.size + block.x] === true) minesAround += 1;\n }\n }\n return minesAround;\n }\n\n private showFirstBlock() {\n const emptyBlocks = [];\n for (let y = 0; y < this.size; y++) {\n for (let x = 0; x < this.size; x++) {\n if (this.board[y * this.size + x] === true) emptyBlocks.push({ x, y });\n }\n }\n\n const safeBlocks = emptyBlocks.filter(b => !this.getMinesAround(b.x, b.y));\n const blocks = safeBlocks.length ? safeBlocks : emptyBlocks;\n\n const rBlock = blocks[Math.floor(Math.random() * blocks.length)];\n this.board[rBlock.y * this.size + rBlock.x] = this.getMinesAround(rBlock.x, rBlock.y);\n }\n\n private hasFoundAllMines(): boolean {\n let found = true;\n for (let y = 0; y < this.size; y++) {\n for (let x = 0; x < this.size; x++) {\n if (this.board[y * this.size + x] === false) found = false;\n }\n }\n return found;\n }\n\n /**\n * Build the minesweeper grid using buttons.\n */\n getComponents(showMines = false, found = false, disabled = false): ActionRowBuilder<ButtonBuilder>[] {\n const components = [];\n\n for (let y = 0; y < this.size; y++) {\n const row = new ActionRowBuilder<ButtonBuilder>();\n\n for (let x = 0; x < this.size; x++) {\n const block = this.board[y * this.size + x];\n const numberEmoji = typeof block === \"number\" && block > 0 ? getNumberEmoji(block) : null;\n const displayMine = block === true && showMines;\n\n const btn = new ButtonBuilder()\n .setStyle(\n displayMine\n ? found\n ? ButtonStyle.Success\n : ButtonStyle.Danger\n : typeof block === \"number\"\n ? ButtonStyle.Secondary\n : ButtonStyle.Primary,\n )\n .setCustomId(`$gamecord-minesweeper-${x}-${y}`)\n .setDisabled(disabled);\n\n if (displayMine || numberEmoji)\n btn.setEmoji(\n displayMine ? (found ? this.options.emojis.flag : this.options.emojis.mine) : numberEmoji!,\n );\n else {\n btn.setLabel(\"\\u200b\");\n }\n\n row.addComponents(btn);\n }\n\n components.push(row);\n }\n\n return components;\n }\n}\n","import z from \"zod/v4\";\nimport { ActionRowBuilder, ButtonBuilder, ButtonStyle, Message, MessageFlags, User } from \"discord.js\";\nimport { GameContext } from \"@/core/Game\";\nimport { VersusGame, VersusGameResult, VersusOptions, versusOptions } from \"@/core/VersusGame\";\nimport { embedBuilder, gameMessage, resultMessage, var2Message } from \"@/utils/schemas\";\nimport { colors } from \"@/utils/constants\";\nimport { Embed1, Embed2 } from \"@/utils/types\";\n\n/**\n * The RPS game result.\n */\nexport interface RockPaperScissorsResult extends VersusGameResult {\n outcome: \"win\" | \"tie\" | \"timeout\";\n /**\n * Only if `outcome` is `win`.\n */\n winner: User | null;\n playerChoice: string | null;\n opponentChoice: string | null;\n}\n\nconst defaultOptions = {\n embed: {\n title: \"Rock Paper Scissors\",\n color: colors.blurple,\n description: \"Press a button below to make a choice.\",\n },\n winMessage: (res: RockPaperScissorsResult) => `**${res.winner}** won the Game! Congratulations!`,\n tieMessage: () => \"The Game tied! No one won the Game!\",\n timeoutMessage: () => \"The Game went unfinished! No one won the Game!\",\n choiceMessage: (emoji: string) => `You choose ${emoji}.`,\n notPlayerMessage: (game: RockPaperScissors) => `Only ${game.player} and ${game.opponent} can use this menu.`,\n buttons: {\n rock: \"Rock\",\n paper: \"Paper\",\n scissors: \"Scissors\",\n },\n emojis: {\n rock: \"🌑\",\n paper: \"📰\",\n scissors: \"✂️\",\n },\n timeout: 60_000,\n};\n\nexport interface RockPaperScissorsOptions extends z.input<typeof rockPaperScissorsOptions> {\n versus: VersusOptions;\n embed?: Embed1<RockPaperScissors>;\n endEmbed?: Embed2<RockPaperScissors, RockPaperScissorsResult>;\n /**\n * The max amount of time the player can be idle.\n */\n timeout?: number;\n}\n\nexport const rockPaperScissorsOptions = z.object({\n versus: versusOptions(\"Rock Paper Scissors\"),\n embed: embedBuilder<[RockPaperScissors]>().optional().default(defaultOptions.embed),\n endEmbed: embedBuilder<[RockPaperScissors, RockPaperScissorsResult]>().optional(),\n winMessage: resultMessage<RockPaperScissorsResult, RockPaperScissors>()\n .optional()\n .default(() => defaultOptions.winMessage),\n tieMessage: resultMessage<RockPaperScissorsResult, RockPaperScissors>()\n .optional()\n .default(() => defaultOptions.tieMessage),\n timeoutMessage: resultMessage<RockPaperScissorsResult, RockPaperScissors>()\n .optional()\n .default(() => defaultOptions.timeoutMessage),\n choiceMessage: var2Message<string, RockPaperScissors>()\n .optional()\n .default(() => defaultOptions.choiceMessage),\n notPlayerMessage: gameMessage<RockPaperScissors>()\n .optional()\n .default(() => defaultOptions.notPlayerMessage),\n buttonStyle: z.number().int().optional().default(ButtonStyle.Primary),\n buttons: z\n .object({\n rock: z.string().optional().default(defaultOptions.buttons.rock),\n paper: z.string().optional().default(defaultOptions.buttons.paper),\n scissors: z.string().optional().default(defaultOptions.buttons.scissors),\n })\n .optional()\n .default(defaultOptions.buttons),\n emojis: z\n .object({\n rock: z.string().optional().default(defaultOptions.emojis.rock),\n paper: z.string().optional().default(defaultOptions.emojis.paper),\n scissors: z.string().optional().default(defaultOptions.emojis.scissors),\n })\n .optional()\n .default(defaultOptions.emojis),\n timeout: z.number().int().optional().default(defaultOptions.timeout),\n});\n\n/**\n * The Rock Paper Scissors game.\n *\n * # Errors\n *\n * Can emit `fatalError` if it fails to edit from the invitation embed to the game message.\n *\n * # Example\n *\n * ```js\n * const opponent = // The opponent (must be a discord.js User)\n *\n * const game = new RockPaperScissors(interaction, {\n * versus: {\n * opponent\n * }\n * });\n *\n * game.on(\"error\", err => console.error(err));\n * game.on(\"versusReject\", () => console.log(\"Opponent rejected the invitation to play\"));\n * game.on(\"gameOver\", result => console.log(result));\n *\n * await game.start();\n * ```\n */\nexport class RockPaperScissors extends VersusGame<RockPaperScissorsResult> {\n readonly options: z.output<typeof rockPaperScissorsOptions>;\n\n playerChoice: string | null = null;\n opponentChoice: string | null = null;\n\n message: Message | null = null;\n\n constructor(context: GameContext, options?: RockPaperScissorsOptions) {\n const parsed = rockPaperScissorsOptions.parse(options || {});\n super(context, parsed.versus);\n this.options = parsed;\n }\n\n override async start() {\n this.message = await this.requestVersus();\n if (this.message) this.runGame(this.message);\n }\n\n private async runGame(message: Message) {\n try {\n const embed = await this.buildEmbed(this.options.embed);\n\n await this.editContextOrMessage(message, {\n content: null,\n embeds: [embed],\n components: [this.getActionRow()],\n });\n } catch (err) {\n this.emit(\"fatalError\", err);\n this.emit(\"end\");\n return;\n }\n\n this.handleButtons(message);\n }\n\n private handleButtons(message: Message) {\n const collector = message.createMessageComponentCollector({ idle: this.options.timeout });\n\n const emojis = this.options.emojis;\n const choices = { r: emojis.rock, p: emojis.paper, s: emojis.scissors };\n\n collector.on(\"collect\", async i => {\n if (!i.customId.startsWith(\"$gamecord\")) return;\n\n if (i.user.id !== this.player.id && i.user.id !== this.opponent.id) {\n if (this.options.notPlayerMessage) {\n try {\n await i.reply({\n content: this.options.notPlayerMessage(this),\n flags: MessageFlags.Ephemeral,\n });\n } catch (err) {\n this.emit(\"error\", err);\n }\n }\n return;\n }\n\n const choice = choices[i.customId.split(\"-\").at(-1) as keyof typeof choices];\n let replyChoice = false;\n\n if (i.user.id === this.player.id && !this.playerChoice) {\n this.playerChoice = choice;\n replyChoice = true;\n } else if (i.user.id === this.opponent.id && !this.opponentChoice) {\n this.opponentChoice = choice;\n replyChoice = true;\n }\n\n if (replyChoice) {\n try {\n await i.reply({\n content: this.options.choiceMessage(choice, this),\n flags: MessageFlags.Ephemeral,\n });\n } catch (err) {\n this.emit(\"error\", err);\n }\n }\n\n if (!i.replied) {\n try {\n await i.deferUpdate();\n } catch (err) {\n this.emit(\"error\", err);\n return;\n }\n }\n\n if (this.playerChoice && this.opponentChoice) return collector.stop(\"$end\");\n });\n\n collector.on(\"end\", async (_, reason) => {\n this.emit(\"end\");\n\n if (reason === \"idle\" || reason === \"$end\") {\n await this.gameOver(message);\n }\n });\n }\n\n private getResult() {\n if (!this.playerChoice && !this.opponentChoice) return \"timeout\";\n else if (this.playerChoice === this.opponentChoice) return \"tie\";\n else return \"win\";\n }\n\n private hasPlayer1Won() {\n const { rock: r, paper: p, scissors: s } = this.options.emojis;\n return (\n (this.playerChoice === s && this.opponentChoice === p) ||\n (this.playerChoice === r && this.opponentChoice === s) ||\n (this.playerChoice === p && this.opponentChoice === r)\n );\n }\n\n private getActionRow(disabled = false) {\n return new ActionRowBuilder<ButtonBuilder>().setComponents(\n new ButtonBuilder()\n .setStyle(this.options.buttonStyle)\n .setEmoji(this.options.emojis.rock)\n .setCustomId(\"$gamecord-rps-r\")\n .setLabel(this.options.buttons.rock)\n .setDisabled(disabled),\n new ButtonBuilder()\n .setStyle(this.options.buttonStyle)\n .setEmoji(this.options.emojis.paper)\n .setCustomId(\"$gamecord-rps-p\")\n .setLabel(this.options.buttons.paper)\n .setDisabled(disabled),\n new ButtonBuilder()\n .setStyle(this.options.buttonStyle)\n .setEmoji(this.options.emojis.scissors)\n .setCustomId(\"$gamecord-rps-s\")\n .setLabel(this.options.buttons.scissors)\n .setDisabled(disabled),\n );\n }\n\n private async gameOver(message: Message) {\n const outcome = this.getResult();\n const result = this.result({\n opponent: this.opponent,\n outcome,\n winner: outcome === \"win\" ? (this.hasPlayer1Won() ? this.player : this.opponent) : null,\n playerChoice: this.playerChoice,\n opponentChoice: this.opponentChoice,\n });\n this.emit(\"gameOver\", result);\n\n let getMessage;\n switch (outcome) {\n case \"win\": {\n getMessage = this.options.winMessage;\n break;\n }\n case \"tie\": {\n getMessage = this.options.tieMessage;\n break;\n }\n case \"timeout\": {\n getMessage = this.options.timeoutMessage;\n break;\n }\n }\n\n const embed = await this.buildEndEmbed(this.options.embed, this.options.endEmbed, result, {\n description: getMessage(result, this),\n fields: [\n {\n name: this.player.displayName,\n value: this.playerChoice ?? \"❔\",\n inline: true,\n },\n {\n name: \"VS\",\n value: \"⚡\",\n inline: true,\n },\n {\n name: this.opponent.displayName,\n value: this.opponentChoice ?? \"❔\",\n inline: true,\n },\n ],\n });\n\n try {\n await this.editContextOrMessage(message, {\n embeds: [embed],\n components: [this.getActionRow(true)],\n });\n } catch (err) {\n this.emit(\"error\", err);\n }\n }\n}\n","import z from \"zod/v4\";\nimport { ActionRowBuilder, ButtonBuilder, ButtonStyle, Message, MessageFlags, User } from \"discord.js\";\nimport { GameContext } from \"@/core/Game\";\nimport { VersusGame, VersusGameResult, VersusOptions, versusOptions } from \"@/core/VersusGame\";\nimport { embedBuilder, gameMessage, resultMessage, var2Message } from \"@/utils/schemas\";\nimport { colors } from \"@/utils/constants\";\nimport { Embed1, Embed2 } from \"@/utils/types\";\n\n/**\n * The Tic Tac Toe game result.\n */\nexport interface TicTacToeResult extends VersusGameResult {\n outcome: \"win\" | \"tie\" | \"timeout\";\n /**\n * Only if `outcome` is `win`.\n */\n winner: User | null;\n winnerEmoji: string | null;\n}\n\n/**\n * The data of a Tic Tac Toe turn.\n */\nexport interface TicTacToeTurn {\n player: User;\n emoji: string;\n}\n\nconst defaultOptions = {\n embed: {\n title: \"Tic Tac Toe\",\n color: colors.blurple,\n },\n winMessage: (res: TicTacToeResult) => `${res.winnerEmoji} | **${res.winner}** won the TicTacToe Game.`,\n tieMessage: () => \"The Game tied! No one won the Game!\",\n timeoutMessage: () => \"The Game went unfinished! No one won the Game!\",\n turnMessage: (turn: TicTacToeTurn) => `${turn.emoji} | It's player **${turn.player.displayName}**'s turn.`,\n notPlayerMessage: (game: TicTacToe) => `Only ${game.player} and ${game.opponent} can use this menu.`,\n emojis: {\n xButton: \"❌\",\n oButton: \"🔵\",\n },\n styles: {\n xButton: ButtonStyle.Secondary,\n oButton: ButtonStyle.Secondary,\n },\n timeout: 60_000,\n};\n\nexport interface TicTacToeOptions extends z.input<typeof ticTacToeOptions> {\n versus: VersusOptions;\n embed?: Embed1<TicTacToe>;\n endEmbed?: Embed2<TicTacToe, TicTacToeResult>;\n /**\n * The max amount of time the player can be idle.\n */\n timeout?: number;\n}\n\nexport const ticTacToeOptions = z.object({\n versus: versusOptions(\"Tic Tac Toe\"),\n embed: embedBuilder<[TicTacToe]>().optional().default(defaultOptions.embed),\n endEmbed: embedBuilder<[TicTacToe, TicTacToeResult]>().optional(),\n winMessage: resultMessage<TicTacToeResult, TicTacToe>()\n .optional()\n .default(() => defaultOptions.winMessage),\n tieMessage: resultMessage<TicTacToeResult, TicTacToe>()\n .optional()\n .default(() => defaultOptions.tieMessage),\n timeoutMessage: resultMessage<TicTacToeResult, TicTacToe>()\n .optional()\n .default(() => defaultOptions.timeoutMessage),\n turnMessage: var2Message<TicTacToeTurn, TicTacToe>()\n .optional()\n .default(() => defaultOptions.turnMessage),\n notPlayerMessage: gameMessage<TicTacToe>()\n .optional()\n .default(() => defaultOptions.notPlayerMessage),\n emojis: z\n .object({\n xButton: z.string().optional().default(defaultOptions.emojis.xButton),\n oButton: z.string().optional().default(defaultOptions.emojis.oButton),\n })\n .optional()\n .default(defaultOptions.emojis),\n styles: z\n .object({\n xButton: z.number().int().optional().default(defaultOptions.styles.xButton),\n oButton: z.number().int().optional().default(defaultOptions.styles.oButton),\n })\n .optional()\n .default(defaultOptions.styles),\n timeout: z.number().int().optional().default(defaultOptions.timeout),\n});\n\n/**\n * The Tic Tac Toe game.\n *\n * # Errors\n *\n * Can emit `fatalError` if it fails to edit from the invitation embed to the game message.\n *\n * # Example\n *\n * ```js\n * const opponent = // The opponent (must be a discord.js User)\n *\n * const game = new TicTacToe(interaction, {\n * versus: {\n * opponent\n * }\n * });\n *\n * game.on(\"error\", err => console.error(err));\n * game.on(\"versusReject\", () => console.log(\"Opponent rejected the invitation to play\"));\n * game.on(\"gameOver\", result => console.log(result));\n *\n * await game.start();\n * ```\n */\nexport class TicTacToe extends VersusGame<TicTacToeResult> {\n readonly options: z.output<typeof ticTacToeOptions>;\n\n /**\n * A 9-elements array.\n *\n * - `0` : empty\n * - `1` : X (player 1)\n * - `2` : O (player 2)\n */\n readonly gameboard: number[] = [0, 0, 0, 0, 0, 0, 0, 0, 0];\n isPlayer1Turn = true;\n\n message: Message | null = null;\n\n private locked = false;\n\n constructor(context: GameContext, options?: TicTacToeOptions) {\n const parsed = ticTacToeOptions.parse(options || {});\n super(context, parsed.versus);\n this.options = parsed;\n }\n\n override async start() {\n this.message = await this.requestVersus();\n if (this.message) this.runGame(this.message);\n }\n\n private async runGame(message: Message) {\n try {\n const embed = await this.buildEmbed(this.options.embed, {\n description: this.options.turnMessage(this.getPlayerTurnData(), this),\n });\n\n await this.editContextOrMessage(message, {\n content: null,\n embeds: [embed],\n components: this.getComponents(),\n });\n } catch (err) {\n this.emit(\"fatalError\", err);\n this.emit(\"end\");\n return;\n }\n\n this.handleButtons(message);\n }\n\n private handleButtons(message: Message) {\n const collector = message.createMessageComponentCollector({ idle: this.options.timeout });\n\n collector.on(\"collect\", async i => {\n if (!i.customId.startsWith(\"$gamecord\")) return;\n\n if (i.user.id !== this.player.id && i.user.id !== this.opponent.id) {\n if (this.options.notPlayerMessage) {\n try {\n await i.reply({\n content: this.options.notPlayerMessage(this),\n flags: MessageFlags.Ephemeral,\n });\n } catch (err) {\n this.emit(\"error\", err);\n }\n }\n return;\n }\n\n try {\n await i.deferUpdate();\n } catch (err) {\n this.emit(\"error\", err);\n return;\n }\n\n if (this.locked) return;\n this.locked = true;\n\n try {\n if (i.user.id !== (this.isPlayer1Turn ? this.player : this.opponent).id) return;\n\n const index = Number(i.customId.split(\"-\").at(-1));\n\n if (this.gameboard[index] !== 0) return;\n this.gameboard[index] = this.isPlayer1Turn ? 1 : 2;\n\n if (this.hasWonGame(1) || this.hasWonGame(2)) return collector.stop(\"$win\");\n if (!this.gameboard.includes(0)) return collector.stop(\"$tie\");\n this.isPlayer1Turn = !this.isPlayer1Turn;\n\n const embed = await this.buildEmbed(this.options.embed, {\n description: this.options.turnMessage(this.getPlayerTurnData(), this),\n });\n\n try {\n await i.editReply({ embeds: [embed], components: this.getComponents() });\n } catch (err) {\n this.emit(\"error\", err);\n }\n } finally {\n this.locked = false;\n }\n });\n\n collector.on(\"end\", async (_, reason) => {\n this.emit(\"end\");\n\n if (reason === \"$win\" || reason === \"$tie\") {\n return await this.gameOver(message, reason === \"$win\" ? \"win\" : \"tie\");\n }\n\n if (reason === \"idle\") {\n return await this.gameOver(message, \"timeout\");\n }\n });\n }\n\n private async gameOver(message: Message, outcome: \"win\" | \"tie\" | \"timeout\") {\n const winner = this.hasWonGame(1) ? this.player : this.opponent;\n const winnerEmoji = this.hasWonGame(1) ? this.options.emojis.xButton : this.options.emojis.oButton;\n\n const result = this.result({\n opponent: this.opponent,\n outcome,\n winner: outcome === \"win\" ? winner : null,\n winnerEmoji: outcome === \"win\" ? winnerEmoji : null,\n });\n this.emit(\"gameOver\", result);\n\n let getMessage;\n switch (outcome) {\n case \"win\": {\n getMessage = this.options.winMessage;\n break;\n }\n case \"tie\": {\n getMessage = this.options.tieMessage;\n break;\n }\n case \"timeout\": {\n getMessage = this.options.timeoutMessage;\n break;\n }\n }\n\n const embed = await this.buildEndEmbed(this.options.embed, this.options.endEmbed, result, {\n description: getMessage(result, this),\n });\n\n try {\n await this.editContextOrMessage(message, {\n embeds: [embed],\n components: this.getComponents(true),\n });\n } catch (err) {\n this.emit(\"error\", err);\n }\n }\n\n private hasWonGame(player: 1 | 2) {\n if (\n this.gameboard[0] === this.gameboard[4] &&\n this.gameboard[0] === this.gameboard[8] &&\n this.gameboard[0] === player\n ) {\n return true;\n } else if (\n this.gameboard[6] === this.gameboard[4] &&\n this.gameboard[6] === this.gameboard[2] &&\n this.gameboard[6] === player\n ) {\n return true;\n }\n for (let i = 0; i < 3; ++i) {\n if (\n this.gameboard[i * 3] === this.gameboard[i * 3 + 1] &&\n this.gameboard[i * 3] === this.gameboard[i * 3 + 2] &&\n this.gameboard[i * 3] === player\n ) {\n return true;\n }\n if (\n this.gameboard[i] === this.gameboard[i + 3] &&\n this.gameboard[i] === this.gameboard[i + 6] &&\n this.gameboard[i] === player\n ) {\n return true;\n }\n }\n return false;\n }\n\n private getPlayerTurnData() {\n return this.isPlayer1Turn\n ? { player: this.player, emoji: this.options.emojis.xButton }\n : { player: this.opponent, emoji: this.options.emojis.oButton };\n }\n\n private getButtonData(player: number) {\n if (player === 1) return { emoji: this.options.emojis.xButton, style: this.options.styles.xButton };\n else if (player === 2) return { emoji: this.options.emojis.oButton, style: this.options.styles.oButton };\n else return { emoji: null, style: ButtonStyle.Secondary };\n }\n\n private getComponents(disabled = false) {\n const components = [];\n\n for (let x = 0; x < 3; x++) {\n const row = new ActionRowBuilder<ButtonBuilder>();\n for (let y = 0; y < 3; y++) {\n const index = y * 3 + x;\n const data = this.getButtonData(this.gameboard[index]);\n\n const btn = new ButtonBuilder().setStyle(data.style).setCustomId(`$gamecord-tictactoe-${index}`);\n\n if (data.emoji) {\n btn.setEmoji(data.emoji);\n } else {\n btn.setLabel(\"\\u200b\");\n }\n if (this.gameboard[y * 3 + x] !== 0) btn.setDisabled(true);\n if (disabled) btn.setDisabled(true);\n\n row.addComponents(btn);\n }\n components.push(row);\n }\n return components;\n }\n}\n","import z from \"zod/v4\";\nimport { ActionRowBuilder, ButtonBuilder, ButtonStyle, Message, MessageFlags } from \"discord.js\";\nimport { Game, GameContext, GameResult } from \"@/core/Game\";\nimport { embedBuilder, gameMessage, resultMessage } from \"@/utils/schemas\";\nimport { colors } from \"@/utils/constants\";\nimport { getRandomElement, shuffleArray } from \"@/utils/random\";\nimport { Awaitable, Embed1, Embed2, GameMessage } from \"@/utils/types\";\n\n/**\n * The trivia game result.\n */\nexport interface TriviaResult extends GameResult {\n outcome: \"win\" | \"lose\" | \"timeout\";\n trivia: TriviaData;\n /**\n * Index in `trivia.options`.\n */\n selected: number;\n}\n\n/**\n * For `single` questions, the values must be the strings `\"True\"` and `\"False\"`.\n */\nexport interface TriviaData {\n question: string;\n difficulty: string;\n category: string;\n answer: string;\n options: string[];\n}\n\nconst triviaAPISchema = z.object({\n results: z.array(\n z.object({\n difficulty: z.string(),\n category: z.string(),\n question: z.string(),\n correct_answer: z.string(),\n incorrect_answers: z.array(z.string()),\n }),\n ),\n});\n\nconst difficulties = [\"easy\", \"medium\", \"hard\"];\n\nconst defaultOptions = {\n embed: {\n title: \"Trivia\",\n color: colors.blurple,\n fields: [\n {\n name: \"\\u200b\",\n value: \"You have 60 seconds to guess the answer.\",\n },\n ],\n },\n winMessage: (res: TriviaResult) => `You won! The correct answer was ${res.trivia.answer}.`,\n loseMessage: (res: TriviaResult) => `You lost! The correct answer was ${res.trivia.answer}.`,\n errorMessage: () => \"Unable to fetch question data! Please try again.\",\n notPlayerMessage: (game: Trivia) => `Only ${game.player} can use this menu.`,\n mode: \"multiple\" as const,\n timeout: 60_000,\n trueText: \"True\",\n falseText: \"False\",\n};\n\nexport interface TriviaOptions extends z.input<typeof triviaOptions> {\n embed?: Embed1<Trivia>;\n endEmbed?: Embed2<Trivia, TriviaResult>;\n /**\n * Message displayed when the API call to fetch the trivia fails.\n */\n errorMessage?: GameMessage<Trivia>;\n /**\n * Random if not specified.\n */\n difficulty?: \"easy\" | \"medium\" | \"hard\";\n /**\n * The max amount of time the player can be idle.\n */\n timeout?: number;\n}\n\nexport const triviaOptions = z.object({\n embed: embedBuilder<[Trivia]>().optional().default(defaultOptions.embed),\n endEmbed: embedBuilder<[Trivia, TriviaResult]>().optional(),\n winMessage: resultMessage<TriviaResult, Trivia>()\n .optional()\n .default(() => defaultOptions.winMessage),\n loseMessage: resultMessage<TriviaResult, Trivia>()\n .optional()\n .default(() => defaultOptions.loseMessage),\n errorMessage: gameMessage<Trivia>()\n .optional()\n .default(() => defaultOptions.errorMessage),\n notPlayerMessage: gameMessage<Trivia>()\n .optional()\n .default(() => defaultOptions.notPlayerMessage),\n mode: z.enum([\"multiple\", \"single\"]).optional().default(defaultOptions.mode),\n difficulty: z.enum(difficulties).optional(),\n trivia: z.custom<(game: Trivia) => Awaitable<TriviaData>>().optional(),\n timeout: z.number().int().optional().default(defaultOptions.timeout),\n trueText: z.string().optional().default(defaultOptions.trueText),\n falseText: z.string().optional().default(defaultOptions.falseText),\n});\n\n/**\n * A game where the player needs to find the answer of a random question.\n *\n * # API\n *\n * This game uses the `opentdb.com` API. If you want to use\n * your own questions, use the `trivia` option.\n *\n * # Example\n *\n * ```js\n * const game = new Trivia(interaction, {\n * timeout: 30_000\n * });\n *\n * game.on(\"error\", err => console.error(err));\n * game.on(\"gameOver\", result => console.log(result));\n *\n * await game.start();\n * ```\n */\nexport class Trivia extends Game<TriviaResult> {\n readonly options: z.output<typeof triviaOptions>;\n\n readonly difficulty: string;\n selected: number | null = null;\n trivia: TriviaData | null = null;\n\n message: Message | null = null;\n\n constructor(context: GameContext, options?: TriviaOptions) {\n super(context);\n this.options = triviaOptions.parse(options || {});\n this.difficulty = this.options.difficulty || getRandomElement(difficulties);\n }\n\n override async start() {\n this.trivia = await this.getTriviaQuestion();\n if (!this.trivia) {\n try {\n await this.sendMessage({\n content: this.options.errorMessage(this),\n });\n } catch (err) {\n this.emit(\"error\", err);\n }\n return;\n }\n\n const embed = await this.buildEmbed(this.options.embed, {\n description: `**${this.trivia.question}**\\n\\n**Difficulty:** ${this.trivia.difficulty}\\n**Category:** ${this.trivia.category}`,\n });\n\n this.message = await this.sendMessage({ embeds: [embed], components: this.getComponents() });\n this.handleButtons(this.message);\n }\n\n private handleButtons(message: Message) {\n const trivia = this.trivia!;\n const collector = message.createMessageComponentCollector({ idle: this.options.timeout });\n\n collector.on(\"collect\", async i => {\n if (!i.customId.startsWith(\"$gamecord\")) return;\n\n if (i.user.id !== this.player.id) {\n if (this.options.notPlayerMessage) {\n try {\n await i.reply({\n content: this.options.notPlayerMessage(this),\n flags: MessageFlags.Ephemeral,\n });\n } catch (err) {\n this.emit(\"error\", err);\n }\n }\n return;\n }\n\n collector.stop();\n this.selected = Number(i.customId.split(\"-\").at(-1));\n\n try {\n await i.deferUpdate();\n } catch (err) {\n this.emit(\"error\", err);\n }\n\n await this.gameOver(message, trivia.options[this.selected] === trivia.answer);\n });\n\n collector.on(\"end\", async (_, reason) => {\n this.emit(\"end\");\n\n if (reason === \"idle\") {\n await this.gameOver(message, false, true);\n }\n });\n }\n\n private async gameOver(message: Message, hasWon: boolean, hasTimedOut = false) {\n const trivia = this.trivia!;\n const result = this.result({\n outcome: hasTimedOut ? \"timeout\" : hasWon ? \"win\" : \"lose\",\n trivia: trivia,\n selected: this.selected!,\n });\n this.emit(\"gameOver\", result);\n\n const embed = await this.buildEndEmbed(this.options.embed, this.options.endEmbed, result, {\n description: `**${trivia.question}**\\n\\n**Difficulty:** ${trivia.difficulty}\\n**Category:** ${trivia.category}`,\n fields: [\n {\n name: \"Game Over\",\n value:\n result.outcome === \"win\"\n ? this.options.winMessage(result, this)\n : this.options.loseMessage(result, this),\n },\n ],\n });\n\n try {\n await this.editContextOrMessage(message, {\n embeds: [embed],\n components: this.getComponents(true),\n });\n } catch (err) {\n this.emit(\"error\", err);\n }\n }\n\n /**\n * Build the selection buttons.\n */\n getComponents(ended = false) {\n const trivia = this.trivia!;\n const row = new ActionRowBuilder<ButtonBuilder>();\n\n if (ended && this.selected === null) {\n this.selected = trivia.options.indexOf(trivia.answer);\n }\n\n if (this.options.mode === \"multiple\") {\n for (let i = 0; i < 4; i++) {\n row.addComponents(\n new ButtonBuilder()\n .setStyle(ButtonStyle.Secondary)\n .setCustomId(`$gamecord-trivia-${i}`)\n .setLabel(trivia.options[i])\n .setDisabled(ended),\n );\n }\n\n if (this.selected !== null) {\n if (trivia.answer !== trivia.options[this.selected]) {\n row.components[this.selected].setStyle(ButtonStyle.Danger);\n } else {\n row.components[this.selected].setStyle(ButtonStyle.Success);\n }\n }\n } else {\n row.setComponents(\n new ButtonBuilder()\n .setStyle(\n this.selected === 0\n ? trivia.answer === \"True\"\n ? ButtonStyle.Success\n : ButtonStyle.Danger\n : ButtonStyle.Secondary,\n )\n .setCustomId(\"$gamecord-trivia-0\")\n .setLabel(this.options.trueText)\n .setDisabled(ended),\n new ButtonBuilder()\n .setStyle(\n this.selected === 1\n ? trivia.answer === \"False\"\n ? ButtonStyle.Success\n : ButtonStyle.Danger\n : ButtonStyle.Secondary,\n )\n .setCustomId(\"$gamecord-trivia-1\")\n .setLabel(this.options.falseText)\n .setDisabled(ended),\n );\n }\n\n return [row];\n }\n\n private async getTriviaQuestion(): Promise<TriviaData | null> {\n if (this.options.trivia) {\n return await this.options.trivia(this);\n }\n\n const mode = this.options.mode.replace(\"single\", \"boolean\");\n\n let data;\n try {\n const res = await fetch(\n `https://opentdb.com/api.php?amount=1&type=${mode}&difficulty=${this.difficulty}&encode=url3986`,\n );\n const json = await res.json();\n\n if (json.response_code === 5) {\n throw new Error(\"Ratelimited by opentdb\");\n }\n\n data = triviaAPISchema.parse(json);\n data = data.results[0];\n } catch (err) {\n this.emit(\"error\", err);\n return null;\n }\n\n if (!data) {\n return null;\n }\n\n const trivia: TriviaData = {\n question: decodeURIComponent(data.question),\n difficulty: decodeURIComponent(data.difficulty),\n category: decodeURIComponent(data.category),\n answer: decodeURIComponent(data.correct_answer),\n options: [],\n };\n\n if (mode === \"multiple\") {\n data.incorrect_answers.push(data.correct_answer);\n trivia.options = shuffleArray(data.incorrect_answers).map(a => decodeURIComponent(a));\n } else {\n trivia.options = [\"True\", \"False\"];\n }\n\n return trivia;\n }\n}\n","import z from \"zod/v4\";\nimport { createCanvas } from \"@napi-rs/canvas\";\nimport { AttachmentBuilder, Message, MessageCollector } from \"discord.js\";\nimport { Game, GameContext, GameResult } from \"@/core/Game\";\nimport { embedBuilder, resultMessage } from \"@/utils/schemas\";\nimport { colors } from \"@/utils/constants\";\nimport { getRandomElement } from \"@/utils/random\";\nimport words from \"@/data/wordle.json\";\nimport { Embed1, Embed2 } from \"@/utils/types\";\n\n/**\n * The Wordle game result.\n */\nexport interface WordleResult extends GameResult {\n outcome: \"win\" | \"lose\" | \"timeout\";\n /**\n * The word to guess, in lowercase. Either the one specified or a random one.\n */\n word: string;\n guesses: string[];\n}\n\nconst defaultOptions = {\n embed: {\n title: \"Wordle\",\n color: colors.blurple,\n },\n winMessage: (res: WordleResult) => `You won! The word was **${res.word}**.`,\n loseMessage: (res: WordleResult) => `You lost! The word was **${res.word}**.`,\n notOwnedMessage: (game: Wordle) => `Only ${game.player} can use this menu.`,\n timeout: 120_000,\n};\n\nexport interface WordleOptions extends z.input<typeof wordleOptions> {\n embed?: Embed1<Wordle>;\n endEmbed?: Embed2<Wordle, WordleResult>;\n /**\n * The max amount of time the player can be idle.\n */\n timeout?: number;\n /**\n * The word to guess, in lowercase. Either the one specified or a random one.\n */\n word?: string;\n}\n\nexport const wordleOptions = z.object({\n embed: embedBuilder<[Wordle]>().optional().default(defaultOptions.embed),\n endEmbed: embedBuilder<[Wordle, WordleResult]>().optional(),\n winMessage: resultMessage<WordleResult, Wordle>()\n .optional()\n .default(() => defaultOptions.winMessage),\n loseMessage: resultMessage<WordleResult, Wordle>()\n .optional()\n .default(() => defaultOptions.loseMessage),\n timeout: z.number().int().optional().default(defaultOptions.timeout),\n word: z.string().length(5).optional(),\n});\n\n/**\n * A game where the player needs to guess the word.\n *\n * # Permissions\n *\n * The bot needs to be able to read the messages of the current channel.\n *\n * # Custom Display\n *\n * If you are using functions to create the embeds, use `attachment://board.png`\n * in the embed image URL to display the board.\n *\n * # Example\n *\n * ```js\n * const game = new Wordle(interaction, {\n * timeout: 120_000\n * // If you want to use your own words (5 letters):\n * word: \"house\",\n * // Otherwise, it will be random.\n * });\n *\n * game.on(\"error\", err => console.error(err));\n * game.on(\"gameOver\", result => console.log(result));\n *\n * await game.start();\n * ```\n */\nexport class Wordle extends Game<WordleResult> {\n readonly options: z.output<typeof wordleOptions>;\n\n /**\n * The word to guess, in lowercase. Either the one specified or a random one.\n */\n readonly word: string;\n readonly guesses: string[] = [];\n\n message: Message | null = null;\n collector: MessageCollector | null = null;\n\n constructor(context: GameContext, options?: WordleOptions) {\n super(context);\n this.options = wordleOptions.parse(options || {});\n this.word = (this.options.word || getRandomElement(words)).toLowerCase();\n }\n\n override async start() {\n const embed = await this.buildEmbed(this.options.embed, {\n image: { url: \"attachment://board.png\" },\n });\n\n this.message = await this.sendMessage({ embeds: [embed], files: [await this.getBoardAttachment()] });\n const message = this.message;\n if (!message.channel.isSendable()) return;\n\n const collector = message.channel.createMessageCollector({\n idle: this.options.timeout,\n filter: msg => msg.author.id === this.player.id && msg.content.length === 5,\n });\n this.collector = collector;\n\n collector.on(\"collect\", async msg => {\n const guess = msg.content.toLowerCase();\n\n if (msg.deletable) {\n try {\n await msg.delete();\n } catch (err) {\n this.emit(\"error\", err);\n }\n }\n\n this.guesses.push(guess);\n if (this.word === guess || this.guesses.length > 5) return collector.stop(\"$end\");\n\n try {\n await this.editContextOrMessage(message, { embeds: [embed], files: [await this.getBoardAttachment()] });\n } catch (err) {\n this.emit(\"error\", err);\n }\n });\n\n collector.on(\"end\", async (_, reason) => {\n this.emit(\"end\");\n\n if (reason === \"$end\" || reason === \"idle\") {\n await this.gameOver(message, reason === \"idle\");\n }\n });\n }\n\n private async gameOver(message: Message, isTimeout: boolean) {\n const result = this.result({\n outcome: isTimeout ? \"timeout\" : this.guesses.includes(this.word) ? \"win\" : \"lose\",\n word: this.word,\n guesses: this.guesses,\n });\n this.emit(\"gameOver\", result);\n\n const embed = await this.buildEndEmbed(this.options.embed, this.options.endEmbed, result, {\n image: {\n url: \"attachment://board.png\",\n },\n fields: [\n {\n name: \"Game Over\",\n value:\n result.outcome === \"win\"\n ? this.options.winMessage(result, this)\n : this.options.loseMessage(result, this),\n },\n ],\n });\n\n try {\n await this.editContextOrMessage(message, {\n embeds: [embed],\n files: [await this.getBoardAttachment()],\n });\n } catch (err) {\n this.emit(\"error\", err);\n }\n }\n\n private async getBoardAttachment(): Promise<AttachmentBuilder> {\n return new AttachmentBuilder(await this.getBoardImage(), { name: \"board.png\" });\n }\n\n private async getBoardImage(): Promise<Buffer> {\n const rows = 6;\n const cols = 5;\n const tile = 88;\n const gap = 12;\n const padding = 20;\n const width = padding * 2 + cols * tile + (cols - 1) * gap;\n const height = padding * 2 + rows * tile + (rows - 1) * gap;\n\n const canvas = createCanvas(width, height);\n const ctx = canvas.getContext(\"2d\");\n\n // palette\n const PALETTE = {\n green: \"#6aaa64\",\n yellow: \"#c9b458\",\n gray: \"#3a3a3c\",\n empty: \"#121213\",\n border: \"#3a3a3c\",\n bg: \"#121213\",\n textLight: \"#ffffff\",\n };\n\n ctx.fillStyle = PALETTE.bg;\n ctx.fillRect(0, 0, width, height);\n\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n ctx.font = `700 ${Math.floor(tile * 0.54)}px sans-serif`;\n\n /**\n * Score a single guess against the answer producing a color per position.\n * Uses standard Wordle rules (greens first, then yellows with letter counts).\n */\n function scoreGuess(guess: string, answer: string) {\n const res = Array(cols).fill(PALETTE.gray);\n const a = answer.split(\"\");\n const g = guess.split(\"\");\n\n // counts for non-green letters\n const counts: Record<string, number> = {};\n for (let i = 0; i < a.length; i++) counts[a[i]] = (counts[a[i]] || 0) + 1;\n\n // mark greens\n for (let i = 0; i < cols; i++) {\n if (g[i] === a[i]) {\n res[i] = PALETTE.green;\n counts[g[i]] = Math.max(0, counts[g[i]] - 1);\n }\n }\n\n // mark yellows/greys\n for (let i = 0; i < cols; i++) {\n if (res[i] === PALETTE.green) continue;\n const ch = g[i];\n if (counts[ch] && counts[ch] > 0) {\n res[i] = PALETTE.yellow;\n counts[ch]--;\n } else {\n res[i] = PALETTE.gray;\n }\n }\n\n return res;\n }\n\n // draw grid\n for (let r = 0; r < rows; r++) {\n const guess = this.guesses[r];\n const colors = guess\n ? scoreGuess(guess.toLowerCase(), this.word.toLowerCase())\n : Array(cols).fill(PALETTE.empty);\n\n for (let c = 0; c < cols; c++) {\n const x = padding + c * (tile + gap);\n const y = padding + r * (tile + gap);\n\n // tile background\n ctx.fillStyle = colors[c] === PALETTE.empty ? PALETTE.empty : colors[c];\n // slight rounding\n const radius = 8;\n ctx.beginPath();\n ctx.moveTo(x + radius, y);\n ctx.lineTo(x + tile - radius, y);\n ctx.quadraticCurveTo(x + tile, y, x + tile, y + radius);\n ctx.lineTo(x + tile, y + tile - radius);\n ctx.quadraticCurveTo(x + tile, y + tile, x + tile - radius, y + tile);\n ctx.lineTo(x + radius, y + tile);\n ctx.quadraticCurveTo(x, y + tile, x, y + tile - radius);\n ctx.lineTo(x, y + radius);\n ctx.quadraticCurveTo(x, y, x + radius, y);\n ctx.closePath();\n ctx.fill();\n\n // border for empty tiles, subtle for colored\n ctx.lineWidth = 4;\n ctx.strokeStyle = colors[c] === PALETTE.empty ? PALETTE.border : colors[c];\n ctx.stroke();\n\n // letter\n const ch = guess ? (guess[c] || \"\").toUpperCase() : \"\";\n if (ch) {\n ctx.fillStyle = PALETTE.textLight;\n ctx.fillText(ch, x + tile / 2, y + tile / 2 + 2); // slight vertical adjustment\n }\n }\n }\n\n // return PNG buffer\n return canvas.toBuffer(\"image/png\");\n }\n}\n","[\n \"APPLE\",\n \"BEACH\",\n \"CHAIR\",\n \"DREAM\",\n \"EAGLE\",\n \"FIGHT\",\n \"GRADE\",\n \"HEART\",\n \"IDEAS\",\n \"JELLY\",\n \"KNIFE\",\n \"LIGHT\",\n \"MOUSE\",\n \"NOVEL\",\n \"OCEAN\",\n \"PLANT\",\n \"QUICK\",\n \"READY\",\n \"SHEEP\",\n \"TIGER\",\n \"UNION\",\n \"VALUE\",\n \"WHALE\",\n \"YOUNG\",\n \"ZEBRA\",\n \"ABOVE\",\n \"BLANK\",\n \"CRISP\",\n \"DIRTY\",\n \"ERROR\",\n \"FLUID\",\n \"GIANT\",\n \"HAPPY\",\n \"INDEX\",\n \"JOKER\",\n \"KNEEL\",\n \"LEMON\",\n \"MAGIC\",\n \"NIGHT\",\n \"ORDER\",\n \"POWER\",\n \"RIVER\",\n \"SCOPE\",\n \"SNAKE\",\n \"TABLE\",\n \"ULTRA\",\n \"VOICE\",\n \"WATCH\",\n \"YIELD\",\n \"ZONAL\"\n]\n"],"mappings":"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","names":["import_v4","import_discord","assert","z","z","import_v4","import_discord","import_discord","defaultOptions","z","defaultOptions","z","import_v4","defaultOptions","z","import_v4","import_discord","defaultOptions","z","import_v4","import_discord","defaultOptions","z","import_v4","import_discord","defaultOptions","z","import_v4","import_discord","defaultOptions","z","import_v4","import_discord","defaultOptions","z","import_v4","import_discord","z","defaultOptions","import_v4","import_canvas","import_discord","defaultOptions","z","colors"]}
|