surger
Version:
CLI wifi gps powered surge pricing indicator for Uber
170 lines (130 loc) • 6.33 kB
JavaScript
;
var _interopRequireWildcard = require("@babel/runtime-corejs2/helpers/interopRequireWildcard");
var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
_Object$defineProperty(exports, "__esModule", {
value: true
});
exports.init = init;
var _values = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/values"));
var _stringify = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/json/stringify"));
var _getOwnPropertyNames = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/get-own-property-names"));
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/classCallCheck"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/defineProperty"));
var util = _interopRequireWildcard(require("util"));
var _eventemitter = _interopRequireDefault(require("eventemitter2"));
var _chalk = _interopRequireDefault(require("chalk"));
var _textTable = _interopRequireDefault(require("text-table"));
var _currentLocation = _interopRequireDefault(require("current-location"));
var _stripAnsi = _interopRequireDefault(require("strip-ansi"));
var pkg = require('../package');
var uber = new (require('node-uber'))(pkg.uber);
var geo = require('node-geocoder')(pkg.geo);
var Surger = function Surger() {
var _this = this;
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
(0, _classCallCheck2["default"])(this, Surger);
(0, _defineProperty2["default"])(this, "isNonEmptyObject", function (obj) {
return (0, _getOwnPropertyNames["default"])(obj || {}).length !== 0;
});
(0, _defineProperty2["default"])(this, "handleCoords", function (_ref) {
var lat = _ref.lat,
lng = _ref.lng;
return _this.getDetailsFromLatLng(lat, lng).then(function () {
return _this.getPriceEstimateFromLatLng(lat, lng)["catch"](function (err) {
_this.emitter.emit('debug.handleCoords', 'getPriceEstimateFromLatLng failed', err);
throw err;
});
})["catch"](function (err) {
_this.emitter.emit('debug.handleCoords', 'getDetailsFromLatLng failed', err);
throw err;
});
});
(0, _defineProperty2["default"])(this, "handlePriceEstimate", function (err, estimates) {
if (err) throw err;
_this.parseEstimates(estimates);
});
(0, _defineProperty2["default"])(this, "parseEstimates", function (estimates) {
console.log((0, _textTable["default"])(estimates));
});
(0, _defineProperty2["default"])(this, "parseDetails", function (details) {
var _details$find = details.find(Object),
streetName = _details$find.streetName;
console.log('');
console.log('Estimates near', _chalk["default"].blue(streetName));
console.log('');
});
(0, _defineProperty2["default"])(this, "getDetailsFromLatLng", function (lat, lng) {
_this.emitter.emit('debug.getDetailsFromLatLng', 'geo reversing', lat, lng);
return geo.reverse({
lat: lat,
lon: lng
}).then(function (details) {
return _this.parseDetails(details);
});
});
(0, _defineProperty2["default"])(this, "getPriceEstimateFromLatLng", function (lat, lng) {
var yay = _chalk["default"].dim.bgGreen.bold;
var nay = _chalk["default"].white.bgRed.bold;
_this.emitter.emit('debug.getPriceEstimateFromLatLng', 'getting estimates');
return uber.estimates.getPriceForRouteAsync(lat, lng, lat, lng).then(function (resp) {
_this.estimates = resp.prices.map(function (resp) {
_this.emitter.emit('debug.getPriceEstimateFromLatLng', 'getPriceForRouteAsync', (0, _stringify["default"])(resp));
var currency_code = resp.currency_code,
display_name = resp.display_name,
distance = resp.distance,
duration = resp.duration,
estimate = resp.estimate,
high_estimate = resp.high_estimate,
localized_display_name = resp.localized_display_name,
low_estimate = resp.low_estimate,
product_id = resp.product_id,
_resp$surge_multiplie = resp.surge_multiplier,
surge_multiplier = _resp$surge_multiplie === void 0 ? 1 : _resp$surge_multiplie;
return [// UberX, UberT, etc.
localized_display_name, // Surge Pricing?
surge_multiplier === 1 ? yay(" \u2714 GOOD [min. ".concat(low_estimate, " ").concat(currency_code, "]")) : nay(" $ SURGE ".concat(surge_multiplier, "x [min. ").concat(estimate, " ").concat(currency_code, "]"))];
});
_this.emitter.emit('debug.estimates', 'estimates', (0, _stringify["default"])(_this.estimates.map(function (a) {
return a.map(_stripAnsi["default"]);
})));
_this.parseEstimates(_this.estimates);
}).error(function (err) {
_this.emitter.emit('debug.getPriceEstimateFromLatLng', 'getting estimate failed');
throw err;
});
});
(0, _defineProperty2["default"])(this, "getCoords", function (cb) {
var gpsP = util.promisify(_currentLocation["default"]);
_this.emitter.emit('debug.getCoords', 'finding location');
return gpsP().then(function (location) {
var _ref2 = location || {},
latitude = _ref2.latitude,
longitude = _ref2.longitude;
_this.emitter.emit('debug.getCoords', 'confirmed location', (0, _values["default"])(location));
return cb({
lat: latitude,
lng: longitude
});
});
});
this.options = options;
this.estimates = [];
this.emitter = new _eventemitter["default"]({
wildcard: true
});
this.options.debug && this.emitter.on('debug.*', function (title) {
var _console;
for (var _len = arguments.length, message = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
message[_key - 1] = arguments[_key];
}
(_console = console).warn.apply(_console, [_chalk["default"].red.bold(this.event), _chalk["default"].magenta(title)].concat(message));
});
this.getCoords(this.handleCoords)["catch"](function (err) {
_this.emitter.emit('debug.surger', 'getCoords failed', err);
console.error(err);
});
};
function init(options) {
return new Surger(options);
}