diff --git a/commands/util/eval.js b/commands/util/eval.js index 655e7c09..1cb1bee2 100644 --- a/commands/util/eval.js +++ b/commands/util/eval.js @@ -2,7 +2,7 @@ const util = require('util'); const discord = require('discord.js'); const tags = require('common-tags'); -const { escapeRegex } = require('../../util/Util'); +const { escapeRegex, splitMessage } = require('../../util/Util'); const Command = require('../../framework/Command'); const nl = '!!NL!!'; @@ -88,14 +88,14 @@ module.exports = class EvalCommand extends Command { const prepend = `\`\`\`javascript\n${prependPart}\n`; const append = `\n${appendPart}\n\`\`\``; if (input) { - return discord.splitMessage(tags.stripIndents` + return splitMessage(tags.stripIndents` *Executed in ${hrDiff[0] > 0 ? `${hrDiff[0]}s ` : ''}${hrDiff[1] / 1000000}ms.* \`\`\`javascript ${inspected} \`\`\` `, { maxLength: 1900, prepend, append }); } else { - return discord.splitMessage(tags.stripIndents` + return splitMessage(tags.stripIndents` *Callback executed after ${hrDiff[0] > 0 ? `${hrDiff[0]}s ` : ''}${hrDiff[1] / 1000000}ms.* \`\`\`javascript ${inspected} diff --git a/util/Util.js b/util/Util.js index bcf1814d..db7f23b3 100644 --- a/util/Util.js +++ b/util/Util.js @@ -408,4 +408,33 @@ module.exports = class Util { if (spoilers !== 0 && (spoilers && (spoilers % 2))) clean += '||'; return clean; } + + static splitMessage(text, { maxLength = 2000, char = '\n', prepend = '', append = '' } = {}) { + text = Util.verifyString(text); + if (text.length <= maxLength) return [text]; + let splitText = [text]; + if (Array.isArray(char)) { + while (char.length > 0 && splitText.some(elem => elem.length > maxLength)) { + const currentChar = char.shift(); + if (currentChar instanceof RegExp) { + splitText = splitText.flatMap(chunk => chunk.match(currentChar)); + } else { + splitText = splitText.flatMap(chunk => chunk.split(currentChar)); + } + } + } else { + splitText = text.split(char); + } + if (splitText.some(elem => elem.length > maxLength)) throw new RangeError('SPLIT_MAX_LEN'); + const messages = []; + let msg = ''; + for (const chunk of splitText) { + if (msg && (msg + char + chunk + append).length > maxLength) { + messages.push(msg + append); + msg = prepend; + } + msg += (msg && msg !== prepend ? char : '') + chunk; + } + return messages.concat(msg).filter(m => m); + } };