1
0
Fork 0
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:
Robin Appelman 2015-04-02 15:53:04 +02:00
commit ff1b2b17b3

101
parser.js
View file

@ -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;