UNPKG

fut

Version:
248 lines (187 loc) 8.63 kB
'use strict'; 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;