Files
node-metaverse/tools/writePacketClasses.js

834 lines
32 KiB
JavaScript
Raw Normal View History

const messages = require('./msg_template.json');
const path = require('path');
const fs = require('fs');
2020-11-19 16:27:29 +00:00
for (const message of messages)
{
2017-11-26 01:14:02 +00:00
let classString = '// This file has been automatically generated by writeMessageClasses.js\n\n';
//First import required classes
let uuid = false;
let ipaddr = false;
let vector3 = false;
let vector4 = false;
let long = false;
let quaternion = false;
2020-11-19 16:27:29 +00:00
for (const block of message.blocks)
{
2020-11-19 16:27:29 +00:00
for (const param of block.params)
{
switch(param.type)
{
case 'BOOL':
case 'U32':
case 'S32':
case 'S8':
case 'U8':
case 'U16':
case 'S16':
case 'F32':
case 'F64':
case "IPPORT":
case "Fixed":
case 'Variable':
break;
case "LLVector3d":
vector3 = true;
break;
case "LLVector3":
vector3 = true;
break;
case "LLVector4":
vector4 = true;
break;
case "LLQuaternion":
quaternion = true;
break;
case "LLUUID":
uuid = true;
break;
case "IPADDR":
ipaddr = true;
break;
case "U64":
long = true;
break;
default:
console.log("UNKNOWN TYPE: "+param.type);
}
2020-11-19 16:27:29 +00:00
}
}
if (uuid)
{
classString += 'import { UUID } from \'../UUID\';\n'
}
if (ipaddr)
{
classString += 'import { IPAddress } from \'../IPAddress\';\n'
}
if (vector3)
{
classString += 'import { Vector3 } from \'../Vector3\';\n'
}
if (vector4)
{
classString += 'import { Vector4 } from \'../Vector4\';\n'
}
if (long)
{
classString += 'import * as Long from \'long\';\n'
}
if (quaternion)
{
classString += 'import { Quaternion } from \'../Quaternion\';\n'
}
classString += 'import { MessageFlags } from \'../../enums/MessageFlags\';\n' +
'import { MessageBase } from \'../MessageBase\';\n' +
'import { Message } from \'../../enums/Message\';\n\n';
2017-11-26 01:14:02 +00:00
classString += 'export class ' + message.name + 'Message implements MessageBase\n';
classString += '{\n';
classString += ' name = \''+message.name+'\';\n';
2017-11-24 03:39:53 +00:00
let flags = [];
2020-11-19 16:27:29 +00:00
for (const flag of message.flags)
{
switch(flag.toUpperCase())
{
case 'TRUSTED':
flags.push('MessageFlags.Trusted');
break;
case 'UDPDEPRECATED':
case 'DEPRECATED':
flags.push('MessageFlags.Deprecated');
break;
case 'ZEROCODED':
flags.push('MessageFlags.Zerocoded');
break;
case 'UNENCODED':
break;
case 'NOTTRUSTED':
break;
case 'UDPBLACKLISTED':
flags.push('MessageFlags.Blacklisted');
break;
default:
console.log("UNKNOWN FLAG: "+flag);
break;
}
2020-11-19 16:27:29 +00:00
}
let id = parseInt(message.id);
switch(message.frequency)
{
case 'Low':
id += 4294901760;
flags.push('MessageFlags.FrequencyLow');
break;
case 'Medium':
id += 65280;
flags.push('MessageFlags.FrequencyMedium');
break;
case 'Fixed':
flags.push('MessageFlags.FrequencyFixed');
break;
case 'High':
flags.push('MessageFlags.FrequencyHigh');
break;
default:
console.log("UNKNOWN FREQUENCY: "+message.frequency);
break;
}
2017-11-26 01:14:02 +00:00
classString += ' messageFlags = ' + flags.join(' | ')+';\n';
2017-11-26 01:14:02 +00:00
classString += ' id = Message.' + message.name+';\n';
classString += '\n';
let messageFixedSize = 0;
let messageVariableSize = [];
let calcVarVar = false;
2020-11-19 16:27:29 +00:00
for (const block of message.blocks)
{
classString += ' '+block.name+': {\n';
let blockFixedSize = 0;
let blockVariableSize = [];
2020-11-19 16:27:29 +00:00
for (const param of block.params)
{
classString += ' '+param.name+': ';
let jstype = 'string';
2017-11-26 01:14:02 +00:00
param.size = parseInt(param.size);
switch(param.type)
{
case 'LLUUID':
jstype = 'UUID';
blockFixedSize += 16;
break;
case 'F32':
case 'S32':
case 'U32':
blockFixedSize += 4;
jstype = 'number';
break;
case 'IPPORT':
case 'S16':
case 'U16':
blockFixedSize += 2;
jstype = 'number';
break;
case 'U64':
case 'S64':
jstype = 'Long';
blockFixedSize += 8;
break;
case 'F64':
blockFixedSize += 8;
jstype = 'number';
break;
case 'S8':
case 'U8':
blockFixedSize += 1;
jstype = 'number';
break;
case 'BOOL':
blockFixedSize += 1;
jstype = 'boolean';
break;
case 'Variable':
jstype = 'Buffer';
if (block.type === 'Single')
{
blockVariableSize.push('this.' + block.name + '[\'' + param.name + '\'].length + ' + param.size);
}
else
{
//Variable parameter in variable or multi block - tricky edge case
messageVariableSize.push('this.calculateVarVarSize(this.'+block.name+', \''+param.name+'\', '+param.size+')');
calcVarVar = true;
}
break;
case 'LLVector4':
blockFixedSize += 16;
jstype = 'Vector4';
break;
case 'LLQuaternion':
// because it's always a unit quaternion, transmitted in messages as a triplet of floats, 12 bytes wide (represented in memory as a quad of floats, 16 bytes wide)
blockFixedSize += 12;
jstype = 'Quaternion';
break;
case 'LLVector3d':
blockFixedSize += 24;
jstype = 'Vector3';
break;
case 'LLVector3':
blockFixedSize += 12;
jstype = 'Vector3';
break;
case 'IPADDR':
blockFixedSize += 4;
jstype = 'IPAddress';
break;
case 'Fixed':
blockFixedSize += parseInt(param.size);
jstype = 'Buffer';
break;
default:
console.log('Unknown type: '+param.type);
}
classString += jstype + ';\n';
2020-11-19 16:27:29 +00:00
}
if (block.type === 'Single')
{
messageFixedSize += blockFixedSize;
if (blockVariableSize.length > 0)
{
messageVariableSize.push('(' + blockVariableSize.join(' + ') + ')');
}
}
else if (block.type === 'Multiple')
{
messageFixedSize += blockFixedSize * block.count;
if (blockVariableSize.length > 0)
{
messageVariableSize.push('((' + blockVariableSize.join(' + ') + ') * ' + block.count + ')');
}
}
else if (block.type === 'Variable')
{
messageFixedSize += 1; //variable block starts with a U8
if (blockFixedSize > 0)
{
blockVariableSize.push(blockFixedSize);
}
if (blockVariableSize.length > 0)
{
messageVariableSize.push('((' + blockVariableSize.join(' + ') + ') * this.' + block.name + '.length)');
}
}
switch(block.type)
{
case 'Single':
classString += ' };\n';
break;
case 'Variable':
case 'Multiple':
classString += ' }[];\n';
break;
default:
console.log("Unknown type: "+block.type);
}
2020-11-19 16:27:29 +00:00
}
classString+='\n';
classString+=' getSize(): number\n';
classString+=' {\n';
if (messageFixedSize > 0)
{
messageVariableSize.push(messageFixedSize);
}
if (messageVariableSize.length === 0)
{
classString += ' return 0;\n';
}
else
{
classString += ' return ' + messageVariableSize.join(' + ') + ';\n';
}
classString+=' }\n';
classString+='\n';
if (calcVarVar)
{
2020-11-19 16:27:29 +00:00
classString+=' calculateVarVarSize(block: {[key: string]: any}[], paramName: string, extraPerVar: number): number\n' +
' {\n' +
' let size = 0;\n' +
2020-11-19 16:27:29 +00:00
' for (const bl of block)\n' +
' {\n' +
' size += bl[paramName].length + extraPerVar;\n' +
2020-11-19 16:27:29 +00:00
' }\n' +
' return size;\n' +
' }\n\n';
}
2017-11-26 01:14:02 +00:00
classString+=' writeToBuffer(buf: Buffer, pos: number): number\n';
classString+=' {\n';
if (message.blocks.length > 0)
{
2017-11-26 01:14:02 +00:00
classString += ' const startPos = pos;\n';
let firstCount = true;
let letConst = 'const';
let varBlockCount = 0;
2020-11-19 16:27:29 +00:00
for (const block of message.blocks)
{
if (block.type === 'Variable' || block.type === 'Multiple')
{
varBlockCount++;
}
2020-11-19 16:27:29 +00:00
}
if (varBlockCount > 1)
{
letConst = 'let';
}
2020-11-19 16:27:29 +00:00
for (const block of message.blocks)
{
let single = false;
let blockIndex = '';
if (block.type === 'Variable')
{
let first = '';
if (firstCount)
{
firstCount = false;
first = letConst + ' ';
}
2017-11-26 01:14:02 +00:00
blockIndex = ' ' + first + 'count = this.' + block.name + '.length;\n';
blockIndex += ' buf.writeUInt8(this.' + block.name + '.length, pos++);\n';
}
else if (block.type === 'Multiple')
{
let first = '';
if (firstCount)
{
firstCount = false;
first = letConst + ' ';
}
2017-11-26 01:14:02 +00:00
blockIndex = ' ' + first + 'count = ' + block.count + ';\n';
}
else
{
single = true;
}
let spaces = '';
if (!single)
{
spaces = ' ';
classString += blockIndex;
2017-11-26 01:14:02 +00:00
classString += ' for (let i = 0; i < count; i++)\n';
classString += ' {\n';
}
2020-11-19 16:27:29 +00:00
for (const param of block.params)
{
let val = '';
if (!single)
{
val = 'this.' + block.name + '[i][\'' + param.name + '\']';
}
else
{
val = 'this.' + block.name + '[\'' + param.name + '\']';
}
switch (param.type)
{
case 'LLUUID':
2017-11-26 01:14:02 +00:00
classString += spaces + ' ' + val + '.writeToBuffer(buf, pos);\n';
classString += spaces + ' pos += 16;\n';
break;
case 'F32':
2017-11-26 01:14:02 +00:00
classString += spaces + ' buf.writeFloatLE(' + val + ', pos);\n';
classString += spaces + ' pos += 4;\n';
break;
case 'S32':
2017-11-26 01:14:02 +00:00
classString += spaces + ' buf.writeInt32LE(' + val + ', pos);\n';
classString += spaces + ' pos += 4;\n';
break;
case 'U32':
2017-11-26 01:14:02 +00:00
classString += spaces + ' buf.writeUInt32LE(' + val + ', pos);\n';
classString += spaces + ' pos += 4;\n';
break;
case 'U16':
case 'IPPORT':
2017-11-26 01:14:02 +00:00
classString += spaces + ' buf.writeUInt16LE(' + val + ', pos);\n';
classString += spaces + ' pos += 2;\n';
break;
case 'S16':
2017-11-26 01:14:02 +00:00
classString += spaces + ' buf.writeInt16LE(' + val + ', pos);\n';
classString += spaces + ' pos += 2;\n';
break;
case 'U64':
case 'S64':
2017-11-26 01:14:02 +00:00
classString += spaces + ' buf.writeInt32LE(' + val + '.low, pos);\n';
classString += spaces + ' pos += 4;\n';
classString += spaces + ' buf.writeInt32LE(' + val + '.high, pos);\n';
classString += spaces + ' pos += 4;\n';
break;
case 'F64':
2017-11-26 01:14:02 +00:00
classString += spaces + ' buf.writeDoubleLE(' + val + ', pos);\n';
classString += spaces + ' pos += 8;\n';
break;
case 'S8':
2017-11-26 01:14:02 +00:00
classString += spaces + ' buf.writeInt8(' + val + ', pos++);\n';
break;
case 'U8':
2017-11-26 01:14:02 +00:00
classString += spaces + ' buf.writeUInt8(' + val + ', pos++);\n';
break;
case 'BOOL':
2017-11-26 01:14:02 +00:00
classString += spaces + ' buf.writeUInt8((' + val + ') ? 1 : 0, pos++);\n';
break;
case 'Variable':
if (param.size === 1)
{
2017-11-26 01:14:02 +00:00
classString += spaces + ' buf.writeUInt8(' + val + '.length, pos++);\n';
}
if (param.size === 2)
{
2017-11-26 01:14:02 +00:00
classString += spaces + ' buf.writeUInt16LE(' + val + '.length, pos);\n';
classString += spaces + ' pos += 2;\n';
}
classString += spaces + ' ' + val + '.copy(buf, pos);\n';
2017-11-26 01:14:02 +00:00
classString += spaces + ' pos += ' + val + '.length;\n';
break;
case 'LLVector4':
2017-11-26 01:14:02 +00:00
classString += spaces + ' ' + val + '.writeToBuffer(buf, pos);\n';
classString += spaces + ' pos += 16;\n';
break;
case 'LLQuaternion':
2017-11-26 01:14:02 +00:00
classString += spaces + ' ' + val + '.writeToBuffer(buf, pos);\n';
classString += spaces + ' pos += 12;\n';
break;
case 'LLVector3d':
2017-11-26 01:14:02 +00:00
classString += spaces + ' ' + val + '.writeToBuffer(buf, pos, true);\n';
classString += spaces + ' pos += 24;\n';
break;
case 'LLVector3':
2017-11-26 01:14:02 +00:00
classString += spaces + ' ' + val + '.writeToBuffer(buf, pos, false);\n';
classString += spaces + ' pos += 12;\n';
break;
case 'IPADDR':
2017-11-26 01:14:02 +00:00
classString += spaces + ' ' + val + '.writeToBuffer(buf, pos);\n';
classString += spaces + ' pos += 4;\n';
break;
case 'Fixed':
2017-11-26 01:14:02 +00:00
classString += spaces + ' ' + val + '.copy(buf, pos);\n';
classString += spaces + ' pos += ' + param.size + ';\n';
break;
default:
console.log('Unknown type: ' + param.type);
}
2020-11-19 16:27:29 +00:00
}
if (!single)
{
2017-11-26 01:14:02 +00:00
classString += ' }\n';
}
2020-11-19 16:27:29 +00:00
}
2017-11-26 01:14:02 +00:00
classString += ' return pos - startPos;\n';
}
else
{
2017-11-26 01:14:02 +00:00
classString += ' return 0;\n';
}
2017-11-26 01:14:02 +00:00
classString +=' }\n';
classString +='\n';
2017-11-26 01:14:02 +00:00
classString+=' readFromBuffer(buf: Buffer, pos: number): number\n';
classString+=' {\n';
if (message.blocks.length > 0)
{
2017-11-26 01:14:02 +00:00
classString += ' const startPos = pos;\n';
classString += ' let varLength = 0;\n';
let firstCount = true;
let letConst = 'const';
let varBlockCount = 0;
2020-11-19 16:27:29 +00:00
for (const block of message.blocks)
{
if (block.type === 'Variable' || block.type === 'Multiple')
{
varBlockCount++;
}
2020-11-19 16:27:29 +00:00
}
if (varBlockCount > 1)
{
letConst = 'let';
}
let varBlockConst = 'const';
if (message.blocks.count > 1)
{
varBlockConst = 'let';
}
let firstBlock = true;
2017-11-26 01:14:02 +00:00
let donelet = false;
2020-11-19 16:27:29 +00:00
for (const block of message.blocks)
{
let single = false;
let blockIndex = '';
2017-11-26 01:14:02 +00:00
block.count = parseInt(block.count);
if (block.type === 'Variable')
{
let first = '';
if (firstCount)
{
firstCount = false;
first = letConst + ' ';
}
blockIndex = ' if (pos >= buf.length)\n {\n return pos - startPos;\n }\n';
blockIndex += ' ' + first + 'count = buf.readUInt8(pos++);\n';
2017-11-26 01:14:02 +00:00
blockIndex += ' this.' + block.name + ' = [];\n';
}
else if (block.type === 'Multiple')
{
let first = '';
if (firstCount)
{
firstCount = false;
first = letConst + ' ';
}
2017-11-26 01:14:02 +00:00
blockIndex = ' ' + first + 'count = ' + block.count + ';\n';
blockIndex += ' this.' + block.name + ' = [];';
}
else
{
single = true;
}
let spaces = '';
let decl = '';
if (firstBlock)
{
firstBlock = false;
decl = varBlockConst + ' ';
}
if (!single)
{
spaces = ' ';
classString += blockIndex;
2017-11-26 01:14:02 +00:00
classString += ' for (let i = 0; i < count; i++)\n';
classString += ' {\n';
classString += ' const newObj' + block.name + ': {\n';
}
else
{
2017-11-26 01:14:02 +00:00
classString += ' const newObj' + block.name + ': {\n';
}
const paramTypes = [];
const paramValues = [];
2020-11-19 16:27:29 +00:00
for (const param of block.params)
{
let jstype = 'string';
let jsvalue = '\'\'';
switch(param.type)
{
case 'LLUUID':
jstype = 'UUID';
jsvalue = 'UUID.zero()';
break;
case 'F32':
case 'S32':
case 'U32':
jstype = 'number';
jsvalue = '0';
break;
case 'IPPORT':
case 'S16':
case 'U16':
jstype = 'number';
jsvalue = '0';
break;
case 'U64':
case 'S64':
jstype = 'Long';
jsvalue = 'Long.ZERO';
break;
case 'F64':
jstype = 'number';
jsvalue = '0';
break;
case 'S8':
case 'U8':
jstype = 'number';
jsvalue = '0';
break;
case 'BOOL':
jstype = 'boolean';
jsvalue = 'false';
break;
case 'Variable':
jstype = 'Buffer';
jsvalue = 'Buffer.allocUnsafe(0)';
break;
case 'LLVector4':
jstype = 'Vector4';
jsvalue = 'Vector4.getZero()';
break;
case 'LLQuaternion':
jstype = 'Quaternion';
jsvalue = 'Quaternion.getIdentity()';
break;
case 'LLVector3d':
jstype = 'Vector3';
jsvalue = 'Vector3.getZero()';
break;
case 'LLVector3':
jstype = 'Vector3';
jsvalue = 'Vector3.getZero()';
break;
case 'IPADDR':
jstype = 'IPAddress';
jsvalue = 'IPAddress.zero()';
break;
case 'Fixed':
jstype = 'Buffer';
jsvalue = 'Buffer.allocUnsafe(0)';
break;
default:
console.log('Unknown type: '+param.type);
}
2017-11-26 01:14:02 +00:00
paramTypes.push(spaces + ' ' + param.name + ': '+jstype);
paramValues.push(spaces + ' ' + param.name + ': '+jsvalue);
2020-11-19 16:27:29 +00:00
}
classString += paramTypes.join(',\n')+'\n';
2017-11-26 01:14:02 +00:00
classString += spaces + ' } = {\n';
classString += paramValues.join(',\n')+'\n';
2017-11-26 01:14:02 +00:00
classString += spaces + ' };\n';
2020-11-19 16:27:29 +00:00
for (const param of block.params)
{
let val = '';
switch (param.type)
{
case 'LLUUID':
2017-11-26 01:14:02 +00:00
classString += spaces + ' newObj' + block.name + '[\'' + param.name + '\'] = new UUID(buf, pos);\n';
classString += spaces + ' pos += 16;\n';
break;
case 'F32':
2017-11-26 01:14:02 +00:00
classString += spaces + ' newObj' + block.name + '[\'' + param.name + '\'] = buf.readFloatLE(pos);\n';
classString += spaces + ' pos += 4;\n';
break;
case 'S32':
2017-11-26 01:14:02 +00:00
classString += spaces + ' newObj' + block.name + '[\'' + param.name + '\'] = buf.readInt32LE(pos);\n';
classString += spaces + ' pos += 4;\n';
break;
case 'U32':
2017-11-26 01:14:02 +00:00
classString += spaces + ' newObj' + block.name + '[\'' + param.name + '\'] = buf.readUInt32LE(pos);\n';
classString += spaces + ' pos += 4;\n';
break;
case 'U16':
case 'IPPORT':
2017-11-26 01:14:02 +00:00
classString += spaces + ' newObj' + block.name + '[\'' + param.name + '\'] = buf.readUInt16LE(pos);\n';
classString += spaces + ' pos += 2;\n';
break;
case 'S16':
2017-11-26 01:14:02 +00:00
classString += spaces + ' newObj' + block.name + '[\'' + param.name + '\'] = buf.readInt16LE(pos);\n';
classString += spaces + ' pos += 2;\n';
break;
case 'U64':
case 'S64':
2017-11-26 01:14:02 +00:00
classString += spaces + ' newObj' + block.name + '[\'' + param.name + '\'] = new Long(buf.readInt32LE(pos), buf.readInt32LE(pos+4));\n';
classString += spaces + ' pos += 8;\n';
break;
case 'F64':
2017-11-26 01:14:02 +00:00
classString += spaces + ' newObj' + block.name + '[\'' + param.name + '\'] = buf.readDoubleLE(pos);\n';
classString += spaces + ' pos += 8;\n';
break;
case 'S8':
2017-11-26 01:14:02 +00:00
classString += spaces + ' newObj' + block.name + '[\'' + param.name + '\'] = buf.readInt8(pos++);\n';
break;
case 'U8':
2017-11-26 01:14:02 +00:00
classString += spaces + ' newObj' + block.name + '[\'' + param.name + '\'] = buf.readUInt8(pos++);\n';
break;
case 'BOOL':
2017-11-26 01:14:02 +00:00
classString += spaces + ' newObj' + block.name + '[\'' + param.name + '\'] = (buf.readUInt8(pos++) === 1);\n';
break;
case 'Variable':
if (param.size === 1)
{
2017-11-26 01:14:02 +00:00
classString += spaces + ' varLength = buf.readUInt8(pos++);\n';
}
2017-11-26 01:14:02 +00:00
else if (param.size === 2)
{
classString += spaces + ' varLength = buf.readUInt16LE(pos);\n';
classString += spaces + ' pos += 2;\n';
}
else
{
2017-11-26 01:14:02 +00:00
console.error("INVALID VARIABLE LENGTH: " + param.size);
}
classString += spaces + ' newObj' + block.name + '[\'' + param.name + '\'] = buf.slice(pos, pos + varLength);\n';
2017-11-26 01:14:02 +00:00
classString += spaces + ' pos += varLength;\n';
break;
case 'LLVector4':
2017-11-26 01:14:02 +00:00
classString += spaces + ' newObj' + block.name + '[\'' + param.name + '\'] = new Vector4(buf, pos);\n';
classString += spaces + ' pos += 16;\n';
break;
case 'LLQuaternion':
2017-11-26 01:14:02 +00:00
classString += spaces + ' newObj' + block.name + '[\'' + param.name + '\'] = new Quaternion(buf, pos);\n';
classString += spaces + ' pos += 12;\n';
break;
case 'LLVector3d':
2017-11-26 01:14:02 +00:00
classString += spaces + ' newObj' + block.name + '[\'' + param.name + '\'] = new Vector3(buf, pos, true);\n';
classString += spaces + ' pos += 24;\n';
break;
case 'LLVector3':
2017-11-26 01:14:02 +00:00
classString += spaces + ' newObj' + block.name + '[\'' + param.name + '\'] = new Vector3(buf, pos, false);\n';
classString += spaces + ' pos += 12;\n';
break;
case 'IPADDR':
2017-11-26 01:14:02 +00:00
classString += spaces + ' newObj' + block.name + '[\'' + param.name + '\'] = new IPAddress(buf, pos);\n';
classString += spaces + ' pos += 4;\n';
break;
case 'Fixed':
2017-11-26 01:14:02 +00:00
classString += spaces + ' newObj' + block.name + '[\'' + param.name + '\'] = buf.slice(pos, pos + ' + param.size + ');\n';
classString += spaces + ' pos += ' + param.size + ';\n';
break;
default:
console.log('Unknown type: ' + param.type);
}
2020-11-19 16:27:29 +00:00
}
if (!single)
{
2017-11-26 01:14:02 +00:00
classString += ' this.'+block.name+'.push(newObj' + block.name + ');\n';
classString += ' }\n';
}
else
{
2017-11-26 01:14:02 +00:00
classString += ' this.'+block.name+' = newObj' + block.name + ';\n';
}
2020-11-19 16:27:29 +00:00
}
2017-11-26 01:14:02 +00:00
classString += ' return pos - startPos;\n';
}
else
{
2017-11-26 01:14:02 +00:00
classString += ' return 0;\n';
}
2017-11-26 01:14:02 +00:00
classString +=' }\n';
classString += '}\n';
classString +='\n';
2017-11-26 01:14:02 +00:00
const p = path.join(__dirname+'/../lib/classes/messages/'+message.name+'.ts');
fs.writeFile(p, classString, (err) =>
{
});
2020-11-19 16:27:29 +00:00
}
//Now write the Messages class
let classString = '// This file has been automatically generated by writePacketClasses.js\n\n';
2020-11-19 16:27:29 +00:00
for (const message of messages)
{
const name = message.name;
2017-11-26 01:14:02 +00:00
classString += 'export * from \'./messages/'+name+'\';\n';
2020-11-19 16:27:29 +00:00
}
classString += 'import { Message } from \'../enums/Message\';\n';
classString += '\n';
classString += 'const messages: {[index: number]: string} = {};\n';
const msgs = [];
2020-11-19 16:27:29 +00:00
for (const message of messages)
{
2017-11-26 01:14:02 +00:00
msgs.push('messages[<number>Message.' + message.name + '] = \'' + message.name + 'Message\'');
2020-11-19 16:27:29 +00:00
}
classString += msgs.join(';\n')+';\n';
classString += '\n';
classString += 'export function nameFromID(id: Message): string\n';
classString += '{\n';
classString += ' return messages[id];\n';
classString += '}\n';
const p = path.join(__dirname+'/../lib/classes/MessageClasses.ts');
fs.writeFile(p, classString, (err) =>
{
});
classString = 'export enum Message {\n';
const msgArr = [];
2020-11-19 16:27:29 +00:00
for (const message of messages)
{
let id = parseInt(message.id);
switch(message.frequency)
{
case 'Low':
id += 4294901760;
break;
case 'Medium':
id += 65280;
break;
case 'Fixed':
break;
case 'High':
break;
default:
console.log("UNKNOWN FREQUENCY: "+message.frequency);
break;
}
msgArr.push(' '+message.name+' = '+id);
2020-11-19 16:27:29 +00:00
}
classString += msgArr.join(',\n')+'\n';
classString += '}\n';
const e = path.join(__dirname+'/../lib/enums/Message.ts');
fs.writeFile(e, classString, (err) =>
{
});