Source: index.js

'use strict';

const Promise  = require('bluebird');
const handlers = require('./handlers');
const Sign     = require('./lib/sign');
const ask      = require('./lib/ask');

/**
 * API client constructor
 * @param {Object} [params]
 * @param {String} [params.keyPub=test]                   Public API key
 * @param {String} [params.keyPriv=test]                  Private API key
 * @param {String} [params.api=http://api.survarium.com/] API address
 * @param {Object} [options]
 * @param {Number} [options.retries]                      Amount of retries
 * @constructor
*/
var Api = function (params, options) {
	params = params || {};
	this.options = options || {};
	this.keyPub  = params.keyPub  || 'test';
	this.keyPriv = params.keyPriv || 'test';
	this.api     = params.api     || 'http://api.survarium.com/';

	this.__handlers = handlers;

	this._sign = new Sign({ keyPriv: this.keyPriv, keyPub: this.keyPub });
};

/**
 * Query executor
 * @param {String} method           API method name
 * @param {Object} [args]           Execution arguments
 * @param {Object} [args.0]         API query params
 * @param {Object} [args.1]         Quering options
 * @param {Object} [args.1.delay]   delay in ms before executing query
 * @returns {function(ask)}
 * @private
 */
Api.prototype.wrap = function (method, args) {
	var params  = args[0];
	var options = args[1] || {};
	var exec = function () {
		return this.__handlers[method].call(this, params).then(ask.bind(this));
	};
	if (options.delay) {
		return Promise.delay(options.delay).then(exec.bind(this));
	}
	return exec.call(this);
};

/**
 * Получить последний сыгранный в Survarium match_id.
 *
 * Return max match_id played in Survarium.
 *
 * param pid - not implemented and hasn't been ported // TODO: investigate getMaxMatchId(pid)
 * @returns {Promise}
*/
Api.prototype.getMaxMatchId = function () {
	return this.wrap.call(this, 'getMaxMatchId', arguments);
};

/**
 * Получить PID игрока по его никнейму.
 *
 * Return users public account id by nickname.
 *
 * @param   {Object}  params
 * @param   {String}  params.nickname Player nickname
 * @returns {Promise}
 */
Api.prototype.getPublicIdByNickname = function (params) {
	return this.wrap.call(this, 'getPublicIdByNickname', arguments);
};

/**
 * Получить список никнеймов по массиву PID.
 *
 * Return bunch of nicknames by array of public account ids.
 *
 * @param   {Object}       params
 * @param   {Array|String} params.pids Array of public ids or one PID
 * @returns {Promise}
 */
Api.prototype.getNicknamesByPublicIds = function (params) {
	return this.wrap.call(this, 'getNicknamesByPublicIds', arguments);
};

/**
 * Получить суммарное количество сыгранных матчей указанным PID.
 *
 * Retrieve amount of played matches by user whose public account Id equals pid.
 *
 * @param   {Object}  params
 * @param   {String}  params.pid  Public player ID
 * @returns {Promise}
 */
Api.prototype.matchesCountByPublicId = function (params) {
	return this.wrap.call(this, 'matchesCountByPublicId', arguments);
};

/**
 * Получить paginated список сыгранных матчей по PID игрока.
 *
 * Return particular amount of played matches of user with public account id = pid.
 *
 * @param   {Object}  params
 * @param   {String}  params.pid                 Public player ID
 * @param   {Number}  [params.matchAmount=10]    Amount of matches to return (limited by 25)
 * @param   {Number}  [params.offset=0]          Amount of entries to skip
 * @returns {Promise}
 */
Api.prototype.getMatchesIdByPublicId = function (params) {
	return this.wrap.call(this, 'getMatchesIdByPublicId', arguments);
};

/**
 * Получить статистику матча по его ID.
 *
 * Return statistic of particular match by match_id.
 *
 * @param   {Object}   params
 * @param   {Number}   params.id                   Match ID
 * @param   {String}   [params.language=english]   Results language
 * @returns {Promise}
 */
