mirror of
https://github.com/gamedig/node-gamedig.git
synced 2024-11-19 02:00:38 +01:00
Resolve SRV records for minecraft servers
This commit is contained in:
parent
a0ba0d219c
commit
c4f66a72db
2 changed files with 52 additions and 9 deletions
|
@ -33,16 +33,20 @@ module.exports = Class.extend(EventEmitter,{
|
||||||
|
|
||||||
this.done({error: err.toString()});
|
this.done({error: err.toString()});
|
||||||
},
|
},
|
||||||
|
prepState: function(state) {
|
||||||
|
if(this.options.notes)
|
||||||
|
state.notes = this.options.notes;
|
||||||
|
if('host' in this.options) state.queryhost = this.options.host;
|
||||||
|
if('port' in this.options) state.queryport = this.options.port;
|
||||||
|
},
|
||||||
finish: function(result) {
|
finish: function(result) {
|
||||||
this.done(result);
|
this.done(result);
|
||||||
},
|
},
|
||||||
done: function(result) {
|
done: function(result) {
|
||||||
if(this.finished) return;
|
if(this.finished) return;
|
||||||
|
|
||||||
clearTimeout(this.globalTimeoutTimer);
|
clearTimeout(this.globalTimeoutTimer);
|
||||||
|
|
||||||
if(this.options.notes)
|
this.prepState(result);
|
||||||
result.notes = this.options.notes;
|
|
||||||
|
|
||||||
this.reset();
|
this.reset();
|
||||||
this.finished = true;
|
this.finished = true;
|
||||||
|
@ -73,11 +77,7 @@ module.exports = Class.extend(EventEmitter,{
|
||||||
self.options.address = self.options.host;
|
self.options.address = self.options.host;
|
||||||
c();
|
c();
|
||||||
} else {
|
} else {
|
||||||
dns.lookup(self.options.host, function(err,address,family) {
|
self.parseDns(self.options.host,c);
|
||||||
if(err) return self.error(err);
|
|
||||||
self.options.address = address;
|
|
||||||
c();
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}, function(c) {
|
}, function(c) {
|
||||||
self.run();
|
self.run();
|
||||||
|
@ -85,11 +85,28 @@ module.exports = Class.extend(EventEmitter,{
|
||||||
|
|
||||||
]);
|
]);
|
||||||
},
|
},
|
||||||
|
parseDns: function(host,c) {
|
||||||
|
var self = this;
|
||||||
|
dns.lookup(host, function(err,address,family) {
|
||||||
|
if(err) return self.error(err);
|
||||||
|
self.options.address = address;
|
||||||
|
c();
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
// utils
|
||||||
reader: function(buffer) {
|
reader: function(buffer) {
|
||||||
return new Reader(this,buffer);
|
return new Reader(this,buffer);
|
||||||
},
|
},
|
||||||
|
translateState: function(state,trans) {
|
||||||
|
for(var from in trans) {
|
||||||
|
var to = trans[from];
|
||||||
|
if(from in state) {
|
||||||
|
if(to) state[to] = state[from];
|
||||||
|
delete state[from];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
setTimeout: function(c,t) {
|
setTimeout: function(c,t) {
|
||||||
if(this.finished) return 0;
|
if(this.finished) return 0;
|
||||||
var id = setTimeout(c,t);
|
var id = setTimeout(c,t);
|
||||||
|
|
|
@ -1,7 +1,33 @@
|
||||||
|
var dns = require('dns');
|
||||||
|
|
||||||
module.exports = require('./gamespy3').extend({
|
module.exports = require('./gamespy3').extend({
|
||||||
init: function() {
|
init: function() {
|
||||||
this._super();
|
this._super();
|
||||||
this.maxAttempts = 2;
|
this.maxAttempts = 2;
|
||||||
this.options.port = 25565;
|
this.options.port = 25565;
|
||||||
|
},
|
||||||
|
parseDns: function(host,c) {
|
||||||
|
var self = this;
|
||||||
|
var _super = this._super;
|
||||||
|
function fallback(h) { _super.call(self,h,c); }
|
||||||
|
|
||||||
|
dns.resolve('_minecraft._tcp.'+host, 'SRV', function(err,addresses) {
|
||||||
|
if(err) return fallback(host);
|
||||||
|
if(addresses.length >= 1) {
|
||||||
|
var line = addresses[0];
|
||||||
|
self.options.port = line.port;
|
||||||
|
var srvhost = line.name;
|
||||||
|
|
||||||
|
if(self.options.host.match(/\d+\.\d+\.\d+\.\d+/)) {
|
||||||
|
self.options.host = srvhost;
|
||||||
|
c();
|
||||||
|
} else {
|
||||||
|
// resolve yet again
|
||||||
|
fallback(srvhost);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
return fallback(host);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in a new issue