UNPKG

leveling-discord

Version:
57 lines (52 loc) 2.32 kB
const events = require('events') const sqlite3 = require('sqlite3').verbose() const sqlite3Promise = require('./sqlite3Promise.js') const randomXP = require('./randomXP.js') class Talker { constructor(guildID) { this.talkerID = []; this.guildID = guildID; } } class LevelingSystem { constructor(db, options = {cooldown: 60, xpmin: 10, xpmax: 20, lvlupXp: 500}) { this.event = new events.EventEmitter(); this.db = new sqlite3.Database(db, sqlite3.OPEN_READWRITE | sqlite3.OPEN_CREATE, (err) => {if (err) throw err}) this.talkedRecently = []; this.options = options; this.event.on('message', async (msg) => { if (!this.talkedRecently.find(g => g.guildID === msg.guild.id)) { let talkerGuild = new Talker(msg.guild.id); this.talkedRecently.push(talkerGuild); } let talker = this.talkedRecently.find(g => g.guildID === msg.guild.id).talkerID; if (talker.some(id => id === msg.author.id)) return; let xp = randomXP(this.options.xpmin, this.options.xpmax); let point = xp, level = 0; try { await sqlite3Promise.Run(this.db, `CREATE TABLE IF NOT EXISTS ? (id VARCHAR(30) PRIMARY KEY, point INTEGER NULL, level INTEGER NULL)`, [msg.guild.id]); let row = await sqlite3Promise.Get(this.db, `SELECT * FROM ? WHERE id = ?`, [msg.guild.id, msg.author.id]); if (row != null) { point += row.point; level = (point >= this.options.lvlupXp) ? Math.floor(point/this.options.lvlupXp) : 0; } await sqlite3Promise.Run(this.db, `INSERT INTO ? (id, point, level) VALUES (?, ?, ?) ON CONFLICT(id) DO UPDATE SET point = ?, level = ?`, [msg.guild.id, msg.author.id, point, level, point, level]); } catch (err) { return console.log(err); } this.talkedRecently.find(g => g.guildID === msg.guild.id).talkerID.push(msg.author.id); setTimeout(() => { this.talkedRecently.find(g => g.guildID === msg.guild.id).talkerID = this.talkedRecently.find(g => g.guildID === msg.guild.id).talkerID.filter(id => id !== msg.author.id); }, 1000*this.options.cooldown); }) } Get(guildID, userID) { return new Promise(async (resolve, reject) => { sqlite3Promise.Get(this.db, `SELECT * FROM ? WHERE id = ?`, [guildID, userID]).then(row => { return resolve(row); }).catch(err => { return reject(err) }) }) } } module.exports = LevelingSystem;