Отключение звука по времени прекращает отсчет при перезапуске бота, discord.js

#javascript #node.js #discord.js

#javascript #node.js #discord.js

Вопрос:

Я пытаюсь заставить бота сохранять время окончания отключения звука, поэтому, если он отключится, а затем снова подключится к Сети (обновление), он не просто забудет о включении отключенного участника и просто оставит его отключенным.

У меня режим отключения звука по времени работает нормально, но я просто хочу, чтобы он запомнил время окончания.

Я имею в виду базу данных или что-то в этом роде?

Примечания:

  1. Я использую обработчик команд.
  2. Я использую https://replit.com

Мой код:

 const { MessageEmbed } = require('discord.js');
const ms = require('ms')

module.exports = {
    name: 'mute',
    category: 'Owner',
    aliases: ["t"],
    description: 'Mute command.',
    usage: 'mute <memeberid> <time>',
    userperms: [],
    botperms: [],
    run: async (client, message, args) => {
    if (!message.guild) return;
    if (message.author.bot) return;

    if (!message.member.roles.cache.has("916785912267034674")) return message.channel.send("You are not a staff member.").then(m => m.delete({timeout: 4000}))
    if (!message.member.hasPermission("MANAGE_ROLES")) return message.channel.send("I don't have permission to do this.").then(m => m.delete({timeout: 4000}))


    let time = args[1]
    let reason = args[2]

    if (!reason) reason = "Violated server rules";
    if (!time) time = "1h"
    
    const user = message.mentions.members.first() || message.guild.members.cache.get(args[0]);
    const muterole = message.guild.roles.cache.get("916963460540157962");
    const embed = new MessageEmbed()
      .setTitle('Member muted!')
      .addField('User muted', '<@' user '>')
      .addField('muted by', message.author)
      .addField('Reason', reason)
      .addField('For', ms(ms(args[1])))
      .setFooter('Time muted', client.user.displayAvatarURL())
      .setThumbnail('https://th.bing.com/th/id/R.3e3ee93bca49df93c9751dbb284d7ec8?rik=fKLepuY9WQQnewamp;riu=http://image.flaticon.com/icons/png/512/25/25632.pngamp;ehk=mdsvAx56LxLhOmmktJkpp5Vbse/xjnaW8mxahrVoQeU=amp;risl=amp;pid=ImgRawamp;r=0')
      .setTimestamp()

    if (!args[0]) return message.channel.send("Please mention a member or use an ID.")
    if (!user) return message.channel.send("Error: Can't find that user.")
    if (user.user.id == message.author.id) return message.channel.send("Uhh, why don't you just shut up like humans?")
    if (user.user.id == client.user.id) return message.channel.send("You good bro?")
    if (user == message.author.id) return message.channel.send("Uhh, why don't you just shut up like humans?")
    if (user == client.user.id) return message.channel.send("You good bro?")
    if (user.roles.cache.has("916963460540157962")) return message.channel.send("Chill, his already muted!")
    if (user.roles.cache.has("916785912267034674")) return message.channel.send("You can't mute staff, idoit.")

    message.channel.send(embed).catch(err => console.log("Error: "   err));
    user.roles.add("916963460540157962").catch(err => console.log("Error: "   err));

    setTimeout(function() {
      user.roles.remove("916963460540157962").catch(err => console.log("Error: "   err));
    }, ms(time));
  }
}
 

Спасибо.

Ответ №1:

setTimeout «удаляется» или отбрасывается при перезапуске приложения

Таким образом, он будет отбрасывать все таймауты и интервалы при каждом перезапуске бота, поэтому вам следует найти другой способ сделать то, что вы хотите сделать

Я бы провел несколько экспериментов с базами данных и прочим

Например, каждое временное отключение сохраняется в базе данных, при перезапуске бота он загружает временные отключения и вычисляет оставшееся время, и продолжает подсчет

Комментарии:

1. Да, но дело в том, что у меня нет знаний о базе данных, и я не могу найти способ понять это.

2. @Hamoodiyoutube Существует множество баз данных (MySQL, MariaDB, MongoDB, megadb) Вы должны исследовать