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.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
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

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