UNPKG

discord-command-parser

Version:
204 lines 8.71 kB
"use strict"; // https://npmjs.com/package/discord-command-parser // https://github.com/campbellbrendene/discord-command-parser // Licensed under the MIT license. See "LICENSE" in the root of this project. var __spreadArrays = (this && this.__spreadArrays) || function () { for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length; for (var r = Array(s), k = 0, i = 0; i < il; i++) for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) r[k] = a[j]; return r; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.parse = exports.MessageArgumentReader = exports.version = void 0; exports.version = "1.5.3"; function getArguments(body) { var args = []; var str = body.trim(); while (str.length) { var arg = void 0; if (str.startsWith('"') && str.indexOf('"', 1) > 0) { arg = str.slice(1, str.indexOf('"', 1)); str = str.slice(str.indexOf('"', 1) + 1); } else if (str.startsWith("'") && str.indexOf("'", 1) > 0) { arg = str.slice(1, str.indexOf("'", 1)); str = str.slice(str.indexOf("'", 1) + 1); } else if (str.startsWith("```") && str.indexOf("```", 3) > 0) { arg = str.slice(3, str.indexOf("```", 3)); str = str.slice(str.indexOf("```", 3) + 3); } else { arg = str.split(/\s+/g)[0].trim(); str = str.slice(arg.length); } args.push(arg.trim()); str = str.trim(); } return args; } var MessageArgumentReader = /** @class */ (function () { function MessageArgumentReader(args, body) { this.args = args.slice(); this.body = body; this._index = 0; } /** Returns the next argument (or null if exhausted) and advances the index (unless `peek` is `true`). */ MessageArgumentReader.prototype.getString = function (peek, v) { if (peek === void 0) { peek = false; } if (this._index >= this.args.length) return null; var value = this.args[peek ? this._index : this._index++]; return v ? (v(value) ? value : null) : value; }; /** Gets all the remaining text and advances the index to the end (unless `peek` is `true`). */ MessageArgumentReader.prototype.getRemaining = function (peek) { if (peek === void 0) { peek = false; } if (this._index >= this.args.length) return null; var remaining = this.body.trim(); for (var i = 0; i < this._index; i++) { if (remaining.startsWith('"') && remaining.charAt(this.args[i].length + 1) === '"') { remaining = remaining.slice(this.args[i].length + 2).trim(); } else if (remaining.startsWith("'") && remaining.charAt(this.args[i].length + 1) === "'") { remaining = remaining.slice(this.args[i].length + 2).trim(); } else if (remaining.startsWith("```") && remaining.slice(this.args[i].length + 3).startsWith("```")) { remaining = remaining.slice(this.args[i].length + 6).trim(); } else { remaining = remaining.slice(this.args[i].length).trim(); } } if (!peek) this.seek(Infinity); return remaining; }; /** * Advances the index (unless `peek` is `true`) and tries to parse an integer * using `Number.parseInt`, returning `null` if NaN. */ MessageArgumentReader.prototype.getInt = function (peek, v) { if (peek === void 0) { peek = false; } var str = this.getString(peek); if (str === null) return null; var parsed = Number.isNaN(str) || !/^-?\d+$/g.test(str) ? null : Number.parseInt(str); if (parsed === null || parsed > Number.MAX_SAFE_INTEGER || parsed < Number.MIN_SAFE_INTEGER) return null; return v ? (v(parsed) ? parsed : null) : parsed; }; /** * Advances the index (unless `peek` is `true`) and tries to parse a floating-point number * (with a maximum guaranteed precision of 2 decimal places) * using `Number.parseFloat`, returning `null` if NaN or out of range. */ MessageArgumentReader.prototype.getFloat = function (peek, v) { if (peek === void 0) { peek = false; } var str = this.getString(peek); if (str === null) return null; var parsed = Number.isNaN(str) || !/^-?\d*(\.\d+)?$/.test(str) ? null : Number.parseFloat(str); if (parsed === null || parsed > 70368744177664 || parsed < -70368744177664) return null; return v ? (v(parsed) ? parsed : null) : parsed; }; /** Advances the index (unless `peek` is `true`) and tries to parse a valid user ID or mention and returns the ID, if found. */ MessageArgumentReader.prototype.getUserID = function (peek, v) { if (peek === void 0) { peek = false; } var str = this.getString(peek); if (str === null) return null; if (/^\d{17,19}$/.test(str)) return str; var match = str.match(/^\<@!?(\d{17,19})\>$/); if (match && match[1]) return v ? (v(match[1]) ? match[1] : null) : match[1]; return null; }; /** Advances the index (unless `peek` is `true`) and tries to parse a valid role ID or mention and returns the ID, if found. */ MessageArgumentReader.prototype.getRoleID = function (peek, v) { if (peek === void 0) { peek = false; } var str = this.getString(peek); if (str === null) return null; if (/^\d{17,19}$/.test(str)) return str; var match = str.match(/^\<@&?(\d{17,19})\>$/); if (match && match[1]) return v ? (v(match[1]) ? match[1] : null) : match[1]; return null; }; /** Advances the index (unless `peek` is `true`) and tries to parse a valid channel ID or mention and returns the ID, if found. */ MessageArgumentReader.prototype.getChannelID = function (peek, v) { if (peek === void 0) { peek = false; } var str = this.getString(peek); if (str === null) return null; if (/^\d{17,19}$/.test(str)) return str; var match = str.match(/^\<#(\d{17,19})\>$/); if (match && match[1]) return v ? (v(match[1]) ? match[1] : null) : match[1]; return null; }; /** Safely increments or decrements the index. Use this for skipping arguments. */ MessageArgumentReader.prototype.seek = function (amount) { if (amount === void 0) { amount = 1; } this._index += amount; if (this._index < 0) this._index = 0; if (this._index > this.args.length) this._index = this.args.length; return this; }; return MessageArgumentReader; }()); exports.MessageArgumentReader = MessageArgumentReader; function parse(message, prefix, options) { var _a; if (options === void 0) { options = {}; } function fail(error) { return { success: false, error: error, message: message }; } var prefixes = Array.isArray(prefix) ? __spreadArrays(prefix) : [prefix]; if (message.author.bot && !options.allowBots) return fail("Message sent by a bot account"); if (!message.content) return fail("Message body empty"); var matchedPrefix = null; for (var _i = 0, prefixes_1 = prefixes; _i < prefixes_1.length; _i++) { var p = prefixes_1[_i]; if ((options.ignorePrefixCase && message.content.toLowerCase().startsWith(p.toLowerCase())) || message.content.startsWith(p)) { matchedPrefix = p; break; } } if (!matchedPrefix) return fail("Message does not start with prefix"); var remaining = message.content.slice(matchedPrefix.length); if (!remaining) return fail("No body after prefix"); if (!options.allowSpaceBeforeCommand && /^\s/.test(remaining)) return fail("Space before command name"); remaining = remaining.trim(); var command = (_a = remaining.match(/^[^\s]+/i)) === null || _a === void 0 ? void 0 : _a[0]; if (!command) return fail("Could not match a command"); remaining = remaining.slice(command.length).trim(); var args = getArguments(remaining); return { success: true, message: message, prefix: matchedPrefix, arguments: args, reader: new MessageArgumentReader(args, remaining), body: remaining, command: command, }; } exports.parse = parse; //# sourceMappingURL=index.js.map