Выполнение малого цикла Loop с Node и Discord.js приводит к фатальной ошибке - PullRequest
0 голосов
/ 13 мая 2019

Итак, я только недавно решил попробовать создать бот Discord.На данный момент я только новичок, поэтому у меня возникли некоторые трудности с созданием одной команды для моего разногласия.Я хочу создать команду, которая может убить любую ранее запущенную команду, такую ​​как // скажем или // спам (Это забавно ориентированный бот, с которым я играю, поэтому он допускает некоторые «спамовые» эксплойты, такие какбот постоянно отвечает самому себе (т. е. // скажем // скажем // скажем // скажем и т. д. заставит бота выполнить команду // сказать до тех пор, пока все // операторы не будут выполнены).

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

Вот что япопробовал первым: (примечание: задача определена, так что это не проблема, она просто не видна в этом кодовом блоке)

//stuff up to this point works fine
  if (msg.content.startsWith(`${prefix}say`)) {
    task = 1;
    var text = msg.content.split(' ').slice(1).join(' ');
    if(!text) return msg.reply('hello?');
        if (task === 1) {
        msg.channel.send(text);
    } else if (task === 0) {
            return;   
    }
  if (msg.content.startsWith(`${prefix}cease`)) {
    task = 0;
    msg.channel.send('Task terminated successfully.');
  }
});

Однако бот полностью игнорирует это и продолжает выполнять команду // sayдаже если пользователь попытался выполнить команду // cease.

Я решил попробовать поэкспериментировать с циклами while после этого, например так:

//stuff up to this point work fine
  if (msg.content.startsWith(`${prefix}say`)) {
    task = 1;
    var text = msg.content.split(' ').slice(1).join(' ');
    if(!text) return msg.reply('hello?');
    while (task === 1) {
        msg.channel.send(text);
    }
    }
  if (msg.content.startsWith(`${prefix}cease`)) {
    task = 0;
    msg.channel.send('Task terminated successfully.');
  }
});

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

Вот что происходит.

<--- Last few GCs --->

[18668:000002D05FC41820]    31983 ms: Mark-sweep 1397.8 (1425.2) -> 1397.3 (1424.7) MB, 892.1 / 0.0 ms  (average mu = 0.089, current mu = 0.015) allocation failure scavenge might not succeed
[18668:000002D05FC41820]    31990 ms: Scavenge 1398.1 (1424.7) -> 1397.6 (1425.2) MB, 5.5 / 0.0 ms  (average mu = 0.089, current mu = 0.015) allocation failure


<--- JS stacktrace --->

==== JS stack trace =========================================

    0: ExitFrame [pc: 000003DFF175C5C1]
    1: StubFrame [pc: 000003DFF175D9BF]
Security context: 0x00069561e6e9 <JSObject>
    2: Channel [00000127FFD14059] [C:\Users\[removed]\Documents\epic-bot\node_modules\discord.js\src\util\Constants.js:~165] [pc=000003DFF1A16AA6](this=0x0127ffd12799 <Object map = 0000023F67AEB559>,channelID=0x0199da820629 <Channel map = 000001B00E5314E1>)
    3: /* anonymous */(aka /* anonymous */) [000000DACB142C...

FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
 1: 00007FF6F1A9F04A v8::internal::GCIdleTimeHandler::GCIdleTimeHandler+5114
 2: 00007FF6F1A7A0C6 node::MakeCallback+4518
 3: 00007FF6F1A7AA30 node_module_register+2032
 4: 00007FF6F1D020EE v8::internal::FatalProcessOutOfMemory+846
 5: 00007FF6F1D0201F v8::internal::FatalProcessOutOfMemory+639
 6: 00007FF6F2222BC4 v8::internal::Heap::MaxHeapGrowingFactor+9556
 7: 00007FF6F2219C46 v8::internal::ScavengeJob::operator=+24310
 8: 00007FF6F221829C v8::internal::ScavengeJob::operator=+17740
 9: 00007FF6F2220F87 v8::internal::Heap::MaxHeapGrowingFactor+2327
10: 00007FF6F2221006 v8::internal::Heap::MaxHeapGrowingFactor+2454
11: 00007FF6F1DDCDB7 v8::internal::Factory::NewFillerObject+55
12: 00007FF6F1E72CC6 v8::internal::WasmJs::Install+29414
13: 000003DFF175C5C1

Ответ, вероятно, суперосновный, но, как я уже сказал, я 'м только начинается.

Любая помощь будет признательна.

Спасибо!

1 Ответ

1 голос
/ 13 мая 2019

Отказ от ответственности: Ваше текущее использование будет рассматриваться как злоупотребление API.Этот ответ предназначен для целей обучения и не предназначен для реализации.

Вы правы в своей ошибке;ваш цикл while вызывает сбой, потому что вашему ЦП не хватает доступной памяти.Он продолжается бесконечно и использует все доступные ресурсы, какие только может.Как объяснено здесь , setInterval() с интервалом 0 миллисекунд является лучшим вариантом, но все еще требует.

Поскольку Discord имеет ограничения скорости, ваш бот прекратит отправлять сообщения, если онпопытался отправить более 5 в течение 5 секунд.Поэтому вы могли бы сделать что-то вроде этого ...

const args = message.content.trim().split(/ +/g);

/* say command */
const text = args.slice(1).join(' ');
if (!text) return;

const interval = setInterval(function() {
  message.channel.send(text)
    .catch(err => {
      console.error(err);
      clearInterval(interval);
    });
}, 1000);

task = interval;


/* cease command */
clearInterval(task);
...