From: MatthieuCoder Date: Wed, 4 Jan 2023 23:45:18 +0000 (+0400) Subject: add lovecalc command X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=3693ebdadd785e99658331eeb195f06461da594c;p=matthieu%2Fgru.git add lovecalc command --- diff --git a/src/commands/index.ts b/src/commands/index.ts index 56a879c..79ea03a 100644 --- a/src/commands/index.ts +++ b/src/commands/index.ts @@ -1,3 +1,4 @@ +import { loveCalculator } from './loveCalculator'; import {ping} from './ping'; -export const commands = [ping]; +export const commands = [ping, loveCalculator]; diff --git a/src/commands/loveCalculator.ts b/src/commands/loveCalculator.ts new file mode 100644 index 0000000..3e42dab --- /dev/null +++ b/src/commands/loveCalculator.ts @@ -0,0 +1,134 @@ +import { + type APIApplicationCommandInteraction, + type APIInteractionResponse, + ApplicationCommandOptionType, + ApplicationCommandType, + InteractionResponseType, + APIUser, + MessageFlags, +} from "discord-api-types/v10"; +import { CommandBuilder, type HandlerFn } from "../sys/handler"; + +type Messages = { + low: []; + high: []; + average: []; + loveMessage: [APIUser, APIUser, number]; + sameUser: []; +}; + +type Locales = { + [K in keyof Messages]: Partial< + Record< + APIApplicationCommandInteraction["locale"] | "_", + (...args: Messages[K]) => string + > + >; +}; + +const locales: Locales = { + low: { + fr: () => "déteste", + _: () => "hates", + }, + average: { + fr: () => "est compatible avec", + _: () => "is compatible with", + }, + high: { + fr: () => "est fou/folle de", + _: () => "is in love with", + }, + + sameUser: { + fr: () => "Vous devez choisir deux utilisateurs distincts", + _: () => "You can't calculate love between the same user!", + }, + + loveMessage: { + fr: (user1: APIUser, user2: APIUser, percentage: number) => + `**${percentage}%**! ${user1.username}#${user1.discriminator} ${resolve( + percentage > 80 ? "high" : percentage <= 35 ? "low" : "average", + "fr" + )} ${user2.username}#${user2.discriminator}`, + _: (user1: APIUser, user2: APIUser, percentage: number) => + `**${percentage}%**! ${user1.username}#${user1.discriminator} ${resolve( + percentage > 80 ? "high" : percentage <= 35 ? "low" : "average", + "_" + )} ${user2.username}#${user2.discriminator}`, + }, +}; + +const resolve = ( + message: T, + locale: APIApplicationCommandInteraction["locale"] | "_", + ...args: Messages[T] +) => + ( + (locales[message][locale] ?? locales[message]._) as ( + ...args: Messages[T] + ) => string + )(...args); + +const handler: HandlerFn = async ({ + data, + locale, +}: APIApplicationCommandInteraction): Promise => { + if ( + data.type === ApplicationCommandType.ChatInput && + data.options[0].name === "user1" && + data.options[0].type === ApplicationCommandOptionType.User && + data.options[1].name === "user2" && + data.options[1].type === ApplicationCommandOptionType.User + ) { + let user1 = data.resolved.users[data.options[0].value]; + let user2 = data.resolved.users[data.options[1].value]; + + if (user1.id === user2.id) { + return { + type: InteractionResponseType.ChannelMessageWithSource, + data: { + flags: MessageFlags.Ephemeral, + content: resolve("sameUser", locale), + }, + }; + } + + let percentage = Math.round(Math.random() * 100); + return { + type: InteractionResponseType.ChannelMessageWithSource, + data: { + content: resolve("loveMessage", locale, user1, user2, percentage), + }, + }; + } +}; + +export const loveCalculator = new CommandBuilder() + .setName("calculate-love") + .handler(handler) + .setDescription("Calcule the love compatibility between two users") + .addUserOption((option) => + option + .setName("user1") + .setDescription("The first user of the couple") + .setDescriptionLocalization("fr", "Le premier membre du couple") + .setNameLocalization("fr", "premier_utilisateur") + .setNameLocalization("en-US", "first_user") + .setRequired(true) + ) + .addUserOption((option) => + option + .setName("user2") + .setDescription("The second user of the couple") + .setDescriptionLocalization("fr", "Le deuxième membre du couple") + .setNameLocalization("fr", "second_utilisateur") + .setNameLocalization("en-US", "second_user") + .setRequired(true) + ) + .setDescriptionLocalizations({ + fr: "Calcule l'amour entre deux membres", + }) + .setNameLocalization("fr", "calculer-compatibilite") + .setDMPermission(false) + .build(); diff --git a/src/index.ts b/src/index.ts index 26ffdf5..af786e1 100644 --- a/src/index.ts +++ b/src/index.ts @@ -23,7 +23,7 @@ const emitter = new Client({ emitter.on('interactionCreate', buildHandler(commands)); // Simple message handler -emitter.on('messageCreate', async (message) => { +emitter.onMessageCreate(async (message) => { if (message.content === '~ping') { await message.client.channels.createMessage(message.channel_id, { content: `Bonjour! <@${message.author.id}>`, @@ -36,9 +36,5 @@ emitter.on('messageCreate', async (message) => { } }); -emitter.onMessageCreate(async (message) => { - console.log(message.content); -}); - // We connect ourselves to the nova nats broker. (async () => emitter.start())(); diff --git a/src/sys/handler/index.ts b/src/sys/handler/index.ts index a832d12..1512ab7 100644 --- a/src/sys/handler/index.ts +++ b/src/sys/handler/index.ts @@ -35,7 +35,7 @@ export const registerCommands = async ( rest: REST, appId: string, ) => { - await rest.post(Routes.applicationCommands(appId), { + await rest.put(Routes.applicationCommands(appId), { body: [...commands].map( (x) => x.json, ) as RESTPostAPIApplicationCommandsJSONBody[],