From df3c7da255958303d8fcfa84a505f4f84485e968 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Bersier?= Date: Sun, 28 Jul 2019 23:55:59 +0200 Subject: [PATCH] Add leaderboard --- commands/minigame/guess.js | 213 +++++++++++------- ...20190728145741-create-guess-leaderboard.js | 33 +++ models/guessleaderboard.js | 12 + 3 files changed, 181 insertions(+), 77 deletions(-) create mode 100644 migrations/20190728145741-create-guess-leaderboard.js create mode 100644 models/guessleaderboard.js diff --git a/commands/minigame/guess.js b/commands/minigame/guess.js index 81941be2..489bfdbc 100644 --- a/commands/minigame/guess.js +++ b/commands/minigame/guess.js @@ -1,78 +1,137 @@ -const { Command } = require('discord-akairo'); - -class guessCommand extends Command { - constructor() { - super('guess', { - aliases: ['guess'], - category: 'minigame', - description: { - content: 'Guess the number ( Say "stop" to stop playing )', - usage: '', - examples: [''] - } - }); - } - - async exec(message) { - message.reply('1. Easy ( 0 - 100 )\n2. Medium ( 0 - 1000 )\n3. Hard ( 0 - 10000 )'); - const filter = m => m.content && m.author.id == message.author.id; - message.channel.awaitMessages(filter, {time: 10000, max: 1, errors: ['time'] }) - .then(messages => { - let max; - - if (messages.map(messages => messages.content)[0] == 1) { - max = 100; - } else if (messages.map(messages => messages.content)[0] == 2) { - max = 1000; - } else if (messages.map(messages => messages.content)[0] == 3) { - max = 10000; - } else { - return message.reply('This isin\'t a valid difficulty number! Please try again.'); - } - - let secretnumber = Math.floor((Math.random() * max) + 1); - let numberTry = 0; - console.log(secretnumber); - - message.reply('What is the number?'); - message.channel.awaitMessages(filter, {max: 1}) - .then(input => { - checkNumber(input.map(input => input.content)[0]); - }); - - function tryAgain (input) { - if (input != secretnumber) { - if (input > secretnumber) { - message.reply('Its less!\nWhat is the number?'); - } else if (input < secretnumber) { - message.reply('Its more!\nWhat is the number?'); - } - } - message.channel.awaitMessages(filter, {max: 1}) - .then(input => { - checkNumber(input.map(input => input.content)[0]); - }); - } - - function checkNumber (input) { - numberTry++; - if (input.toLowerCase() == 'stop') { - return message.reply('Ok, let\'s stop playing :('); - } else if (input != secretnumber) { - tryAgain(input); - } else { - if (numberTry > 1) { - return message.reply(`Congratulations! You won! It took you ${numberTry} turns!`); - } else { - return message.reply('Congratulations! You won! It took you 1 Turn!'); - } - } - } - }) - .catch(() => { - return message.reply('Timed out'); - }); - } -} - +const { Command } = require('discord-akairo'); +const guessLeaderboard = require('../../models').guessLeaderboard; +const { MessageEmbed } = require('discord.js'); + +class guessCommand extends Command { + constructor() { + super('guess', { + aliases: ['guess'], + category: 'minigame', + args: [ + { + id: 'leaderboard', + type: 'flag', + match: 'flag', + flag: ['--leaderboard', '--top'] + }, + ], + description: { + content: 'Guess the number ( Say "stop" to stop playing )', + usage: '', + examples: [''] + } + }); + } + + async exec(message, args) { + + /* + * TODO: + * + * Make leaderboard look and work better + * Separate by categories + * + */ + if (args.leaderboard) { + const leaderboard = await guessLeaderboard.findAll({order: ['try']}); + let top = []; + let leaderboardEmbed = new MessageEmbed() + .setColor('#0099ff') + .setTitle('Guess leaderboard'); + for (let i = 0; i < leaderboard.length; i++) { + this.client.users.fetch(leaderboard[i].get('memberID')) + .then(user => { + let body = `**${user.username}**\nTry: ${leaderboard[i].get('try')}`; + top.push(body); + + if (leaderboard[i].get('difficulty') == 'Easy') { + leaderboardEmbed.addField('Easy', body, true); + } else if (leaderboard[i].get('difficulty') == 'Normal') { + leaderboardEmbed.addField('Normal', body, true); + } else if (leaderboard[i].get('difficulty') == 'Hard') { + leaderboardEmbed.addField('Hard', body, true); + } + + if (i + 1 == leaderboard.length) { + return message.channel.send(leaderboardEmbed); + } + }); + } + return; + } + + message.reply('1. Easy ( 0 - 100 )\n2. Normal ( 0 - 1000 )\n3. Hard ( 0 - 10000 )'); + const filter = m => m.content && m.author.id == message.author.id; + message.channel.awaitMessages(filter, {time: 10000, max: 1, errors: ['time'] }) + .then(messages => { + let max; + let difficulty; + + if (messages.map(messages => messages.content)[0] == 1) { + max = 100; + difficulty = 'Easy'; + } else if (messages.map(messages => messages.content)[0] == 2) { + max = 1000; + difficulty = 'Normal'; + } else if (messages.map(messages => messages.content)[0] == 3) { + max = 10000; + difficulty = 'Hard'; + } else { + return message.reply('This isin\'t a valid difficulty number! Please try again.'); + } + + let secretnumber = Math.floor((Math.random() * max) + 1); + let numberTry = 0; + console.log(secretnumber); + + message.reply('What is the number?'); + message.channel.awaitMessages(filter, {max: 1}) + .then(input => { + checkNumber(input.map(input => input.content)[0]); + }); + + function tryAgain (input) { + if (input != secretnumber) { + if (input > secretnumber) { + message.reply('Its less!\nWhat is the number?'); + } else if (input < secretnumber) { + message.reply('Its more!\nWhat is the number?'); + } + } + message.channel.awaitMessages(filter, {max: 1}) + .then(input => { + checkNumber(input.map(input => input.content)[0]); + }); + } + + async function checkNumber (input) { + numberTry++; + if (input.toLowerCase() == 'stop') { + return message.reply('Ok, let\'s stop playing :('); + } else if (input != secretnumber) { + tryAgain(input); + } else { + const leaderboard = await guessLeaderboard.findOne({where: {memberID: message.author.id, difficulty: difficulty}}); + if (!leaderboard) { + const body = {memberID: message.author.id, try: numberTry, difficulty:difficulty}; + await guessLeaderboard.create(body); + } else { + const body = {memberID: message.author.id, try: numberTry, difficulty:difficulty}; + await guessLeaderboard.update(body, {where: {memberID: message.author.id, difficulty: difficulty}}); + } + + if (numberTry > 1) { + return message.reply(`Congratulations! You won! It took you ${numberTry} turns!`); + } else { + return message.reply('Congratulations! You won! It took you 1 Turn!'); + } + } + } + }) + .catch(() => { + return message.reply('Timed out'); + }); + } +} + module.exports = guessCommand; \ No newline at end of file diff --git a/migrations/20190728145741-create-guess-leaderboard.js b/migrations/20190728145741-create-guess-leaderboard.js new file mode 100644 index 00000000..3b086739 --- /dev/null +++ b/migrations/20190728145741-create-guess-leaderboard.js @@ -0,0 +1,33 @@ +'use strict'; +module.exports = { + up: (queryInterface, Sequelize) => { + return queryInterface.createTable('guessLeaderboards', { + id: { + allowNull: false, + autoIncrement: true, + primaryKey: true, + type: Sequelize.INTEGER + }, + memberID: { + type: Sequelize.BIGINT + }, + try: { + type: Sequelize.INTEGER + }, + difficulty: { + type: Sequelize.STRING + }, + createdAt: { + allowNull: false, + type: Sequelize.DATE + }, + updatedAt: { + allowNull: false, + type: Sequelize.DATE + } + }); + }, + down: (queryInterface, Sequelize) => { + return queryInterface.dropTable('guessLeaderboards'); + } +}; \ No newline at end of file diff --git a/models/guessleaderboard.js b/models/guessleaderboard.js new file mode 100644 index 00000000..e15c4331 --- /dev/null +++ b/models/guessleaderboard.js @@ -0,0 +1,12 @@ +'use strict'; +module.exports = (sequelize, DataTypes) => { + const guessLeaderboard = sequelize.define('guessLeaderboard', { + memberID: DataTypes.INTEGER, + try: DataTypes.INTEGER, + difficulty: DataTypes.STRING + }, {}); + guessLeaderboard.associate = function(models) { + // associations can be defined here + }; + return guessLeaderboard; +}; \ No newline at end of file