howsmydriving-nyc
Version:
NYC region plug-in for @HowsMyDrivingWA.
229 lines (228 loc) • 10.4 kB
JavaScript
;
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
var howsmydriving_utils_1 = require("howsmydriving-utils");
var howsmydriving_utils_2 = require("howsmydriving-utils");
var howsmydriving_utils_3 = require("howsmydriving-utils");
var fine_data_1 = require("./models/fine_data");
var logging_1 = require("./logging");
var server_1 = require("./server");
var logging_2 = require("./logging");
// TODO: Consolidate these.
var parkingAndCameraViolationsText = 'Total __REGION__ parking and camera violations for #__LICENSE__: __COUNT__', violationsByYearText = 'Violations by year for #', violationsByStatusText = 'Violations by status for #', citationQueryText = 'License #__LICENSE__ has been queried __COUNT__ times.';
var NewYorkCityRegionFactory = /** @class */ (function (_super) {
__extends(NewYorkCityRegionFactory, _super);
function NewYorkCityRegionFactory() {
var _this = _super !== null && _super.apply(this, arguments) || this;
_this.name = logging_1.__REGION_NAME__;
return _this;
}
NewYorkCityRegionFactory.prototype.createRegion = function (state_store) {
var region = new NewYorkCity(state_store);
return Promise.resolve(region);
};
return NewYorkCityRegionFactory;
}(howsmydriving_utils_3.RegionFactory));
exports.NewYorkCityRegionFactory = NewYorkCityRegionFactory;
var NewYorkCity = /** @class */ (function (_super) {
__extends(NewYorkCity, _super);
function NewYorkCity(state_store) {
var _this = _super.call(this, logging_1.__REGION_NAME__, state_store) || this;
logging_2.log.debug("Creating instance of " + _this.name + " for region " + logging_1.__REGION_NAME__);
return _this;
}
NewYorkCity.prototype.GetCitationsByPlate = function (plate, state) {
logging_2.log.debug("Getting citations for " + state + ":" + plate + " in region " + logging_1.__REGION_NAME__ + ".");
return new Promise(function (resolve, reject) {
var vehicle = {
state: state,
plate: plate,
types: null
};
var external_data = {
lookup_source: 'api',
fingerprint_id: null,
mixpanel_id: null
};
server_1.getVehicleResponse(vehicle, null, external_data).then(function (response) {
var citations = [];
response.vehicle.violations.forEach(function (violation) {
var citation = violation;
citations.push(citation);
});
resolve(citations);
});
});
};
NewYorkCity.prototype.ProcessCitationsForRequest = function (citations, query_count) {
var citationInfo = citations[0];
logging_2.log.info("ProcessCitationsForRequest called with " + citations.length);
server_1._form_plate_lookup_response_parts(undefined, 0, new fine_data_1.FineData(citationInfo.fines), citationInfo.plate, citationInfo.plate_types, citationInfo.state, citationInfo.violations, citationInfo.years, citationInfo.camera_streak_data, citationInfo.previous_lookup);
var categorizedCitations = {};
// TODO: Does it work to convert Date's to string for sorting? Might have to use epoch.
var chronologicalCitations = {};
var violationsByYear = {};
var violationsByStatus = {};
if (!citations || citations.length == 0) {
// Should never happen. There is always at least a "no citations found" citation.
throw new Error("We should never be called with zero citations. The controller is responsible for handling 'no records found for region n'");
}
var license;
var region;
for (var i = 0; i < citations.length; i++) {
var citation = citations[i];
var year = 1970;
var violationDate = new Date(Date.now());
// All citations are from the same license
if (license == null) {
license = citation.license;
}
if (region == null) {
region = citation.region;
}
try {
violationDate = new Date(Date.parse(citation.ViolationDate));
}
catch (e) {
// TODO: refactor error handling to a separate file
throw new Error(e);
}
// TODO: Is it possible to have more than 1 citation with exact same time?
// Maybe throw an exception if we ever encounter it...
if (!(violationDate.getTime().toString() in chronologicalCitations)) {
chronologicalCitations[violationDate.getTime().toString()] = new Array();
}
chronologicalCitations[violationDate.getTime().toString()].push(citation);
if (!(citation.Type in categorizedCitations)) {
categorizedCitations[citation.Type] = 0;
}
categorizedCitations[citation.Type]++;
if (!(citation.Status in violationsByStatus)) {
violationsByStatus[citation.Status] = 0;
}
violationsByStatus[citation.Status]++;
year = violationDate.getFullYear();
if (!(year.toString() in violationsByYear)) {
violationsByYear[year.toString()] = 0;
}
violationsByYear[year.toString()]++;
}
var general_summary = parkingAndCameraViolationsText
.replace('__LICENSE__', howsmydriving_utils_2.formatPlate(license))
.replace('__REGION__', region)
.replace('__COUNT__', Object.keys(citations).length.toString());
Object.keys(categorizedCitations).forEach(function (key) {
var line = key + ': ' + categorizedCitations[key];
// Max twitter username is 15 characters, plus the @
general_summary += '\n';
general_summary += line;
});
general_summary += '\n\n';
general_summary += citationQueryText
.replace('__LICENSE__', howsmydriving_utils_2.formatPlate(license))
.replace('__COUNT__', query_count.toString());
var detailed_list = '';
var sortedChronoCitationKeys = Object.keys(chronologicalCitations).sort(function (a, b) {
//return new Date(a).getTime() - new Date(b).getTime();
return howsmydriving_utils_1.CompareNumericStrings(a, b); //(a === b) ? 0 : ( a < b ? -1 : 1);
});
var first = true;
for (var i = 0; i < sortedChronoCitationKeys.length; i++) {
var key = sortedChronoCitationKeys[i];
chronologicalCitations[key].forEach(function (citation) {
if (first != true) {
detailed_list += '\n';
}
first = false;
detailed_list += citation.ViolationDate + ", " + citation.Type + ", " + citation.ViolationLocation + ", " + citation.Status;
});
}
var temporal_summary = violationsByYearText + howsmydriving_utils_2.formatPlate(license) + ':';
Object.keys(violationsByYear).forEach(function (key) {
temporal_summary += '\n';
temporal_summary += key + ": " + violationsByYear[key].toString();
});
var type_summary = violationsByStatusText + howsmydriving_utils_2.formatPlate(license) + ':';
Object.keys(violationsByStatus).forEach(function (key) {
type_summary += '\n';
type_summary += key + ": " + violationsByStatus[key];
});
// Return them in the order they should be rendered.
return [general_summary, detailed_list, type_summary, temporal_summary];
};
NewYorkCity.prototype.GetRecentCollisions = function () {
logging_2.log.info("Collisions feature is not implemented in NYC region plugin.");
return Promise.resolve([]);
};
NewYorkCity.prototype.ProcessCollisions = function (collisions) {
return Promise.resolve([]);
};
return NewYorkCity;
}(howsmydriving_utils_3.Region));
exports.NewYorkCity = NewYorkCity;
function CitationType() {
var citation_types = [
'PARKING',
'TRAFFIC CAMERA',
'INFRACTION',
'EXPLODING CAR',
'G@SSHOLE DRIVIST',
'PARKING IN BIKE LANE',
'BOOMER ENTITLEMENT'
];
return citation_types[Math.floor(Math.random() * citation_types.length)];
}
function CitationStatus() {
var citation_statuses = [
'PAID',
'ACTIVE',
'DISPOSED',
'COLLECTIONS',
'BUDDYS_A_JUDGE'
];
return citation_statuses[Math.floor(Math.random() * citation_statuses.length)];
}
function CitationValidationDate() {
var days_in_month = {
1: 31,
2: 28,
3: 31,
4: 30,
5: 31,
6: 30,
7: 31,
8: 31,
9: 30,
10: 31,
11: 30,
12: 31
};
var month = Math.floor(Math.random() * 12) + 1;
var day = Math.floor(Math.random() * days_in_month[month]) + 1;
var year = Math.floor(Math.random() * 10) + 2010;
return month + "/" + day + "/" + year;
}
function CitationValidationLocation() {
var directions = ['NE', 'NW', 'SE', 'SW'];
var street_types = ['St', 'Ave', 'Blvd', 'Circle', 'Ct'];
var num = Math.floor(Math.random() * 100000) + 1;
var dir = directions[Math.floor(Math.random() * 4)];
var street = Math.floor(Math.random() * 145) + 1;
var street_type = street_types[Math.floor(Math.random() * street_types.length)];
return num + " " + dir + " " + street + "th " + street_type;
}
var Factory = new NewYorkCityRegionFactory();
exports.default = Factory;
exports.Factory = Factory;