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 ConsoleCmd = require('./consolecmd');
var StringTable = require('./stringtable');
var DataTable = require('./datatable');
var BitStream = require('bit-buffer').BitStream;
var EventEmitter = require('events').EventEmitter;
var Parser = function (steam) {
this.stream = steam;
this.state = {
tick : 0,
chat : [],
users : {},
deaths : [],
@ -16,8 +19,11 @@ var Parser = function (steam) {
};
this.packets = [];
this.strings = {};
this.on('packet', this.updateState.bind(this));
};
util.inherits(Parser, EventEmitter);
Parser.MessageType = {
Sigon : 1,
Packet : 2,
@ -46,24 +52,55 @@ Parser.prototype.readHeader = function () {
};
Parser.prototype.parseBody = function () {
var message, i, tick = 0;
while (message = this.readMessage()) {
var message, i;
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) {
var packets = message.parse();
for (i = 0; i < packets.length; i++) {
var packet = packets[i];
if (packet) {
this.emit('packet', packet);
this.packets.push(packet);
}
if (!packet) {
continue;
}
}
};
Parser.prototype.updateState = function (packet) {
switch (packet.packetType) {
case 'netTick':
if (this.state.startTick === 0) {
this.state.startTick = packet.tick;
}
tick = packet.tick;
this.state.tick = packet.tick;
break;
case 'serverInfo':
this.state.intervalPerTick = packet.intervalPerTick;
@ -73,7 +110,7 @@ Parser.prototype.parseBody = function () {
kind: packet.kind,
from: packet.from,
text: packet.text,
tick: tick
tick: this.state.tick
});
break;
case 'stringTable':
@ -103,7 +140,7 @@ Parser.prototype.parseBody = function () {
assister: assister,
victim : packet.event.values.userid,
weapon : packet.event.values.weapon,
tick : tick
tick : this.state.tick
});
break;
case 'teamplay_round_win':
@ -111,7 +148,7 @@ Parser.prototype.parseBody = function () {
this.state.rounds.push({
winner : packet.event.values.team === 2 ? 'red' : 'blue',
length : packet.event.values.round_time,
end_tick: tick
end_tick: this.state.tick
});
}
break;
@ -131,32 +168,24 @@ Parser.prototype.parseBody = function () {
}
break;
}
}
}
}
this.strings = StringTable.tables;
return this.state;
};
Parser.prototype.readMessage = function () {
//console.log();
//console.log('start message');
//console.log(this.stream.byteIndex);
var type = this.stream.readBits(8);
Parser.prototype.readMessage = function (stream) {
var type = stream.readBits(8);
//console.log(type);
if (type === Parser.MessageType.Stop) {
return null;
}
var tick = this.stream.readInt32();
var tick = stream.readInt32();
var data, start, length, buffer;
switch (type) {
case Parser.MessageType.Sigon:
case Parser.MessageType.Packet:
this.stream.byteIndex += 0x54; // command/sequence info
stream.byteIndex += 0x54; // command/sequence info
break;
case Parser.MessageType.UserCmd:
this.stream.byteIndex += 0x04; // unknown / outgoing sequence
stream.byteIndex += 0x04; // unknown / outgoing sequence
break;
case Parser.MessageType.Stop:
return false;
@ -164,31 +193,11 @@ Parser.prototype.readMessage = function () {
return true;
}
length = this.stream.readInt32();
//console.log('message length: ' + length + ' byte');
start = this.stream.byteIndex;
buffer = this.stream.buffer.slice(start, start + length);
this.stream.byteIndex += 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;
}
length = stream.readInt32();
start = stream.byteIndex;
buffer = stream.buffer.slice(start, start + length);
stream.byteIndex += length;
return this.parseMessage(buffer, type, tick, length);
};
module.exports = Parser;