mirror of
https://github.com/demostf/demo.js
synced 2026-06-04 00:54:14 +02:00
bit of splitting of methods
This commit is contained in:
parent
fc63e6b0c4
commit
ff1b2b17b3
1 changed files with 126 additions and 117 deletions
101
parser.js
101
parser.js
|
|
@ -1,12 +1,15 @@
|
||||||
|
var util = require('util');
|
||||||
var Packet = require('./packet');
|
var Packet = require('./packet');
|
||||||
var ConsoleCmd = require('./consolecmd');
|
var ConsoleCmd = require('./consolecmd');
|
||||||
var StringTable = require('./stringtable');
|
var StringTable = require('./stringtable');
|
||||||
var DataTable = require('./datatable');
|
var DataTable = require('./datatable');
|
||||||
var BitStream = require('bit-buffer').BitStream;
|
var BitStream = require('bit-buffer').BitStream;
|
||||||
|
var EventEmitter = require('events').EventEmitter;
|
||||||
|
|
||||||
var Parser = function (steam) {
|
var Parser = function (steam) {
|
||||||
this.stream = steam;
|
this.stream = steam;
|
||||||
this.state = {
|
this.state = {
|
||||||
|
tick : 0,
|
||||||
chat : [],
|
chat : [],
|
||||||
users : {},
|
users : {},
|
||||||
deaths : [],
|
deaths : [],
|
||||||
|
|
@ -16,8 +19,11 @@ var Parser = function (steam) {
|
||||||
};
|
};
|
||||||
this.packets = [];
|
this.packets = [];
|
||||||
this.strings = {};
|
this.strings = {};
|
||||||
|
this.on('packet', this.updateState.bind(this));
|
||||||
};
|
};
|
||||||
|
|
||||||
|
util.inherits(Parser, EventEmitter);
|
||||||
|
|
||||||
Parser.MessageType = {
|
Parser.MessageType = {
|
||||||
Sigon : 1,
|
Sigon : 1,
|
||||||
Packet : 2,
|
Packet : 2,
|
||||||
|
|
@ -46,24 +52,55 @@ Parser.prototype.readHeader = function () {
|
||||||
};
|
};
|
||||||
|
|
||||||
Parser.prototype.parseBody = function () {
|
Parser.prototype.parseBody = function () {
|
||||||
var message, i, tick = 0;
|
var message, i;
|
||||||
while (message = this.readMessage()) {
|
while (message = this.readMessage(this.stream)) {
|
||||||
|
this.handleMessage(message);
|
||||||
|
}
|
||||||
|
this.strings = StringTable.tables;
|
||||||
|
return this.state;
|
||||||
|
};
|
||||||
|
|
||||||
|
Parser.prototype.parseMessage = function (buffer, type, tick, length) {
|
||||||
|
var data = new BitStream(buffer);
|
||||||
|
|
||||||
|
switch (type) {
|
||||||
|
case Parser.MessageType.Sigon:
|
||||||
|
case Parser.MessageType.Packet:
|
||||||
|
return new Packet(type, tick, data, length);
|
||||||
|
case Parser.MessageType.ConsoleCmd:
|
||||||
|
return new ConsoleCmd(type, tick, data, length);
|
||||||
|
case Parser.MessageType.UserCmd:
|
||||||
|
//console.log('usercmd');
|
||||||
|
return true;
|
||||||
|
case Parser.MessageType.DataTables:
|
||||||
|
return new DataTable(type, tick, data, length);
|
||||||
|
case Parser.MessageType.StringTables:
|
||||||
|
return new StringTable(type, tick, data, length);
|
||||||
|
default:
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Parser.prototype.handleMessage = function (message) {
|
||||||
if (message.parse) {
|
if (message.parse) {
|
||||||
var packets = message.parse();
|
var packets = message.parse();
|
||||||
for (i = 0; i < packets.length; i++) {
|
for (i = 0; i < packets.length; i++) {
|
||||||
var packet = packets[i];
|
var packet = packets[i];
|
||||||
if (packet) {
|
if (packet) {
|
||||||
|
this.emit('packet', packet);
|
||||||
this.packets.push(packet);
|
this.packets.push(packet);
|
||||||
}
|
}
|
||||||
if (!packet) {
|
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Parser.prototype.updateState = function (packet) {
|
||||||
switch (packet.packetType) {
|
switch (packet.packetType) {
|
||||||
case 'netTick':
|
case 'netTick':
|
||||||
if (this.state.startTick === 0) {
|
if (this.state.startTick === 0) {
|
||||||
this.state.startTick = packet.tick;
|
this.state.startTick = packet.tick;
|
||||||
}
|
}
|
||||||
tick = packet.tick;
|
this.state.tick = packet.tick;
|
||||||
break;
|
break;
|
||||||
case 'serverInfo':
|
case 'serverInfo':
|
||||||
this.state.intervalPerTick = packet.intervalPerTick;
|
this.state.intervalPerTick = packet.intervalPerTick;
|
||||||
|
|
@ -73,7 +110,7 @@ Parser.prototype.parseBody = function () {
|
||||||
kind: packet.kind,
|
kind: packet.kind,
|
||||||
from: packet.from,
|
from: packet.from,
|
||||||
text: packet.text,
|
text: packet.text,
|
||||||
tick: tick
|
tick: this.state.tick
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
case 'stringTable':
|
case 'stringTable':
|
||||||
|
|
@ -103,7 +140,7 @@ Parser.prototype.parseBody = function () {
|
||||||
assister: assister,
|
assister: assister,
|
||||||
victim : packet.event.values.userid,
|
victim : packet.event.values.userid,
|
||||||
weapon : packet.event.values.weapon,
|
weapon : packet.event.values.weapon,
|
||||||
tick : tick
|
tick : this.state.tick
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
case 'teamplay_round_win':
|
case 'teamplay_round_win':
|
||||||
|
|
@ -111,7 +148,7 @@ Parser.prototype.parseBody = function () {
|
||||||
this.state.rounds.push({
|
this.state.rounds.push({
|
||||||
winner : packet.event.values.team === 2 ? 'red' : 'blue',
|
winner : packet.event.values.team === 2 ? 'red' : 'blue',
|
||||||
length : packet.event.values.round_time,
|
length : packet.event.values.round_time,
|
||||||
end_tick: tick
|
end_tick: this.state.tick
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
@ -131,32 +168,24 @@ Parser.prototype.parseBody = function () {
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this.strings = StringTable.tables;
|
|
||||||
return this.state;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
Parser.prototype.readMessage = function () {
|
Parser.prototype.readMessage = function (stream) {
|
||||||
//console.log();
|
var type = stream.readBits(8);
|
||||||
//console.log('start message');
|
|
||||||
//console.log(this.stream.byteIndex);
|
|
||||||
var type = this.stream.readBits(8);
|
|
||||||
//console.log(type);
|
//console.log(type);
|
||||||
if (type === Parser.MessageType.Stop) {
|
if (type === Parser.MessageType.Stop) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
var tick = this.stream.readInt32();
|
var tick = stream.readInt32();
|
||||||
var data, start, length, buffer;
|
var data, start, length, buffer;
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case Parser.MessageType.Sigon:
|
case Parser.MessageType.Sigon:
|
||||||
case Parser.MessageType.Packet:
|
case Parser.MessageType.Packet:
|
||||||
this.stream.byteIndex += 0x54; // command/sequence info
|
stream.byteIndex += 0x54; // command/sequence info
|
||||||
break;
|
break;
|
||||||
case Parser.MessageType.UserCmd:
|
case Parser.MessageType.UserCmd:
|
||||||
this.stream.byteIndex += 0x04; // unknown / outgoing sequence
|
stream.byteIndex += 0x04; // unknown / outgoing sequence
|
||||||
break;
|
break;
|
||||||
case Parser.MessageType.Stop:
|
case Parser.MessageType.Stop:
|
||||||
return false;
|
return false;
|
||||||
|
|
@ -164,31 +193,11 @@ Parser.prototype.readMessage = function () {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
length = this.stream.readInt32();
|
length = stream.readInt32();
|
||||||
//console.log('message length: ' + length + ' byte');
|
start = stream.byteIndex;
|
||||||
start = this.stream.byteIndex;
|
buffer = stream.buffer.slice(start, start + length);
|
||||||
buffer = this.stream.buffer.slice(start, start + length);
|
stream.byteIndex += length;
|
||||||
this.stream.byteIndex += length;
|
return this.parseMessage(buffer, type, tick, length);
|
||||||
data = new BitStream(buffer);
|
|
||||||
//console.log(this.stream.buffer);
|
|
||||||
|
|
||||||
switch (type) {
|
|
||||||
case Parser.MessageType.Sigon:
|
|
||||||
case Parser.MessageType.Packet:
|
|
||||||
return new Packet(type, tick, data, length);
|
|
||||||
case Parser.MessageType.ConsoleCmd:
|
|
||||||
return new ConsoleCmd(type, tick, data, length);
|
|
||||||
case Parser.MessageType.UserCmd:
|
|
||||||
//console.log('usercmd');
|
|
||||||
return true;
|
|
||||||
case Parser.MessageType.DataTables:
|
|
||||||
return new DataTable(type, tick, data, length);
|
|
||||||
case Parser.MessageType.StringTables:
|
|
||||||
return new StringTable(type, tick, data, length);
|
|
||||||
default:
|
|
||||||
return true;
|
|
||||||
//throw 'Unknown message type: ' + type;
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
module.exports = Parser;
|
module.exports = Parser;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue