@jsprismarine/prismarine
Version:
Dedicated Minecraft Bedrock Edition server written in TypeScript
98 lines (97 loc) • 12.3 kB
JavaScript
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==