Adding A Cooldown To Awarding Points On Sqlite Xp System
I'm looking to improve my points system by only allowing xp to be gained once every 60 seconds. I've tried a few things but none have really come close. The current point awarding
Solution 1:
What springs to mind for me would be to store the timestamp you last gave the user points. Then for each time you want to award the user more points for a new message, check if the current time is more than or equal to 60 seconds later from the last time you assigned the user points.
Take a look at the sample code below and give it a try. It might need tweaking as I'm not really experienced with SQLite but I'll link the resources I used below.
client.on('ready', () => {
// Check if the table "points" exists.const table = sql
.prepare(
"SELECT count(*) FROM sqlite_master WHERE type='table' AND name = 'scores';"
)
.get();
if (!table['count(*)']) {
// create and setup the database correctly.// Includes the new column 'lastAwardedDate'.
sql
.prepare(
'CREATE TABLE scores (id TEXT PRIMARY KEY, user TEXT, guild TEXT, points INTEGER, level INTEGER, lastAwardedDate TEXT);'
)
.run();
// "id" row is always unique and indexed.
sql.prepare('CREATE UNIQUE INDEX idx_scores_id ON scores (id);').run();
sql.pragma('synchronous = 1');
sql.pragma('journal_mode = wal');
}
// get and set the score data.
client.getScore = sql.prepare(
'SELECT * FROM scores WHERE user = ? AND guild = ?'
);
client.setScore = sql.prepare(
'INSERT OR REPLACE INTO scores (id, user, guild, points, level, lastAwardedDate) VALUES (@id, @user, @guild, @points, @level, @lastAwardedDate);'
);
});
// Define a constant value for the delay (in ms).const pointDelay = 60 * 1000;
client.on('message', (message) => {
if (message.author.bot) return;
let score;
if (message.guild) {
score = client.getScore.get(message.author.id, message.guild.id);
if (!score) {
score = {
id: `${message.guild.id}-${message.author.id}`,
user: message.author.id,
guild: message.guild.id,
points: 0,
level: 1,
};
} else {
// Check if the current time minus the last awarded time is less than the delay.if (newDate() - Date.parse(score.lastAwardedDate) < pointDelay) {
return;
}
}
score.points++;
score.lastAwardedDate = newDate().toString();
const curLevel = Math.floor(0.2 * Math.sqrt(score.points));
if (score.level < curLevel) {
score.level++;
client.channels.cache
.get('738662532700700719')
.send(`${message.author} has leveled up to level **${curLevel}**!`);
}
client.setScore.run(score);
}
if (message.content.indexOf(config.prefix) !== 0) return;
const args = message.content
.slice(config.prefix.length)
.trim()
.split(/ +/g);
const command = args.shift().toLowerCase();
});
Sources I used:
Post a Comment for "Adding A Cooldown To Awarding Points On Sqlite Xp System"