Неожиданная ошибка при запуске несколько раз - PullRequest
0 голосов
/ 22 апреля 2020

Я создаю бот Discord и обнаружил непредвиденную ошибку, причину которой я не знаю. Возможно, потому что мне никогда не приходилось программировать в режиме реального времени, поэтому есть некоторые вещи, которые я не учел.

Ошибка возникает, когда бот спамит и запускает его несколько раз. Хотя я просмотрел весь код несколько раз, и он мне подходит и должен охватывать действия «спама».

[ERROR 16] _setTimeoutVanishMessage()
DiscordAPIError: Unknown Message

Мой код действия простыми словами;

Отправьте сообщение и через X секунд удалите его. В случае, если есть другое сообщение, которое было отправлено для указанного пользователя c, немедленно удалите старое сообщение и отобразите новое.

Мой код действия в шагах;

  1. Получить сообщение для указанного пользователя c. В случае, если сообщения нет, создайте его и закройте.
  2. Если значение нового сообщения и старое совпадают, ничего не делайте и снова подождите все X секунд, прежде чем удалить его.
  3. Если новое значение сообщения не совпадает со старым, немедленно удалите сообщение и выполните рекурсивный вызов.

Мой код (this.vanishMessage является основным функция);

_setTimeoutVanishMessage(MESSAGE, USER_VANISH_MESSAGE) { // ERROR 16
    if (USER_VANISH_MESSAGE.settimeout !== null) {
        clearTimeout(USER_VANISH_MESSAGE.settimeout);
        USER_VANISH_MESSAGE.settimeout = null;
    }
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    USER_VANISH_MESSAGE.settimeout = setTimeout(async () => {
        if (USER_VANISH_MESSAGE.sentmessage === null || USER_VANISH_MESSAGE.sentmessage.deleted === true)
            return;
        // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        try {
            await USER_VANISH_MESSAGE.sentmessage.delete();
        }
        catch(ERROR) { 
            console.log(`[ERROR 16] _setTimeoutVanishMessage()\n${ERROR}`);
        };
        // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        delete this.servers[MESSAGE.guild.id].vanishmessages[MESSAGE.author.id];
    }, USER_VANISH_MESSAGE.ms);
}
async _addVanishMessage(MESSAGE, TEXT, MS, USER_VANISH_MESSAGE) { // ERROR 17
    USER_VANISH_MESSAGE.text = TEXT,
    USER_VANISH_MESSAGE.ms = (MS === undefined) ? (Math.round(TEXT.length / 25) * 1000) : MS
    USER_VANISH_MESSAGE.sentmessage = null;
    USER_VANISH_MESSAGE.settimeout = null;
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    try {
        USER_VANISH_MESSAGE.sentmessage = await MESSAGE.channel.send(TEXT);
    }
    catch(ERROR) {
        console.log(`[ERROR 17] _addVanishMessage()\n${ERROR}`); 
        delete this.servers[MESSAGE.guild.id].vanishmessages[MESSAGE.author.id];
        return;
    }
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    this._setTimeoutVanishMessage(MESSAGE, USER_VANISH_MESSAGE);
}
async vanishMessage(CLIENT, MESSAGE, TEXT, MS) { // ERROR 18
    if (MESSAGE.channel.permissionsFor(MESSAGE.guild.me).has("SEND_MESSAGES") === false)
        return;
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    let USER_VANISH_MESSAGE;
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    // - Check if user has not have a message - create
    if (this.servers[MESSAGE.guild.id].vanishmessages.hasOwnProperty(MESSAGE.author.id) === false) {
        this.servers[MESSAGE.guild.id].vanishmessages[MESSAGE.author.id] = {};
        USER_VANISH_MESSAGE = this.servers[MESSAGE.guild.id].vanishmessages[MESSAGE.author.id];
        return this._addVanishMessage(MESSAGE, TEXT, MS, USER_VANISH_MESSAGE);
    }
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    USER_VANISH_MESSAGE = this.servers[MESSAGE.guild.id].vanishmessages[MESSAGE.author.id];
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    // - Check if user has a message with the same value - rewrite
    if (TEXT === USER_VANISH_MESSAGE.text)
        return this._setTimeoutVanishMessage(MESSAGE, USER_VANISH_MESSAGE);
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    // - Check if user has a message - delete and rewrite
    if (USER_VANISH_MESSAGE.sentmessage !== null && USER_VANISH_MESSAGE.sentmessage.deleted === false) {
        try { 
            await USER_VANISH_MESSAGE.sentmessage.delete(); 
        }
        catch(ERROR) { 
            console.log(`[ERROR 18] vanishMessage()\n${ERROR}`); 
        }
    }
    clearTimeout(USER_VANISH_MESSAGE.settimeout);
    delete this.servers[MESSAGE.guild.id].vanishmessages[MESSAGE.author.id];
    this.vanishMessage(CLIENT, MESSAGE, TEXT, MS);
}

ОБНОВЛЕНИЕ; После нескольких проверок я обнаружил, что он выполняется более 6,5 млн раз за 10 секунд, хотя он удаляет сообщения, что нормально, но показывает более одного сообщения на пользователя. Может быть, потому, что он запускается огромное количество раз?

Извините за мой Engli sh, надеюсь, я хорошо себя объяснил ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...