From 816a3ef1f42ad01f0ac1b38f03957405b887f7bf Mon Sep 17 00:00:00 2001 From: *x1 Date: Fri, 21 Jun 2024 07:24:57 +0200 Subject: [PATCH 01/11] Update msgCreate --- events/messageCreate.js | 58 +++++++++++++++++++++-------------------- 1 file changed, 30 insertions(+), 28 deletions(-) diff --git a/events/messageCreate.js b/events/messageCreate.js index 72042ec..ffd2e41 100644 --- a/events/messageCreate.js +++ b/events/messageCreate.js @@ -19,38 +19,40 @@ module.exports = { loggerT(error) message.reply("Erreur lors de l'exécution de la commande"); } - } - const user = await new Promise((resolve, reject) => { - db.get(`SELECT * FROM users WHERE guildId = ? AND userId = ?`, [message.guild.id, message.author.id], (err, row) => { - if (err) reject(err); - resolve(row); + } else { + const user = await new Promise((resolve, reject) => { + db.get(`SELECT * FROM users WHERE guildId = ? AND userId = ?`, [message.guild.id, message.author.id], (err, row) => { + if (err) reject(err); + resolve(row); + }); }); - }); - if (user.blacklist == true) { return } - - const prefix = db.get(`SELECT value FROM config WHERE guildId = ? AND name = ?`, [message.guild.id, 'prefix'])?.value || '&'; - if (message.content.startsWith(prefix)) { - const args = message.content.slice(prefix.length).trim().split(/ +/); - const commandName = args.shift()?.toLowerCase(); + if (user.blacklist == true) { return } - const command = client.commands.get(commandName); - if (!command) return; + const prefix = db.get(`SELECT value FROM config WHERE guildId = ? AND name = ?`, [message.guild.id, 'prefix'])?.value || '&'; + if (message.content.startsWith(prefix)) { + const args = message.content.slice(prefix.length).trim().split(/ +/); + const commandName = args.shift()?.toLowerCase(); - const permissionLevel = 1 //await getPermissionLevel(message.member, message.guild); - if ((permissionLevel < command.permission) && (!client.config.owners.includes(message.author.id))) { - return message.reply("Vous n'avez pas la permission d'utiliser cette commande."); + const command = client.commands.get(commandName); + if (!command) return; + + const permissionLevel = 1 //await getPermissionLevel(message.member, message.guild); + if ((permissionLevel < command.permission) && (!client.config.owners.includes(message.author.id))) { + return message.reply("Vous n'avez pas la permission d'utiliser cette commande."); + } + + try { + command.execute(message, args, client); + console.log(`[${prefix}}] ${message.guild.name} | ${message.author.tag} | ${command.name}`.blue) + loggT(`[${prefix}] ${message.guild.name} | ${message.author.tag} | ${command.name}`) + } catch (error) { + console.error(error); + loggE(error) + message.reply("Erreur lors de l'exécution de la commande"); + } } - - try { - command.execute(message, args, client); - console.log(`[${prefix}}] ${message.guild.name} | ${message.author.tag} | ${command.name}`.blue) - loggT(`[${prefix}] ${message.guild.name} | ${message.author.tag} | ${command.name}`) - } catch (error) { - console.error(error); - loggE(error) - message.reply("Erreur lors de l'exécution de la commande"); - } - } else if (message.content === `<@!${client.user.id}>` || message.content === `<@${client.user.id}>`) { + } + if (message.content === `<@!${client.user.id}>` || message.content === `<@${client.user.id}>`) { message.reply(`Mon prefix est \`${prefix}\``); } } From 79cc8088195221b2c6091eef89b075fd8b99cc74 Mon Sep 17 00:00:00 2001 From: *x1 Date: Fri, 21 Jun 2024 07:59:21 +0200 Subject: [PATCH 02/11] Update ready --- events/ready.js | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/events/ready.js b/events/ready.js index 5edac4f..ab23d2b 100644 --- a/events/ready.js +++ b/events/ready.js @@ -7,7 +7,7 @@ module.exports = { name: Events.ClientReady, async execute(client) { console.log(`[READY] ${client.user.tag} est prêt ||| ${client.guilds.cache.size.toLocaleString('fr-FR')} serveurs | ${client.guilds.cache.reduce((acc, guild) => acc + guild.memberCount, 0).toLocaleString('fr-FR')} utilisateurs\n`.green); - loggT(`[READY] ${client.user.tag} est prêt ||| ${client.guilds.cache.size} serveurs | ${client.guilds.cache.reduce((acc, guild) => acc + guild.memberCount, 0)} utilisateurs\n`) + loggT(`[READY] ${client.user.tag} est prêt ||| ${client.guilds.cache.size} serveurs | ${client.guilds.cache.reduce((acc, guild) => acc + guild.memberCount, 0)} utilisateurs\n`); client.user.setPresence({ activities: [{ @@ -60,7 +60,7 @@ module.exports = { }); if (team.location == 0) return - db.run(`UPDATE teams SET bank = bank + ? WHERE guildId = ? AND userId = ?`, [team.location, message.guild.id, message.author.id]); + db.run(`UPDATE teams SET bank = bank + ?`, [team.location]); }, 1 * 60 * 1000) //AntiCrash @@ -68,7 +68,7 @@ module.exports = { if (error.code == "10064") return if (error.code == "10008") return console.log(' [antiCrash] :: Unhandled Rejection/Catch'.red); - console.log(error); + console.log(`${error}`.grey); loggE(error) }); @@ -76,7 +76,7 @@ module.exports = { if (error.code == "10064") return if (error.code == "10008") return console.log(' [antiCrash] :: Uncaught Exception/Catch'.red); - console.log(error); + console.log(`${error}`.grey); console.log('Information supplémentaire:', origin); loggE(error) }); @@ -85,7 +85,7 @@ module.exports = { if (error.code == "10064") return if (error.code == "10008") return console.log(' [antiCrash] :: Uncaught Exception Monitor/Catch'.red); - console.log(error); + console.log(`${error}`.grey); console.log('Information supplémentaire:', origin); loggE(error) }); @@ -95,7 +95,6 @@ module.exports = { if (error.code == "10008") return console.log(' [antiCrash] :: Before Exit'.red); console.log('Code de sortie:', code); - loggE(error) }); process.on('exit', (code) => { @@ -103,7 +102,6 @@ module.exports = { if (error.code == "10008") return console.log(' [antiCrash] :: Exit'.red); console.log('Code de sortie:', code); - loggE(error) }); }, From ef2a368ea2c48e09fc9d8e23a88a6bed754532a6 Mon Sep 17 00:00:00 2001 From: *x1 Date: Fri, 21 Jun 2024 08:16:01 +0200 Subject: [PATCH 03/11] Update top (ajout de top team) --- commands/casino/top.js | 38 ++++++++++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/commands/casino/top.js b/commands/casino/top.js index 23fee6b..ef690c1 100644 --- a/commands/casino/top.js +++ b/commands/casino/top.js @@ -3,10 +3,10 @@ const db = require('../../fonctions/database.js'); const embedColor = require('../../fonctions/embedColor.js'); module.exports = { - aliases: ['leaderboard', 'lb'], - description: 'Affiche le top 10 des membres du serveur.', + aliases: ['leaderboard', 'lb', 'ttop'], + description: 'Affiche le top 10 des membres/teams du serveur.', emote: '🏆', - utilisation: '[global|pocket|bank|reputation|niveau|teamdonnateur]', + utilisation: '[global|pocket|bank|reputation|niveau|team|teamreputation|teamdonnateur]', permission: 0, async execute(message, args, client) { @@ -20,6 +20,10 @@ module.exports = { args[0] = 'reputation' } else if (args[0] === 'niveau' || args[0] === 'lvl' || args[0] === 'level' || args[0] === 'lvl') { args[0] = 'niveau' + } else if (args[0] === 'team' || args[0] === 't') { + args[0] = 'team' + } else if (args[0] === 'teamreputation' || args[0] === 'treputation' || args[0] === 'teamrep' || args[0] === 'trep') { + args[0] = 'team' } else if (args[0] === 'teamdonnateur' || args[0] === ' tdonnateur' || args[0] === 'tdroper' || args[0] === ' tdropper' || args[0] === ' teamdrop' || args[0] === 'tdrop' || args[0] === 'teamdroper' || args[0] === 'teamdropper') { args[0] = 'teamdroper' } else if (!args[0]) { @@ -29,7 +33,7 @@ module.exports = { message.reply({ embeds: [ new EmbedBuilder() .setTitle('Argument invalide') - .setDescription(`Vous pouvez utiliser les arguments suivants: \`coins\`, \`pocket\`, \`bank\`, \`reputation\`, \`niveau\` ou ne rien mettre pour afficher le top 10 des membres du serveur.`) + .setDescription(`Vous pouvez utiliser les arguments suivants: \`coins\`, \`pocket\`, \`bank\`, \`reputation\`, \`niveau\`, \`team\`, \`teamreputation\`, \`teamdonnateur\`, ou ne rien mettre pour afficher le top 10 des membres du serveur.`) .setColor(await embedColor(message.author.id, message.guild.id)) .setTimestamp() .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }) @@ -73,6 +77,20 @@ module.exports = { resolve(rows); }); }); + } else if (type === 'team') { + data = await new Promise((resolve, reject) => { + db.all(`SELECT name, bank AS coins FROM teams WHERE guildId = ? ORDER BY coins DESC LIMIT 10`, [message.guild.id], (err, rows) => { + if (err) reject(err); + resolve(rows); + }); + }); + } else if (type === 'teamreputation') { + data = await new Promise((resolve, reject) => { + db.all(`SELECT name, reputation AS teams FROM users WHERE guildId = ? ORDER BY coins DESC LIMIT 10`, [message.guild.id], (err, rows) => { + if (err) reject(err); + resolve(rows); + }); + }); } else if (type === 'teamdroper') { data = await new Promise((resolve, reject) => { db.all(`SELECT userId, teamdroper AS coins FROM users WHERE guildId = ? ORDER BY coins DESC LIMIT 10`, [message.guild.id], (err, rows) => { @@ -88,6 +106,8 @@ module.exports = { bank: '🏦', reputation: '🔺', niveau: '📊', + team: '👑', + teamreputation: '🔺', teamdroper: '🎁' } @@ -150,6 +170,16 @@ module.exports = { .setEmoji('📊') .setDescription('Affiche le top en fonction du niveau') .setValue('niveau'), + new StringSelectMenuOptionBuilder() + .setLabel('Teams bank') + .setEmoji('👑') + .setDescription('Affiche le top en fonction de l\'argent des teams') + .setValue('team'), + new StringSelectMenuOptionBuilder() + .setLabel('Teams réputation') + .setEmoji('🔺') + .setDescription('Affiche le top en fonction de la réputation des teams') + .setValue('teamreputation'), new StringSelectMenuOptionBuilder() .setLabel('TeamDroper') .setEmoji('🎁') From c4273188157670920fe8bee5eb344e2846f76797 Mon Sep 17 00:00:00 2001 From: *x1 Date: Fri, 21 Jun 2024 08:16:38 +0200 Subject: [PATCH 04/11] Update box --- commands/jeux/box.js | 1 + 1 file changed, 1 insertion(+) diff --git a/commands/jeux/box.js b/commands/jeux/box.js index 664b729..e539868 100644 --- a/commands/jeux/box.js +++ b/commands/jeux/box.js @@ -19,6 +19,7 @@ module.exports = { } }); }); + if (key == 0) return message.reply('Tu n\'as pas de clef, tu ne peux pas ouvrir de box') db.run(`UPDATE users SET key = key - 1 WHERE userId = ? AND guildId = ?`, [message.author.id, message.guild.id]) const embed = new EmbedBuilder() From 6daa6d48a463ec7260b27460fdbe57c696c1762d Mon Sep 17 00:00:00 2001 From: *x1 Date: Fri, 21 Jun 2024 08:17:05 +0200 Subject: [PATCH 05/11] Update me (arondissement pocket et bank) --- commands/casino/me.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/commands/casino/me.js b/commands/casino/me.js index 1d39832..e97f67a 100644 --- a/commands/casino/me.js +++ b/commands/casino/me.js @@ -17,12 +17,12 @@ module.exports = { resolve(row); }); }); - const pocket = user.pocket - const bank = user.bank + const pocket = Math.round(user.pocket) + const bank = Math.round(user.bank) const reputation = user.reputation const niveau = user.lvl const xp = user.xp - const tdrop = user.tdroper + const tdrop = Math.round(user.tdroper) let anti_rob = `` if (user.antiRob + 7200000 > Date.now()) { From b005f91ec517bc671e4c6c08609ac8c6e69ef3e1 Mon Sep 17 00:00:00 2001 From: *x1 Date: Fri, 21 Jun 2024 08:20:25 +0200 Subject: [PATCH 06/11] Add console.log in ready for debugging --- events/ready.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/events/ready.js b/events/ready.js index ab23d2b..43e2cba 100644 --- a/events/ready.js +++ b/events/ready.js @@ -9,6 +9,7 @@ module.exports = { console.log(`[READY] ${client.user.tag} est prêt ||| ${client.guilds.cache.size.toLocaleString('fr-FR')} serveurs | ${client.guilds.cache.reduce((acc, guild) => acc + guild.memberCount, 0).toLocaleString('fr-FR')} utilisateurs\n`.green); loggT(`[READY] ${client.user.tag} est prêt ||| ${client.guilds.cache.size} serveurs | ${client.guilds.cache.reduce((acc, guild) => acc + guild.memberCount, 0)} utilisateurs\n`); + console.log('setPresence : ...') client.user.setPresence({ activities: [{ name: '/azelie', @@ -17,17 +18,21 @@ module.exports = { }], status: 'online' }); + console.log('setPresence : OK') client.guilds.cache.forEach(guild => { + console.log('BD update : ...') db.run(`INSERT OR IGNORE INTO config (guildId, name, value) VALUES (?, ?, ?)`, [guild.id, 'prefix', '&']); guild.members.cache.forEach(member => { db.run(`INSERT OR IGNORE INTO users (guildId, guildName, userId, userName) VALUES (?, ?, ?, ?)`, [guild.id, guild.name, member.id, member.name]); }); + console.log('BD update : OK') }); setInterval(async () => { + console.log('Recompense vocal : ...') client.guilds.cache.forEach(guild => { guild.members.cache.filter(member => member.voice.channel).forEach(member => { if (member.voice.selfMute == true) { @@ -49,9 +54,11 @@ module.exports = { db.run('UPDATE users SET xp = xp + 20 WHERE guildId = ? AND userId = ?', [guild.id, member.id]); }); }); + console.log('Recompense vocal : OK') }, 15 * 60 * 1000); setInterval(async () => { + console.log('Bâtiment : ...') const team = await new Promise((resolve, reject) => { db.get(`SELECT * FROM teams`, (err, row) => { if (err) reject(err); @@ -61,6 +68,7 @@ module.exports = { if (team.location == 0) return db.run(`UPDATE teams SET bank = bank + ?`, [team.location]); + console.log('Bâtiment : OK') }, 1 * 60 * 1000) //AntiCrash From 0e537399c89b412e3caaf68e69cb9f21cd66b373 Mon Sep 17 00:00:00 2001 From: *x1 Date: Fri, 21 Jun 2024 08:36:39 +0200 Subject: [PATCH 07/11] Add pouletFight --- commands/jeux/poulet.js | 134 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 134 insertions(+) create mode 100644 commands/jeux/poulet.js diff --git a/commands/jeux/poulet.js b/commands/jeux/poulet.js new file mode 100644 index 0000000..8f40ff5 --- /dev/null +++ b/commands/jeux/poulet.js @@ -0,0 +1,134 @@ +const { EmbedBuilder, ButtonStyle, ButtonBuilder, ActionRowBuilder } = require('discord.js'); +const embedColor = require('../../fonctions/embedColor.js'); +const db = require('../../fonctions/database.js'); + +module.exports = { + aliases: ['pouletfight', 'pfight', 'poulet'], + description: 'Fait un combat de poulet.', + emote: '🐔', + utilisation: '', + permission: 0, + + async execute(message, args, client) { + let mise = 0 + const pocket = await new Promise((resolve, reject) => { + db.get(`SELECT pocket FROM users WHERE userId = ? AND guildId = ?`, [message.author.id, message.guild.id], (err, row) => { + if (err) { + reject(err); + } else { + resolve(row.pocket); + } + }); + }); + if (args[0] == 'all') { + mise = pocket + } else { + mise = args[0] + } + + if (pocket < mise) { + embedColor(message.author.id, message.guild.id).then(color => { + const embed = new EmbedBuilder() + .setTitle('🐔 Poulet') + .setDescription(`Vous n'avez pas assez d'argent sur vous pour miser cette somme.`) + .setColor(color) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }) + + message.reply({ embeds: [embed], allowedMentions: { repliedUser: false } }) + }); + return + } + + if (isNaN(args[0]) && !args[0] == "all") { + embedColor(message.author.id, message.guild.id).then(color => { + const embed = new EmbedBuilder() + .setTitle('🐔 Poulet') + .setDescription(`La mise doit être un nombre.`) + .setColor(color) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }) + + message.reply({ embeds: [embed], allowedMentions: { repliedUser: false } }) + }); + return + } else if (mise < 25) { + embedColor(message.author.id, message.guild.id).then(color => { + const embed = new EmbedBuilder() + .setTitle('🐔 Poulet') + .setDescription(`La mise doit être supérieure ou égale à \`25\`.`) + .setColor(color) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }) + + message.reply({ embeds: [embed], allowedMentions: { repliedUser: false } }) + }); + return + } + + embedColor(message.author.id, message.guild.id).then(color => { + const embed = new EmbedBuilder() + .setTitle('🐔 Poulet') + //.setImage('') // image de combat de poulet + .setDescription(`Vous avez misé \`${mise}\` sur votre poulet. Les poulets se battent...\nRésultat dans 7.5 secondes...`) + .setColor(color) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }) + + return message.reply({ embeds: [embed], allowedMentions: { repliedUser: false } }) + }); + + await new Promise(resolve => setTimeout(resolve, 7500)); + + const result = Math.floor(Math.random() * 2); + let win = ''; + if (result === 0) { + win = true; + } else { + win = false; + } + + let gain = 0; + if (win == true) { + gain = Math.round(mise * 2); + } else { + gain = 0 - mise; + } + + await new Promise((resolve, reject) => { + db.run(`UPDATE users SET pocket = pocket + ? WHERE userId = ? AND guildId = ?`, [gain, message.author.id, message.guild.id], (err) => { + if (err) { + reject(err); + } else { + resolve(); + } + }); + }); + + if (gain >= 0) { + embedColor(message.author.id, message.guild.id).then(color => { + const embed = new EmbedBuilder() + .setTitle('🐔 Poulet') + .setDescription(`Vous avez misé \`${mise}\` sur votre poulet et votre poulet a gagné ! Vous avez gagné \`${gain}\`coins !`) + .setColor(color) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }) + + message.reply({ embeds: [embed], allowedMentions: { repliedUser: false } }) + }); + return + } else { + embedColor(message.author.id, message.guild.id).then(color => { + const embed = new EmbedBuilder() + .setTitle('🐔 Poulet') + .setDescription(`Vous avez misé \`${mise}\` sur votre poulet et votre poulet a perdu. Vous avez perdu \`${0 - gain}\`coins !`) + .setColor(color) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }) + + message.reply({ embeds: [embed], allowedMentions: { repliedUser: false } }) + }); + return + } + } +}; \ No newline at end of file From 54e3390d81d9936e4e87ca9e06dcd40e1ccb6a1a Mon Sep 17 00:00:00 2001 From: *x1 Date: Fri, 21 Jun 2024 08:40:15 +0200 Subject: [PATCH 08/11] Update a_test.txt --- a_test.txt | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/a_test.txt b/a_test.txt index ca694ec..3199e58 100644 --- a/a_test.txt +++ b/a_test.txt @@ -6,10 +6,9 @@ &awh &blacklistAdd &blacklistRemove -&servers -&sell +?? = &sell &drop -&box +?? = &box &juge &tcadenas &tleave @@ -18,5 +17,4 @@ &tdemote &tpromote &tedit -&tkick -&towner \ No newline at end of file +&tkick \ No newline at end of file From 4ad2b83eaa9dedf4186c3c85c35fa1332b1221fc Mon Sep 17 00:00:00 2001 From: *x1 Date: Fri, 21 Jun 2024 08:43:28 +0200 Subject: [PATCH 09/11] Update logger --- events/ready.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/events/ready.js b/events/ready.js index 43e2cba..e11eb90 100644 --- a/events/ready.js +++ b/events/ready.js @@ -7,7 +7,8 @@ module.exports = { name: Events.ClientReady, async execute(client) { console.log(`[READY] ${client.user.tag} est prêt ||| ${client.guilds.cache.size.toLocaleString('fr-FR')} serveurs | ${client.guilds.cache.reduce((acc, guild) => acc + guild.memberCount, 0).toLocaleString('fr-FR')} utilisateurs\n`.green); - loggT(`[READY] ${client.user.tag} est prêt ||| ${client.guilds.cache.size} serveurs | ${client.guilds.cache.reduce((acc, guild) => acc + guild.memberCount, 0)} utilisateurs\n`); + loggT(`\n\n`) + loggT(`[READY] ${client.user.tag} est prêt ||| ${client.guilds.cache.size} serveurs | ${client.guilds.cache.reduce((acc, guild) => acc + guild.memberCount, 0)} utilisateurs`); console.log('setPresence : ...') client.user.setPresence({ From dfa96ed9f78fed075be82fd14c1a68d3b6d1fbc7 Mon Sep 17 00:00:00 2001 From: *x1 Date: Fri, 21 Jun 2024 08:44:07 +0200 Subject: [PATCH 10/11] Loggs /!\ --- logs/ERROR.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/logs/ERROR.txt b/logs/ERROR.txt index b09261a..712eb71 100644 --- a/logs/ERROR.txt +++ b/logs/ERROR.txt @@ -1,4 +1,3 @@ - [ERROR] || 20/051/2024 =>> 18h 37m 19s 514ms || TypeError: team.forEach is not a function [ERROR] || 20/051/2024 =>> 18h 37m 19s 551ms || TypeError: team.forEach is not a function [ERROR] || 20/051/2024 =>> 18h 37m 19s 628ms || TypeError: team.forEach is not a function From 0cf105625d43ce8551275149ed915893234140d4 Mon Sep 17 00:00:00 2001 From: *x1 Date: Fri, 21 Jun 2024 16:45:26 +0200 Subject: [PATCH 11/11] =?UTF-8?q?Add=20rentaB=C3=A2timent.xlsx?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rentaBâtiment.xlsx | Bin 0 -> 17490 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 rentaBâtiment.xlsx diff --git a/rentaBâtiment.xlsx b/rentaBâtiment.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..36559e63c5ca327a9b6b3a1c3b5e73f88375026e GIT binary patch literal 17490 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 B@~!{? literal 0 HcmV?d00001