feat(Util): allow array for StringOptions' char (#5566)

Co-authored-by: Voltrex <62040526+VoltrexMaster@users.noreply.github.com>
Co-authored-by: SpaceEEC <spaceeec@yahoo.com>
Co-authored-by: Papaia <43409674+papaia@users.noreply.github.com>
Co-authored-by: Noel <icrawltogo@gmail.com>
This commit is contained in:
u9g
2021-06-10 05:24:45 -04:00
committed by GitHub
parent eb0291d9a5
commit fbcbb29884
3 changed files with 17 additions and 4 deletions

View File

@@ -102,7 +102,8 @@ class TextBasedChannel {
* Options for splitting a message.
* @typedef {Object} SplitOptions
* @property {number} [maxLength=2000] Maximum character length per message piece
* @property {string} [char='\n'] Character to split the message with
* @property {string|string[]|RegExp|RegExp[]} [char='\n'] Character(s) or Regex(s) to split the message with,
* an array can be used to split multiple times
* @property {string} [prepend=''] Text to prepend to every piece except the first
* @property {string} [append=''] Text to append to every piece except the last
*/

View File

@@ -64,8 +64,20 @@ class Util {
static splitMessage(text, { maxLength = 2000, char = '\n', prepend = '', append = '' } = {}) {
text = Util.verifyString(text, RangeError, 'MESSAGE_CONTENT_TYPE', false);
if (text.length <= maxLength) return [text];
const splitText = text.split(char);
if (splitText.some(chunk => chunk.length > maxLength)) throw new RangeError('SPLIT_MAX_LEN');
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.map(chunk => chunk.match(currentChar));
} else {
splitText = splitText.map(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) {

2
typings/index.d.ts vendored
View File

@@ -3631,7 +3631,7 @@ declare module 'discord.js' {
interface SplitOptions {
maxLength?: number;
char?: string;
char?: string | string[] | RegExp | RegExp[];
prepend?: string;
append?: string;
}