既に存在するデータに sqlite データを設定しても、設定されません。したがって、ユーザー '9' が存在しない場合、問題なく sqlite テーブルに行が作成されます。データが存在する場合、何もしません。
例: ユーザー '9' に書き込もうとしている
前
{user: '9', timestamp: 10}
END RESULT (実行しようとしたとき):
this._client.setCooldown[this.name].run({user: '9', timestamp: 20})
//this.name = command name
//this.client = discord.js client | setCooldown is an array. the [this.name] represents the command name that i want to cooldown for a certain user
this._client.getCooldown[this.name].get('9')
//doesn't return {user: '9', timestamp: 20} which is expected
//instead returns {user: '9', timestamp: 10} which is the actual result
コンソールにエラーは表示されません。順番に実行される重要なファイルのスニペットを次に示します。
index.js (クライアントの作成と別のファイルの呼び出し用)
var djs = require('discord.js');
var client = new djs.client();
// code
require('./sqlitecreator.js')(client);
// code
sqlitecreator.js (このファイルは基本的に、この質問に関係のない他のいくつかの sqlite ファイルを作成し、別のファイルを読み取るためにコマンド名とそれぞれのディレクトリを含むクライアント コレクションを作成し、クールダウン用のファイルを作成します)
var sqlite3 = require('better-sqlite3');
var CooldownsSqlite = sqlite(`./src/util/essentials/util-cache/Cooldowns.sqlite`)
//verifiednames is an array of names where every string is unique.
//bot is the client from index.js
bot.getCooldown = [];
bot.setCooldown = [];
for(var verifiedname of verifiednames) {
var cooldownsqlitetable = CooldownsSqlite.prepare(`SELECT count(*) FROM sqlite_master WHERE type='table' AND name = '${verifiedname}';`).get();
if (!cooldownsqlitetable['count(*)']) {
console.log('Command Cooldowns Not Prepared!')
CooldownsSqlite.prepare(`CREATE TABLE ${verifiedname} (user TEXT, timestamp INTEGER);`).run();
CooldownsSqlite.prepare(`CREATE UNIQUE INDEX idx_${verifiedname}_user ON ${verifiedname} (user, timestamp);`).run();
CooldownsSqlite.pragma("synchronous = 1");
CooldownsSqlite.pragma("journal_mode = wal");
}
bot.getCooldown[verifiedname] = CooldownsSqlite.prepare(`SELECT * FROM ${verifiedname} WHERE user = ?`);
bot.setCooldown[verifiedname] = CooldownsSqlite.prepare(`INSERT OR REPLACE INTO ${verifiedname} (user, timestamp) VALUES (@user, @timestamp);`);
}
} catch (e) {
console.error(e);
process.exit(1);
}
message.js (クライアントがメッセージ イベントを受信したときに起動し、上記のコレクションからディレクトリを取得し、Command.js (クラス ファイル) から関数を呼び出します)
//file basically checks if message begins with prefix
//...
command.executable(message); // checks if the command can run (checks permissions, uses bot.getCooldown function from the previous file.
if(command.executable(message) !== 'finished') return;
command.throttle(message.author); // is supposed to run the bot.setCooldown function
command.js (このファイルは set/getCooldown 関数を使用します。これもクラス ファイルです)
//occurances of get/setCooldown
executable(...) {
//...
if(this._client.getCooldown[this.name.toLowerCase()].get(msg.author.id)) {
//.. executes another function
}
//..
}
//...
/**
* Cooldown a user.
* @param {Discord.User} user
* @param {Date} now
* @returns {void}
*/
async throttle(user, now = Date.now()) {
if(this._client.getCooldown[this.name.toLowerCase()]) return;
var cd = {user: user.id,timestamp: now} ;
//i thought it was a problem with the setCooldown function running before the object was created, but this didn't work.
await this._client.setCooldown[this.name.toLowerCase()].run(cd);
return;
}
message.js ファイルの間に、取得したクールダウンを console.log() すると、常に同じ値が返されます。