]> git.puffer.fish Git - matthieu/gru.git/commitdiff
add lovecalc command
authorMatthieuCoder <matthieu@matthieu-dev.xyz>
Wed, 4 Jan 2023 23:45:18 +0000 (03:45 +0400)
committerMatthieuCoder <matthieu@matthieu-dev.xyz>
Wed, 4 Jan 2023 23:45:18 +0000 (03:45 +0400)
src/commands/index.ts
src/commands/loveCalculator.ts [new file with mode: 0644]
src/index.ts
src/sys/handler/index.ts

index 56a879c2534b346d512058c3ec7f11a1b75462d4..79ea03ae9056c8a26e9c2ab0062e0645eb306352 100644 (file)
@@ -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 (file)
index 0000000..3e42dab
--- /dev/null
@@ -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 = <T extends keyof Messages>(
+  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<APIInteractionResponse> => {
+  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();
index 26ffdf5203a4c99db3d870506d515ac6a02b5115..af786e1f989614d7e4754bed038bcc769409bb10 100644 (file)
@@ -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())();
index a832d1221511a3d45f3c4f124b3bec2b22e6870d..1512ab7cff68cce8955903bb06267ae097188845 100644 (file)
@@ -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[],