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 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;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue