#javascript #node.js #discord.js
#javascript #node.js #discord.js
Вопрос:
Я работал над проектом для сервера discord моего друга, где я хочу сохранить что-то вроде «базы данных» о наших участниках, например, количество предупреждений (или забастовок), их возраст (потому что у нас были проблемы с несовершеннолетними участниками) и некоторые заметки. Я использую учебные пособия, поскольку я довольно новичок в javascript и действительно новичок в Discord.js так что я пока не совсем уверен в том, что я делаю.
(чтобы уточнить, я не получаю никаких ошибок, он просто не обновляется до нового файла)
Вот ресурсы, которые я использовал:
https://www.youtube.com/watch?v=JB1rWJRafRA
https://discordjs.guide/popular-topics/collectors.html#message-collectors
https://www.youtube.com/watch?v=J2bKyv5pp-M
И мой код: (заранее извините, это действительно грязно)
const Discord = require('discord.js');
const fs = require('fs');
const jsonfile = require('jsonfile');
const Client = new Discord.Client();
var data = {}; //start of member activeness tracker
if (fs.existsSync('data.json')) {
data = jsonfile.readFileSync('data.json');
}
console.log("Bot Starting...");
Client.on("ready", () => console.log('ServerMgr is ready! Now managing servers!')); //bot init complete
Client.on("message", (message) => {
if (message.guild.id in data === false) {data[message.guild.id] = {} } //if new guild
const guildData = data[message.guild.id];
if (message.author.id in guildData === false) {
guildData[message.author.id] = {
username: message.author.username,
message_count: 0,
last_message: 0,
age: 0,
times_left: 0,
strikes: 0,
notes: ""
}
}
const userData = guildData[message.author.id];
userData.message_count
userData.last_message = Date.now();
jsonfile.writeFileSync('data.json', data)
const parts = message.content.split(' ')
if(parts[0] === ';ping') {message.reply('```SeverMgr is online!nCurrent Ping: ' (Math.abs(Date.now() - message.createdTimestamp))/ 100 " ms```")}
if(parts[0] === ';read') {
if (message.mentions.members.first()) {
var user = message.mentions.users.first()
const id = user.id
const userData = guildData[id]
const lastMessage = new Date(userData.last_message)
message.channel.send("Getting data for " user.username "#" user.discriminator "...")
message.channel.send("Sent " userData.message_count " messagesn"
"Last message was sent at: " lastMessage "n"
"Age: " userData.age "n"
"Times user left server: " userData.times_left "n"
"Strikes: " userData.strikes "n"
userData.notes);
} else {
message.reply("You need to mention a user to get their data!");
}
}
if(parts[0] === ';write') {
if (message.mentions.members.first()) {
var user = message.mentions.users.first();
const id = user.id;
const userData = guildData[id];
message.channel.send("What data point do you want to edit? n Accepted responses are: n `message count` n `age` n `times left` n `strikes` n `notes` ")
let filter = m => m.content.includes('message count' || 'age' || 'times left' || 'strikes' || 'notes') amp;amp; !m.author.bot ;
let collector = new Discord.MessageCollector(message.channel, filter);
collector.on('collect', (m,col) => {
var res = "";
let mess = m.content;
console.log(mess);
if (mess == ("message count")) {res = 'message_count' }
if (mess == ("age")) {res = 'age' }
if (mess == ("times left")) {res = 'times_left' }
if (mess == ("strikes")) {res = 'strikes' }
if (mess == ("notes")) {res = 'notes' }
console.log(res);
message.channel.send("Editing " res "n The current value is:");
if (res == "message count") {message.channel.send(userData.message_count) }
if (res == "age") {message.channel.send(userData.age)}
if (res == "times left") {message.channel.send(userData.times_left)}
if (res == "strikes") {message.channel.send(userData.strikes)}
if (res == "notes") {message.channel.send(userData.notes)}
collector.stop();
message.channel.send("The value currently located inside of " res " will be overwritten, so if you want to edit the content directly, copy the message above, and paste it into the send box.");
let filter = m => !m.author.bot;
let collector2 = new Discord.MessageCollector(message.channel, filter);
});
collector2.on('collect', m => {
var mess = m.content;
if (res === "message count") {userData.message_count = mess }
if (res == "age") {userData.age = mess}
if (res == "times left") {userData.times_left = mess}
if (res == "strikes") {userData.strikes = mess}
if (res == "notes") {userData.notes = mess}
message.channel.send("Data saved!");
console.log("Saving " mess);
var guildData = data[message.guild.id];
var userData = guildData[message.author.id];
var pointData = userData[res];
console.log("old data");
console.log(pointData);
pointData = mess;
console.log("new data");
console.log(pointData);
jsonfile.writeFileSync('data.json', data) //HERE IS THE ISSUE
collector2.stop();
});
} else {
message.reply("You need to mention a user to edit their data!");
}
}
});
Client.login('TOKEN');
Данные хранятся как таковые:
'779904676879007744': {
username: 'SeverMgr',
message_count: 129,
last_message: 1606028233445,
age: 0,
times_left: 0,
strikes: 0,
notes: ''
Спасибо за любую помощь!
Комментарии:
1. Можете ли вы указать, какие проблемы у вас возникли с JSON? Есть сообщения об ошибках?
2. О чем говорит ошибка?
3. Я не получил никаких ошибок, это просто не обновление файла.
4. Выполняется ли блок кода? Вы видите консоль? журнал выше?
5. Да, вся консоль. журналы отображаются в журнале.
Ответ №1:
Знак равенства создаст копию вашей переменной. Если вы обновите новую переменную, она не обновит значение предыдущей, поскольку она не является ссылкой.
Пример
var x = 1
var y = x
var y = 2
---
x will still be 1
y will be 2
Итак, в вашем случае вы могли бы сделать это, чтобы обновить переменную данных
data[message.guild.id][message.author.id][res] = mess
Вместо этого, поскольку вы обновляете копии, а не данные напрямую.
var guildData = data[message.guild.id]
var userData = guildData[message.author.id]
var pointData = userData[res]
pointData = mess