为了账号安全,请及时绑定邮箱和手机立即绑定

在 SQLite xp 系统上为奖励积分添加冷却时间

在 SQLite xp 系统上为奖励积分添加冷却时间

鸿蒙传说 2023-03-03 09:59:36
我希望通过只允许每 60 秒获得一次 xp 来改进我的积分系统。我尝试了一些东西,但没有一个真正接近。当前的积分奖励代码是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.  sql   .prepare(    'CREATE TABLE scores (id TEXT PRIMARY KEY, user TEXT, guild TEXT, points INTEGER, level INTEGER);'   )   .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) VALUES (@id, @user, @guild, @points, @level);' );});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,   };  }  score.points++;  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();});
查看完整描述

1 回答

?
慕沐林林

TA贡献2016条经验 获得超9个赞

我想到的是存储您上次给用户积分的时间戳。然后,每次你想为新消息奖励用户更多积分时,检查当前时间是否比你上次分配用户积分晚了 60 秒以上。


看看下面的示例代码并试一试。它可能需要调整,因为我对 SQLite 没有真正的经验,但我将链接我在下面使用的资源。


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 (new Date() - Date.parse(score.lastAwardedDate) < pointDelay) {

    return;

   }

  }

  score.points++;

  score.lastAwardedDate = new Date().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();

});


查看完整回答
反对 回复 2023-03-03
  • 1 回答
  • 0 关注
  • 87 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信