UNPKG

ts3-nodejs-library

Version:
709 lines 28.6 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Command = void 0; const ResponseError_1 = require("../exception/ResponseError"); class Command { constructor() { this.requestParser = Command.getParsers().request; this.responseParser = Command.getParsers().response; this.cmd = ""; this.options = {}; this.multiOpts = []; this.flags = []; this.response = []; this.error = null; this.stack = new Error().stack; } /** Initializes the Respone with default values */ reset() { this.response = []; this.error = null; return this; } /** Sets the main command to send */ setCommand(cmd) { this.cmd = cmd.trim(); return this; } /** * Sets the TeamSpeak Key Value Pairs * @param opts sets the Object with the key value pairs which should get sent to the TeamSpeak Query */ setOptions(options) { this.options = options; return this; } /** * retrieves the current set options for this command */ getOptions() { return this.options; } /** * Sets the TeamSpeak Key Value Pairs * @param opts sets the Object with the key value pairs which should get sent to the TeamSpeak Query */ setMultiOptions(options) { this.multiOpts = options; return this; } /** * adds a customparser * @param parsers */ setParser(parsers) { const { response, request } = parsers(Command.getParsers()); this.requestParser = request; this.responseParser = response; return this; } /** checks wether there are options used with this command */ hasOptions() { return Object.values(this.options).length > 0 || this.hasMultiOptions(); } /** checks wether there are options used with this command */ hasMultiOptions() { return this.multiOpts.length > 0; } /** * set TeamSpeak flags * @param flags sets the flags which should get sent to the teamspeak query */ setFlags(flags) { this.flags = flags .filter(flag => ["string", "number"].includes(typeof flag)) .map(flag => String(flag)); return this; } /** checks wether there are flags used with this command */ hasFlags() { return this.flags.length > 0; } /** * set the Line which has been received from the TeamSpeak Query * @param line the line which has been received from the teamSpeak query */ setResponse(line) { this.response = this.parse(line); return this; } /** * Set the error line which has been received from the TeamSpeak Query * @param error the error line which has been received from the TeamSpeak Query */ setError(raw) { this.error = Command.parse({ raw })[0]; return this; } /** get the parsed error object which has been received from the TeamSpeak Query */ getError() { if (!this.hasError()) return null; return new ResponseError_1.ResponseError(this.error, this.stack); } /** checks if a error has been received */ hasError() { return (this.error !== null && typeof this.error === "object" && typeof this.error.id === "string" && this.error.id !== "0"); } /** get the parsed response object which has been received from the TeamSpeak Query */ getResponse() { return this.response; } /** runs the parser of this instance */ parse(raw) { return this.responseParser({ raw, cmd: Command }); } /** runs the parser of this instance */ build() { return this.requestParser(this); } /** * retrieves the default parsers */ static getParsers() { return { response: Command.parse, request: Command.build }; } /** * parses a snapshot create request * @param param0 the custom snapshot response parser */ static parseSnapshotCreate({ raw }) { const version = raw.match(/version=(\d+)/); if (!version) throw new Error("unable to detect snapshot version"); switch (version[1]) { case "2": return (() => { const [data, snapshot] = raw.split("|"); return [{ ...Command.parse({ raw: data })[0], snapshot }]; })(); case "3": return (() => { const { salt, data } = Command.parse({ raw })[0]; return [{ version: "3", salt, snapshot: data }]; })(); default: throw new Error(`unsupported snapshot version: ${version[1]}`); } } /** * the custom snapshot request parser * @param data snapshot string * @param cmd command object */ static buildSnapshotDeploy(data, cmd, { version }, snapshotVersion = "0") { if ((snapshotVersion === "0" && Command.minVersion("3.12.0", version)) || snapshotVersion === "3") { cmd.setOptions({ ...cmd.getOptions(), version: "3", data }); return Command.build(cmd); } else if ((snapshotVersion === "0" && Command.minVersion("3.10.0", version)) || snapshotVersion === "2") { cmd.setOptions({ ...cmd.getOptions(), version: "2" }); return [Command.build(cmd), data].join("|"); } else { throw new Error(`unsupported teamspeak version (${version}) or snapshot version (${snapshotVersion})`); } } /** * checks if a version string has a minimum of x * @param minimum minimum the version string should have * @param version version string to compare */ static minVersion(minimum, version) { const v = version.split(".").map(n => parseInt(n, 10)); return minimum .split(".") .map(n => parseInt(n, 10)) .every((n, index) => n <= v[index]); } /** * parses a query response * @param data the query response received */ static parse({ raw }) { return raw .split("|") .map(entry => { const res = {}; entry.split(" ").forEach(str => { const { key, value } = Command.getKeyValue(str); res[key] = Command.parseValue(key, value); }); return res; }) .map((entry, _, original) => ({ ...original[0], ...entry })); } /** * Checks if a error has been received * @return The parsed String which is readable by the TeamSpeak Query */ static build(command) { let cmd = Command.escape(command.cmd); if (command.hasFlags()) cmd += ` ${command.buildFlags()}`; if (command.hasOptions()) cmd += ` ${command.buildOptions()}`; return cmd; } /** * builds the query string for options * @return the parsed String which is readable by the TeamSpeak Querytt */ buildOptions() { const options = this.buildOption(this.options); if (!this.hasMultiOptions()) return options; return `${options} ${this.multiOpts.map(this.buildOption.bind(this)).join("|")}`; } /** builds the query string for options */ buildOption(options) { return Object .keys(options) .filter(key => ![undefined, null].includes(options[key])) .filter(key => typeof options[key] !== "number" || !isNaN(options[key])) .map(key => Command.escapeKeyValue(key, options[key])) .join(" "); } /** builds the query string for flags */ buildFlags() { return this.flags.map(f => Command.escape(f)).join(" "); } /** * escapes a key value pair * @param {string} key the key used * @param {string|string[]} value the value or an array of values * @return the parsed String which is readable by the TeamSpeak Query */ static escapeKeyValue(key, value) { key = Command.toSnakeCase(key); if (typeof value === "boolean") value = value ? "1" : "0"; if (Array.isArray(value)) { return value.map(v => `${Command.escape(key)}=${Command.escape(v)}`).join("|"); } else { return `${Command.escape(key)}=${Command.escape(value)}`; } } /** * retrieves the key value pair from a string * @param str the key value pair to unescape eg foo=bar */ static getKeyValue(str) { const index = str.indexOf("="); if (index === -1) return { key: Command.toCamelCase(str), value: undefined }; const value = str.substring(index + 1); return { key: Command.toCamelCase(str.substring(0, index)), value: value === "" ? undefined : value }; } /** * Parses a value to the type which the key represents * @param k the key which should get looked up * @param v the value which should get parsed */ static parseValue(k, v) { if (v === undefined) return undefined; if (Object.keys(Command.Identifier).includes(k)) { return Command.Identifier[k](v); } else { return this.parseString(v); } } /** * parses a number * @param value string to parse */ static parseBoolean(value) { return Command.parseNumber(value) === 1; } /** * parses a string value * @param value string to parse */ static parseString(value) { return Command.unescape(value); } static parseRecursive(value) { return Command.parse({ raw: Command.unescape(value) }); } /** * parses a string array * @param value string to parse */ static parseStringArray(value) { return value.split(",").map(v => Command.parseString(v)); } /** * parses a number * @param value string to parse */ static parseNumber(value) { return parseFloat(value); } /** * parses a number array * @param value string to parse */ static parseNumberArray(value) { return value.split(",").map(v => Command.parseNumber(v)); } /** unescapes a string */ static unescape(str) { return String(str) .replace(/\\s/g, " ") .replace(/\\p/g, "|") .replace(/\\n/g, "\n") .replace(/\\f/g, "\f") .replace(/\\r/g, "\r") .replace(/\\t/g, "\t") .replace(/\\v/g, "\v") .replace(/\\\//g, "/") .replace(/\\\\/g, "\\"); } /** escapes a string */ static escape(str) { return String(str) .replace(/\\/g, "\\\\") .replace(/\//g, "\\/") .replace(/\|/g, "\\p") .replace(/\n/g, "\\n") .replace(/\r/g, "\\r") .replace(/\t/g, "\\t") .replace(/\v/g, "\\v") .replace(/\f/g, "\\f") .replace(/ /g, "\\s"); } /** converts a string to camel case */ static toCamelCase(str) { let toUpper = false; return str.split("").map(char => { if (char === Command.SNAKE_CASE_IDENTIFIER) { toUpper = true; return ""; } else if (toUpper) { toUpper = false; return char.toUpperCase(); } else { return char; } }).join(""); } /** converts a string to snake case */ static toSnakeCase(str) { return str.split("").map(char => { const lower = char.toLowerCase(); if (char !== lower) return `${Command.SNAKE_CASE_IDENTIFIER}${lower}`; return char; }).join(""); } } exports.Command = Command; Command.SNAKE_CASE_IDENTIFIER = "_"; (function (Command) { Command.Identifier = { sid: Command.parseString, serverId: Command.parseString, virtualserverNickname: Command.parseString, virtualserverUniqueIdentifier: Command.parseString, virtualserverName: Command.parseString, virtualserverWelcomemessage: Command.parseString, virtualserverPlatform: Command.parseString, virtualserverVersion: Command.parseString, virtualserverMaxclients: Command.parseNumber, virtualserverPassword: Command.parseString, virtualserverClientsonline: Command.parseNumber, virtualserverChannelsonline: Command.parseNumber, virtualserverCreated: Command.parseNumber, virtualserverUptime: Command.parseNumber, virtualserverCodecEncryptionMode: Command.parseNumber, virtualserverHostmessage: Command.parseString, virtualserverHostmessageMode: Command.parseNumber, virtualserverFilebase: Command.parseString, virtualserverDefaultServerGroup: Command.parseString, virtualserverDefaultChannelGroup: Command.parseString, virtualserverFlagPassword: Command.parseBoolean, virtualserverDefaultChannelAdminGroup: Command.parseString, virtualserverMaxDownloadTotalBandwidth: Command.parseNumber, virtualserverMaxUploadTotalBandwidth: Command.parseNumber, virtualserverHostbannerUrl: Command.parseString, virtualserverHostbannerGfxUrl: Command.parseString, virtualserverHostbannerGfxInterval: Command.parseNumber, virtualserverComplainAutobanCount: Command.parseNumber, virtualserverComplainAutobanTime: Command.parseNumber, virtualserverComplainRemoveTime: Command.parseNumber, virtualserverMinClientsInChannelBeforeForcedSilence: Command.parseNumber, virtualserverPrioritySpeakerDimmModificator: Command.parseNumber, virtualserverId: Command.parseString, virtualserverAntifloodPointsNeededPluginBlock: Command.parseNumber, virtualserverAntifloodPointsTickReduce: Command.parseNumber, virtualserverAntifloodPointsNeededCommandBlock: Command.parseNumber, virtualserverAntifloodPointsNeededIpBlock: Command.parseNumber, virtualserverClientConnections: Command.parseNumber, virtualserverQueryClientConnections: Command.parseNumber, virtualserverHostbuttonTooltip: Command.parseString, virtualserverHostbuttonUrl: Command.parseString, virtualserverHostbuttonGfxUrl: Command.parseString, virtualserverQueryclientsonline: Command.parseNumber, virtualserverDownloadQuota: Command.parseNumber, virtualserverUploadQuota: Command.parseNumber, virtualserverMonthBytesDownloaded: Command.parseNumber, virtualserverMonthBytesUploaded: Command.parseNumber, virtualserverTotalBytesDownloaded: Command.parseNumber, virtualserverTotalBytesUploaded: Command.parseNumber, virtualserverPort: Command.parseNumber, virtualserverAutostart: Command.parseNumber, virtualserverMachineId: Command.parseString, virtualserverNeededIdentitySecurityLevel: Command.parseNumber, virtualserverLogClient: Command.parseNumber, virtualserverLogQuery: Command.parseNumber, virtualserverLogChannel: Command.parseNumber, virtualserverLogPermissions: Command.parseNumber, virtualserverLogServer: Command.parseNumber, virtualserverLogFiletransfer: Command.parseNumber, virtualserverMinClientVersion: Command.parseNumber, virtualserverNamePhonetic: Command.parseString, virtualserverIconId: Command.parseString, virtualserverReservedSlots: Command.parseNumber, virtualserverTotalPacketlossSpeech: Command.parseNumber, virtualserverTotalPacketlossKeepalive: Command.parseNumber, virtualserverTotalPacketlossControl: Command.parseNumber, virtualserverTotalPacketlossTotal: Command.parseNumber, virtualserverTotalPing: Command.parseNumber, virtualserverIp: Command.parseStringArray, virtualserverWeblistEnabled: Command.parseNumber, virtualserverAskForPrivilegekey: Command.parseNumber, virtualserverHostbannerMode: Command.parseNumber, virtualserverChannelTempDeleteDelayDefault: Command.parseNumber, virtualserverMinAndroidVersion: Command.parseNumber, virtualserverMinIosVersion: Command.parseNumber, virtualserverStatus: Command.parseString, connectionFiletransferBandwidthSent: Command.parseNumber, connectionFiletransferBandwidthReceived: Command.parseNumber, connectionFiletransferBytesSentTotal: Command.parseNumber, connectionFiletransferBytesReceivedTotal: Command.parseNumber, connectionPacketsSentSpeech: Command.parseNumber, connectionBytesSentSpeech: Command.parseNumber, connectionPacketsReceivedSpeech: Command.parseNumber, connectionBytesReceivedSpeech: Command.parseNumber, connectionPacketsSentKeepalive: Command.parseNumber, connectionBytesSentKeepalive: Command.parseNumber, connectionPacketsReceivedKeepalive: Command.parseNumber, connectionBytesReceivedKeepalive: Command.parseNumber, connectionPacketsSentControl: Command.parseNumber, connectionBytesSentControl: Command.parseNumber, connectionPacketsReceivedControl: Command.parseNumber, connectionBytesReceivedControl: Command.parseNumber, connectionPacketsSentTotal: Command.parseNumber, connectionBytesSentTotal: Command.parseNumber, connectionPacketsReceivedTotal: Command.parseNumber, connectionBytesReceivedTotal: Command.parseNumber, connectionBandwidthSentLastSecondTotal: Command.parseNumber, connectionBandwidthSentLastMinuteTotal: Command.parseNumber, connectionBandwidthReceivedLastSecondTotal: Command.parseNumber, connectionBandwidthReceivedLastMinuteTotal: Command.parseNumber, connectionPacketlossTotal: Command.parseNumber, connectionPing: Command.parseNumber, clid: Command.parseString, clientId: Command.parseString, cldbid: Command.parseString, clientDatabaseId: Command.parseString, clientChannelId: Command.parseString, clientOriginServerId: Command.parseString, clientNickname: Command.parseString, clientType: Command.parseNumber, clientAway: Command.parseBoolean, clientAwayMessage: Command.parseString, clientFlagTalking: Command.parseBoolean, clientInputMuted: Command.parseBoolean, clientOutputMuted: Command.parseBoolean, clientInputHardware: Command.parseBoolean, clientOutputHardware: Command.parseBoolean, clientTalkPower: Command.parseNumber, clientIsTalker: Command.parseBoolean, clientIsPrioritySpeaker: Command.parseNumber, clientIsRecording: Command.parseBoolean, clientIsChannelCommander: Command.parseBoolean, clientUniqueIdentifier: Command.parseString, clientServergroups: Command.parseStringArray, clientChannelGroupId: Command.parseString, clientChannelGroupInheritedChannelId: Command.parseString, clientVersion: Command.parseString, clientPlatform: Command.parseString, clientIdleTime: Command.parseNumber, clientCreated: Command.parseNumber, clientLastconnected: Command.parseNumber, clientIconId: Command.parseString, clientCountry: Command.parseString, clientEstimatedLocation: Command.parseString, clientOutputonlyMuted: Command.parseNumber, clientDefaultChannel: Command.parseString, clientMetaData: Command.parseString, clientVersionSign: Command.parseString, clientSecurityHash: Command.parseString, clientLoginName: Command.parseString, clientLoginPassword: Command.parseString, clientTotalconnections: Command.parseNumber, clientFlagAvatar: Command.parseString, clientTalkRequest: Command.parseNumber, clientTalkRequestMsg: Command.parseString, clientMonthBytesUploaded: Command.parseNumber, clientMonthBytesDownloaded: Command.parseNumber, clientTotalBytesUploaded: Command.parseNumber, clientTotalBytesDownloaded: Command.parseNumber, clientNicknamePhonetic: Command.parseString, clientDefaultToken: Command.parseString, clientBadges: Command.parseString, clientBase64HashClientUID: Command.parseString, connectionConnectedTime: Command.parseNumber, connectionClientIp: Command.parseString, clientMyteamspeakId: Command.parseString, clientIntegrations: Command.parseString, clientDescription: Command.parseString, clientNeededServerqueryViewPower: Command.parseNumber, clientMyteamspeakAvatar: Command.parseString, clientSignedBadges: Command.parseString, clientLastip: Command.parseString, cid: Command.parseString, pid: Command.parseString, cpid: Command.parseString, order: Command.parseNumber, channelOrder: Command.parseNumber, channelName: Command.parseString, channelPassword: Command.parseString, channelDescription: Command.parseString, channelTopic: Command.parseString, channelFlagDefault: Command.parseBoolean, channelFlagPassword: Command.parseBoolean, channelFlagPermanent: Command.parseBoolean, channelFlagSemiPermanent: Command.parseBoolean, channelFlagTemporary: Command.parseBoolean, channelCodec: Command.parseNumber, channelCodecQuality: Command.parseNumber, channelNeededTalkPower: Command.parseNumber, channelIconId: Command.parseString, totalClientsFamily: Command.parseNumber, channelMaxclients: Command.parseNumber, channelMaxfamilyclients: Command.parseNumber, totalClients: Command.parseNumber, channelNeededSubscribePower: Command.parseNumber, channelCodecLatencyFactor: Command.parseNumber, channelCodecIsUnencrypted: Command.parseNumber, channelSecuritySalt: Command.parseString, channelDeleteDelay: Command.parseNumber, channelFlagMaxclientsUnlimited: Command.parseBoolean, channelFlagMaxfamilyclientsUnlimited: Command.parseBoolean, channelFlagMaxfamilyclientsInherited: Command.parseBoolean, channelFilepath: Command.parseString, channelForcedSilence: Command.parseNumber, channelNamePhonetic: Command.parseString, channelFlagPrivate: Command.parseBoolean, channelBannerGfxUrl: Command.parseString, channelBannerMode: Command.parseNumber, secondsEmpty: Command.parseNumber, cgid: Command.parseString, sgid: Command.parseString, permid: Command.parseString, permvalue: Command.parseNumber, permnegated: Command.parseBoolean, permskip: Command.parseBoolean, permsid: Command.parseString, t: Command.parseNumber, id1: Command.parseString, id2: Command.parseString, p: Command.parseNumber, v: Command.parseNumber, n: Command.parseNumber, s: Command.parseNumber, reasonid: Command.parseString, reasonmsg: Command.parseString, ctid: Command.parseString, cfid: Command.parseString, targetmode: Command.parseNumber, target: Command.parseNumber, invokerid: Command.parseString, invokername: Command.parseString, invokeruid: Command.parseString, hash: Command.parseString, lastPos: Command.parseNumber, fileSize: Command.parseNumber, l: Command.parseString, path: Command.parseString, size: Command.parseNumber, clientftfid: Command.parseString, serverftfid: Command.parseString, currentSpeed: Command.parseNumber, averageSpeed: Command.parseNumber, runtime: Command.parseNumber, sizedone: Command.parseNumber, sender: Command.parseNumber, status: Command.parseNumber, ftkey: Command.parseString, port: Command.parseNumber, proto: Command.parseNumber, datetime: Command.parseNumber, hostTimestampUtc: Command.parseNumber, instanceUptime: Command.parseNumber, virtualserversRunningTotal: Command.parseNumber, virtualserversTotalChannelsOnline: Command.parseNumber, virtualserversTotalClientsOnline: Command.parseNumber, virtualserversTotalMaxclients: Command.parseNumber, serverinstanceDatabaseVersion: Command.parseNumber, serverinstanceFiletransferPort: Command.parseNumber, serverinstanceServerqueryMaxConnectionsPerIp: Command.parseNumber, serverinstanceMaxDownloadTotalBandwidth: Command.parseNumber, serverinstanceMaxUploadTotalBandwidth: Command.parseNumber, serverinstanceGuestServerqueryGroup: Command.parseNumber, serverinstancePendingConnectionsPerIp: Command.parseNumber, serverinstancePermissionsVersion: Command.parseNumber, serverinstanceServerqueryFloodBanTime: Command.parseNumber, serverinstanceServerqueryFloodCommands: Command.parseNumber, serverinstanceServerqueryFloodTime: Command.parseNumber, serverinstanceTemplateChanneladminGroup: Command.parseString, serverinstanceTemplateChanneldefaultGroup: Command.parseString, serverinstanceTemplateServeradminGroup: Command.parseNumber, serverinstanceTemplateServerdefaultGroup: Command.parseString, msgid: Command.parseString, timestamp: Command.parseNumber, cluid: Command.parseString, subject: Command.parseString, message: Command.parseString, version: Command.parseString, build: Command.parseNumber, platform: Command.parseString, name: Command.parseString, token: Command.parseString, tokencustomset: Command.parseRecursive, value: Command.parseString, banid: Command.parseString, id: Command.parseString, msg: Command.parseString, extraMsg: Command.parseString, failedPermid: Command.parseString, ident: Command.parseString, ip: Command.parseString, nickname: Command.parseString, uid: Command.parseString, desc: Command.parseString, pwClear: Command.parseString, start: Command.parseNumber, end: Command.parseNumber, tcid: Command.parseString, permname: Command.parseString, permdesc: Command.parseString, tokenType: Command.parseNumber, tokenCustomset: Command.parseRecursive, token1: Command.parseString, token2: Command.parseString, tokenId1: Command.parseString, tokenId2: Command.parseString, tokenCreated: Command.parseNumber, tokenDescription: Command.parseString, flagRead: Command.parseBoolean, tcldbid: Command.parseString, tname: Command.parseString, fcldbid: Command.parseString, fname: Command.parseString, mytsid: Command.parseString, lastnickname: Command.parseString, created: Command.parseNumber, duration: Command.parseNumber, invokercldbid: Command.parseString, enforcements: Command.parseNumber, reason: Command.parseString, type: Command.parseNumber, iconid: Command.parseString, savedb: Command.parseNumber, namemode: Command.parseNumber, nModifyp: Command.parseNumber, nMemberAddp: Command.parseNumber, nMemberRemovep: Command.parseNumber, sortid: Command.parseString, count: Command.parseNumber, salt: Command.parseString, snapshot: Command.parseString, apikey: Command.parseString, scope: Command.parseString, timeLeft: Command.parseNumber, createdAt: Command.parseNumber, expiresAt: Command.parseNumber }; })(Command || (exports.Command = Command = {})); //# sourceMappingURL=Command.js.map