steam-user
Version:
Steam client for Individual and AnonUser Steam account types
118 lines (101 loc) • 3.4 kB
JavaScript
const StdLib = require('@doctormckay/stdlib');
const SteamID = require('steamid');
const Helpers = require('./helpers.js');
const EMsg = require('../enums/EMsg.js');
const SteamUserGameCoordinator = require('./gamecoordinator.js');
class SteamUserGameServers extends SteamUserGameCoordinator {
/**
* 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}
*/
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
};
})
});
});
});
}
/**
* Get a list of servers including game data.
* @param {string} filter - A filter string (https://mckay.media/hEW8A)
* @param {int} [limit] - Limit how many servers may be returned. Current maximum appears to be 20,000.
* @param {function} [callback]
* @return {Promise}
*/
getServerList(filter, limit, callback) {
return StdLib.Promises.timeoutCallbackPromise(30000, ['servers'], callback, (resolve, reject) => {
this._sendUnified('GameServers.GetServerList#1', {filter, limit}, (body) => {
resolve({
servers: (body.servers || []).map((server) => {
try {
server.steamid = new SteamID(server.steamid.toString());
} catch (e) {
// don't care
}
return server;
})
});
});
});
}
/**
* Get the associated SteamIDs for given server IPs.
* @param {string[]} ips
* @param {function} [callback]
*/
getServerSteamIDsByIP(ips, callback) {
return StdLib.Promises.timeoutCallbackPromise(10000, ['servers'], callback, (resolve, reject) => {
this._sendUnified('GameServers.GetServerSteamIDsByIP#1', {
server_ips: ips
}, (body) => {
let servers = {};
(body.servers || []).forEach((server) => {
servers[server.addr] = new SteamID(server.steamid.toString());
});
resolve({servers});
});
});
}
/**
* Get the associated IPs for given server SteamIDs.
* @param {string[]|SteamID[]} steamids
* @param {function} [callback]
* @return {Promise}
*/
getServerIPsBySteamID(steamids, callback) {
return StdLib.Promises.timeoutCallbackPromise(10000, ['servers'], callback, (resolve, reject) => {
steamids = steamids.map(Helpers.steamID);
this._sendUnified('GameServers.GetServerIPsBySteamID#1', {
server_steamids: steamids
}, (body) => {
let servers = {};
(body.servers || []).forEach((server) => {
servers[server.steamid.toString()] = server.addr;
});
resolve({servers});
});
});
}
}
module.exports = SteamUserGameServers;