summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/commands/index.ts3
-rw-r--r--src/commands/loveCalculator.ts134
-rw-r--r--src/index.ts6
-rw-r--r--src/sys/handler/index.ts2
4 files changed, 138 insertions, 7 deletions
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 = <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();
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[],