mirror of
https://github.com/skylord123/node-red-contrib-gamedig.git
synced 2025-07-08 19:51:06 -06:00
Compare commits
2 Commits
a5498a4ba9
...
787ee61c4e
Author | SHA1 | Date | |
---|---|---|---|
787ee61c4e | |||
8bdb043923 |
@ -6,7 +6,9 @@ This package adds the node "Query Game Server" that uses the NPM package [GameDi
|
|||||||
|
|
||||||
You can pass the server type, host, and port on the input message or define them on the node (settings defined on the node will override msg values).
|
You can pass the server type, host, and port on the input message or define them on the node (settings defined on the node will override msg values).
|
||||||
|
|
||||||
[Click here](https://github.com/gamedig/node-gamedig#return-value) if you want more information about what this library parses and standardizes from the server response.
|
You can also specify manual GameDig options using `msg.options` as an input. This will override any other options. For example: you can set `msg.options.guildId` that is required for querying Discord servers.
|
||||||
|
|
||||||
|
Visit the [GameDig GitLab page](https://github.com/gamedig/node-gamedig#return-value) if you want more information about what this library parses and standardizes from the server response.
|
||||||
|
|
||||||
### Usage Examples
|
### Usage Examples
|
||||||
- #### Inserting query data into InfluxDB and using Grafana to view results
|
- #### Inserting query data into InfluxDB and using Grafana to view results
|
||||||
|
@ -14,7 +14,8 @@
|
|||||||
given_port_only: { value: '' },
|
given_port_only: { value: '' },
|
||||||
ip_family: { value: '0' },
|
ip_family: { value: '0' },
|
||||||
debug: { value: '' },
|
debug: { value: '' },
|
||||||
request_rules: { value: '' }
|
request_rules: { value: '' },
|
||||||
|
output_options: { value: '' }
|
||||||
},
|
},
|
||||||
inputs:1,
|
inputs:1,
|
||||||
outputs:1,
|
outputs:1,
|
||||||
@ -32,20 +33,38 @@
|
|||||||
return 'Query Game Server';
|
return 'Query Game Server';
|
||||||
},
|
},
|
||||||
oneditprepare: function() {
|
oneditprepare: function() {
|
||||||
|
let server_types = null;
|
||||||
|
|
||||||
$.getJSON('/gamedig/types', function(data) {
|
$.getJSON('/gamedig/types', function(data) {
|
||||||
let html = '<table>' +
|
if(data.result !== 'ok' || !data.hasOwnProperty("server_types"))
|
||||||
'<thead id="query-game-server-types-table"><tr><td><strong>Type</strong></td><td><strong>Name</strong></td><td><strong>Protocol</strong></td></tr></thead>' +
|
{
|
||||||
'<tbody id="query-game-server-type-rows">';
|
console.error("server_types failed to load");
|
||||||
for(let game of data) {
|
return;
|
||||||
html += "<tr class=\"query-game-server-type-row\">" +
|
}
|
||||||
"<td>"+game['type']+"</td>" +
|
|
||||||
"<td>"+game['name']+"</td>" +
|
server_types = data.server_types;
|
||||||
"<td>"+game['protocol']+"</td>" +
|
});
|
||||||
"</tr>";
|
|
||||||
|
$("#node-input-server_type").autoComplete({
|
||||||
|
search: function(val) {
|
||||||
|
if(!server_types) return false; // ignore until we have the types loaded
|
||||||
|
|
||||||
|
let matches = [];
|
||||||
|
server_types.forEach(v => {
|
||||||
|
if (
|
||||||
|
v.name.toLowerCase().indexOf(val.toLowerCase()) > -1 ||
|
||||||
|
v.type.toLowerCase().indexOf(val.toLowerCase()) > -1 ||
|
||||||
|
v.protocol.toLowerCase().indexOf(val.toLowerCase()) > -1
|
||||||
|
) {
|
||||||
|
matches.push({
|
||||||
|
value: v.type,
|
||||||
|
label: `${v.name} (${v.type})`,
|
||||||
|
protocol: v.protocol
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return matches;
|
||||||
}
|
}
|
||||||
html += '</tbody>' +
|
|
||||||
'</table>';
|
|
||||||
$("#query-game-server-types").html(html);
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -68,10 +87,10 @@
|
|||||||
|
|
||||||
<div class="form-row">
|
<div class="form-row">
|
||||||
<label for="node-input-server_type"><i class="fa fa-cube"></i> Server Type</label>
|
<label for="node-input-server_type"><i class="fa fa-cube"></i> Server Type</label>
|
||||||
<input type="text" id="node-input-server_type">
|
<input type="text" id="node-input-server_type" placeholder="msg.server_type">
|
||||||
</div>
|
</div>
|
||||||
<div style="margin-left: 105px;width: 50%;margin-bottom: 10px;margin-top: -10px;">
|
<div style="margin-left: 105px;width: 50%;margin-bottom: 10px;margin-top: -10px;">
|
||||||
View server types <a href="#gamdig-types" style="color:#0000EE;text-decoration: underline;">below</a>.
|
Recommend visiting the <a href="https://github.com/gamedig/node-gamedig#games-list" target="_blank" style="color:#0000EE;text-decoration: underline;">GameDig GitHub page</a> for more information about the server type you are trying to query. Some types require extra setup.
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="form-row">
|
<div class="form-row">
|
||||||
@ -84,7 +103,7 @@
|
|||||||
|
|
||||||
<div class="form-row">
|
<div class="form-row">
|
||||||
<label for="node-input-port"><i class="fa fa-server"></i> Port</label>
|
<label for="node-input-port"><i class="fa fa-server"></i> Port</label>
|
||||||
<input type="text" id="node-input-port" placeholder="msg.host" />
|
<input type="text" id="node-input-port" placeholder="msg.port" />
|
||||||
</div>
|
</div>
|
||||||
<div style="margin-left: 105px;width: 50%;margin-bottom: 10px;margin-top: -10px;">
|
<div style="margin-left: 105px;width: 50%;margin-bottom: 10px;margin-top: -10px;">
|
||||||
Query port for the server (join and query port may differ).
|
Query port for the server (join and query port may differ).
|
||||||
@ -106,7 +125,7 @@
|
|||||||
|
|
||||||
<div class="form-row">
|
<div class="form-row">
|
||||||
<label for="node-input-max_attempts"><i class="fa fa-cogs"></i> Max Attempts</label>
|
<label for="node-input-max_attempts"><i class="fa fa-cogs"></i> Max Attempts</label>
|
||||||
<input type="text" id="node-input-max_attempts" placeholder="1" />
|
<input type="text" id="node-input-max_attempts" placeholder="msg.max_attempts (default: 1)" />
|
||||||
</div>
|
</div>
|
||||||
<div style="margin-left: 105px;width: 50%;margin-bottom: 10px;margin-top: -10px;">
|
<div style="margin-left: 105px;width: 50%;margin-bottom: 10px;margin-top: -10px;">
|
||||||
Number of attempts to query server in case of failure.
|
Number of attempts to query server in case of failure.
|
||||||
@ -114,7 +133,7 @@
|
|||||||
|
|
||||||
<div class="form-row">
|
<div class="form-row">
|
||||||
<label for="node-input-socket_timeout"><i class="fa fa-cogs"></i> Socket Timeout</label>
|
<label for="node-input-socket_timeout"><i class="fa fa-cogs"></i> Socket Timeout</label>
|
||||||
<input type="text" id="node-input-socket_timeout" placeholder="2000" />
|
<input type="text" id="node-input-socket_timeout" placeholder="msg.socket_timeout (default: 2000)" />
|
||||||
</div>
|
</div>
|
||||||
<div style="margin-left: 105px;width: 50%;margin-bottom: 10px;margin-top: -10px;">
|
<div style="margin-left: 105px;width: 50%;margin-bottom: 10px;margin-top: -10px;">
|
||||||
Milliseconds to wait for a single packet. Beware that increasing this will cause many queries to take longer even if the server is online.
|
Milliseconds to wait for a single packet. Beware that increasing this will cause many queries to take longer even if the server is online.
|
||||||
@ -122,7 +141,7 @@
|
|||||||
|
|
||||||
<div class="form-row">
|
<div class="form-row">
|
||||||
<label for="node-input-attempt_timeout"><i class="fa fa-cogs"></i> Attempt Timeout</label>
|
<label for="node-input-attempt_timeout"><i class="fa fa-cogs"></i> Attempt Timeout</label>
|
||||||
<input type="text" id="node-input-attempt_timeout" placeholder="10000" />
|
<input type="text" id="node-input-attempt_timeout" placeholder="msg.attempt_timeout (default: 10000)" />
|
||||||
</div>
|
</div>
|
||||||
<div style="margin-left: 105px;width: 50%;margin-bottom: 10px;margin-top: -10px;">
|
<div style="margin-left: 105px;width: 50%;margin-bottom: 10px;margin-top: -10px;">
|
||||||
Milliseconds allowed for an entire query attempt. This timeout is not commonly hit, as the socketTimeout typically fires first.
|
Milliseconds allowed for an entire query attempt. This timeout is not commonly hit, as the socketTimeout typically fires first.
|
||||||
@ -164,6 +183,18 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="form-row">
|
||||||
|
<label for="node-input-output_options" style="vertical-align: top"><i class="fa fa-server"></i> Output options</label>
|
||||||
|
<div style="width: 50%;display: inline-block;">
|
||||||
|
<input
|
||||||
|
type="checkbox"
|
||||||
|
id="node-input-output_options"
|
||||||
|
style="width: auto; vertical-align: top"
|
||||||
|
/>
|
||||||
|
Outputs <code style="white-space: normal;">msg.options</code> as an object that contains all the options used to query the server using GameDig. Note: If you pass <code style="white-space: normal;">msg.options</code> as an input it will override all set options so make sure you unset it if chaining multiple server query nodes together unless that is what you want.
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="form-row">
|
<div class="form-row">
|
||||||
<label for="node-input-ip_family"><i class="fa fa-server"></i> IP Rules</label>
|
<label for="node-input-ip_family"><i class="fa fa-server"></i> IP Rules</label>
|
||||||
<select
|
<select
|
||||||
@ -177,35 +208,6 @@
|
|||||||
<div style="margin-left: 105px;width: 50%;margin-bottom: 10px;margin-top: -10px;">
|
<div style="margin-left: 105px;width: 50%;margin-bottom: 10px;margin-top: -10px;">
|
||||||
IP family/version returned when looking up hostnames via DNS, can be IPv4 and IPv6, IPv4 only or IPv6 only.
|
IP family/version returned when looking up hostnames via DNS, can be IPv4 and IPv6, IPv4 only or IPv6 only.
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<h3 id="gamdig-types">Server Types</h3>
|
|
||||||
<p>
|
|
||||||
Search available types below.<br>
|
|
||||||
You can also view the list <a href="https://github.com/gamedig/node-gamedig#games-list" target="_blank" style="color:#0000EE;text-decoration: underline;">here</a>.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<div class="row">
|
|
||||||
<input type="text" id="query-game-server-types-search" placeholder="Search types.." style="margin-bottom: 10px;" />
|
|
||||||
</div>
|
|
||||||
<div id="query-game-server-types"></div>
|
|
||||||
<script type="text/javascript">
|
|
||||||
$("#query-game-server-types-search").on("input", function(e) {
|
|
||||||
let value = $(this).val();
|
|
||||||
if(value.length) {
|
|
||||||
$(".query-game-server-type-row").each(function(i, elem){
|
|
||||||
console.log('yay', $(elem).text(), value, $(elem).text().indexOf(value));
|
|
||||||
if($(elem).text().toLowerCase().indexOf(value.toLowerCase()) > -1) {
|
|
||||||
$(elem).show();
|
|
||||||
} else {
|
|
||||||
$(elem).hide();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
$(".query-game-server-type-row").show();
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<script type="text/html" data-help-name="query-game-server">
|
<script type="text/html" data-help-name="query-game-server">
|
||||||
@ -228,6 +230,11 @@
|
|||||||
</dt>
|
</dt>
|
||||||
<dd>Query port of the server. Ignored if configured on the node. Uses default query port for the server type if left empty.</dd>
|
<dd>Query port of the server. Ignored if configured on the node. Uses default query port for the server type if left empty.</dd>
|
||||||
|
|
||||||
|
<dt class="optional">
|
||||||
|
msg.options <span class="property-type">object | null</span>
|
||||||
|
</dt>
|
||||||
|
<dd>Set additional GameDig options. This overrides all other methods of setting options. Can be used for example to set <code style="white-space: normal;">msg.options.guildId</code> that is required for querying Discord servers.</dd>
|
||||||
|
|
||||||
<dt class="optional">
|
<dt class="optional">
|
||||||
msg.max_attempts <span class="property-type">integer | null</span>
|
msg.max_attempts <span class="property-type">integer | null</span>
|
||||||
</dt>
|
</dt>
|
||||||
@ -297,18 +304,8 @@
|
|||||||
<dd>Query port of the server. Ignored if configured on the node.</dd>
|
<dd>Query port of the server. Ignored if configured on the node.</dd>
|
||||||
|
|
||||||
<dt>
|
<dt>
|
||||||
msg.max_attempts <span class="property-type">integer</span>
|
msg.options <span class="property-type">object | undefined</span>
|
||||||
</dt>
|
</dt>
|
||||||
<dd>Number of attempts to query server in case of failure. Ignored if configured on the node.</dd>
|
<dd>Only set if configured to do so. Will return all the options passed to GameDig to query the server.</dd>
|
||||||
|
|
||||||
<dt>
|
|
||||||
msg.socket_timeout <span class="property-type">integer</span>
|
|
||||||
</dt>
|
|
||||||
<dd>Milliseconds to wait for a single packet. Beware that increasing this will cause many queries to take longer even if the server is online. Ignored if configured on the node.</dd>
|
|
||||||
|
|
||||||
<dt>
|
|
||||||
msg.attempt_timeout <span class="property-type">integer</span>
|
|
||||||
</dt>
|
|
||||||
<dd>Milliseconds allowed for an entire query attempt. This timeout is not commonly hit, as the socketTimeout typically fires first. Ignored if configured on the node.</dd>
|
|
||||||
</dl>
|
</dl>
|
||||||
</script>
|
</script>
|
@ -4,7 +4,7 @@ module.exports = function(RED) {
|
|||||||
|
|
||||||
function QueryGameServer(config) {
|
function QueryGameServer(config) {
|
||||||
RED.nodes.createNode(this, config);
|
RED.nodes.createNode(this, config);
|
||||||
var node = this;
|
let node = this;
|
||||||
this.server_type = config.server_type;
|
this.server_type = config.server_type;
|
||||||
this.host = config.host;
|
this.host = config.host;
|
||||||
this.port = config.port;
|
this.port = config.port;
|
||||||
@ -16,67 +16,46 @@ module.exports = function(RED) {
|
|||||||
this.ip_family = config.ip_family || 0;
|
this.ip_family = config.ip_family || 0;
|
||||||
this.debug = config.debug || false;
|
this.debug = config.debug || false;
|
||||||
this.request_rules = config.request_rules || false;
|
this.request_rules = config.request_rules || false;
|
||||||
|
this.output_options = config.output_options || false;
|
||||||
node.on('input', function(msg) {
|
node.on('input', function(msg) {
|
||||||
if(node.server_type) {
|
let options = {
|
||||||
msg.server_type = node.server_type;
|
'type': node.server_type || msg.server_type || undefined,
|
||||||
|
'host': node.host || msg.host || undefined,
|
||||||
|
'port': node.port || msg.port || undefined,
|
||||||
|
'maxAttempts': node.max_attempts || msg.max_attempts || undefined,
|
||||||
|
'socketTimeout': node.socket_timeout || msg.socket_timeout || undefined,
|
||||||
|
'attemptTimeout': node.attempt_timeout || msg.attempt_timeout || undefined,
|
||||||
|
'givenPortOnly': node.given_port_only || msg.given_port_only || undefined,
|
||||||
|
'ipFamily': node.ip_family || msg.ip_family || undefined,
|
||||||
|
'debug': node.debug || msg.config || undefined,
|
||||||
|
'requestRules': node.request_rules || msg.request_rules || undefined
|
||||||
|
};
|
||||||
|
|
||||||
|
if(typeof msg.options === 'object' && msg.options)
|
||||||
|
{
|
||||||
|
options = {...options, ...msg.options};
|
||||||
}
|
}
|
||||||
|
|
||||||
if(node.host) {
|
// set the things we want to return
|
||||||
msg.host = node.host;
|
msg.server_type = options.type;
|
||||||
|
msg.host = options.host;
|
||||||
|
msg.port = options.port;
|
||||||
|
if(node.output_options)
|
||||||
|
{
|
||||||
|
msg.options = options;
|
||||||
}
|
}
|
||||||
if(!msg.host) {
|
|
||||||
node.error("msg.host missing from input.");
|
if(!options.host) {
|
||||||
|
node.error("host missing from input.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(node.port) {
|
if(!options.type) {
|
||||||
msg.port = node.port;
|
node.error("server_type missing from input.");
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(node.halt_if) {
|
gamedig.query(options)
|
||||||
msg.halt_if = node.halt_if;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(node.max_attempts) {
|
|
||||||
msg.max_attempts = node.max_attempts;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(node.socket_timeout) {
|
|
||||||
msg.socket_timeout = node.socket_timeout;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(node.attempt_timeout) {
|
|
||||||
msg.attempt_timeout = node.attempt_timeout;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(node.given_port_only) {
|
|
||||||
msg.given_port_only = node.given_port_only;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(node.ip_family) {
|
|
||||||
msg.ip_family = node.ip_family;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(node.debug) {
|
|
||||||
msg.debug = node.debug;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(node.request_rules) {
|
|
||||||
msg.request_rules = node.request_rules;
|
|
||||||
}
|
|
||||||
|
|
||||||
gamedig.query({
|
|
||||||
'type': msg.server_type,
|
|
||||||
'host': msg.host,
|
|
||||||
'port': msg.port,
|
|
||||||
'maxAttempts': msg.max_attempts,
|
|
||||||
'socketTimeout': msg.socket_timeout,
|
|
||||||
'attemptTimeout': msg.attempt_timeout,
|
|
||||||
'givenPortOnly': msg.given_port_only,
|
|
||||||
'ipFamily': msg.ip_family,
|
|
||||||
'debug': msg.debug,
|
|
||||||
'requestRules': msg.request_rules
|
|
||||||
})
|
|
||||||
.then(function(state) {
|
.then(function(state) {
|
||||||
msg.payload = 'online';
|
msg.payload = 'online';
|
||||||
msg.data = state;
|
msg.data = state;
|
||||||
@ -108,7 +87,7 @@ module.exports = function(RED) {
|
|||||||
// so we just use regex to parse the info from the README
|
// so we just use regex to parse the info from the README
|
||||||
// this could break so we also reference the gamedig repo
|
// this could break so we also reference the gamedig repo
|
||||||
let availableTypesContent = fs.readFileSync(require.resolve("gamedig/games.txt"), 'utf-8')
|
let availableTypesContent = fs.readFileSync(require.resolve("gamedig/games.txt"), 'utf-8')
|
||||||
results = [];
|
server_types = [];
|
||||||
|
|
||||||
availableTypesContent
|
availableTypesContent
|
||||||
.split(/\r?\n/)
|
.split(/\r?\n/)
|
||||||
@ -126,12 +105,15 @@ module.exports = function(RED) {
|
|||||||
// avp2010|Aliens vs. Predator (2010)|valve|port=27015
|
// avp2010|Aliens vs. Predator (2010)|valve|port=27015
|
||||||
|
|
||||||
let [game_type, game_name, game_protocol] = line.split('|');
|
let [game_type, game_name, game_protocol] = line.split('|');
|
||||||
results.push({
|
server_types.push({
|
||||||
'name': game_type,
|
'name': game_name,
|
||||||
'type': game_type,
|
'type': game_type,
|
||||||
'protocol': game_protocol
|
'protocol': game_protocol
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
res.json(results);
|
res.json({
|
||||||
|
'result': 'ok',
|
||||||
|
'server_types': server_types
|
||||||
|
});
|
||||||
});
|
});
|
||||||
};
|
};
|
Loading…
x
Reference in New Issue
Block a user