From eb44a5196949350f6f470c12736f307b5488987f Mon Sep 17 00:00:00 2001 From: utarwyn Date: Mon, 20 Jun 2022 21:15:10 +0200 Subject: [PATCH] GH-192: Add option to disable buttons after use --- config/config.example.json | 3 ++- src/__tests__/GameBoardBuilder.test.ts | 2 +- src/__tests__/GameBoardButtonBuilder.test.ts | 14 ++++++++++++- .../{entity => builder}/GameBoardBuilder.ts | 0 .../GameBoardButtonBuilder.ts | 21 ++++++++++++++++++- src/bot/entity/GameBoard.ts | 11 ++++++++-- src/config/ConfigProvider.ts | 1 + src/config/GameConfig.ts | 4 ++++ 8 files changed, 50 insertions(+), 6 deletions(-) rename src/bot/{entity => builder}/GameBoardBuilder.ts (100%) rename src/bot/{entity => builder}/GameBoardButtonBuilder.ts (83%) diff --git a/config/config.example.json b/config/config.example.json index 2b237557..ff3f8b29 100644 --- a/config/config.example.json +++ b/config/config.example.json @@ -13,5 +13,6 @@ "gameExpireTime": 30, "gameBoardReactions": false, "gameBoardDelete": false, - "gameBoardEmojies": [] + "gameBoardEmojies": [], + "gameBoardDisableButtons": false } diff --git a/src/__tests__/GameBoardBuilder.test.ts b/src/__tests__/GameBoardBuilder.test.ts index 3588ae68..d3b394c1 100644 --- a/src/__tests__/GameBoardBuilder.test.ts +++ b/src/__tests__/GameBoardBuilder.test.ts @@ -1,4 +1,4 @@ -import GameBoardBuilder from '@bot/entity/GameBoardBuilder'; +import GameBoardBuilder from '@bot/builder/GameBoardBuilder'; import localize from '@i18n/localize'; import AI from '@tictactoe/AI'; import { Player } from '@tictactoe/Player'; diff --git a/src/__tests__/GameBoardButtonBuilder.test.ts b/src/__tests__/GameBoardButtonBuilder.test.ts index 25aaa1e1..f5fc5294 100644 --- a/src/__tests__/GameBoardButtonBuilder.test.ts +++ b/src/__tests__/GameBoardButtonBuilder.test.ts @@ -1,4 +1,4 @@ -import GameBoardButtonBuilder from '@bot/entity/GameBoardButtonBuilder'; +import GameBoardButtonBuilder from '@bot/builder/GameBoardButtonBuilder'; import localize from '@i18n/localize'; import AI from '@tictactoe/AI'; import { Player } from '@tictactoe/Player'; @@ -56,4 +56,16 @@ describe('GameBoardButtonBuilder', () => { builder.withEntityPlaying(entity); expect(builder.toMessageOptions()).toEqual({ content: state, components: [] }); }); + + it('should compute board using disabled buttons after been used', () => { + const options = builder + .withButtonsDisabledAfterUse() + .withBoard(2, [Player.First, Player.Second, Player.None, Player.None]) + .toMessageOptions(); + + expect((options.components![0].components[0] as MessageButton).disabled).toBeTruthy(); + expect((options.components![0].components[1] as MessageButton).disabled).toBeTruthy(); + expect((options.components![1].components[0] as MessageButton).disabled).toBeFalsy(); + expect((options.components![1].components[1] as MessageButton).disabled).toBeFalsy(); + }); }); diff --git a/src/bot/entity/GameBoardBuilder.ts b/src/bot/builder/GameBoardBuilder.ts similarity index 100% rename from src/bot/entity/GameBoardBuilder.ts rename to src/bot/builder/GameBoardBuilder.ts diff --git a/src/bot/entity/GameBoardButtonBuilder.ts b/src/bot/builder/GameBoardButtonBuilder.ts similarity index 83% rename from src/bot/entity/GameBoardButtonBuilder.ts rename to src/bot/builder/GameBoardButtonBuilder.ts index d5e82998..3e3a5ae8 100644 --- a/src/bot/entity/GameBoardButtonBuilder.ts +++ b/src/bot/builder/GameBoardButtonBuilder.ts @@ -1,4 +1,4 @@ -import GameBoardBuilder from '@bot/entity/GameBoardBuilder'; +import GameBoardBuilder from '@bot/builder/GameBoardBuilder'; import Entity from '@tictactoe/Entity'; import { Player } from '@tictactoe/Player'; import { @@ -31,6 +31,21 @@ export default class GameBoardButtonBuilder extends GameBoardBuilder { * @private */ private customEmojies = false; + /** + * Should disable buttons after been used. + * @private + */ + private disableButtonsAfterUsed = false; + + /** + * Should disable buttons after been used. + * + * @returns same instance + */ + public withButtonsDisabledAfterUse(): GameBoardBuilder { + this.disableButtonsAfterUsed = true; + return this; + } /** * @inheritdoc @@ -87,6 +102,10 @@ export default class GameBoardButtonBuilder extends GameBoardBuilder { } else { button.setLabel(this.buttonLabels[buttonData - 1]); } + + if (this.disableButtonsAfterUsed) { + button.setDisabled(true); + } } else { button.setLabel(' '); } diff --git a/src/bot/entity/GameBoard.ts b/src/bot/entity/GameBoard.ts index 0bcf13e1..e333d4ce 100644 --- a/src/bot/entity/GameBoard.ts +++ b/src/bot/entity/GameBoard.ts @@ -1,5 +1,5 @@ -import GameBoardBuilder from '@bot/entity/GameBoardBuilder'; -import GameBoardButtonBuilder from '@bot/entity/GameBoardButtonBuilder'; +import GameBoardBuilder from '@bot/builder/GameBoardBuilder'; +import GameBoardButtonBuilder from '@bot/builder/GameBoardButtonBuilder'; import MessagingTunnel from '@bot/messaging/MessagingTunnel'; import GameStateManager from '@bot/state/GameStateManager'; import GameConfig from '@config/GameConfig'; @@ -107,6 +107,13 @@ export default class GameBoard { builder.withEmojies(emojies[0], emojies[1]); } + if ( + this.configuration.gameBoardDisableButtons && + builder instanceof GameBoardButtonBuilder + ) { + builder.withButtonsDisabledAfterUse(); + } + return builder.toMessageOptions(); } diff --git a/src/config/ConfigProvider.ts b/src/config/ConfigProvider.ts index 456f1ed6..08fda85d 100644 --- a/src/config/ConfigProvider.ts +++ b/src/config/ConfigProvider.ts @@ -27,6 +27,7 @@ export default class ConfigProvider implements Config { public gameBoardReactions = false; public gameBoardDelete = false; public gameBoardEmojies = []; + public gameBoardDisableButtons = false; [key: string]: any; diff --git a/src/config/GameConfig.ts b/src/config/GameConfig.ts index 6817933c..cf3996d4 100644 --- a/src/config/GameConfig.ts +++ b/src/config/GameConfig.ts @@ -21,4 +21,8 @@ export default interface GameConfig { * List of emojies used to identify players. */ gameBoardEmojies?: string[]; + /** + * Should disable buttons after been used. + */ + gameBoardDisableButtons?: boolean; }