From db4d4b3db1ec08f81b7a1f8e1bfbd034be71b38c Mon Sep 17 00:00:00 2001 From: utarwyn Date: Tue, 25 Jan 2022 19:38:32 +0100 Subject: [PATCH] Use allowedMentions to avoid mentions in messages --- src/__tests__/GameBoardBuilder.test.ts | 24 ++++++++++--------- src/bot/entity/DuelRequest.ts | 32 ++++++++++++++------------ src/bot/entity/GameBoardBuilder.ts | 11 +++++---- src/bot/state/GameStateManager.ts | 2 +- src/bot/util.ts | 10 -------- 5 files changed, 38 insertions(+), 41 deletions(-) delete mode 100644 src/bot/util.ts diff --git a/src/__tests__/GameBoardBuilder.test.ts b/src/__tests__/GameBoardBuilder.test.ts index d385a920..3588ae68 100644 --- a/src/__tests__/GameBoardBuilder.test.ts +++ b/src/__tests__/GameBoardBuilder.test.ts @@ -17,15 +17,18 @@ describe('GameBoardBuilder', () => { }); it('should send empty message by default', () => { - expect(builder.toMessageOptions()).toEqual({ content: '', components: [] }); + expect(builder.toMessageOptions()).toEqual({ + allowedMentions: { parse: ['users'] }, + content: '', + components: [] + }); }); it('should compute title based on entity names', () => { builder.withTitle({ id: '1', displayName: 'entity1' }, { id: '2', displayName: 'entity2' }); - expect(builder.toMessageOptions()).toEqual({ - content: ':game_die: `entity1` **VS** `entity2`\n\n', - components: [] - }); + expect(builder.toMessageOptions()).toEqual( + expect.objectContaining({ content: ':game_die: `entity1` **VS** `entity2`\n\n' }) + ); }); it('should compute board using custom emojies', () => { @@ -33,10 +36,9 @@ describe('GameBoardBuilder', () => { .withEmojies(':dog:', ':cat:') .withBoard(2, [Player.First, Player.Second, Player.Second, Player.First]); - expect(builder.toMessageOptions()).toEqual({ - content: ':dog: :cat: \n:cat: :dog: \n', - components: [] - }); + expect(builder.toMessageOptions()).toEqual( + expect.objectContaining({ content: ':dog: :cat: \n:cat: :dog: \n' }) + ); }); it('should add an empty line between board and state if both defined', () => { @@ -51,7 +53,7 @@ describe('GameBoardBuilder', () => { ${{ toString: () => 'fake' }} | ${'fake, select your move:'} `('should set state based if playing entity is $entity', ({ entity, state }) => { builder.withEntityPlaying(entity); - expect(builder.toMessageOptions()).toEqual({ content: state, components: [] }); + expect(builder.toMessageOptions()).toEqual(expect.objectContaining({ content: state })); }); it.each` @@ -60,6 +62,6 @@ describe('GameBoardBuilder', () => { ${{ toString: () => 'fake' }} | ${':tada: fake has won the game!'} `('should set state based if winning entity is $entity', ({ entity, state }) => { builder.withEndingMessage(entity); - expect(builder.toMessageOptions()).toEqual({ content: state, components: [] }); + expect(builder.toMessageOptions()).toEqual(expect.objectContaining({ content: state })); }); }); diff --git a/src/bot/entity/DuelRequest.ts b/src/bot/entity/DuelRequest.ts index a7ac2e7f..1b6bc92e 100644 --- a/src/bot/entity/DuelRequest.ts +++ b/src/bot/entity/DuelRequest.ts @@ -1,12 +1,11 @@ import MessagingTunnel from '@bot/messaging/MessagingTunnel'; import GameStateManager from '@bot/state/GameStateManager'; -import { formatDiscordName } from '@bot/util'; import localize from '@i18n/localize'; import { Collection, GuildMember, Message, - MessageEmbedOptions, + MessageOptions, MessageReaction, Snowflake } from 'discord.js'; @@ -61,23 +60,28 @@ export default class DuelRequest { } /** - * Creates the embed options to send the duel request. + * Creates the message options to send the duel request. * - * @returns embed options object for the duel message + * @returns message options object for the duel request */ - public get embed(): MessageEmbedOptions { + public get content(): MessageOptions { const content = localize.__('duel.challenge', { invited: this.invited.toString(), - initier: formatDiscordName(this.tunnel.author.displayName ?? '') + initier: this.tunnel.author.displayName }) + '\n' + localize.__('duel.action'); return { - color: 2719929, // #2980B9 - title: localize.__('duel.title'), - description: content + allowedMentions: { parse: [] }, + embeds: [ + { + color: 2719929, // #2980B9 + title: localize.__('duel.title'), + description: content + } + ] }; } @@ -119,9 +123,8 @@ export default class DuelRequest { await this.manager.createGame(this.tunnel, this.invited); } else { await this.tunnel.end({ - content: localize.__('duel.reject', { - invited: formatDiscordName(this.invited.displayName) - }) + allowedMentions: { parse: [] }, + content: localize.__('duel.reject', { invited: this.invited.displayName }) }); } } @@ -131,9 +134,8 @@ export default class DuelRequest { */ private async challengeExpired(): Promise { await this.tunnel.end({ - content: localize.__('duel.expire', { - invited: formatDiscordName(this.invited.displayName) - }) + allowedMentions: { parse: [] }, + content: localize.__('duel.expire', { invited: this.invited.displayName }) }); } } diff --git a/src/bot/entity/GameBoardBuilder.ts b/src/bot/entity/GameBoardBuilder.ts index 59a6bb50..dcae347a 100644 --- a/src/bot/entity/GameBoardBuilder.ts +++ b/src/bot/entity/GameBoardBuilder.ts @@ -1,4 +1,3 @@ -import { formatDiscordName } from '@bot/util'; import localize from '@i18n/localize'; import AI from '@tictactoe/AI'; import Entity from '@tictactoe/Entity'; @@ -63,8 +62,8 @@ export default class GameBoardBuilder { withTitle(player1: Entity, player2: Entity): GameBoardBuilder { this.title = localize.__('game.title', { - player1: formatDiscordName(player1.displayName), - player2: formatDiscordName(player2.displayName) + player1: player1.displayName, + player2: player2.displayName }) + '\n\n'; return this; } @@ -145,6 +144,10 @@ export default class GameBoardBuilder { // Generate final string const state = this.state && board ? '\n' + this.state : this.state; - return { content: this.title + board + state, components: [] }; + return { + allowedMentions: { parse: ['users'] }, + content: this.title + board + state, + components: [] + }; } } diff --git a/src/bot/state/GameStateManager.ts b/src/bot/state/GameStateManager.ts index 6eb8346a..11160057 100644 --- a/src/bot/state/GameStateManager.ts +++ b/src/bot/state/GameStateManager.ts @@ -60,7 +60,7 @@ export default class GameStateManager { ); // Reply with the duel request and attach the created message - const message = await tunnel.replyWith({ embeds: [duel.embed] }); + const message = await tunnel.replyWith(duel.content); await duel.attachTo(message); // Setup user cooldown diff --git a/src/bot/util.ts b/src/bot/util.ts deleted file mode 100644 index 5d026986..00000000 --- a/src/bot/util.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { Util } from 'discord.js'; - -/** - * Formats an entity name before displaying it to a message. - * - * @param name name of an entity to be formatted - * @returns formatted name - */ -export const formatDiscordName = (name: string): string => - Util.removeMentions(name.replace(/`/g, ''));