From 43a83acdc683fcbc73a74b477bd920105e60f80a Mon Sep 17 00:00:00 2001 From: BastLast Date: Thu, 29 Feb 2024 23:31:37 +0100 Subject: [PATCH] various fixes language command #2273 small fixes language command #2273 more fixes language command #2273 more fixes language command #2273 fix codacy --- Core/src/commands/admin/LanguageCommand.ts | 13 ------- Core/src/core/constants/ServersConstants.ts | 5 --- .../core/database/game/migrations/019-v5.ts | 4 +-- Core/src/core/database/game/models/Server.ts | 4 +-- Discord/src/commands/CommandsManager.ts | 24 ++++++------- .../commands/SlashCommandBuilderGenerator.ts | 27 +++++++------- Discord/src/commands/admin/LanguageCommand.ts | 35 ++++++++++--------- Discord/src/commands/player/HelpCommand.ts | 6 ++-- Discord/src/messages/DraftBotErrorEmbed.ts | 1 - Discord/src/messages/DraftbotInteraction.ts | 13 +++---- .../handlers/CommandHandlers.ts | 2 +- Discord/src/translations/i18n.ts | 4 +-- Lang/en/discordBuilder.json | 4 --- Lib/src/Language.ts | 18 ++++++++++ Lib/src/constants/StringConstants.ts | 21 ----------- Lib/src/keycloak/KeycloakUtils.ts | 34 ++++++++++-------- Lib/src/utils/TimeUtils.ts | 7 ++-- 17 files changed, 99 insertions(+), 123 deletions(-) delete mode 100644 Core/src/commands/admin/LanguageCommand.ts delete mode 100644 Core/src/core/constants/ServersConstants.ts diff --git a/Core/src/commands/admin/LanguageCommand.ts b/Core/src/commands/admin/LanguageCommand.ts deleted file mode 100644 index 303c7ce8ea..0000000000 --- a/Core/src/commands/admin/LanguageCommand.ts +++ /dev/null @@ -1,13 +0,0 @@ -import {packetHandler} from "../../core/packetHandlers/PacketHandler"; -import {CommandUpdatePacketReq, CommandUpdatePacketRes} from "../../../../Lib/src/packets/commands/CommandUpdatePacket"; -import {WebsocketClient} from "../../../../Lib/src/instances/WebsocketClient"; -import {DraftBotPacket, makePacket, PacketContext} from "../../../../Lib/src/packets/DraftBotPacket"; - -export default class LanguageCommand { - @packetHandler(CommandUpdatePacketReq) - execute(client: WebsocketClient, packet: CommandUpdatePacketReq, context: PacketContext, response: DraftBotPacket[]): void { - response.push(makePacket(CommandUpdatePacketRes, { - coreVersion: process.env.npm_package_version - })); - } -} \ No newline at end of file diff --git a/Core/src/core/constants/ServersConstants.ts b/Core/src/core/constants/ServersConstants.ts deleted file mode 100644 index fb97fce332..0000000000 --- a/Core/src/core/constants/ServersConstants.ts +++ /dev/null @@ -1,5 +0,0 @@ -import {StringConstants} from "../../../../Lib/src/constants/StringConstants"; - -export abstract class ServersConstants { - static readonly DEFAULT_LANGUAGE = StringConstants.LANGUAGE.ENGLISH; -} \ No newline at end of file diff --git a/Core/src/core/database/game/migrations/019-v5.ts b/Core/src/core/database/game/migrations/019-v5.ts index 25d4b0d46a..ed07a51cff 100644 --- a/Core/src/core/database/game/migrations/019-v5.ts +++ b/Core/src/core/database/game/migrations/019-v5.ts @@ -8,7 +8,7 @@ import {readFileSync} from "fs"; import {KeycloakUtils} from "../../../../../../Lib/src/keycloak/KeycloakUtils"; import {KeycloakConfig} from "../../../../../../Lib/src/keycloak/KeycloakConfig"; import {logsV5NewIds} from "../../logs/migrations/006-v5"; -import {StringConstants} from "../../../../../../Lib/src/constants/StringConstants"; +import {LANGUAGE} from "../../../../../../Lib/src/Language"; export async function up({context}: { context: QueryInterface }): Promise { const configPath = `${process.cwd()}/config/keycloak.toml`; @@ -29,7 +29,7 @@ clientSecret = "secret" for (let i = 0; i < players.length; ++i) { const player = players[i]; - const user = await KeycloakUtils.getOrRegisterDiscordUser(config.keycloak, player.discordUserId as string, player.discordUserId as string, StringConstants.LANGUAGE.ENGLISH); + const user = await KeycloakUtils.getOrRegisterDiscordUser(config.keycloak, player.discordUserId as string, player.discordUserId as string, LANGUAGE.ENGLISH); await context.sequelize.query(`UPDATE players SET discordUserId = "${user.id}" WHERE discordUserId = "${player.discordUserId}"`); logsV5NewIds.set(player.discordUserId as string, user.id); } diff --git a/Core/src/core/database/game/models/Server.ts b/Core/src/core/database/game/models/Server.ts index 05ee3b9f15..d1ea1cb52c 100644 --- a/Core/src/core/database/game/models/Server.ts +++ b/Core/src/core/database/game/models/Server.ts @@ -1,5 +1,5 @@ import {DataTypes, Model, Sequelize} from "sequelize"; -import {ServersConstants} from "../../../constants/ServersConstants"; +import {LANGUAGE} from "../../../../../../Lib/src/Language"; import moment = require("moment"); export class Server extends Model { @@ -33,7 +33,7 @@ export function initModel(sequelize: Sequelize): void { }, language: { type: DataTypes.STRING(2), // eslint-disable-line new-cap - defaultValue: ServersConstants.DEFAULT_LANGUAGE + defaultValue: LANGUAGE.DEFAULT_LANGUAGE }, discordGuildId: { type: DataTypes.STRING(64) // eslint-disable-line new-cap diff --git a/Discord/src/commands/CommandsManager.ts b/Discord/src/commands/CommandsManager.ts index e7e8f648de..10385927fb 100644 --- a/Discord/src/commands/CommandsManager.ts +++ b/Discord/src/commands/CommandsManager.ts @@ -32,7 +32,7 @@ import {DiscordWebSocket} from "../bot/Websocket"; import {PacketContext} from "../../../Lib/src/packets/DraftBotPacket"; import {DiscordCache} from "../bot/DiscordCache"; import {BotUtils} from "../utils/BotUtils"; -import { StringConstants } from "../../../Lib/src/constants/StringConstants"; +import {LANGUAGE} from "../../../Lib/src/Language"; export class CommandsManager { static commands = new Map(); @@ -217,16 +217,16 @@ export class CommandsManager { message.channel.send({ content: ` ${i18n.t("bot:mentionHelp", { - lang: StringConstants.LANGUAGE.ENGLISH, - commandHelp: BotUtils.commandsMentions.get("help"), - commandLanguage: BotUtils.commandsMentions.get("language") - })} + lang: LANGUAGE.ENGLISH, + commandHelp: BotUtils.commandsMentions.get("help"), + commandLanguage: BotUtils.commandsMentions.get("language") + })} ${i18n.t("bot:mentionHelp", { - lang: StringConstants.LANGUAGE.FRENCH, - commandHelp: BotUtils.commandsMentions.get("help"), - commandLanguage: BotUtils.commandsMentions.get("language") - })}` + lang: LANGUAGE.FRENCH, + commandHelp: BotUtils.commandsMentions.get("help"), + commandLanguage: BotUtils.commandsMentions.get("language") + })}` }).then(); }); } @@ -302,7 +302,7 @@ ${i18n.t("bot:mentionHelp", { attachmentList.push(new AttachmentBuilder(Buffer.from(message.content)).setName(`userMessage-${message.author.id}-${message.id}.txt`)); } const supportAlert = i18n.t("bot:supportAlert", { - lang: StringConstants.LANGUAGE.FRENCH, + lang: LANGUAGE.FRENCH, username: escapeUsername(message.author.username), id: message.author.id }) + (message.content.length > Constants.DM.MAX_MESSAGE_LENGTH_ALLOWED @@ -336,7 +336,7 @@ ${i18n.t("bot:mentionHelp", { if (!msg!.getFirstReaction()) { return; } - const language = msg!.getFirstReaction()!.emoji.name === Constants.REACTIONS.ENGLISH_FLAG ? StringConstants.LANGUAGE.ENGLISH : StringConstants.LANGUAGE.FRENCH; + const language = msg!.getFirstReaction()!.emoji.name === Constants.REACTIONS.ENGLISH_FLAG ? LANGUAGE.ENGLISH : LANGUAGE.FRENCH; message.channel.send({ embeds: [new DraftBotEmbed() .formatAuthor(i18n.t("bot:dmHelpMessageTitle", { @@ -354,7 +354,7 @@ ${i18n.t("bot:mentionHelp", { .formatAuthor(Constants.DM.TITLE_SUPPORT, author) .setDescription(message instanceof DraftbotInteraction ? Constants.DM.INTERACTION_SUPPORT : Constants.DM.MESSAGE_SUPPORT); const draftbotChannel = message.channel as unknown as DraftbotChannel; - draftbotChannel.language = StringConstants.LANGUAGE.ENGLISH; + draftbotChannel.language = LANGUAGE.ENGLISH; message instanceof Message ? await helpMessage.send(draftbotChannel) : await helpMessage.reply(message); } diff --git a/Discord/src/commands/SlashCommandBuilderGenerator.ts b/Discord/src/commands/SlashCommandBuilderGenerator.ts index cb7549872f..ec3af8f413 100644 --- a/Discord/src/commands/SlashCommandBuilderGenerator.ts +++ b/Discord/src/commands/SlashCommandBuilderGenerator.ts @@ -3,10 +3,9 @@ */ import {ApplicationCommandOptionBase, SlashCommandBuilder} from "@discordjs/builders"; import i18n from "../translations/i18n"; -import {Constants} from "../Constants"; import {SlashCommandStringOption} from "discord.js"; import {TopConstants} from "../../../Lib/src/constants/TopConstants"; -import { StringConstants } from "../../../Lib/src/constants/StringConstants"; +import {LANGUAGE} from "../../../Lib/src/Language"; export class SlashCommandBuilderGenerator { @@ -17,13 +16,13 @@ export class SlashCommandBuilderGenerator { */ static generateBaseCommand(commandSectionName: string): SlashCommandBuilder { return new SlashCommandBuilder() - .setName(i18n.t(`discordBuilder:${commandSectionName}.name`, { lng: StringConstants.LANGUAGE.ENGLISH })) + .setName(i18n.t(`discordBuilder:${commandSectionName}.name`, {lng: LANGUAGE.ENGLISH})) .setNameLocalizations({ - fr: i18n.t(`discordBuilder:${commandSectionName}.name`, { lng: StringConstants.LANGUAGE.FRENCH }) + fr: i18n.t(`discordBuilder:${commandSectionName}.name`, {lng: LANGUAGE.FRENCH}) }) - .setDescription(i18n.t(`discordBuilder:${commandSectionName}.description`, { lng: StringConstants.LANGUAGE.ENGLISH })) + .setDescription(i18n.t(`discordBuilder:${commandSectionName}.description`, {lng: LANGUAGE.ENGLISH})) .setDescriptionLocalizations({ - fr: i18n.t(`discordBuilder:${commandSectionName}.description`, { lng: StringConstants.LANGUAGE.FRENCH }) + fr: i18n.t(`discordBuilder:${commandSectionName}.description`, {lng: LANGUAGE.FRENCH}) }); } @@ -34,13 +33,13 @@ export class SlashCommandBuilderGenerator { * @param option Option to populate */ static generateOption(commandSectionName: string, optionSectionName: string, option: T): T { - return option.setName(i18n.t(`discordBuilder:${commandSectionName}.options.${optionSectionName}.name`, { lng: StringConstants.LANGUAGE.ENGLISH })) + return option.setName(i18n.t(`discordBuilder:${commandSectionName}.options.${optionSectionName}.name`, {lng: LANGUAGE.ENGLISH})) .setNameLocalizations({ - fr: i18n.t(`discordBuilder:${commandSectionName}.options.${optionSectionName}.name`, { lng: StringConstants.LANGUAGE.FRENCH }) + fr: i18n.t(`discordBuilder:${commandSectionName}.options.${optionSectionName}.name`, {lng: LANGUAGE.FRENCH}) }) - .setDescription(i18n.t(`discordBuilder:${commandSectionName}.options.${optionSectionName}.description`, { lng: StringConstants.LANGUAGE.ENGLISH })) + .setDescription(i18n.t(`discordBuilder:${commandSectionName}.options.${optionSectionName}.description`, {lng: LANGUAGE.ENGLISH})) .setDescriptionLocalizations({ - fr: i18n.t(`discordBuilder:${commandSectionName}.options.${optionSectionName}.description`, { lng: StringConstants.LANGUAGE.FRENCH }) + fr: i18n.t(`discordBuilder:${commandSectionName}.options.${optionSectionName}.description`, {lng: LANGUAGE.FRENCH}) }); } @@ -58,16 +57,16 @@ export class SlashCommandBuilderGenerator { return SlashCommandBuilderGenerator.generateOption(commandSectionName, optionSectionName, option) .addChoices( { - name: i18n.t("discordBuilder:scopes.global", { lng: StringConstants.LANGUAGE.ENGLISH }), + name: i18n.t("discordBuilder:scopes.global", {lng: LANGUAGE.ENGLISH}), "name_localizations": { - fr: i18n.t("discordBuilder:scopes.global", { lng: StringConstants.LANGUAGE.FRENCH }) + fr: i18n.t("discordBuilder:scopes.global", {lng: LANGUAGE.FRENCH}) }, value: TopConstants.GLOBAL_SCOPE }, { - name: i18n.t("discordBuilder:scopes.server", { lng: StringConstants.LANGUAGE.ENGLISH }), + name: i18n.t("discordBuilder:scopes.server", {lng: LANGUAGE.ENGLISH}), "name_localizations": { - fr: i18n.t("discordBuilder:scopes.server", { lng: StringConstants.LANGUAGE.FRENCH }) + fr: i18n.t("discordBuilder:scopes.server", {lng: LANGUAGE.FRENCH}) } , value: TopConstants.SERVER_SCOPE diff --git a/Discord/src/commands/admin/LanguageCommand.ts b/Discord/src/commands/admin/LanguageCommand.ts index 4d2aa5f5e4..c82c50a76d 100644 --- a/Discord/src/commands/admin/LanguageCommand.ts +++ b/Discord/src/commands/admin/LanguageCommand.ts @@ -9,34 +9,34 @@ import { import {DraftbotInteraction} from "../../messages/DraftbotInteraction"; import i18n from "../../translations/i18n"; import {DraftBotEmbed} from "../../messages/DraftBotEmbed"; -import {StringConstants} from "../../../../Lib/src/constants/StringConstants"; -import {PermissionsConstants} from "../../constants/PermissionsConstants"; import {KeycloakUser} from "../../../../Lib/src/keycloak/KeycloakUser"; import {KeycloakUtils} from "../../../../Lib/src/keycloak/KeycloakUtils"; import {keycloakConfig} from "../../bot/DraftBotShard"; import {Constants} from "../../Constants"; import {sendInteractionNotForYou} from "../../utils/ErrorUtils"; -import {Language} from "../../../../Lib/src/Language"; +import {LANGUAGE, Language} from "../../../../Lib/src/Language"; /** - * Allow an admin to change the prefix the bot uses in a specific server + * Change the language used by the bot to interact with the player */ async function getPacket(interaction: DraftbotInteraction, keycloakUser: KeycloakUser): Promise { const selectLanguageMenuId = "languageSelectionMenu"; - const selectLanguageMenuOptions = Object.keys(StringConstants.LANGUAGE) - .map((key) => { - const languageCode = StringConstants.LANGUAGE[key as keyof typeof StringConstants.LANGUAGE]; - return new StringSelectMenuOptionBuilder() - .setLabel(i18n.t(`commands:language.languages.${languageCode}.name`, {lng: interaction.userLanguage})) - .setEmoji(i18n.t(`commands:language.languages.${languageCode}.emoji`, {lng: interaction.userLanguage})) - .setValue(languageCode); - }); + + const selectLanguageMenuOptions = LANGUAGE.LANGUAGES + .map((languageCode) => new StringSelectMenuOptionBuilder() + .setLabel(i18n.t(`commands:language.languages.${languageCode}.name`, {lng: interaction.userLanguage})) + .setEmoji(i18n.t(`commands:language.languages.${languageCode}.emoji`, {lng: interaction.userLanguage})) + .setValue(languageCode) + ); + const languageSelectionMenu = new StringSelectMenuBuilder() .setCustomId(selectLanguageMenuId) .setPlaceholder(i18n.t("commands:language.selectLanguage", {lng: interaction.userLanguage})) .addOptions(selectLanguageMenuOptions); + const row = new ActionRowBuilder() .addComponents(languageSelectionMenu); + const msg = await interaction.reply({ embeds: [new DraftBotEmbed() .setTitle(i18n.t("commands:language.title", { @@ -54,18 +54,21 @@ async function getPacket(interaction: DraftbotInteraction, keycloakUser: Keycloa }); collector.on("collect", async (menuInteraction: StringSelectMenuInteraction) => { + if (menuInteraction.user.id !== interaction.user.id) { await sendInteractionNotForYou(menuInteraction.user, menuInteraction, interaction.userLanguage); return; } + await KeycloakUtils.updateUserLanguage(keycloakConfig, keycloakUser, menuInteraction.values[0] as Language); + await menuInteraction.reply({ embeds: [new DraftBotEmbed() .setTitle(i18n.t("commands:language.newLanguageSetTitle", { - lng: menuInteraction.values[0] as Language + lng: menuInteraction.values[0] as Language })) .setDescription(i18n.t("commands:language.newLanguageSetDescription", { - lng: menuInteraction.values[0] as Language + lng: menuInteraction.values[0] as Language }))] }) }); @@ -75,8 +78,6 @@ async function getPacket(interaction: DraftbotInteraction, keycloakUser: Keycloa export const commandInfo: ICommand = { slashCommandBuilder: SlashCommandBuilderGenerator.generateBaseCommand("language"), getPacket, - requirements: { - userPermission: PermissionsConstants.ROLES.USER.ADMINISTRATOR - }, + requirements: {}, mainGuildCommand: false }; diff --git a/Discord/src/commands/player/HelpCommand.ts b/Discord/src/commands/player/HelpCommand.ts index 7f3a135223..a529d2de3d 100644 --- a/Discord/src/commands/player/HelpCommand.ts +++ b/Discord/src/commands/player/HelpCommand.ts @@ -5,11 +5,9 @@ import {SlashCommandBuilderGenerator} from "../SlashCommandBuilderGenerator"; import {DraftBotEmbed} from "../../messages/DraftBotEmbed"; import {SlashCommandBuilder} from "@discordjs/builders"; import {BotUtils} from "../../utils/BotUtils"; -import {Language} from "../../../../Lib/src/Language"; +import {LANGUAGE, Language} from "../../../../Lib/src/Language"; import {PetConstants} from "../../../../Lib/src/constants/PetConstants"; import {HelpConstants} from "../../constants/HelpConstants"; -import {Constants} from "../../Constants"; -import { StringConstants } from "../../../../Lib/src/constants/StringConstants"; /** * Get the list of commands mention from the command data @@ -183,7 +181,7 @@ function generateReplacementObjectForHelpCommand(interaction: DraftbotInteractio */ async function getPacket(interaction: DraftbotInteraction): Promise { const helpMessage = new DraftBotEmbed(); - const command = interaction.options.get(i18n.t("discordBuilder:help.options.commandName.name", {lng: StringConstants.LANGUAGE.ENGLISH})); + const command = interaction.options.get(i18n.t("discordBuilder:help.options.commandName.name", {lng: LANGUAGE.ENGLISH})); const askedCommand = command ? command.value as string : null; if (!askedCommand) { generateGenericHelpMessage(helpMessage, interaction); diff --git a/Discord/src/messages/DraftBotErrorEmbed.ts b/Discord/src/messages/DraftBotErrorEmbed.ts index 1a62ec1e38..3f45e4cbe0 100644 --- a/Discord/src/messages/DraftBotErrorEmbed.ts +++ b/Discord/src/messages/DraftBotErrorEmbed.ts @@ -2,7 +2,6 @@ import {DraftBotEmbed} from "./DraftBotEmbed"; import {User} from "discord.js"; import {DraftbotInteraction} from "./DraftbotInteraction"; import i18n from "../translations/i18n"; -import {Language} from "../../../Lib/src/Language"; /** * Default error embed with the title and description formatted. If you just want the red color, see {@link DraftBotEmbed#setErrorColor} diff --git a/Discord/src/messages/DraftbotInteraction.ts b/Discord/src/messages/DraftbotInteraction.ts index 498bef1e83..8ded678327 100644 --- a/Discord/src/messages/DraftbotInteraction.ts +++ b/Discord/src/messages/DraftbotInteraction.ts @@ -2,15 +2,16 @@ import { BaseGuildTextChannel, Client, CommandInteraction, - GuildTextBasedChannel, InteractionEditReplyOptions, + GuildTextBasedChannel, + InteractionEditReplyOptions, InteractionReplyOptions, Message, - MessageCreateOptions, MessagePayload + MessageCreateOptions, + MessagePayload } from "discord.js"; import {RawInteractionData, RawWebhookData} from "discord.js/typings/rawDataTypes"; import i18n from "../translations/i18n"; -import {Language} from "../../../Lib/src/Language"; -import { StringConstants } from "../../../Lib/src/constants/StringConstants"; +import {LANGUAGE, Language} from "../../../Lib/src/Language"; type DraftbotInteractionWithoutSendCommands = new(client: Client, data: RawInteractionData) => Omit; const DraftbotInteractionWithoutSendCommands: DraftbotInteractionWithoutSendCommands = CommandInteraction as unknown as DraftbotInteractionWithoutSendCommands; @@ -27,7 +28,7 @@ export class DraftbotInteraction extends DraftbotInteractionWithoutSendCommands // @ts-ignore private _channel: DraftbotChannel; - public userLanguage: Language = StringConstants.DEFAULT_LANGUAGE; + public userLanguage: Language = LANGUAGE.DEFAULT_LANGUAGE; private _replyEdited = false; @@ -102,7 +103,7 @@ export class DraftbotInteraction extends DraftbotInteractionWithoutSendCommands * @private */ private async manageFallback(functionPrototype: ReplyFunctionLike): Promise { - const errorText = i18n.t("bot:noSpeakPermission", { lang: this.channel.language }); + const errorText = i18n.t("bot:noSpeakPermission", {lang: this.channel.language}); try { // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore diff --git a/Discord/src/packetHandlers/handlers/CommandHandlers.ts b/Discord/src/packetHandlers/handlers/CommandHandlers.ts index 5704119f9d..74fc5b387b 100644 --- a/Discord/src/packetHandlers/handlers/CommandHandlers.ts +++ b/Discord/src/packetHandlers/handlers/CommandHandlers.ts @@ -53,6 +53,6 @@ export default class CommandHandlers { @packetHandler(CommandRarityPacketRes) async rarityRes(socket: WebSocket, packet: CommandRarityPacketRes, context: PacketContext): Promise { - handleCommandRarityPacketRes(packet, context).then(); + await handleCommandRarityPacketRes(packet, context); } } \ No newline at end of file diff --git a/Discord/src/translations/i18n.ts b/Discord/src/translations/i18n.ts index 303c2d10fc..aff9360c64 100644 --- a/Discord/src/translations/i18n.ts +++ b/Discord/src/translations/i18n.ts @@ -41,12 +41,12 @@ import * as deEvents from "../../../Lang/de/events.json"; import * as esEvents from "../../../Lang/es/events.json"; import * as ptEvents from "../../../Lang/pt/events.json"; import * as itEvents from "../../../Lang/it/events.json"; -import {StringConstants} from "../../../Lib/src/constants/StringConstants"; +import {LANGUAGE} from "../../../Lib/src/Language"; // Todo load automatically modules i18next.init({ - fallbackLng: StringConstants.DEFAULT_LANGUAGE, + fallbackLng: LANGUAGE.DEFAULT_LANGUAGE, resources: { en: { bot: enBot, diff --git a/Lang/en/discordBuilder.json b/Lang/en/discordBuilder.json index f34345ccaa..63fe67efb2 100644 --- a/Lang/en/discordBuilder.json +++ b/Lang/en/discordBuilder.json @@ -3,10 +3,6 @@ "description": "Displays information about badges.", "name": "badges" }, - "vote": { - "description": "Displays the link to vote for the bot.", - "name": "vote" - }, "idea": { "description": "Share with us your idea to improve the game.", "name": "idea" diff --git a/Lib/src/Language.ts b/Lib/src/Language.ts index c9ed496783..87c8bcdfc5 100644 --- a/Lib/src/Language.ts +++ b/Lib/src/Language.ts @@ -1 +1,19 @@ export type Language = "fr" | "en" | "it" | "es" | "de" | "pt"; + +export class LANGUAGE { + static readonly FRENCH: Language = "fr"; + static readonly ENGLISH: Language = "en"; + static readonly ITALIAN: Language = "it"; + static readonly SPANISH: Language = "es"; + static readonly PORTUGUESE: Language = "pt"; + static readonly GERMAN: Language = "de"; + static get LANGUAGES(): Language[] { + return Object.values(LANGUAGE); + } + static get DEFAULT_LANGUAGE(): Language { + return LANGUAGE.ENGLISH; + } +} + + + diff --git a/Lib/src/constants/StringConstants.ts b/Lib/src/constants/StringConstants.ts index 89fd0fe7eb..6e3b093b99 100644 --- a/Lib/src/constants/StringConstants.ts +++ b/Lib/src/constants/StringConstants.ts @@ -1,25 +1,4 @@ -import {Language} from "../Language"; - export class StringConstants { static readonly PROGRESS_BAR_SIZE = 20; - static readonly LANGUAGE: { - FRENCH: Language, - ENGLISH: Language, - ITALIAN: Language, - SPANISH: Language, - PORTUGUESE: Language, - GERMAN: Language - } - = { - FRENCH: "fr", - ENGLISH: "en", - ITALIAN: "it", - SPANISH: "es", - PORTUGUESE: "pt", - GERMAN: "de" - }; - - static readonly DEFAULT_LANGUAGE: Language = StringConstants.LANGUAGE.ENGLISH - } \ No newline at end of file diff --git a/Lib/src/keycloak/KeycloakUtils.ts b/Lib/src/keycloak/KeycloakUtils.ts index 34d79b7a26..bb5d6f963b 100644 --- a/Lib/src/keycloak/KeycloakUtils.ts +++ b/Lib/src/keycloak/KeycloakUtils.ts @@ -159,13 +159,7 @@ export class KeycloakUtils { public static async getOrRegisterDiscordUser(keycloakConfig: KeycloakConfig, discordId: string, gameUsername: string, language: string): Promise { await this.checkAndQueryToken(keycloakConfig); - const res = await fetch(`${keycloakConfig.url}/admin/realms/${keycloakConfig.realm}/users?q=discordId:${discordId}`, { - method: "GET", - headers: { - "Authorization": `Bearer ${this.keycloakToken}`, - "Content-Type": "application/json" - } - }); + const res = await this.getUserFromDiscordId(keycloakConfig, discordId); if (!res.ok) { throw new Error(`Keycloak retrieve user with attribute 'discordId:${discordId}', error: '${JSON.stringify(await res.json())}'`); @@ -189,6 +183,22 @@ export class KeycloakUtils { return user; } + /** + * Send a get request to keycloak to retrieve a user from it's discordId + * @param keycloakConfig + * @param discordId + * @private + */ + private static async getUserFromDiscordId(keycloakConfig: KeycloakConfig, discordId: string) : Promise { + return await fetch(`${keycloakConfig.url}/admin/realms/${keycloakConfig.realm}/users?q=discordId:${discordId}`, { + method: "GET", + headers: { + "Authorization": `Bearer ${this.keycloakToken}`, + "Content-Type": "application/json" + } + }); + } + public static async getKeycloakIdFromDiscordId(keycloakConfig: KeycloakConfig, discordId: string, gameUsername: string | null): Promise { const cachedId = KeycloakUtils.keycloakDiscordToIdMap.get(discordId); if (cachedId) { @@ -197,13 +207,7 @@ export class KeycloakUtils { await this.checkAndQueryToken(keycloakConfig); - const res = await fetch(`${keycloakConfig.url}/admin/realms/${keycloakConfig.realm}/users?q=discordId:${discordId}`, { - method: "GET", - headers: { - "Authorization": `Bearer ${this.keycloakToken}`, - "Content-Type": "application/json" - } - }); + const res = await this.getUserFromDiscordId(keycloakConfig, discordId); if (!res.ok) { throw new Error(`Keycloak retrieve user with attribute 'discordId:${discordId}', error: '${JSON.stringify(await res.json())}'`); @@ -239,7 +243,7 @@ export class KeycloakUtils { "Content-Type": "application/json" }, body: JSON.stringify({ - attributes: attributes + attributes }) }); diff --git a/Lib/src/utils/TimeUtils.ts b/Lib/src/utils/TimeUtils.ts index 847adff371..588e724072 100644 --- a/Lib/src/utils/TimeUtils.ts +++ b/Lib/src/utils/TimeUtils.ts @@ -1,5 +1,4 @@ - -import {StringConstants} from "../constants/StringConstants"; +import {LANGUAGE} from "../Language"; /** * Get the elements to display a remaining time in the given language @@ -12,7 +11,7 @@ function getMinutesDisplayStringConstants(language: string): { hoursDisplay: str secondsDisplay: "s", linkWord: " ", plural: "" - } : language === StringConstants.LANGUAGE.FRENCH ? { + } : language === LANGUAGE.FRENCH ? { hoursDisplay: "heure", minutesDisplay: "minute", secondsDisplay: "seconde", @@ -207,7 +206,7 @@ export function parseTimeDifferenceFooter(date1: number, date2: number, language let parsed = ""; const days = Math.floor(seconds / (24 * 60 * 60)); if (days > 0) { - parsed += days + (language === StringConstants.LANGUAGE.FRENCH ? " J " : " D "); + parsed += days + (language === LANGUAGE.FRENCH ? " J " : " D "); seconds -= days * 24 * 60 * 60; }