UNPKG

detritus-client

Version:

A Typescript NodeJS library to interact with Discord's API, both Rest and Gateway.

253 lines (252 loc) 10 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.escape = exports.trueSlice = exports.timestamp = exports.url = exports.underline = exports.strike = exports.spoiler = exports.italics = exports.codestring = exports.codeblock = exports.bold = exports.Replacements = exports.Regexes = exports.Strings = void 0; exports.Strings = Object.freeze({ BOLD: '**', CODEBLOCK: '```', CODESTRING: '`', CODESTRING_DOUBLE: '``', ESCAPE: '\\', ITALICS: '_', SPOILER: '||', STRIKE: '~~', UNDERLINE: '__', }); exports.Regexes = Object.freeze({ [exports.Strings.BOLD]: /\*\*/g, [exports.Strings.CODEBLOCK]: new RegExp(exports.Strings.CODEBLOCK, 'g'), [exports.Strings.CODESTRING]: new RegExp(exports.Strings.CODESTRING, 'g'), [exports.Strings.ESCAPE]: /\\/g, [exports.Strings.ITALICS]: /(_|\*)/g, [exports.Strings.SPOILER]: /\|\|/g, [exports.Strings.STRIKE]: new RegExp(exports.Strings.STRIKE, 'g'), [exports.Strings.UNDERLINE]: new RegExp(exports.Strings.UNDERLINE, 'g'), EVERYONE: /@(everyone|here)/g, LINK: /\]\(/g, MENTION: /<@([!&]?[0-9]{16,21})>/g, MENTION_HARDCORE: /@/g, URL: /\)/g, }); exports.Replacements = Object.freeze({ [exports.Strings.BOLD]: '\\*\\*', [exports.Strings.CODEBLOCK]: '``\u200b`', [exports.Strings.CODESTRING]: '\\`', [exports.Strings.ESCAPE]: '\\\\', [exports.Strings.ITALICS]: '\\$1', [exports.Strings.SPOILER]: '\\|\\|', [exports.Strings.STRIKE]: '\\~\\~', [exports.Strings.UNDERLINE]: '\\_\\_', MENTION: '\u200b', }); const defaultMarkupFilter = Object.freeze({ limit: 2000, links: true, mentions: true, mentionEscapeCharacter: '\u200b', replacement: '', }); const defaultBoldFilter = Object.freeze(Object.assign({}, defaultMarkupFilter, { limit: 1996, replacement: exports.Replacements[exports.Strings.BOLD], })); function bold(text, options = {}) { text = exports.escape.bold(text, options); return `**${text}**`; } exports.bold = bold; const defaultCodeblockFilter = Object.freeze(Object.assign({}, defaultMarkupFilter, { language: '', limit: 1990, replacement: exports.Replacements[exports.Strings.CODEBLOCK], })); function codeblock(text, options = {}) { text = exports.escape.codeblock(text, options); return [ exports.Strings.CODEBLOCK + (options.language || defaultCodeblockFilter.language), text, exports.Strings.CODEBLOCK, ].join('\n'); } exports.codeblock = codeblock; const defaultCodestringFilter = Object.freeze(Object.assign({}, defaultMarkupFilter, { limit: 1998, replacement: exports.Replacements[exports.Strings.CODESTRING], })); function codestring(text, options = {}) { let wrap = exports.Strings.CODESTRING; if (text.includes(exports.Strings.CODESTRING)) { options = Object.assign({ limit: 1995, replacement: exports.Strings.CODESTRING + exports.Replacements.MENTION, }, options); text = exports.escape.codestring(text, options); wrap = exports.Strings.CODESTRING_DOUBLE; if (text.endsWith(exports.Strings.CODESTRING)) { text += exports.Replacements.MENTION; } } else { text = exports.escape.codestring(text, options); } return `${wrap}${text}${wrap}`; } exports.codestring = codestring; const defaultItalicsFilter = Object.freeze(Object.assign({}, defaultMarkupFilter, { limit: 1998, replacement: exports.Replacements[exports.Strings.ITALICS], })); function italics(text, options = {}) { text = exports.escape.italics(text, options); return `_${text}_`; } exports.italics = italics; const defaultSpoilerFilter = Object.freeze(Object.assign({}, defaultMarkupFilter, { limit: 1996, replacement: exports.Replacements[exports.Strings.SPOILER], })); function spoiler(text, options = {}) { text = exports.escape.spoiler(text, options); return `||${text}||`; } exports.spoiler = spoiler; const defaultStrikeFilter = Object.freeze(Object.assign({}, defaultMarkupFilter, { limit: 1996, replacement: exports.Replacements[exports.Strings.STRIKE], })); function strike(text, options = {}) { text = exports.escape.strike(text, options); return `~~${text}~~`; } exports.strike = strike; const defaultUnderlineFilter = Object.freeze(Object.assign({}, defaultMarkupFilter, { limit: 1996, replacement: exports.Replacements[exports.Strings.UNDERLINE], })); function underline(text, options = {}) { text = exports.escape.underline(text, options); return `__${text}__`; } exports.underline = underline; function url(text, url, comment) { url = exports.escape.url(url); if (comment) { return `[${text}](${url} '${comment}')`; } return `[${text}](${url})`; } exports.url = url; function timestamp(timestamp, format) { let unixTimestamp; if (timestamp) { if (typeof (timestamp) === 'number' || typeof (timestamp) === 'string') { timestamp = new Date(timestamp); } unixTimestamp = Math.floor(timestamp.getTime() / 1000); } else { unixTimestamp = Math.floor(Date.now() / 1000); } if (format) { return `<t:${unixTimestamp}:${format}>`; } return `<t:${unixTimestamp}>`; } exports.timestamp = timestamp; function trueSlice(text, limit) { if (limit) { return Buffer.from(text).slice(0, limit).toString(); } return text; } exports.trueSlice = trueSlice; exports.escape = Object.freeze({ all: (text, options = {}) => { const filter = Object.assign({}, defaultMarkupFilter, options); text = text.replace(exports.Regexes[exports.Strings.ESCAPE], exports.Replacements[exports.Strings.ESCAPE]); text = text.replace(exports.Regexes[exports.Strings.ITALICS], exports.Replacements[exports.Strings.ITALICS]); text = text.replace(exports.Regexes[exports.Strings.BOLD], exports.Replacements[exports.Strings.BOLD]); text = text.replace(exports.Regexes[exports.Strings.CODESTRING], exports.Replacements[exports.Strings.CODESTRING]); text = text.replace(exports.Regexes[exports.Strings.SPOILER], exports.Replacements[exports.Strings.SPOILER]); text = text.replace(exports.Regexes[exports.Strings.STRIKE], exports.Replacements[exports.Strings.STRIKE]); text = text.replace(exports.Regexes[exports.Strings.UNDERLINE], exports.Replacements[exports.Strings.UNDERLINE]); if (filter.links) { text = exports.escape.links(text, filter.mentionEscapeCharacter); } if (filter.mentions) { text = exports.escape.mentions(text, filter.mentionEscapeCharacter); } return trueSlice(text, filter.limit); }, bold: (text, options = {}) => { const filter = Object.assign({}, defaultBoldFilter, options); text = text.replace(exports.Regexes[exports.Strings.BOLD], filter.replacement); if (filter.mentions) { text = exports.escape.mentions(text, filter.mentionEscapeCharacter); } return trueSlice(text, filter.limit); }, codeblock: (text, options = {}) => { const filter = Object.assign({}, defaultCodeblockFilter, options); while (text.includes(exports.Strings.CODEBLOCK)) { text = text.replace(exports.Regexes[exports.Strings.CODEBLOCK], filter.replacement); } if (options.limit === undefined) { filter.limit -= filter.language.length; } return trueSlice(text, filter.limit); }, codestring: (text, options = {}) => { const filter = Object.assign({}, defaultCodestringFilter, options); text = text.replace(exports.Regexes[exports.Strings.CODESTRING], filter.replacement); if (filter.mentions) { text = exports.escape.mentions(text, filter.mentionEscapeCharacter); } return trueSlice(text, filter.limit); }, italics: (text, options = {}) => { const filter = Object.assign({}, defaultItalicsFilter, options); text = text.replace(exports.Regexes[exports.Strings.ITALICS], filter.replacement); if (filter.mentions) { text = exports.escape.mentions(text, filter.mentionEscapeCharacter); } return trueSlice(text, filter.limit); }, links: (text, replacement = exports.Replacements.MENTION) => { text = text.replace(exports.Regexes.LINK, `]${replacement}(`); return text; }, mentions: (text, replacement = exports.Replacements.MENTION) => { text = text.replace(exports.Regexes.MENTION_HARDCORE, `@${replacement}`); return text; }, spoiler: (text, options = {}) => { const filter = Object.assign({}, defaultSpoilerFilter, options); text = text.replace(exports.Regexes[exports.Strings.SPOILER], filter.replacement); if (filter.mentions) { text = exports.escape.mentions(text, filter.mentionEscapeCharacter); } return trueSlice(text, filter.limit); }, strike: (text, options = {}) => { const filter = Object.assign({}, defaultStrikeFilter, options); text = text.replace(exports.Regexes[exports.Strings.STRIKE], filter.replacement); if (filter.mentions) { text = exports.escape.mentions(text, filter.mentionEscapeCharacter); } return trueSlice(text, filter.limit); }, underline: (text, options = {}) => { const filter = Object.assign({}, defaultUnderlineFilter, options); text = text.replace(exports.Regexes[exports.Strings.UNDERLINE], filter.replacement); if (filter.mentions) { text = exports.escape.mentions(text, filter.mentionEscapeCharacter); } return trueSlice(text, filter.limit); }, url: (text, options = {}) => { text = text.replace(exports.Regexes.URL, (match) => { return '%' + match.charCodeAt(0).toString(16); }); return text; }, });