2017-08-09 11:05:55 +02:00
|
|
|
class Armagetron extends require('./core') {
|
2017-08-09 12:32:09 +02:00
|
|
|
constructor() {
|
|
|
|
super();
|
|
|
|
this.encoding = 'latin1';
|
|
|
|
this.byteorder = 'be';
|
|
|
|
}
|
2014-10-29 08:02:03 +01:00
|
|
|
|
2017-08-09 12:32:09 +02:00
|
|
|
run(state) {
|
2017-08-09 11:05:55 +02:00
|
|
|
const b = Buffer.from([0,0x35,0,0,0,0,0,0x11]);
|
2014-10-29 08:02:03 +01:00
|
|
|
|
2017-08-09 12:32:09 +02:00
|
|
|
this.udpSend(b,(buffer) => {
|
|
|
|
const reader = this.reader(buffer);
|
2014-10-29 08:02:03 +01:00
|
|
|
|
2017-08-09 12:32:09 +02:00
|
|
|
reader.skip(6);
|
2014-10-29 08:02:03 +01:00
|
|
|
|
2017-08-09 12:32:09 +02:00
|
|
|
state.raw.port = this.readUInt(reader);
|
|
|
|
state.raw.hostname = this.readString(reader);
|
|
|
|
state.name = this.stripColorCodes(this.readString(reader));
|
|
|
|
state.raw.numplayers = this.readUInt(reader);
|
|
|
|
state.raw.versionmin = this.readUInt(reader);
|
|
|
|
state.raw.versionmax = this.readUInt(reader);
|
|
|
|
state.raw.version = this.readString(reader);
|
|
|
|
state.maxplayers = this.readUInt(reader);
|
2014-10-29 08:02:03 +01:00
|
|
|
|
2017-08-09 11:05:55 +02:00
|
|
|
const players = this.readString(reader);
|
|
|
|
const list = players.split('\n');
|
2017-08-09 12:32:09 +02:00
|
|
|
for(const name of list) {
|
|
|
|
if(!name) continue;
|
|
|
|
state.players.push({
|
|
|
|
name: this.stripColorCodes(name)
|
|
|
|
});
|
|
|
|
}
|
2014-10-29 08:02:03 +01:00
|
|
|
|
2017-08-09 12:32:09 +02:00
|
|
|
state.raw.options = this.stripColorCodes(this.readString(reader));
|
|
|
|
state.raw.uri = this.readString(reader);
|
|
|
|
state.raw.globalids = this.readString(reader);
|
2017-08-09 11:05:55 +02:00
|
|
|
this.finish(state);
|
2017-08-09 12:32:09 +02:00
|
|
|
return true;
|
|
|
|
});
|
|
|
|
}
|
2017-08-09 11:05:55 +02:00
|
|
|
|
2017-08-09 12:32:09 +02:00
|
|
|
readUInt(reader) {
|
|
|
|
const a = reader.uint(2);
|
2017-08-09 11:05:55 +02:00
|
|
|
const b = reader.uint(2);
|
2017-08-09 12:32:09 +02:00
|
|
|
return (b<<16) + a;
|
|
|
|
}
|
|
|
|
readString(reader) {
|
2017-08-09 11:05:55 +02:00
|
|
|
const len = reader.uint(2);
|
2017-08-09 12:32:09 +02:00
|
|
|
if(!len) return '';
|
2014-10-29 08:02:03 +01:00
|
|
|
|
2017-08-09 12:32:09 +02:00
|
|
|
let out = '';
|
|
|
|
for(let i = 0; i < len; i += 2) {
|
2017-08-09 11:05:55 +02:00
|
|
|
const hi = reader.uint(1);
|
|
|
|
const lo = reader.uint(1);
|
2017-08-09 12:32:09 +02:00
|
|
|
if(i+1<len) out += String.fromCharCode(lo);
|
|
|
|
if(i+2<len) out += String.fromCharCode(hi);
|
|
|
|
}
|
2014-10-29 08:02:03 +01:00
|
|
|
|
2017-08-09 12:32:09 +02:00
|
|
|
return out;
|
|
|
|
}
|
|
|
|
stripColorCodes(str) {
|
|
|
|
return str.replace(/0x[0-9a-f]{6}/g,'');
|
|
|
|
}
|
2017-08-09 11:05:55 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
module.exports = Armagetron;
|