-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtestparse.js
More file actions
211 lines (177 loc) · 5.03 KB
/
testparse.js
File metadata and controls
211 lines (177 loc) · 5.03 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
// take a bullet for this city
var RLDB = true; // print lots of shit
var usecached = false; // use local file... don't re-download
var testfire = false; // insert testfire in 1 minute
debugprint("take a bullet for this city..."); // friendly
// node shit
var http = require('http');
var fs = require('fs');
// SODA URL shit
var APIep = "http://data.nola.gov/resource/jsyu-nz5r.json"; // endpoint for NOLA open data
var APIquery = "?typetext=DISCHARGING%20FIREARM&$order=timecreate%20DESC"; // query we want
var queryURL = APIep + APIquery; // the whole enchilada
// TWITTER API shit
var usetwitter = false; // use Twitter or no?
var util = require('util'),
twitter = require('twitter');
var twit = new twitter({
consumer_key: 'Y9jSHVYrKWR2PAfLpT8jlZPmo',
consumer_secret: '7rHFAyz3Lvf83St5rriBmOMwqH4X5tS3N72rZPRhURBQytk9Fb',
access_token_key: '322177274-lpyPxLmXuwgdN5trfKYmukrNypIYYecsFrcFqEMd',
access_token_secret: 'DIZGKfFI8UW1smwjuqiRxpEUqOEFkEoPAOZcIUaNNHKKI'
});
// local file shit
var destFile = "foo.json"; // where are we stashing this locally?
// data shit
var thestuff; // holder for JSON
var gunQueue = new Array(); // gun queue
var backdate = 7.5; // use week old data
var loaded = false;
// timer shit
var qinterval = 30*1000; // poll queue every n seconds
var timer = setInterval(pollQueue, qinterval, backdate);
// spawner shit
var spawn = require('child_process').spawn;
//
// FUNCTION BLOCK:
//
// download the SODA stuff asynchronously and fire off a callback
var downloadJSON = function(url, dest, cb) {
var file = fs.createWriteStream(dest);
debugprint("about to download...");
var request = http.get(url, function(response) {
response.pipe(file);
file.on('finish', function() {
file.close(cb(dest)); // close() is async, call cb after close completes.
});
});
}
// callback out of downloadJSON... loads and parses the file and continues
function gotFile(destFile)
{
debugprint("parsing file...");
thestuff = (JSON.parse(fs.readFileSync(destFile, "utf8")));
//debugprint(thestuff);
// parse JSON into queue
debugprint("generating queue...");
gunQueue = JSONtoQueue(thestuff, backdate);
// dump Queue to screen
debugprint("dumping queue...");
dumpQueue(gunQueue);
// do Twitter request
if(usetwitter) {
debugprint("polling twitter...");
insertTwitter(backdate);
}
}
// parses JSON and returns Array object of Date elements
// Date elements are to be queued based on old data set by 'backdate'
function JSONtoQueue(stuff, bd)
{
// new array
q = new Array();
// date shit
var lastday = bd*24*60*60*1000; // milliseconds
var today = new Date();
var tda = new Date(today.getTime() - lastday); // bd days ago
var tdawhen = tda.getTime(); // now in epoch
debugprint("Today is: " + tda);
for(var i=0;i<stuff.length;i++){
var d = new Date(Date.parse(stuff[i].timecreate));
var when = d.getTime(); // epoch for the event
if(when>tdawhen && when<(tdawhen+(24*60*60*1000)))
{
// date matches backdate... add to queue
// strip duplicates
if(stuff[i].disposition!="DUP")
{
q.push(d);
}
}
}
if(testfire)
{
var t = new Date(tda.getTime() + 60*1000);
q.push(t);
}
q.reverse();
loaded = true;
return(q);
}
// print out queue
function dumpQueue(q)
{
for(var i = 0;i<q.length;i++)
{
debugprint("schedule gun at: " +q[i]);
}
}
// main event callback
function pollQueue(bd)
{
if(loaded) {
// date shit
var lastday = bd*24*60*60*1000; // milliseconds
var today = new Date();
var tda = new Date(today.getTime() - lastday); // bd days ago
debugprint("queue serviced: " + tda);
for(var i = 0;i<q.length;i++)
{
if(gunQueue[i].getMinutes()==tda.getMinutes()
&& gunQueue[i].getHours()==tda.getHours())
{
// FIRE!
console.log("FIRE!!!!! :" + tda);
//
// insert pi shit
//
spawn('python', ['firegun.py'], { stdio: 'inherit' });
gunQueue.splice(i, 1); // remove from queue
dumpQueue(gunQueue); // list next fires
break;
}
}
}
}
function insertTwitter(bd)
{
// date shit
var lastday = bd*24*60*60*1000; // milliseconds
var today = new Date();
var tda = new Date(today.getTime() - lastday); // bd days ago
twit.search('#NOPDCrimeAlert', {'count':100}, function(data) {
// debugprint(data);
data = data.statuses;
if(data != undefined){
for(var i = 0;i<data.length;i++)
{
if(data[i].text.toLowerCase().search("shooting")>-1)
{
var d = new Date(Date.parse(data[i].created_at));
// debugprint("twitter: " + d);
// date matches backdate... add to queue
if(d.getDate()==tda.getDate()
&& d.getFullYear()==tda.getFullYear()
&& d.getMonth()==tda.getMonth()) {
gunQueue.push(d);
}
}
}
}
// dump Queue to screen
debugprint("dumping queue...");
dumpQueue(gunQueue);
});
}
function debugprint(stuff)
{
if(RLDB) console.log(stuff);
}
// MASTER BLOCK
if(usecached)
{
gotFile(destFile);
}
else {
downloadJSON(queryURL, destFile, gotFile);
}