Api.prototype.getMatchStatistic = function (params) {
	return this.wrap.call(this, 'getMatchStatistic', arguments);
};

/**
 * Получить информацию об игроке: рейтинг, инвентарь по PID.
 *
 * Return all user data: rating, inventory.
 *
 * @param   {Object}   params
 * @param   {String}   params.pid                  Player ID
 * @param   {String}   [params.language=english]   Results language
 * @returns {Promise}
 */
Api.prototype.getUserData = function (params) {
	return this.wrap.call(this, 'getUserData', arguments);
};

/**
 * Получить информацию о прокачке игрока.
 *
 * Return user skill points.
 *
 * @param   {Object}   params
 * @param   {String}   params.pid                  Player ID
 * @returns {Promise}
 */
Api.prototype.getUserSkills = function (params) {
	return this.wrap.call(this, 'getUserSkills', arguments);
};

/**
 * Получить количество активных кланов в Survarium.
 *
 * Return amount of active clans in Survarium.
 * @returns {Promise}
 */
Api.prototype.getClanAmounts = function () {
	return this.wrap.call(this, 'getClanAmounts', arguments);
};

/**
 * Получить paginated список кланов, сортированных по ELO рейтингу (от большего к меньшему).
 *
 * Return list of the clan ids and names ordered by elo rating (begin from the top).
 *
 * @param   {Object}   params
 * @param   {Number}   [params.amount=10]      Amount of clans to fetch (limited by 25)
 * @param   {Number}   [params.offset=0]       Amount of skipped entities
 * @returns {Promise}
 */
Api.prototype.getClans = function (params) {
	return this.wrap.call(this, 'getClans', arguments);
};

/**
 * Получить информацию о клане по его ID (название, тег, уровень, рейтинг, PID командира).
 *
 * Return name, abbr, level, elo rating and pid of clan commander.
 *
 * @param   {Object}   params
 * @param   {Number}   params.id   ID of clan
 * @returns {Promise}
 */
Api.prototype.getClanInfo = function (params) {
	return this.wrap.call(this, 'getClanInfo', arguments);
};

/**
 * Получить список участников клана с их званиями.
 *
 * Return members of given clan with their roles.
 *
 * @param   {Object}   params
 * @param   {Number}   params.id       ID of clan
 * @returns {Promise}
 */
Api.prototype.getClanMembers = function (params) {
	return this.wrap.call(this, 'getClanMembers', arguments);
};

/**
 * Получить лимитированный список матчей, прошедших с заданной даты.
 *
 * Return limited matches list after timestamp.
 *
 * @param   {Object}   params
 * @param   {Number}   params.timestamp        Timestamp to search from
 * @param   {Number}   [params.limit=50]       Amount of matches to fetch
 * @param   {Number}   [params.offset=50]      Amount of matches to skip
 * @returns {Promise}
 */
Api.prototype.getNewMatches = function (params) {
	return this.wrap.call(this, 'getNewMatches', arguments);
};

/**
 * Получить словарь игровых слотов.
 *
 * Return game slots dictionary.
 *
 * @param   {Object}   [params]
 * @param   {String}   [params.language=english]   Dictionary language
 * @returns {Promise}
 */
Api.prototype.getSlotsDict = function (params) {
	return this.wrap.call(this, 'getSlotsDict', arguments);
};

/**
 * Получить словарь игровых предметов.
 *
 * Return game items dictionary.
 *
 * @param   {Object}   [params]
 * @param   {String}   [params.language=english]   Dictionary language
 * @returns {Promise}
 */
Api.prototype.getItemsDict = function (params) {
	return this.wrap.call(this, 'getItemsDict', arguments);
};

/**
 * Получить словарь карт.
 *
 * Return game maps dictionary.
 *
 * @param   {Object}   [params]
 * @param   {String}   [params.language=english]   Dictionary language
 * @returns {Promise}
 */
Api.prototype.getMapsDict = function (params) {
	return this.wrap.call(this, 'getMapsDict', arguments);
};

module.exports = Api;