summaryrefslogtreecommitdiff
path: root/lib/awdrone/index.js
diff options
context:
space:
mode:
Diffstat (limited to 'lib/awdrone/index.js')
-rw-r--r--lib/awdrone/index.js92
1 files changed, 92 insertions, 0 deletions
diff --git a/lib/awdrone/index.js b/lib/awdrone/index.js
new file mode 100644
index 0000000..df947cd
--- /dev/null
+++ b/lib/awdrone/index.js
@@ -0,0 +1,92 @@
+const fetch = require('node-fetch')
+
+function AWDrone (options) {
+ if (!(this instanceof AWDrone))
+ return new AWDrone(options)
+
+ options = options || {}
+ if (!options.express)
+ throw new Error('Express not provided to AWDrone');
+ if (!options.config)
+ throw new Error('Configuration not provided to AWDrone');
+
+ const express = options.express
+ const router = express.Router()
+ const config = options.config
+ const db = options.db
+
+ router.get('/', function (req, res) {
+ update(db).then( () => {
+ res.sendStatus(200)
+ }).catch( (err) => {
+ res.sendStatus(500)
+ })
+ })
+
+ function refresh () {
+ setTimeout(refresh, 60 * 60 * 12)
+ update(db)
+ }
+
+ setTimeout(refresh, 60)
+
+ this._router = router
+}
+
+function update (db) {
+ return new Promise( (resolve, reject) => {
+ const type = 'drone'
+ const id = 'drone-statistics'
+ db.get(type).get(id).then( data => {
+ scrape().then( matches => {
+ if (matches.length !== 4) {
+ throw new Error('problem retrieving matches')
+ }
+
+ data.strikes = matches[0]
+ data.totalKilled = matches[1]
+ data.civiliansKilled = matches[2]
+ data.childrenKilled = matches[3]
+
+ const resource = db.get(type, id)
+ resource.update(id, data).then(function(updated) {
+ resolve()
+ }).fail( err => { throw err })
+ })
+ .catch( err => {
+ reject(err)
+ })
+ })
+ })
+}
+
+function scrape (cb) {
+ return fetch('https://www.thebureauinvestigates.com/projects/drone-war')
+ .then(response => {
+ return response.text()
+ })
+ .then(body => {
+ const statRegexp = new RegExp('stat__figure">([-0-9,]+)<', 'g')
+ const matches = getMatches(body, statRegexp)
+ return matches
+ })
+ .catch( err => {
+ return []
+ })
+}
+
+function getMatches(string, regex, index) {
+ index = index || 1
+ let matches = []
+ let match
+ while (match = regex.exec(string)) {
+ matches.push(match[index])
+ }
+ return matches
+}
+
+AWDrone.prototype.middleware = function () {
+ return this._router
+}
+
+module.exports = AWDrone