UNPKG

@jsprismarine/prismarine

Version:

Dedicated Minecraft Bedrock Edition server written in TypeScript

98 lines (97 loc) 12.3 kB
import { getGametypeName } from "@jsprismarine/minecraft"; //#region src/utils/ParseTargetSelector.ts /** * Parse target selector argument. * * @remarks * A target selector is made up of 3 parts: * * - First there's the `@` (at symbol) part, * notifying us that this is in fact a target selector * * - Secondly there's the target selector type (`a`, `e`, `p`, `r`, `s`), * this specifies what kind of entities we should query for * and in what way. * * - Thirdly there's the arguments, * they are split up in a comma-separated list in the * argument=value format. * * This results in an input similar to: * `@e[type=player,gamemode=creative,limit=3]` * * @returns The entities matching the target query */ var ParseTargetSelector = ({ input, entities, source }) => { if (!input.startsWith("@")) throw new Error("input does not start with \"@\""); let targets = entities; const str = input.slice(1, input.length); const type = str.split("[")[0]; const args = str.split("[")[1]?.split("]")[0].split(",").map((arg) => ({ argument: arg.split("=")[0], value: arg.split("=")[1].replace("!", ""), reverse: arg.split("=")[1].startsWith("!") })) || []; let limit = Number.MAX_SAFE_INTEGER, sort; switch (type) { case "a": targets = targets.filter((entity) => entity.isPlayer()); sort = "arbitrary"; break; case "e": sort = "arbitrary"; break; case "p": limit = 1; sort = "nearest"; break; case "r": limit = 1; sort = "random"; break; case "s": limit = 1; sort = "arbitrary"; targets = [source]; break; default: throw new Error(`type "${type}" is invalid. Expected "a", "e", "p", "r" or "s"`); } args.forEach((filter) => { switch (filter.argument) { case "type": if (filter.value.split(":").length === 1) targets = targets.filter((entity) => filter.reverse ? entity.getType().split(":")[1] !== filter.value : entity.getType().split(":")[1] === filter.value); else targets = targets.filter((entity) => filter.reverse ? entity.getType() !== filter.value : entity.getType() === filter.value); break; case "name": targets = targets.filter((entity) => filter.reverse ? entity.getName() !== filter.value : entity.getName() === filter.value); break; case "m": case "gamemode": targets = targets.filter((entity) => entity.isPlayer() && (filter.reverse ? getGametypeName(entity.gamemode).toLowerCase() !== filter.value.toLowerCase() : getGametypeName(entity.gamemode).toLowerCase() === filter.value.toLowerCase())); break; case "sort": sort = filter.value; break; case "c": case "limit": limit = Number.parseInt(filter.value, 10); break; default: break; } }); switch (sort) { case "nearest": targets = source.getNearestEntity(targets.filter((entity) => entity.isPlayer())); break; case "random": targets = [targets[Math.floor(Math.random() * targets.length)]]; break; default: break; } targets = targets.slice(0, limit); if (targets.length <= 0) throw new Error("no results"); return targets; }; //#endregion export { ParseTargetSelector as default }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGFyc2VUYXJnZXRTZWxlY3Rvci5lcy5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvUGFyc2VUYXJnZXRTZWxlY3Rvci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXRHYW1ldHlwZU5hbWUgfSBmcm9tICdAanNwcmlzbWFyaW5lL21pbmVjcmFmdCc7XG5pbXBvcnQgdHlwZSBQbGF5ZXIgZnJvbSAnLi4vUGxheWVyJztcbmltcG9ydCB0eXBlIHsgRW50aXR5IH0gZnJvbSAnLi4vZW50aXR5L0VudGl0eSc7XG5cbi8qKlxuICogUGFyc2UgdGFyZ2V0IHNlbGVjdG9yIGFyZ3VtZW50LlxuICpcbiAqIEByZW1hcmtzXG4gKiBBIHRhcmdldCBzZWxlY3RvciBpcyBtYWRlIHVwIG9mIDMgcGFydHM6XG4gKlxuICogLSBGaXJzdCB0aGVyZSdzIHRoZSBgQGAgKGF0IHN5bWJvbCkgcGFydCxcbiAqIG5vdGlmeWluZyB1cyB0aGF0IHRoaXMgaXMgaW4gZmFjdCBhIHRhcmdldCBzZWxlY3RvclxuICpcbiAqIC0gU2Vjb25kbHkgdGhlcmUncyB0aGUgdGFyZ2V0IHNlbGVjdG9yIHR5cGUgKGBhYCwgYGVgLCBgcGAsIGByYCwgYHNgKSxcbiAqIHRoaXMgc3BlY2lmaWVzIHdoYXQga2luZCBvZiBlbnRpdGllcyB3ZSBzaG91bGQgcXVlcnkgZm9yXG4gKiBhbmQgaW4gd2hhdCB3YXkuXG4gKlxuICogLSBUaGlyZGx5IHRoZXJlJ3MgdGhlIGFyZ3VtZW50cyxcbiAqIHRoZXkgYXJlIHNwbGl0IHVwIGluIGEgY29tbWEtc2VwYXJhdGVkIGxpc3QgaW4gdGhlXG4gKiBhcmd1bWVudD12YWx1ZSBmb3JtYXQuXG4gKlxuICogVGhpcyByZXN1bHRzIGluIGFuIGlucHV0IHNpbWlsYXIgdG86XG4gKiBgQGVbdHlwZT1wbGF5ZXIsZ2FtZW1vZGU9Y3JlYXRpdmUsbGltaXQ9M11gXG4gKlxuICogQHJldHVybnMgVGhlIGVudGl0aWVzIG1hdGNoaW5nIHRoZSB0YXJnZXQgcXVlcnlcbiAqL1xuY29uc3QgUGFyc2VUYXJnZXRTZWxlY3RvciA9ICh7XG4gICAgaW5wdXQsXG4gICAgZW50aXRpZXMsXG4gICAgc291cmNlXG59OiB7XG4gICAgaW5wdXQ6IHN0cmluZztcbiAgICBlbnRpdGllczogRW50aXR5W107XG4gICAgc291cmNlOiBFbnRpdHk7XG59KTogRW50aXR5W10gPT4ge1xuICAgIGlmICghaW5wdXQuc3RhcnRzV2l0aCgnQCcpKSB0aHJvdyBuZXcgRXJyb3IoJ2lucHV0IGRvZXMgbm90IHN0YXJ0IHdpdGggXCJAXCInKTtcblxuICAgIGxldCB0YXJnZXRzOiBFbnRpdHlbXSA9IGVudGl0aWVzO1xuXG4gICAgLy8gR2V0IGlucHV0IHdpdGhvdXQgdGhlIGF0IHN5bWJvbFxuICAgIGNvbnN0IHN0ciA9IGlucHV0LnNsaWNlKDEsIGlucHV0Lmxlbmd0aCk7XG5cbiAgICAvLyBUeXBlIGlzIGFsd2F5cyBhZnRlciB0aGUgYGFgIHN5bWJvbCBhbmQgYWx3YXlzIGJlZm9yZSB0aGUgb3B0aW9uYWwgYXJndW1lbnRzXG4gICAgY29uc3QgdHlwZTogJ2EnIHwgJ2UnIHwgJ3AnIHwgJ3InIHwgJ3MnID0gc3RyLnNwbGl0KCdbJylbMF0gYXMgYW55O1xuXG4gICAgLy8gUGFyc2UgY29tbWEtc2VwYXJhdGVkIGFyZ3VtZW50cyBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdDpcbiAgICAvLyBbYXJnPXZhbCxhcmcyPXZhbDIsYXJnMz12YWwzXVxuICAgIGNvbnN0IGFyZ3MgPVxuICAgICAgICBzdHJcbiAgICAgICAgICAgIC5zcGxpdCgnWycpWzFdXG4gICAgICAgICAgICA/LnNwbGl0KCddJylbMF0hXG4gICAgICAgICAgICAuc3BsaXQoJywnKVxuICAgICAgICAgICAgLm1hcCgoYXJnKSA9PiAoe1xuICAgICAgICAgICAgICAgIGFyZ3VtZW50OiBhcmcuc3BsaXQoJz0nKVswXSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogYXJnLnNwbGl0KCc9JylbMV0hLnJlcGxhY2UoJyEnLCAnJyksXG4gICAgICAgICAgICAgICAgcmV2ZXJzZTogYXJnLnNwbGl0KCc9JylbMV0hLnN0YXJ0c1dpdGgoJyEnKVxuICAgICAgICAgICAgfSkpIHx8IFtdO1xuXG4gICAgLy8gRmlsdGVyc1xuICAgIGxldCBsaW1pdCA9IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSLFxuICAgICAgICBzb3J0OiAnbmVhcmVzdCcgfCAnZnVydGhlc3QnIHwgJ3JhbmRvbScgfCAnYXJiaXRyYXJ5JztcblxuICAgIC8vIEFwcGx5IGZpbHRlcnMgYmFzZWQgb24gdHlwZVxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlICdhJzpcbiAgICAgICAgICAgIHRhcmdldHMgPSB0YXJnZXRzLmZpbHRlcigoZW50aXR5KSA9PiBlbnRpdHkuaXNQbGF5ZXIoKSk7XG4gICAgICAgICAgICBzb3J0ID0gJ2FyYml0cmFyeSc7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnZSc6XG4gICAgICAgICAgICBzb3J0ID0gJ2FyYml0cmFyeSc7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAncCc6XG4gICAgICAgICAgICBsaW1pdCA9IDE7XG4gICAgICAgICAgICBzb3J0ID0gJ25lYXJlc3QnO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3InOlxuICAgICAgICAgICAgbGltaXQgPSAxO1xuICAgICAgICAgICAgc29ydCA9ICdyYW5kb20nO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3MnOlxuICAgICAgICAgICAgbGltaXQgPSAxO1xuICAgICAgICAgICAgc29ydCA9ICdhcmJpdHJhcnknO1xuICAgICAgICAgICAgdGFyZ2V0cyA9IFtzb3VyY2VdO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHR5cGUgXCIke3R5cGV9XCIgaXMgaW52YWxpZC4gRXhwZWN0ZWQgXCJhXCIsIFwiZVwiLCBcInBcIiwgXCJyXCIgb3IgXCJzXCJgKTtcbiAgICB9XG5cbiAgICBhcmdzLmZvckVhY2goKGZpbHRlcikgPT4ge1xuICAgICAgICBzd2l0Y2ggKGZpbHRlci5hcmd1bWVudCkge1xuICAgICAgICAgICAgY2FzZSAndHlwZSc6XG4gICAgICAgICAgICAgICAgaWYgKGZpbHRlci52YWx1ZS5zcGxpdCgnOicpLmxlbmd0aCA9PT0gMSlcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0cyA9IHRhcmdldHMuZmlsdGVyKChlbnRpdHkpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIucmV2ZXJzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZW50aXR5LmdldFR5cGUoKS5zcGxpdCgnOicpWzFdICE9PSBmaWx0ZXIudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGVudGl0eS5nZXRUeXBlKCkuc3BsaXQoJzonKVsxXSA9PT0gZmlsdGVyLnZhbHVlXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICB0YXJnZXRzID0gdGFyZ2V0cy5maWx0ZXIoKGVudGl0eSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlci5yZXZlcnNlID8gZW50aXR5LmdldFR5cGUoKSAhPT0gZmlsdGVyLnZhbHVlIDogZW50aXR5LmdldFR5cGUoKSA9PT0gZmlsdGVyLnZhbHVlXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgJ25hbWUnOlxuICAgICAgICAgICAgICAgIHRhcmdldHMgPSB0YXJnZXRzLmZpbHRlcigoZW50aXR5KSA9PlxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXIucmV2ZXJzZSA/IGVudGl0eS5nZXROYW1lKCkgIT09IGZpbHRlci52YWx1ZSA6IGVudGl0eS5nZXROYW1lKCkgPT09IGZpbHRlci52YWx1ZVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgJ20nOiAvLyBCZWRyb2NrXG4gICAgICAgICAgICBjYXNlICdnYW1lbW9kZSc6IC8vIEphdmFcbiAgICAgICAgICAgICAgICB0YXJnZXRzID0gdGFyZ2V0cy5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgIChlbnRpdHkpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICBlbnRpdHkuaXNQbGF5ZXIoKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgKGZpbHRlci5yZXZlcnNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBnZXRHYW1ldHlwZU5hbWUoKGVudGl0eSBhcyBQbGF5ZXIpLmdhbWVtb2RlKS50b0xvd2VyQ2FzZSgpICE9PSBmaWx0ZXIudmFsdWUudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZ2V0R2FtZXR5cGVOYW1lKChlbnRpdHkgYXMgUGxheWVyKS5nYW1lbW9kZSkudG9Mb3dlckNhc2UoKSA9PT0gZmlsdGVyLnZhbHVlLnRvTG93ZXJDYXNlKCkpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSAnc29ydCc6XG4gICAgICAgICAgICAgICAgc29ydCA9IGZpbHRlci52YWx1ZSBhcyBhbnk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgJ2MnOiAvLyBCZWRyb2NrXG4gICAgICAgICAgICBjYXNlICdsaW1pdCc6IC8vIEphdmFcbiAgICAgICAgICAgICAgICBsaW1pdCA9IE51bWJlci5wYXJzZUludChmaWx0ZXIudmFsdWUgYXMgYW55LCAxMCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHN3aXRjaCAoc29ydCkge1xuICAgICAgICBjYXNlICduZWFyZXN0JzpcbiAgICAgICAgICAgIHRhcmdldHMgPSBzb3VyY2UuZ2V0TmVhcmVzdEVudGl0eSh0YXJnZXRzLmZpbHRlcigoZW50aXR5KSA9PiBlbnRpdHkuaXNQbGF5ZXIoKSkpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3JhbmRvbSc6XG4gICAgICAgICAgICAvLyBGSVhNRTogcmVzcGVjdCBsaW1pdCBmaWx0ZXJcbiAgICAgICAgICAgIHRhcmdldHMgPSBbdGFyZ2V0c1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiB0YXJnZXRzLmxlbmd0aCldIV07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgLy8gVE9ETzogY2FzZSAnYXJiaXRyYXJ5JzpcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHRhcmdldHMgPSB0YXJnZXRzLnNsaWNlKDAsIGxpbWl0KTtcbiAgICBpZiAodGFyZ2V0cy5sZW5ndGggPD0gMCkgdGhyb3cgbmV3IEVycm9yKCdubyByZXN1bHRzJyk7XG4gICAgcmV0dXJuIHRhcmdldHM7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBQYXJzZVRhcmdldFNlbGVjdG9yO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUEwQkEsSUFBTSx1QkFBdUIsRUFDekIsT0FDQSxVQUNBLGFBS1k7Q0FDWixJQUFJLENBQUMsTUFBTSxXQUFXLEdBQUcsR0FBRyxNQUFNLElBQUksTUFBTSxpQ0FBK0I7Q0FFM0UsSUFBSSxVQUFvQjtDQUd4QixNQUFNLE1BQU0sTUFBTSxNQUFNLEdBQUcsTUFBTSxNQUFNO0NBR3ZDLE1BQU0sT0FBb0MsSUFBSSxNQUFNLEdBQUcsRUFBRTtDQUl6RCxNQUFNLE9BQ0YsSUFDSyxNQUFNLEdBQUcsRUFBRSxJQUNWLE1BQU0sR0FBRyxFQUFFLEdBQ1osTUFBTSxHQUFHLEVBQ1QsS0FBSyxTQUFTO0VBQ1gsVUFBVSxJQUFJLE1BQU0sR0FBRyxFQUFFO0VBQ3pCLE9BQU8sSUFBSSxNQUFNLEdBQUcsRUFBRSxHQUFJLFFBQVEsS0FBSyxFQUFFO0VBQ3pDLFNBQVMsSUFBSSxNQUFNLEdBQUcsRUFBRSxHQUFJLFdBQVcsR0FBRztDQUM5QyxFQUFFLEtBQUssQ0FBQztDQUdoQixJQUFJLFFBQVEsT0FBTyxrQkFDZjtDQUdKLFFBQVEsTUFBUjtFQUNJLEtBQUs7R0FDRCxVQUFVLFFBQVEsUUFBUSxXQUFXLE9BQU8sU0FBUyxDQUFDO0dBQ3RELE9BQU87R0FDUDtFQUNKLEtBQUs7R0FDRCxPQUFPO0dBQ1A7RUFDSixLQUFLO0dBQ0QsUUFBUTtHQUNSLE9BQU87R0FDUDtFQUNKLEtBQUs7R0FDRCxRQUFRO0dBQ1IsT0FBTztHQUNQO0VBQ0osS0FBSztHQUNELFFBQVE7R0FDUixPQUFPO0dBQ1AsVUFBVSxDQUFDLE1BQU07R0FDakI7RUFDSixTQUNJLE1BQU0sSUFBSSxNQUFNLFNBQVMsS0FBSyxpREFBaUQ7Q0FDdkY7Q0FFQSxLQUFLLFNBQVMsV0FBVztFQUNyQixRQUFRLE9BQU8sVUFBZjtHQUNJLEtBQUs7SUFDRCxJQUFJLE9BQU8sTUFBTSxNQUFNLEdBQUcsRUFBRSxXQUFXLEdBQ25DLFVBQVUsUUFBUSxRQUFRLFdBQ3RCLE9BQU8sVUFDRCxPQUFPLFFBQVEsRUFBRSxNQUFNLEdBQUcsRUFBRSxPQUFPLE9BQU8sUUFDMUMsT0FBTyxRQUFRLEVBQUUsTUFBTSxHQUFHLEVBQUUsT0FBTyxPQUFPLEtBQ3BEO1NBRUEsVUFBVSxRQUFRLFFBQVEsV0FDdEIsT0FBTyxVQUFVLE9BQU8sUUFBUSxNQUFNLE9BQU8sUUFBUSxPQUFPLFFBQVEsTUFBTSxPQUFPLEtBQ3JGO0lBQ0o7R0FFSixLQUFLO0lBQ0QsVUFBVSxRQUFRLFFBQVEsV0FDdEIsT0FBTyxVQUFVLE9BQU8sUUFBUSxNQUFNLE9BQU8sUUFBUSxPQUFPLFFBQVEsTUFBTSxPQUFPLEtBQ3JGO0lBQ0E7R0FFSixLQUFLO0dBQ0wsS0FBSztJQUNELFVBQVUsUUFBUSxRQUNiLFdBQ0csT0FBTyxTQUFTLE1BQ2YsT0FBTyxVQUNGLGdCQUFpQixPQUFrQixRQUFRLEVBQUUsWUFBWSxNQUFNLE9BQU8sTUFBTSxZQUFZLElBQ3hGLGdCQUFpQixPQUFrQixRQUFRLEVBQUUsWUFBWSxNQUFNLE9BQU8sTUFBTSxZQUFZLEVBQ3RHO0lBQ0E7R0FFSixLQUFLO0lBQ0QsT0FBTyxPQUFPO0lBQ2Q7R0FFSixLQUFLO0dBQ0wsS0FBSztJQUNELFFBQVEsT0FBTyxTQUFTLE9BQU8sT0FBYyxFQUFFO0lBQy9DO0dBRUosU0FDSTtFQUNSO0NBQ0osQ0FBQztDQUVELFFBQVEsTUFBUjtFQUNJLEtBQUs7R0FDRCxVQUFVLE9BQU8saUJBQWlCLFFBQVEsUUFBUSxXQUFXLE9BQU8sU0FBUyxDQUFDLENBQUM7R0FDL0U7RUFDSixLQUFLO0dBRUQsVUFBVSxDQUFDLFFBQVEsS0FBSyxNQUFNLEtBQUssT0FBTyxJQUFJLFFBQVEsTUFBTSxFQUFHO0dBQy9EO0VBRUosU0FDSTtDQUNSO0NBRUEsVUFBVSxRQUFRLE1BQU0sR0FBRyxLQUFLO0NBQ2hDLElBQUksUUFBUSxVQUFVLEdBQUcsTUFBTSxJQUFJLE1BQU0sWUFBWTtDQUNyRCxPQUFPO0FBQ1gifQ==