From 4f9184e29d513e67f841b0716e1b6b921447b534 Mon Sep 17 00:00:00 2001 From: Raphael Date: Thu, 31 Jul 2025 23:14:31 +0200 Subject: [PATCH] style(emoji/json): update the emoji to be on a json file --- assets/emoji.json | 15 ++ assets/emoji/loading.gif | Bin 0 -> 31087 bytes src/commands/custom/set.ts | 309 +++++++++++++++++++++++++++++++ src/commands/rank/whitelist.ts | 233 +++++++++++++++++++++++ src/events/client/guildCreate.ts | 53 ++++++ 5 files changed, 610 insertions(+) create mode 100644 assets/emoji.json create mode 100644 assets/emoji/loading.gif create mode 100644 src/commands/custom/set.ts create mode 100644 src/commands/rank/whitelist.ts create mode 100644 src/events/client/guildCreate.ts diff --git a/assets/emoji.json b/assets/emoji.json new file mode 100644 index 0000000..4357a19 --- /dev/null +++ b/assets/emoji.json @@ -0,0 +1,15 @@ +{ + "answer": { + "yes": "", + "no": "", + "error": "", + "loading": "" + }, + "badge": { + "dev": "<:dev:1398755085441564772>", + "enium": "<:enium_staff:1398755055930179586>", + "buyer": "", + "owner": "", + "dash": "<:dash:1398755072317325403>" + } +} diff --git a/assets/emoji/loading.gif b/assets/emoji/loading.gif new file mode 100644 index 0000000000000000000000000000000000000000..946c2ea681325bd3721fe958d48c628423ce6c7a GIT binary patch literal 31087 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 subcommand + .setName('color') + .setDescription('Change the default color for the embed') + .addStringOption(option => + option.setName('color') + .setDescription('The new color by default') + .setRequired(true) + ) + ) + .addSubcommand(subcommand => subcommand + .setName('footer') + .setDescription('Change the default footer for the embed') + .addStringOption(option => + option.setName('text') + .setDescription('The new text by default of the bot') + .setRequired(true) + ) + ) + .addSubcommand(subcommand => subcommand + .setName('pp') + .setDescription('Change the bot profile picture') + .addStringOption(option => + option.setName('link') + .setDescription('The new link to the new profile picture') + .setRequired(true) + ) + ) + .addSubcommand(subcommand => subcommand + .setName('status') + .setDescription('Change the status of the bot') + .addStringOption(option => + option.setName('status') + .setDescription('The new status used by the bot') + .setRequired(true) + ) + .addStringOption(option => + option.setName('presence') + .setDescription('The new presence of the bot') + .setRequired(true) + .addChoices( + { + name: 'Online', + value: 'online' + }, + { + name: 'Do not disturb', + value: 'dnd' + }, + { + name: 'Idle', + value: 'idle' + }, + { + name: 'Invisible', + value: 'invisible' + }, + ) + ) + .addStringOption(option => + option.setName('type') + .setDescription('The type of the new activity') + .setRequired(true) + .addChoices( + { + name: 'Playing', + value: 'play' + }, + { + name: 'Watching', + value: 'watch' + }, + { + name: 'Listening', + value: 'listen' + }, + { + name: 'Competing', + value: 'competing' + }, + { + name: 'Streaming', + value: 'stream' + }, + ) + ) + ), + async execute(interaction: CommandInteraction) { + let guildData: Guild; + try { + guildData = await prisma.guild.findUnique({ + where: { + id: interaction.guild.id + } + }); + } catch (err) { + console.error(`\t⚠️ | INFO => Cannot get the database connection!\n\t\t(${err}).`); + await interaction.reply({ + content: `${emoji.answer.error} | Cannot connect to the database`, + flags: MessageFlags.Ephemeral + }); + return; + } + let userData: User; + try { + userData = await prisma.user.findUnique({ + where: { + id: interaction.user.id + } + }); + } catch (err) { + console.error(`\t⚠️ | Owner => Cannot get the database connection!\n\t\t(${err}).`); + await interaction.reply({ + content: `${emoji.answer.error} | Cannot connect to the database`, + flags: MessageFlags.Ephemeral + }); + return; + } + const subcommand: string = interaction.options.getSubcommand(); + switch (subcommand) { + case 'color': + if (!userData.isOwner) { + await interaction.reply({ + content: `${emoji.answer.no} | This command is only for owner`, + flags: MessageFlags.Ephemeral + }); + return; + } + const newColor: string = interaction.options.getString('color'); + if (!/^#[0-9A-Fa-f]{6}$/.test(newColor)) { + await interaction.reply({ + content: `${emoji.answer.no} | You have to give a color with the syntax: \`#000000\`.`, + flags: MessageFlags.Ephemeral + }); + return; + } + await prisma.guild.upsert({ + where: { + id: interaction.guild.id + }, + update: { + color: newColor + }, + create: { + id: interaction.guild.id, + color: newColor + } + }); + await interaction.reply({ + content: `${emoji.answer.yes} | The default color for embed will be now changed by \`${newColor}\``, + flags: MessageFlags.Ephemeral + }); + return; + case 'footer': + if (!userData.isOwner) { + await interaction.reply({ + content: `${emoji.answer.no} | This command is only for owner`, + flags: MessageFlags.Ephemeral + }); + return; + } + const newFooter: string = interaction.options.getString('text'); + if (newFooter.length > 2048) { + await interaction.reply({ + content: `${emoji.answer.no} | The maximum lenght for the footer is 2048`, + flags: MessageFlags.Ephemeral + }); + return; + } + await prisma.guild.upsert({ + where: { + id: interaction.guild.id + }, + update: { + footer: newFooter + }, + create: { + id: interaction.guild.id, + footer: newFooter + } + }); + await interaction.reply({ + content: `${emoji.answer.yes} | The default footer for embed will be now changed by \`${newFooter}\`.`, + flags: MessageFlags.Ephemeral + }); + return; + case 'pp': + if (!userData.isBuyer) { + await interaction.reply({ + content: `${emoji.answer.no} | This command is only for buyer`, + flags: MessageFlags.Ephemeral + }); + return; + } + const newPicture: string = interaction.options.getString('link'); + try { + interaction.client.user.setAvatar(newPicture); + } catch (err) { + await interaction.reply({ + content: `${emoji.answer.no} | Error during changing the bot profile picture`, + flags: MessageFlags.Ephemeral + }); + } + await interaction.reply({ + content: `${emoji.answer.yes} | The picture profile of the bot is now updated.`, + flags: MessageFlags.Ephemeral + }); + return; + case 'status': + if (!userData.isBuyer) { + await interaction.reply({ + content: `${emoji.answer.no} | This command is only for buyer`, + flags: MessageFlags.Ephemeral + }); + return; + } + const newStatus: string = interaction.options.getString('status'); + const tmpType: string = interaction.options.getString('type'); + let newType: ActivityType; + switch (tmpType) { + case 'play': + newType = ActivityType.Playing; + break; + case 'listen': + newType = ActivityType.Listening; + break; + case 'watch': + newType = ActivityType.Watching; + break; + case 'stream': + newType = ActivityType.Streaming; + break; + case 'competing': + newType = ActivityType.Competing; + break; + } + const tmpPresence: string = interaction.options.getString('presence'); + let newPresence: PresenceUpdateStatus; + switch (tmpPresence) { + case 'online': + newPresence = PresenceUpdateStatus.Online; + break; + case 'idle': + newPresence = PresenceUpdateStatus.Idle; + break; + case 'dnd': + newPresence = PresenceUpdateStatus.DoNotDisturb; + break; + case 'invisible': + newPresence = PresenceUpdateStatus.Invisible; + break; + } + try { + await prisma.bot.upsert({ + where: { + id: 1 + }, + update: { + status: newStatus, + type: tmpType, + presence: newPresence + }, + create: { + id: 1, + status: newStatus, + type: tmpType, + presence: newPresence + } + }); + if (tmpType === 'steam') { + interaction.client.user.setPresence({ + status: newPresence, + activities: [{ + name: newStatus, + type: newType, + url: 'https://twitch.tv/EniumRaphael' + }] + }); + } else { + interaction.client.user.setPresence({ + status: newPresence, + activities: [{ + name: newStatus, + type: newType, + }] + }); + } + } catch (err) { + await interaction.reply({ + content: `${emoji.answer.no} | Cannot change the status\n\n\t${err}`, + flags: MessageFlags.Ephemeral + }); + return; + } + await interaction.reply({ + content: `${emoji.answer.yes} | The new activity is now \`${newStatus}\``, + flags: MessageFlags.Ephemeral + }); + return; + } + } +} diff --git a/src/commands/rank/whitelist.ts b/src/commands/rank/whitelist.ts new file mode 100644 index 0000000..87641f2 --- /dev/null +++ b/src/commands/rank/whitelist.ts @@ -0,0 +1,233 @@ +import { EmbedBuilder, userMention, MessageFlags, SlashCommandBuilder } from 'discord.js'; +import { prisma } from '../../lib/prisma.ts'; +import emoji from '../../../assets/emoji.json' assert { type: "json" }; + +export default { + data: new SlashCommandBuilder() + .setName('whitelist') + .setDescription('Interact with the whitelist') + .addSubcommand(subcommand => subcommand + .setName('add') + .setDescription('Add a user on the whitelist') + .addUserOption(option => + option.setName('target') + .setDescription('The user who will be added to the whitelist') + .setRequired(true) + ) + ) + .addSubcommand(subcommand => subcommand + .setName('delete') + .setDescription('Delete a user on the whitelist') + .addUserOption(option => + option.setName('target') + .setDescription('The user who will be deleted to the whitelist') + .setRequired(true) + ) + ) + .addSubcommand(subcommand => subcommand + .setName('list') + .setDescription('Show the whitelist') + ), + async execute(interaction: CommandInteraction) { + const subcommand = interaction.options.getSubcommand(); + let userData: User; + try { + userData = await prisma.user.findUnique({ + where: { + id: interaction.user.id + } + }); + } catch (err) { + console.error(`\t⚠️ | Whitelist => Cannot get the database connection!\n\t\t(${err}).`); + await interaction.reply({ + content: `${emoji.answer.error} | Cannot connect to the database`, + flags: MessageFlags.Ephemeral + }); + return; + } + let guildData: Guild; + try { + guildData = await prisma.guild.findUnique({ + where: { + id: interaction.guild.id + } + }); + } catch (err) { + console.error(`\t⚠️ | INFO => Cannot get the database connection!\n\t\t(${err}).`); + await interaction.reply({ + content: `${emoji.answer.error} | Cannot connect to the database`, + flags: MessageFlags.Ephemeral + }); + return; + } + const target: GuildMember = interaction.options.getUser('target') + switch (subcommand) { + case 'add': + if (!userData.isOwner) { + await interaction.reply({ + content: `${emoji.answer.no} | This command is only for owner`, + flags: MessageFlags.Ephemeral + }); + return; + } + try { + await prisma.guildUser.upsert({ + where: { + userId_guildId: { + userId: target.id, + guildId: interaction.guild.id + } + }, + update: { + isWlUser: true + }, + create: { + userId: target.id, + guildId: interaction.guild.id, + isWlUser: true + } + }); + await prisma.guild.update({ + where: { + id: interaction.guild.id + }, + data: { + WlUsers: { + connect: { + id: target.id + } + } + } + }); + } catch (err) { + console.error(`⚠️ | Error when adding ${target.username} to the whitelist\n\t${err}`); + await interaction.reply({ + content: `${emoji.answer.error} | Error when adding ${target.username} to the whitelist`, + flags: MessageFlags.Ephemeral + }); + return; + } + await interaction.reply({ + content: `${emoji.answer.yes} | ${target.username} has been added to the whitelist`, + flags: MessageFlags.Ephemeral + }); + return; + case 'delete': + if (!userData.isOwner) { + await interaction.reply({ + content: `${emoji.answer.no} | This command is only for owner`, + flags: MessageFlags.Ephemeral + }); + return; + } else if (interaction.user.id === target.id) { + await interaction.reply({ + content: `${emoji.answer.no} | You cannot removing yourself from the whitelist`, + flags: MessageFlags.Ephemeral + }); + return; + } + try { + await prisma.guildUser.upsert({ + where: { + userId_guildId: { + userId: target.id, + guildId: interaction.guild.id + } + }, + update: { + isWlUser: false + }, + create: { + userId: target.id, + guildId: interaction.guild.id, + isWlUser: false + } + }); + await prisma.guild.update({ + where: { + id: interaction.guild.id + }, + data: { + WlUsers: { + disconnect: { + id: target.id + } + } + } + }); + } catch (err) { + console.error(`⚠️ | Error when removing ${target.username} to the username\n\t${err}`); + await interaction.reply({ + content: `${emoji.answer.error} | Cannot remove ${target.username} from the whitelist`, + flags: MessageFlags.Ephemeral + }); + return; + } + await interaction.reply({ + content: `${emoji.answer.yes} | ${target.username} has been removing to the whitelist`, + flags: MessageFlags.Ephemeral + }); + return; + case 'list': + if (!userData.isOwner) { + await interaction.reply({ + content: `${emoji.answer.no} | This command is only for owner`, + flags: MessageFlags.Ephemeral + }); + return; + } + try { + const guild = await prisma.guild.findUnique({ + where: { + id: interaction.guild.id + }, + include: { + WlUsers: true + } + }); + + if (!guild || guild.WlUsers.length === 0) { + await interaction.reply({ + content: `${emoji.answer.error} | There is no whitelisted user.`, + flags: MessageFlags.Ephemeral + }); + break; + } + + const WlUsers = await Promise.all( + guild.WlUsers.map(async (whitelist) => { + try { + const user = await interaction.client.users.fetch(whitelist.id); + return `- ${user.username} (\`${user.id}\`)\n`; + } catch (err) { + console.warn(`⚠️ | ${whitelist.id} : ${err}`); + return null; + } + }) + ); + + const toSend: EmbedBuilder = new EmbedBuilder() + .setTitle(`🗞️ | Whitelist`) + .setColor(guildData.color) + .setFooter({ + text: guildData.footer + }) + .setDescription(WlUsers.filter(Boolean).join('')) + await interaction.reply({ + embeds: [ + toSend + ], + flags: MessageFlags.Ephemeral + }); + } catch (err) { + console.error(`⚠️ | Whitelist => error when fetching infromation from the database: ${err}`); + await interaction.reply({ + content: `${emoji.answer.error} | Cannot fetch the infromation of the database.`, + flags: MessageFlags.Ephemeral + }); + } + break; + return; + } + } +} diff --git a/src/events/client/guildCreate.ts b/src/events/client/guildCreate.ts new file mode 100644 index 0000000..b54d569 --- /dev/null +++ b/src/events/client/guildCreate.ts @@ -0,0 +1,53 @@ +import { Events, MessageFlags } from 'discord.js' +import { prisma } from '../../lib/prisma.ts'; + +export default { + name: Events.GuildCreate, + async execute(guild, client) { + const botData = await prisma.bot.findUnique({ + where: { id: 1 }, + include: { + buyers: true + } + }); + await prisma.guild.upsert({ + where: { + id: guild.id + }, + update: {}, + create: { + id: guild.id + } + }); + + const members = await guild.members.fetch(); + let i = 0; + for (const [memberId, member] of members) { + await prisma.user.upsert({ + where: { + id: memberId + }, + update: {}, + create: { + id: memberId + } + }); + + await prisma.guildUser.upsert({ + where: { + userId_guildId: { + userId: memberId, + guildId: guild.id + } + }, + update: {}, + create: { + userId: memberId, + guildId: guild.id + } + }); + i++; + } + console.log(`✅ | Guild ${guild.name} synchronisée avec ${members.size} membres.`); + } +}