index.js(仅与系统这部分相关的内容。)
const Discord = require('discord.js');
const {GoogleSpreadsheet} = require('google-spreadsheet');
const doc = new GoogleSpreadsheet(process.env.SHEET_TOKEN);
const client = new Discord.Client();
const achieveFiles = fs.readdirSync('./achievements').filter(file => file.endsWith('js'));
// Create the Achievements Table
for(const file of achieveFiles){
const achieve = require(`./achievements/${file}`);
var key = `${file}`;
ach_list[key.slice(0, -3)] = achieve;
}
function checkAllAchievement(ply, list2){
ply.members.cache.forEach(mem => {
if (mem["id"] === "156963320220352512" || mem["id"] === "202932736984481793"){
var allRoles = mem["_roles"]
var keylen = Object.keys(list2).length
for (var i = 0; i < keylen; i++) {
var notFound = false;
var key = Object.keys(list2)[i]
//get all users roles and check against 1 achievement at a time
for (var j = 0; j < allRoles.length; j++){
//Check All Roles Against Achievement Role
if (allRoles[j] == list2[key].roleID){
notFound = true
}
}
if (!notFound) {
list2[key].execute(mem, list2[key].roleID, list2[key].name, list2[key].umbrellans, list2[key].description, doc)
notFound = true
}
};
}
})
setInterval(() => checkAllAchievement(client.guilds.cache.get("the correctnumbershere"), ach_list), 20000)
----------------ReadyPlayerOne.js---------------------
const Discord = require('discord.js');
var interviewRole = '841576000034570280'
async function checkReadyPlayerOne(user, roleID, achievementName, umbrellans, desc, doc){
var unlocked = false
console.log("Running")
const sheet = doc.sheetsByIndex[0];
const rows = await sheet.getRows();
var allRoles = user["_roles"]
// Check all roles for Achievement Role
for (var i = 0; i < allRoles.length; i++){
if (allRoles[i] === roleID){
unlocked = true
}
}
// If Achievement isnt unlocked then check if it should be
if(!unlocked){
for (var i = 0; i < allRoles.length; i++){
if (allRoles[i] === interviewRole){
console.log("GIVING U THE ROLE!")
user.roles.add(roleID)
user.send("**Congratulations!! You unlocked the achievement '" + achievementName + "'** :partying_face:\n**Achievement Description: " + desc + "**\n**You have received " + umbrellans + " Umbrellans for unlocking this achievement!**");
rows.forEach(row => {
if(row.DiscordID === user["id"]){
console.log(user["id"])
row.Currency = (parseInt(row.Currency) + parseInt(umbrellans));
row.save()
}
});
}
}
}
}
module.exports = {
name: 'Ready Player One!',
description: "Receive your Interview Certification.",
roleID: "844544209830412308",
umbrellans: 10,
execute(user, role, name, coin, desc, doc){
checkReadyPlayerOne(user, role, name, coin, desc, doc);
//console.log("CALLED FUNCTION")
}
}
----------------LivingOnAPrayer.js---------------------
const Discord = require('discord.js');
const interviewRole = '841576000034570280'
const boothRole = '841575999186927636'
var hasInt = false;
var hasBooth = false;
async function checkLivingOnAPrayer(user, roleID, achievementName, umbrellans, desc, doc){
var unlocked = false
//console.log("Running")
const sheet = doc.sheetsByIndex[0];
const rows = await sheet.getRows();
var allRoles = user["_roles"]
// Check all roles for Achievement Role
for (var i = 0; i < allRoles.length; i++){
if (allRoles[i] == roleID){
unlocked = true
}
}
// If Achievement isnt unlocked then check if it should be
if(!unlocked){
for (var i = 0; i < allRoles.length; i++){
//console.log(allRoles[i])
if (allRoles[i] == interviewRole){
hasInt = true
}
if (allRoles[i] == boothRole){
console.log(allRoles[i])
hasBooth = true
}
}
//console.log("booth: " + hasBooth + " int: " + hasInt)
if (hasBooth && hasInt){
//console.log("GIVING U THE ROLE!")
user.roles.add(roleID)
user.send("**Congratulations!! You unlocked the achievement '" + achievementName + "'** :partying_face:\n**Achievement Description: " + desc + "**\n**You have received " + umbrellans + " Umbrellans for unlocking this achievement!**");
rows.forEach(row => {
if(row.DiscordID === user["id"]){
//console.log(user["id"])
row.Currency = (parseInt(row.Currency) + parseInt(umbrellans));
row.save()
}
})
hasBooth = false
hasInt = false
}
}
}
module.exports = {
name: 'Living On A Prayer',
description: "Receive your Interview Certification & Booth Certification",
roleID: "844544201563832380",
umbrellans: 10,
execute(user, role, name, coin, desc, doc){
checkLivingOnAPrayer(user, role, name, coin, desc, doc);
//console.log("CALLED FUNCTION")
}
}
当它执行 row.save() 时,它会将其写入谷歌文档。 row.Currency 是文档上的值。在 index.js 中的每次循环迭代中,它不断拉取旧货币而不是新货币。有时它会两者兼而有之,即让货币增加 10 并保存。但大多数情况下,它获取旧值加 10 并保存,然后获取旧值加 10 并再次保存。我希望它获得增值 10 并保存。然后下一次循环获取新值加 10 并保存。