fut
Version:
fifa 17 web-app api
248 lines (187 loc) • 8.63 kB
JavaScript
;
var _stringify = require('babel-runtime/core-js/json/stringify');
var _stringify2 = _interopRequireDefault(_stringify);
var _bluebird = require('bluebird');
var _bluebird2 = _interopRequireDefault(_bluebird);
var _extends2 = require('babel-runtime/helpers/extends');
var _extends3 = _interopRequireDefault(_extends2);
var _assign = require('babel-runtime/core-js/object/assign');
var _assign2 = _interopRequireDefault(_assign);
var _class, _temp;
var _assert = require('assert');
var _assert2 = _interopRequireDefault(_assert);
var _utils = require('./lib/utils');
var _utils2 = _interopRequireDefault(_utils);
var _login = require('./lib/login');
var _login2 = _interopRequireDefault(_login);
var _mobileLogin = require('./lib/mobile-login');
var _mobileLogin2 = _interopRequireDefault(_mobileLogin);
var _underscore = require('underscore');
var _underscore2 = _interopRequireDefault(_underscore);
var _methods = require('./lib/methods');
var _methods2 = _interopRequireDefault(_methods);
var _moment = require('moment');
var _moment2 = _interopRequireDefault(_moment);
var _request = require('request');
var _request2 = _interopRequireDefault(_request);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
let Fut = (_temp = _class = class Fut extends _methods2.default {
/**
* [constructor description]
* @param {[type]} options.email [description]
* @param {[type]} options.password [description]
* @param {[type]} options.secret [description]
* @param {[type]} options.platform [description]
* @param {[type]} options.captchaHandler [description]
* @param {[type]} options.tfAuthHandler [description]
* @param {Boolean} options.saveVariable [description]
* @param {Boolean} options.loadVariable [description]
* @param {Number} options.RPM [description]
* @param {Number} options.minDelay [description]
* @param {[String]} options.proxy [description]
* @param {[String]} options.loginType [description]
* @param {[Function]} options.preHook [Function that return a promise]
* @return {[type]} [description]
*/
constructor(options) {
super();
(0, _assert2.default)(options.email, 'Email is required');
(0, _assert2.default)(options.password, 'Password is required');
(0, _assert2.default)(options.secret, 'Secret is required');
(0, _assert2.default)(options.platform, 'Platform is required');
let defaultOptions = {
RPM: 0,
minDelay: 0,
loginType: 'web'
};
this.options = {};
this.isReady = false; // instance will be ready after we called _init func
(0, _assign2.default)(this.options, defaultOptions, _underscore2.default.omit(options, 'preHook'));
if (_underscore2.default.isFunction(options.preHook)) {
this.preHook = options.preHook.bind(this);
}
if (this.options.loginType === 'web') {
this.loginLib = _bluebird2.default.promisifyAll(new _login2.default({ proxy: options.proxy }));
} else if (this.options.loginType === 'mobile') {
this.loginLib = new _mobileLogin2.default((0, _extends3.default)({}, options, { tfCodeHandler: options.tfAuthHandler }));
} else {
throw new Error(`Unknown loginType ${ this.options.loginType }`);
}
}
loadVariable(key) {
var _this = this;
return (0, _bluebird.coroutine)(function* () {
if (!_this.options.loadVariable) return null;
return _this.options.loadVariable(key);
})();
}
saveVariable(key, val) {
var _this2 = this;
return (0, _bluebird.coroutine)(function* () {
if (!_this2.options.saveVariable) return null;
return _this2.options.saveVariable(key, val);
})();
}
_init() {
var _this3 = this;
return (0, _bluebird.coroutine)(function* () {
const cookie = yield _this3.loadVariable('cookie');
if (cookie) {
_this3.loginLib.setCookieJarJSON(cookie);
}
const minuteLimitStartedAt = yield _this3.loadVariable('minuteLimitStartedAt');
_this3.minuteLimitStartedAt = minuteLimitStartedAt || (0, _moment2.default)();
})();
}
login() {
var _this4 = this;
return (0, _bluebird.coroutine)(function* () {
yield _this4._init();
const loginMethod = _this4.options.loginType === 'web' ? 'loginAsync' : 'login';
const loginResponse = yield _this4.loginLib[loginMethod](_this4.options.email, _this4.options.password, _this4.options.secret, _this4.options.platform, _this4.options.tfAuthHandler, _this4.options.captchaHandler);
yield _this4.saveVariable('cookie', _this4.loginLib.getCookieJarJSON());
_this4.rawApi = loginResponse.apiRequest;
const loginDefaults = _underscore2.default.omit(_this4.loginLib.getLoginDefaults(), 'jar');
yield _this4.saveVariable('loginDefaults', loginDefaults);
if (_this4.options.loginType === 'web') _this4.rawApi = _bluebird2.default.promisify(_this4.rawApi, _this4);
_this4.isReady = true;
})();
}
loginCached() {
var _this5 = this;
return (0, _bluebird.coroutine)(function* () {
const loginDefaults = yield _this5.loadVariable('loginDefaults');
if (!loginDefaults) {
throw new Error('Login defaults are not saved. Use classic login first!');
}
let rawApi = _request2.default.defaults(loginDefaults);
if (_this5.options.proxy) {
rawApi = rawApi.defaults({ proxy: _this5.options.proxy });
}
_this5.rawApi = _bluebird2.default.promisify(rawApi, _this5);
_this5.isReady = true;
})();
}
api(url, options) {
var _this6 = this;
return (0, _bluebird.coroutine)(function* () {
if (!_this6.isReady) throw new Error('Fut instance is not ready yet, run login first!');
// limit handler
yield _this6._limitHandler();
if (_this6.preHook) yield _this6.preHook();
const defaultOptions = {
xHttpMethod: 'GET',
headers: {}
};
options = _underscore2.default.extend(defaultOptions, options);
options.url = url;
options.method = 'POST';
options.headers['X-HTTP-Method-Override'] = options.xHttpMethod;
delete options.xHttpMethod;
var _ref = yield _this6.rawApi(options);
const statusCode = _ref.statusCode,
statusMessage = _ref.statusMessage,
body = _ref.body;
if (statusCode.toString()[0] !== '2') {
const request = { url: url, options: options };
const err = new Error(`FUT api http error: ${ statusCode } ${ statusMessage } ${ (0, _stringify2.default)(body) } request was: ${ (0, _stringify2.default)(request) }`);
err.futApiStatusCode = Number(statusCode);
throw err;
}
if (_utils2.default.isApiError(body)) {
body.request = { url: url, options: options };
const err = new Error(`Fut api error: ${ (0, _stringify2.default)(body) }`);
err.futApiStatusCode = Number(body.code);
throw err;
}
return body;
})();
}
_limitHandler() {
var _this7 = this;
return (0, _bluebird.coroutine)(function* () {
// seconds
const sinceLastRequest = (0, _moment2.default)().diff(_this7.lastRequestAt);
if (sinceLastRequest < _this7.options.minDelay) {
console.log('Waiting on second limit ...');
yield _bluebird2.default.delay(_this7.options.minDelay - sinceLastRequest);
}
// minutes
if ((0, _moment2.default)().diff(_this7.minuteLimitStartedAt, 'minutes') >= 1 || !_this7.minuteLimitStartedAt) {
_this7.minuteLimitStartedAt = (0, _moment2.default)();
_this7.requestsThisMinute = 0;
} else {
_this7.requestsThisMinute++;
}
if (_this7.requestsThisMinute >= _this7.options.RPM && _this7.options.RPM !== 0) {
const resetsAt = _this7.minuteLimitStartedAt.add(1, 'minute');
const needsToReset = resetsAt.diff((0, _moment2.default)());
console.log(`Waiting on RPM ... ${ needsToReset }`);
yield _bluebird2.default.delay(needsToReset);
}
// TODO: continue this
_this7.lastRequestAt = (0, _moment2.default)();
})();
}
}, _class.isPriceValid = _utils2.default.isPriceValid, _class.calculateValidPrice = _utils2.default.calculateValidPrice, _class.calculateNextLowerPrice = _utils2.default.calculateNextLowerPrice, _class.calculateNextHigherPrice = _utils2.default.calculateNextHigherPrice, _class.getBaseId = _utils2.default.getBaseId, _temp);
module.exports = Fut;