node-minecraft-protocol/examples/proxy/proxy.js

185 lines
6.1 KiB
JavaScript
Raw Normal View History

var mc = require('minecraft-protocol');
var states = mc.states;
function printHelpAndExit(exitCode) {
console.log("usage: node proxy.js [<options>...] <target_srv> <version>");
console.log("options:");
2015-09-23 09:05:52 -04:00
console.log(" --dump name");
console.log(" print to stdout messages with the specified name.");
console.log(" --dump-all");
console.log(" print to stdout all messages, except those specified with -x.");
2015-09-23 09:05:52 -04:00
console.log(" -x name");
console.log(" do not print messages with this name.");
console.log(" name");
console.log(" a packet name as defined in protocol.json");
console.log("examples:");
console.log(" node proxy.js --dump-all -x keep_alive -x update_time -x entity_velocity -x rel_entity_move -x entity_look -x entity_move_look -x entity_teleport -x entity_head_rotation -x position -x localhost 1.8");
console.log(" print all messages except for some of the most prolific.");
console.log(" node examples/proxy.js --dump open_window --dump close_window --dump set_slot --dump window_items --dump craft_progress_bar --dump transaction --dump close_window --dump window_click --dump set_creative_slot --dump enchant_item localhost 1.8");
console.log(" print messages relating to inventory management.");
process.exit(exitCode);
}
if(process.argv.length < 4) {
console.log("Too few arguments!");
printHelpAndExit(1);
}
process.argv.forEach(function(val) {
if(val == "-h") {
printHelpAndExit(0);
}
});
var args = process.argv.slice(2);
var host;
var port = 25565;
var version;
2015-09-23 09:05:52 -04:00
var printAllNames = false;
var printNameWhitelist = {};
var printNameBlacklist = {};
(function() {
for(var i = 0; i < args.length; i++) {
var option = args[i];
if(!/^-/.test(option)) break;
if(option == "--dump-all") {
2015-09-23 09:05:52 -04:00
printAllNames = true;
continue;
}
i++;
2015-09-23 09:05:52 -04:00
var name = args[i];
if(option == "--dump") {
2015-09-23 09:05:52 -04:00
printNameWhitelist[name] = "io";
} else if(option == "-x") {
2015-09-23 09:05:52 -04:00
printNameBlacklist[name] = "io";
} else {
printHelpAndExit(1);
}
}
if(!(i + 2 <= args.length && args.length <= i + 4)) printHelpAndExit(1);
host = args[i++];
version = args[i++];
})();
if(host.indexOf(':') != -1) {
port = host.substring(host.indexOf(':') + 1);
host = host.substring(0, host.indexOf(':'));
}
var srv = mc.createServer({
'online-mode': false,
port: 25566,
keepAlive: false,
version:version
});
srv.on('login', function(client) {
var addr = client.socket.remoteAddress;
console.log('Incoming connection', '(' + addr + ')');
var endedClient = false;
var endedTargetClient = false;
client.on('end', function() {
endedClient = true;
console.log('Connection closed by client', '(' + addr + ')');
if(!endedTargetClient)
targetClient.end("End");
});
2016-02-15 14:50:42 -05:00
client.on('error', function(err) {
endedClient = true;
console.log('Connection error by client', '(' + addr + ')');
2016-02-15 14:50:42 -05:00
console.log(err.stack);
if(!endedTargetClient)
2015-02-24 18:44:59 -05:00
targetClient.end("Error");
});
var targetClient = mc.createClient({
host: host,
port: port,
username: client.username,
keepAlive:false,
version:version
});
2015-09-23 09:05:52 -04:00
client.on('packet', function(data, meta) {
if(targetClient.state == states.PLAY && meta.state == states.PLAY) {
if(shouldDump(meta.name, "o")) {
console.log("client->server:",
client.state + " "+ meta.name + " :",
2015-09-23 09:05:52 -04:00
JSON.stringify(data));
}
if(!endedTargetClient)
2015-09-23 09:05:52 -04:00
targetClient.write(meta.name, data);
}
});
2015-09-23 09:05:52 -04:00
targetClient.on('packet', function(data, meta) {
if(meta.state == states.PLAY && client.state == states.PLAY) {
if(shouldDump(meta.name, "i")) {
console.log("client<-server:",
2015-09-23 09:05:52 -04:00
targetClient.state + "." + meta.name + " :" +
JSON.stringify(data));
}
2015-11-06 19:25:12 -05:00
if(!endedClient) {
2015-09-23 09:05:52 -04:00
client.write(meta.name, data);
2015-11-06 19:25:12 -05:00
if (meta.name === 'set_compression') // Set compression
client.compressionThreshold = data.threshold;
}
}
});
var bufferEqual = require('buffer-equal');
2015-09-23 09:05:52 -04:00
targetClient.on('raw', function(buffer, meta) {
if(client.state != states.PLAY || meta.state != states.PLAY)
return;
var packetData = targetClient.deserializer.parsePacketBuffer(buffer).data.params;
var packetBuff = client.serializer.createPacketBuffer({name:meta.name, params:packetData});
if(!bufferEqual(buffer, packetBuff)) {
2016-02-15 17:18:57 -05:00
console.log("client<-server: Error in packet " + meta.state + "." + meta.name);
console.log(buffer.toString('hex'));
console.log(packetBuff.toString('hex'));
2015-08-05 18:04:53 -04:00
console.log(buffer.length);
console.log(packetBuff.length);
}
/*if (client.state == states.PLAY && brokenPackets.indexOf(packetId.value) !== -1)
{
console.log(`client<-server: raw packet);
console.log(packetData);
if (!endedClient)
client.writeRaw(buffer);
}*/
});
2015-09-23 09:05:52 -04:00
client.on('raw', function(buffer, meta) {
if(meta.state != states.PLAY || targetClient.state != states.PLAY)
return;
var packetData = client.deserializer.parsePacketBuffer(buffer).data.params;
var packetBuff = targetClient.serializer.createPacketBuffer({name:meta.name, params:packetData});
if(!bufferEqual(buffer, packetBuff)) {
2016-02-15 17:18:57 -05:00
console.log("client->server: Error in packet " + meta.state + "." + meta.name);
console.log(buffer.toString('hex'));
console.log(packetBuff.toString('hex'));
2015-07-29 20:41:49 -04:00
console.log(buffer.length);
console.log(packetBuff.length);
}
});
targetClient.on('end', function() {
endedTargetClient = true;
console.log('Connection closed by server', '(' + addr + ')');
if(!endedClient)
client.end("End");
});
2015-07-29 20:41:49 -04:00
targetClient.on('error', function(err) {
endedTargetClient = true;
2015-07-29 20:41:49 -04:00
console.log('Connection error by server', '(' + addr + ') ',err);
console.log(err.stack);
if(!endedClient)
client.end("Error");
});
});
2015-09-23 09:05:52 -04:00
function shouldDump(name, direction) {
if(matches(printNameBlacklist[name])) return false;
if(printAllNames) return true;
return matches(printNameWhitelist[name]);
function matches(result) {
return result != null && result.indexOf(direction) !== -1;
}
}