#javascript #node.js #discord.js
#javascript #node.js #discord.js
Вопрос:
Я пытаюсь создать бот для экономии discord с помощью node.js
и я пытаюсь переместить команды в модули, чтобы у меня был общий / динамический обработчик команд. Как мне ссылаться на коллекцию валют и модели, которые я создал в основном файле в командных модулях?
index.js
файл:
const currency = new Discord.Collection();
//defining methods for the currency collection
Reflect.defineProperty(currency, 'add', {
/* eslint-disable-next-line func-name-matching */
value: async function add(id, amount) {
const user = currency.get(id);
if (user) {
user.balance = Number(amount);
return user.save();
}
const newUser = await Users.create({ user_id: id, balance: amount });
currency.set(id, newUser);
return newUser;
},
});
Reflect.defineProperty(currency, 'getBalance', {
/* eslint-disable-next-line func-name-matching */
value: function getBalance(id) {
const user = currency.get(id);
return user ? user.balance : 0;
},
});
(Во вложенной папке) balance.js
:
module.exports = {
name: 'balance',
description: 'get balance',
execute(message, args) {
const target = message.mentions.users.first() || message.author;
return message.channel.send(`${target.tag} has ${currency.getBalance(target.id)}🍉`);
},
};
Который в настоящее время выдает ошибку в валюте, поскольку она не определена. Однако я не знаю, как ссылаться на коллекцию валют, которую я создал в index.js
, для которой также созданы методы.
Заранее благодарю вас.
Ответ №1:
Для этого вы могли бы прикрепить Collection
к своему Client
. Что-то вроде
Client.currency = new Discord.Collection()
Каждый раз, когда вы затем ссылаетесь на коллекцию, вместо того, чтобы делать, currency
вы бы затем запускали Client.currency
.
Что касается доступа к объекту валюты через файлы, я бы добавил еще один параметр к вашему execute
методу, что-то вроде этого:
module.exports = {
name: 'balance',
description: 'get balance',
execute(client, message, args) { // Notice the added "client"
const target = message.mentions.users.first() || message.author;
return message.channel.send(`${target.tag} has ${client.currency.getBalance(target.id)}🍉`); // Added "client." in front of "currency", because currency is a property of your client now
},
};
Затем, при выполнении execute
метода, вы должны выполнить execute(Client, message, arguments);
. Затем ваш клиент будет передан в команду и будет использоваться там.
Комментарии:
1. Похоже, это не работает. Я попытался добавить
Client.currency = new Discord.Collection()
, и это выдает мне ошибку, указывающую, что клиент не определен. Я подумал, что, возможно, вы хотели добавить ее в существующую клиентскую версию, которая у меня естьconst client = new Discord.Client();
, но затем она выдает мне сообщение об ошибке, в котором говорится, что валюта не определена.2. @fl384 Когда я говорил о
Client
, я, конечно, улучшил ваш экземпляр клиента. Поскольку вы не сказали, как она была названа, я просто использовалClient
в качестве заполнителя.3. Я пробовал это изначально, но теперь понимаю, что неправильно понял ошибку, которую он выдал. Это работает, спасибо!