diff --git a/protocols/buildandshoot.js b/protocols/buildandshoot.js new file mode 100644 index 0000000..f6fe7f0 --- /dev/null +++ b/protocols/buildandshoot.js @@ -0,0 +1,50 @@ +var request = require('request'); + +module.exports = require('./core').extend({ + init: function() { + this._super(); + this.pretty = 'Build and Shoot'; + this.options.port = 32886; + }, + run: function(state) { + var self = this; + request({ + uri: 'http://'+this.options.address+':'+this.options.port+'/', + timeout: 3000, + }, function(e,r,body) { + if(e) return self.error('HTTP error'); + + var m = body.match(/status server for (.*?)\r|\n/); + if(m) state.name = m[1]; + + var m = body.match(/Current uptime: (\d+)/); + if(m) state.raw.uptime = m[1]; + + var m = body.match(/currently running (.*?) by /); + if(m) state.map = m[1]; + + var m = body.match(/Current players: (\d+)\/(\d+)/); + if(m) { + state.raw.numplayers = m[1]; + state.maxplayers = m[2]; + } + + var m = body.match(/class="playerlist"([^]+?)\/table/); + if(m) { + var table = m[1]; + var pre = /[^]*([^]*)<\/td>[^]*([^]*)<\/td>[^]*([^]*)<\/td>[^]*([^]*)<\/td>/g; + while(pm = pre.exec(table)) { + if(pm[2] == 'Ping') continue; + state.players.push({ + name: pm[1], + ping: pm[2], + team: pm[3], + score: pm[4] + }); + } + } + + self.finish(state); + }); + } +});