mirror of
https://github.com/gamedig/node-gamedig.git
synced 2024-11-17 17:25:19 +01:00
Improve source protocol to support all available features
This commit is contained in:
parent
ef0f0075d3
commit
f062e03271
5 changed files with 56 additions and 10 deletions
|
@ -28,6 +28,7 @@
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"iconv": ">=2.0.6",
|
"iconv": ">=2.0.6",
|
||||||
"bignum": ">=0.6.1",
|
"bignum": ">=0.6.1",
|
||||||
"async": ">=0.2.9"
|
"async": ">=0.2.9",
|
||||||
|
"compressjs": ">=1.0.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,6 @@ var EventEmitter = require('events').EventEmitter,
|
||||||
dns = require('dns'),
|
dns = require('dns'),
|
||||||
async = require('async'),
|
async = require('async'),
|
||||||
Class = require('../Class'),
|
Class = require('../Class'),
|
||||||
Bignum = require('bignum'),
|
|
||||||
Reader = require('../reader');
|
Reader = require('../reader');
|
||||||
|
|
||||||
module.exports = Class.extend(EventEmitter,{
|
module.exports = Class.extend(EventEmitter,{
|
||||||
|
|
|
@ -80,7 +80,7 @@ module.exports = require('./core').extend({
|
||||||
id = id & 0x7f;
|
id = id & 0x7f;
|
||||||
if(last) numPackets = id+1;
|
if(last) numPackets = id+1;
|
||||||
|
|
||||||
packets[id] = buffer;
|
packets[id] = buffer.slice(16);
|
||||||
|
|
||||||
if(!numPackets || Object.keys(packets).length != numPackets) return;
|
if(!numPackets || Object.keys(packets).length != numPackets) return;
|
||||||
|
|
||||||
|
@ -91,7 +91,7 @@ module.exports = require('./core').extend({
|
||||||
self.error('Missing packet #'+i);
|
self.error('Missing packet #'+i);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
list.push(packets[i].slice(16));
|
list.push(packets[i]);
|
||||||
}
|
}
|
||||||
var assembled = Buffer.concat(list);
|
var assembled = Buffer.concat(list);
|
||||||
c(assembled);
|
c(assembled);
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
var async = require('async');
|
var async = require('async'),
|
||||||
|
Bzip2 = require('compressjs').Bzip2;
|
||||||
|
|
||||||
module.exports = require('./core').extend({
|
module.exports = require('./core').extend({
|
||||||
init: function() {
|
init: function() {
|
||||||
|
@ -15,7 +16,7 @@ module.exports = require('./core').extend({
|
||||||
async.series([
|
async.series([
|
||||||
function(c) {
|
function(c) {
|
||||||
self.sendPacket(
|
self.sendPacket(
|
||||||
0x54,false,new Buffer('Source Engine Query'),
|
0x54,false,new Buffer('Source Engine Query\0'),
|
||||||
self.goldsrc ? 0x6D : 0x49,
|
self.goldsrc ? 0x6D : 0x49,
|
||||||
function(b) {
|
function(b) {
|
||||||
var reader = self.reader(b);
|
var reader = self.reader(b);
|
||||||
|
@ -136,13 +137,54 @@ module.exports = require('./core').extend({
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var numPackets = 0;
|
||||||
var packets = [];
|
var packets = [];
|
||||||
|
var bzip = false;
|
||||||
this.udpSend(b,function(buffer) {
|
this.udpSend(b,function(buffer) {
|
||||||
var header = buffer.readInt32LE(0);
|
var header = buffer.readInt32LE(0);
|
||||||
if(header == -1) return received(buffer.slice(4));
|
if(header == -1) {
|
||||||
|
// full package
|
||||||
|
return received(buffer.slice(4));
|
||||||
|
}
|
||||||
|
if(header == -2) {
|
||||||
|
// partial package
|
||||||
|
var uid = buffer.readUInt32LE(4);
|
||||||
|
if(!self.goldsrc && uid & 0x80000000) bzip = true;
|
||||||
|
|
||||||
// partial pack
|
var id,payload;
|
||||||
console.log(buffer);
|
if(self.goldsrc) {
|
||||||
|
id = buffer.readUInt8(8);
|
||||||
|
numPackets = id & 0x0f;
|
||||||
|
id = id & 0xf0 >> 4;
|
||||||
|
payload = buffer.slice(9);
|
||||||
|
} else {
|
||||||
|
numPackets = buffer.readUInt8(8);
|
||||||
|
id = buffer.readUInt8(9);
|
||||||
|
if(id == 0 && bzip) payload = buffer.slice(20);
|
||||||
|
else payload = buffer.slice(12);
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(id,numPackets);
|
||||||
|
|
||||||
|
packets[id] = payload;
|
||||||
|
|
||||||
|
if(!numPackets || Object.keys(packets).length != numPackets) return;
|
||||||
|
|
||||||
|
// assemble the parts
|
||||||
|
var list = [];
|
||||||
|
for(var i = 0; i < numPackets; i++) {
|
||||||
|
if(!(i in packets)) {
|
||||||
|
self.error('Missing packet #'+i);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
list.push(packets[i]);
|
||||||
|
}
|
||||||
|
var assembled = Buffer.concat(list);
|
||||||
|
var payload = assembled.slice(4);
|
||||||
|
if(bzip) payload = Bzip2.uncompressFile(payload);
|
||||||
|
|
||||||
|
return received(payload);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,4 +1,8 @@
|
||||||
var Iconv = require('iconv').Iconv;
|
var Iconv = require('iconv').Iconv,
|
||||||
|
Bignum = require('bignum');
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
var Iconv_converters = {};
|
var Iconv_converters = {};
|
||||||
function getIconv(from) {
|
function getIconv(from) {
|
||||||
var to = 'utf-8';
|
var to = 'utf-8';
|
||||||
|
|
Loading…
Reference in a new issue