diff --git a/.gitignore b/.gitignore index 23ed173..eb95846 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ node_modules/* - +database.sqlite +index.js diff --git a/index.js b/index.js index 042a312..48c8ef0 100644 --- a/index.js +++ b/index.js @@ -9,8 +9,9 @@ const sequelize = new Sequelize({ const format = require('util').format; -var ADMIN_ROLENAME = "admin"; -var MEMBER_CHANNEL_NAME = "members"; +var ADMIN_ROLENAME = "Cadre du Parti"; +var MEMBER_ROLENAME = "Membre du Parti"; +var MEMBER_CHANNEL_NAME = "annonces-au-peuple"; var EVERYONE_CHANNEL_NAME = "general"; client.login('token'); @@ -25,13 +26,13 @@ Partie.init({ max_joueurs: DataTypes.INTEGER }, { sequelize, modelName: 'Partie' }); -/*class Joueur extends Model { } +class Joueur extends Model { } Joueur.init({ discord_id: { type: DataTypes.STRING, primaryKey: true } -}, { sequelize, modelName: 'Joueur' });*/ +}, { sequelize, modelName: 'Joueur' }); class Joueur_Partie extends Model { } Joueur_Partie.init({ @@ -44,6 +45,10 @@ Joueur_Partie.init({ type: DataTypes.BOOLEAN, defaultValue: false }, + membre: { + type: DataTypes.BOOLEAN, + defaultValue: false + }, barbeque: { type: DataTypes.BOOLEAN, defaultValue: false @@ -56,6 +61,9 @@ Joueur_Partie.init({ type: DataTypes.BOOLEAN, defaultValue: false }, + date_inscription: { + type: DataTypes.DATE + }, partie_date_partie: { type: DataTypes.DATE }, @@ -94,8 +102,10 @@ client.on('ready', () => { client.on('message', async function(msg) { if(msg.guild == undefined) return; // Pour que les DM trigger pas les call const admin_role = msg.guild.roles.cache.find(r => (r.name == ADMIN_ROLENAME)); + const member_role = msg.guild.roles.cache.find(r => (r.name == MEMBER_ROLENAME)); const member_channel = msg.guild.channels.cache.find(r => (r.name == MEMBER_CHANNEL_NAME)); - if (msg.content.startsWith('/organiser ') && msg.member.roles.cache.find(r => (r == admin_role))) { + const is_admin = msg.member.roles.cache.find(r => (r == admin_role)); + if (msg.content.startsWith('/organiser ') && is_admin) { const args = msg.content.split(/(\s+)/).filter(e => (e.trim().length > 0)); const parser = /^(\d{2})\/(\d{2})$/; @@ -103,6 +113,7 @@ client.on('message', async function(msg) { const date_fin_exclu = adjust_date(args[2].match(parser)).toISOString(); const nb_joueurs = parseInt(args[3].match(parser)); + const partie = Partie.build({ date_partie: date_de_partie, date_fin_exclu: date_fin_exclu, @@ -122,53 +133,81 @@ Réagissez avec 👍 pour recevoir le formulaire d'inscription! const collector = message.createReactionCollector(v => (true), {}); collector.on('collect', async function(m) { - m.users.cache.forEach(async function(user, _) { - if(user.id == client.user.id) return; - const j = await Joueur.findOrCreate({where: {discord_id: user.id}, default: {discord_id: user.id}}); - var [p, _] = await Joueur_Partie.findOrCreate({ - where: {joueur_discord_id: user.id, partie_date_partie: partie.date_partie}, - default: {joueur_discord_id: user.id, partie_date_partie: partie.date_partie} - }); + try{ + m.users.cache.forEach(async function(user, _) { + const member = await msg.guild.members.fetch(user.id); + console.log(user.id); + const is_member = member.roles.cache.find(r => (r == member_role)); + console.log(user); + if(user.id == client.user.id) return; + const j = await Joueur.findOrCreate({where: {discord_id: user.id}, default: {discord_id: user.id}}); + var [p, _] = await Joueur_Partie.findOrCreate({ + where: {joueur_discord_id: user.id, partie_date_partie: partie.date_partie}, + default: {joueur_discord_id: user.id, partie_date_partie: partie.date_partie} + }); - if(!p.envoi_dm) { - const discord_user = await client.users.fetch(user.id) - const dms = await discord_user.createDM(); - const sent_dm = await dms.send( + if(!p.envoi_dm) { + const discord_user = await client.users.fetch(user.id); + const dms = await discord_user.createDM(); + if(is_member || date_fin_exclu <= new Date()) { + const sent_dm = await dms.send( format(` Pour vous inscrire à la partie du %s, réagissez à ce message avec l'émote appropriée: 🔫: Participe à la partie 🍴: Participe au repas 🥺: Loue une réplique -`, partie.date_partie)); - await p.save(); - await sent_dm.react('🔫'); - await sent_dm.react('🍴'); - await sent_dm.react('🥺'); - const personal_collector = sent_dm.createReactionCollector(v => (true), {}); - - personal_collector.on('collect', async function(m) { - console.log(m._emoji.name); - for(var [user, rest] of m.users.cache) { - if(user != client.user.id) { - - var element = await Joueur_Partie.findOne({where: {joueur_discord_id: user, partie_date_partie: date_de_partie}}); - if(m._emoji.name == '🔫') { - element.participe = true; - console.log(await element.save()); - } else if(m._emoji.name == '🍴') { - element.barbeque = true; - await element.save(); - } else if(m._emoji.name =='🥺') { - element.location = true; - await element.save(); + +⚠️: Ce bot n'as pas encore de fonctionalité pour annuler votre inscription, en cas d'annulation, prévenez @asitiglutama#1025 +`, args[1])); + await p.save(); + await sent_dm.react('🔫'); + await sent_dm.react('🍴'); + await sent_dm.react('🥺'); + const personal_collector = sent_dm.createReactionCollector(v => (true), {}); + + personal_collector.on('collect', async function(m) { + try { + console.log(m._emoji.name); + for(var [user, rest] of m.users.cache) { + if(user != client.user.id) { + var element = await Joueur_Partie.findOne({where: {joueur_discord_id: user, partie_date_partie: date_de_partie}}); + if(m._emoji.name == '🔫') { + const partie = await Partie.findOne({where: {date_partie: date_de_partie}}); + const participants = await Joueur_Partie.count({where: {partie_date_partie: date_de_partie, participe: true}}); + if(participants >= nb_joueurs) { + const sent_dm = await dms.send("Impossible de vous inscrire, la partie est pleine"); + } else { + element.participe = true; + element.date_inscription = new Date(); + await element.save(); + } + + } else if(m._emoji.name == '🍴') { + element.barbeque = true; + await element.save(); + } else if(m._emoji.name =='🥺') { + element.location = true; + await element.save(); + } + } + } + } catch (ex) { + } - } + }); + p.envoi_dm = true; + await p.save(); + } else { + const sent_dm = await dms.send( + format(` +Pour vous inscrire à la partie du %s, vous devez être membre de la NvA ou attendre la fin de l'exclusivité le %s! +`, args[1], args[2])); } - }); - p.envoi_dm = true; - await p.save(); - } - }); + } + }); + } catch(ex) { + console.log(ex); + } }) } else if (msg.content.startsWith('/liste ') && msg.member.roles.cache.find(r => (r == admin_role))) { const args = msg.content.split(/(\s+)/).filter(e => (e.trim().length > 0)); @@ -187,7 +226,7 @@ Pour vous inscrire à la partie du %s, réagissez à ce message avec l'émote ap await dm.send(format("Liste de la partie du %s\ninscrits=%i\nrepas=%i\nloca=%i", args[1], participants, repas, loca)); for(const element of liste) { const inscrit = await client.users.fetch(element.joueur_discord_id); - await dm.send(format(inscrit.username)); + await dm.send(format(inscrit.username)+" "+(inscrit.participe ? "🔫" : "")+(inscrit.barbeque ? "🍴" : "")+(inscrit.location ? "🥺" : "")); } } });