Я ищу способ изменить текстовую строку или значение в одной команде, введя новое значение в другой команде. Например, у меня есть Discord js v12, и я использую команды модуля, причем каждая команда находится в своем собственном файле .js.
module.exports = {
name: 'calc',
cooldown: 1000,
run: async(client, message, args) => {
if (!message.member.hasPermission("ADMINISTRATOR")) return await message.delete();
await message.delete();
var multiply = args[0] * (100 - percalc) / 100;
var calculation = multiply.toFixed(2);
if (!args[0]) return await message.channel.send('Specify a Value');
await message.channel.send(changableValue);
await message.channel.send(calculation < 5 ? 5 : calculation);
}
И у меня есть константы в файле конфигурации, например
const percalc = 50;
const changableValue = 'Text example';
Прямо сейчас команда _calc {number} производит расчет в процентах на основе percalc const и текста, который идет с ним в части changableValue. Я хотел бы создать команду, скажем, _calcset {Value}, которая сохранит предоставленное значение и отправит его вместо changableValue const.
Прежде всего, обратите внимание, что единственная причина, по которой существует ключевое слово const, заключается в том, что оно означает constant, а константные переменные никогда не могут быть изменены после инициализации. Поэтому убедитесь, что вы изменили ключевое слово объявления переменной на просто var или let.
Теперь, если вы хотите, чтобы переменная изменялась только за сеанс, и вас устраивает возвращение к тому, что вы определили, как при закрытии бота, вы можете просто обновить переменную, используя функции, экспортированные из файла js. Но чтобы получить динамическую переменную, вам также потребуется использовать функцию получения, которую вы также экспортируете. Пример:
Config.js
var changeableValue = "foo";
function getValue() {
return changeableValue;
}
function updateValue(newValue) {
changeableValue = newValue;
}
module.exports = {
getValue,
updateValue
}
Команда.js
const { getValue, updateValue } = require("config.js");
console.info(getValue()); // logs "foo"
updateValue("bar");
console.info(getValue()); // logs "bar"
К сожалению, как я уже упоминал, переменная changeableValue будет сбрасываться обратно на «foo» каждый раз, когда вы отключаете бота. Если с вами все в порядке, то все вышеперечисленное работает нормально.
Если вы хотите сохранить переменную changeableValue через сеансы, это становится немного сложнее. Два наиболее вероятных варианта: либо записать значение в файл JSON с помощью модуля fs (так оно будет сохранено на диск), либо сохранить значение в какой-либо другой базе данных, например MongoDB. Я бы порекомендовал использовать другого поставщика базы данных, потому что есть больше проблем, с которыми вы можете столкнуться при записи на свой собственный диск, например, если вы делаете два запроса на запись одновременно (например, если два пользователя используют команду одновременно), вы можете повредить файл, когда запросы пытаются писать одновременно. Однако настройка внешней базы данных выходит за рамки этого вопроса, поэтому вот как вы можете настроить запись в файл JSON:
Config.json
{
"changeableValue": "foo"
}
Команда.js
const fs = require("fs");
var { changeableValue } = require("config.json");
console.info(changeableValue) // logs "foo"
var updatedValueJSON = JSON.stringify({ changeableValue: "bar" }); // necessary because the JSON object must be converted to a string
fs.writeFile("config.json", updatedValueJSON, "utf8", () => {
// this is the callback function called when the file write completes
let { changeableValue } = require("config.json");
console.info(changeableValue); // logs "bar", and now if you restart the bot and import changeableValue, it will still be bar
});
Да, замените аргумент «bar» значением, которое вы хотите передать функции для сохранения.
Как мне реализовать это в команде _calcset {Value}? Через аргумент я догадываюсь, где бы я заменил «бар» на аргумент?