serverQuery(conditions, callback) {
		if (typeof conditions === 'string') {
			conditions = {filter_text: conditions};
		}

		if (conditions.geo_location_ip) {
			conditions.geo_location_ip = StdLib.IPv4.stringToInt(conditions.geo_location_ip);
		}

		return StdLib.Promises.timeoutCallbackPromise(30000, ['servers'], callback, (resolve, reject) => {
			this._send(EMsg.ClientGMSServerQuery, conditions, function(body) {
				if (body.error) {
					reject(new Error(body.error));
					return;
				}

				// TODO add ipv6 support someday
				resolve({
					servers: (body.servers || []).filter(server => server.server_ip && server.server_ip.v4).map((server) => {
						return {
							ip: StdLib.IPv4.intToString(server.server_ip),
							port: server.server_port,
							players: server.auth_players
						};
					})
				});
			});
		});
	}
Query the GMS for a list of game server IPs, and their current player counts.
@param {(string|{[filter_text], [geo_location_ip]})} conditions - A filter string (https://mckay.media/hEW8A) or object
@param {function} [callback]
@return {Promise}