Discord bot Команда, которая изменяет значение другой команды

Я ищу способ изменить текстовую строку или значение в одной команде, введя новое значение в другой команде. Например, у меня есть 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.

Как использовать API парсинга квитанций с помощью JavaScript за 5 минут?
Как использовать API парсинга квитанций с помощью JavaScript за 5 минут?
В этом руководстве вы узнаете, как использовать API парсинга квитанций за 5 минут с помощью JavaScript. Eden AI предоставляет простой и удобный для...
Хук useOnClickOutside в ReactJS
Хук useOnClickOutside в ReactJS
Как разработчик ReactJS, вы, возможно, сталкивались с ситуацией, когда вам нужно закрыть модальное или выпадающее меню, когда кто-то щелкает за его...
Хуки (часть-2) - useEffect
Хуки (часть-2) - useEffect
Хук useEffect - один из самых мощных и универсальных инструментов в арсенале разработчика React. Он позволяет вам управлять побочными эффектами в...
Простое руководство по тестированию взаимодействия с пользователем с помощью библиотеки тестирования React
Простое руководство по тестированию взаимодействия с пользователем с помощью библиотеки тестирования React
В предыдущем посте я показал вам на примерах, как писать базовые тесты в React. Важнейшей частью пользовательского интерфейса приложений является...
Как конвертировать HTML в PDF с помощью jsPDF
Как конвертировать HTML в PDF с помощью jsPDF
В этой статье мы рассмотрим, как конвертировать HTML в PDF с помощью jsPDF. Здесь мы узнаем, как конвертировать HTML в PDF с помощью javascript.
Создайте титры как в звездных войнах с помощью CSS и Javascript
Создайте титры как в звездных войнах с помощью CSS и Javascript
Если вы веб-разработчик (или хотите им стать), то вы наверняка гик и вам нравятся "Звездные войны". А как бы вы хотели, чтобы фоном для вашего...
0
0
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Прежде всего, обратите внимание, что единственная причина, по которой существует ключевое слово const, заключается в том, что оно означает constant, а константные переменные никогда не могут быть изменены после инициализации. Поэтому убедитесь, что вы изменили ключевое слово объявления переменной на просто var или let.

Способ 1. Если вам не нужны данные для сохранения

Теперь, если вы хотите, чтобы переменная изменялась только за сеанс, и вас устраивает возвращение к тому, что вы определили, как при закрытии бота, вы можете просто обновить переменную, используя функции, экспортированные из файла 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» каждый раз, когда вы отключаете бота. Если с вами все в порядке, то все вышеперечисленное работает нормально.

Способ 2. Если вам нужны данные для сохранения через сеансы

Если вы хотите сохранить переменную 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
});

Как мне реализовать это в команде _calcset {Value}? Через аргумент я догадываюсь, где бы я заменил «бар» на аргумент?

lkityehvlwoyy 21.11.2022 22:39

Да, замените аргумент «bar» значением, которое вы хотите передать функции для сохранения.

isaac.g 25.11.2022 02:48

Другие вопросы по теме