game_dig 0.0.1 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +7 -1
- data/README.md +5 -2
- data/Rakefile +8 -0
- data/cli/pry_service.rb +5 -0
- data/lib/game_dig/game_dig_helper.rb +68 -0
- data/lib/game_dig/service.rb +38 -0
- data/lib/game_dig/version.rb +1 -1
- data/lib/game_dig.rb +43 -19
- data/lib/node/gamedig-service.js +46 -0
- data/lib/node/package.json +9 -0
- metadata +7 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1606417a646f32a9d14cf9c257d469059ec2cee23135750b869e1347224e61bd
|
4
|
+
data.tar.gz: 79f5027b3737ee03265083ada485ce45a4cd1998550076b10bc802116f33a9bd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8003e414913f228ea043a64904f0a477dac28fb2881086f5ac89bbf6d52d6f3b0c5dc1dd8c2f594d48dbc126fddb4dfa88767d77c0beb965ad907e150fdf3858
|
7
|
+
data.tar.gz: acf5a2889986077010cc105cdf8324d692284fd91db41deaac8e7d1a383c219779d9e8e56c94a08ca6a5713e9286022072185da066e662764a7eb5f8fa800720
|
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -69,8 +69,11 @@ This will just run the gamedig cli and return its result.
|
|
69
69
|
p data
|
70
70
|
```
|
71
71
|
|
72
|
-
### Service wrapper (
|
73
|
-
|
72
|
+
### Service wrapper (experimental, only did some testing on linux)
|
73
|
+
|
74
|
+
Only the following parameters are implemented for the service wrapper: `type, host, protocol` (version 0.1.0)
|
75
|
+
|
76
|
+
Behaves the same to the user, but runs a tiny node webservice in the background to avoid startup times when called more than one time.
|
74
77
|
|
75
78
|
```
|
76
79
|
your-ruby-app
|
data/Rakefile
CHANGED
@@ -19,4 +19,12 @@ task :cli do |t|
|
|
19
19
|
require_relative 'cli/pry'
|
20
20
|
end
|
21
21
|
|
22
|
+
desc "start service cli to play with the environment"
|
23
|
+
task :cli_service do |t|
|
24
|
+
puts
|
25
|
+
puts %{ Starting CLI ... }.red
|
26
|
+
puts
|
27
|
+
require_relative 'cli/pry_service'
|
28
|
+
end
|
29
|
+
|
22
30
|
RSpec::Core::RakeTask.new(:spec)
|
data/cli/pry_service.rb
ADDED
@@ -0,0 +1,68 @@
|
|
1
|
+
require 'uri'
|
2
|
+
require 'net/http'
|
3
|
+
|
4
|
+
class GameDigHelper
|
5
|
+
|
6
|
+
#----------------------------------------------------------------------------------------------------
|
7
|
+
|
8
|
+
def self.node_service_running?
|
9
|
+
port_open? '127.0.0.1', 24445
|
10
|
+
end
|
11
|
+
|
12
|
+
#----------------------------------------------------------------------------------------------------
|
13
|
+
|
14
|
+
def self.stop_node_service
|
15
|
+
begin
|
16
|
+
uri = URI("http://127.0.0.1:24445/exit")
|
17
|
+
res = Net::HTTP.get_response(uri)
|
18
|
+
rescue Errno::ECONNREFUSED => e
|
19
|
+
# will be refused, as /exit closes the server and makes no more response
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
#----------------------------------------------------------------------------------------------------
|
24
|
+
|
25
|
+
#
|
26
|
+
# Check if gamedig cli is installed globally
|
27
|
+
#
|
28
|
+
# @return [Boolean]
|
29
|
+
def self.cli_installed?()
|
30
|
+
!!(which 'gamedig')
|
31
|
+
end
|
32
|
+
|
33
|
+
#----------------------------------------------------------------------------------------------------
|
34
|
+
|
35
|
+
def self.which(cmd)
|
36
|
+
exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : ['']
|
37
|
+
ENV['PATH'].split(File::PATH_SEPARATOR).each do |path|
|
38
|
+
exts.each do |ext|
|
39
|
+
exe = File.join(path, "#{cmd}#{ext}")
|
40
|
+
return exe if File.executable?(exe) && !File.directory?(exe)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
nil
|
44
|
+
end
|
45
|
+
|
46
|
+
#----------------------------------------------------------------------------------------------------
|
47
|
+
|
48
|
+
private
|
49
|
+
|
50
|
+
#----------------------------------------------------------------------------------------------------
|
51
|
+
|
52
|
+
def self.port_open?(ip, port, seconds = 0.5)
|
53
|
+
# => checks if a port is open or not on a remote host
|
54
|
+
Timeout::timeout(seconds) do
|
55
|
+
begin
|
56
|
+
TCPSocket.new(ip, port).close
|
57
|
+
true
|
58
|
+
rescue Errno::ECONNREFUSED, Errno::EHOSTUNREACH, SocketError
|
59
|
+
false
|
60
|
+
end
|
61
|
+
end
|
62
|
+
rescue Timeout::Error
|
63
|
+
false
|
64
|
+
end
|
65
|
+
|
66
|
+
#----------------------------------------------------------------------------------------------------
|
67
|
+
|
68
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'uri'
|
2
|
+
require 'net/http'
|
3
|
+
require 'benchmark'
|
4
|
+
|
5
|
+
require_relative 'game_dig_helper'
|
6
|
+
|
7
|
+
node_js_app_base_path = File.expand_path(File.dirname(__FILE__) + '/../node/')
|
8
|
+
node_js_app_js_path = File.expand_path(node_js_app_base_path + '/gamedig-service.js')
|
9
|
+
|
10
|
+
unless Dir.exist?(node_js_app_base_path + '/node_modules')
|
11
|
+
puts "GameDig Service: Install missing dependencies ..."
|
12
|
+
if !!GameDigHelper.which('yarn')
|
13
|
+
`cd "#{node_js_app_base_path}" && yarn install`
|
14
|
+
elsif !!GameDigHelper.which('npm')
|
15
|
+
`cd "#{node_js_app_base_path}" && npm install`
|
16
|
+
else
|
17
|
+
raise "Neither 'yarn' nor 'npm' found!"
|
18
|
+
end
|
19
|
+
puts "done"
|
20
|
+
end
|
21
|
+
|
22
|
+
|
23
|
+
unless GameDigHelper.node_service_running?
|
24
|
+
node_js_thread = Thread.new do |t|
|
25
|
+
system %Q(cd "#{node_js_app_base_path}" && node ./gamedig-service.js)
|
26
|
+
at_exit do
|
27
|
+
node_js_thread.exit
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
ENV['GAMEDIG_SERVICE'] = 'true'
|
33
|
+
|
34
|
+
at_exit do
|
35
|
+
GameDigHelper.stop_node_service
|
36
|
+
end
|
37
|
+
|
38
|
+
require_relative '../game_dig'
|
data/lib/game_dig/version.rb
CHANGED
data/lib/game_dig.rb
CHANGED
@@ -1,5 +1,9 @@
|
|
1
|
-
require '
|
2
|
-
require '
|
1
|
+
require 'uri'
|
2
|
+
require 'net/http'
|
3
|
+
require 'json'
|
4
|
+
|
5
|
+
require_relative 'game_dig/version'
|
6
|
+
require_relative 'game_dig/game_dig_helper'
|
3
7
|
require_relative 'custom_errors/game_dig_error'
|
4
8
|
require_relative 'custom_errors/game_dig_cli_not_found'
|
5
9
|
|
@@ -10,6 +14,7 @@ require_relative 'custom_errors/game_dig_cli_not_found'
|
|
10
14
|
module GameDig
|
11
15
|
|
12
16
|
DEBUG_MESSAGE_END = 'Q#0 Query was successful'
|
17
|
+
@@node_service_up = false
|
13
18
|
|
14
19
|
#----------------------------------------------------------------------------------------------------
|
15
20
|
|
@@ -25,7 +30,21 @@ module GameDig
|
|
25
30
|
# @param [Boolean] debug
|
26
31
|
# @param [Boolean] request_rules
|
27
32
|
def self.query(type:, host:, port: nil, max_attempts: nil, socket_timeout: nil, attempt_timeout: nil, given_port_only: nil, debug: nil, request_rules: nil)
|
28
|
-
|
33
|
+
if ENV['GAMEDIG_SERVICE'] == 'true'
|
34
|
+
perform_service_query(type: type, host: host, port: port, max_attempts: max_attempts, socket_timeout: socket_timeout, attempt_timeout: attempt_timeout, given_port_only: given_port_only, debug: debug, request_rules: request_rules)
|
35
|
+
else
|
36
|
+
perform_cli_query(type: type, host: host, port: port, max_attempts: max_attempts, socket_timeout: socket_timeout, attempt_timeout: attempt_timeout, given_port_only: given_port_only, debug: debug, request_rules: request_rules)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
#----------------------------------------------------------------------------------------------------
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
#----------------------------------------------------------------------------------------------------
|
45
|
+
|
46
|
+
def self.perform_cli_query(type:, host:, port: nil, max_attempts: nil, socket_timeout: nil, attempt_timeout: nil, given_port_only: nil, debug: nil, request_rules: nil)
|
47
|
+
throw GameDigCliNotFound unless GameDigHelper.cli_installed?
|
29
48
|
command = "gamedig --type #{type}"
|
30
49
|
command += " --port #{port}" if port
|
31
50
|
command += " --maxAttempts #{max_attempts}" if max_attempts
|
@@ -35,7 +54,6 @@ module GameDig
|
|
35
54
|
command += " --debug #{debug}" if debug
|
36
55
|
command += " --requestRules" if request_rules
|
37
56
|
command += " #{host}"
|
38
|
-
puts command
|
39
57
|
begin
|
40
58
|
output = `#{command}`
|
41
59
|
json = if debug
|
@@ -58,27 +76,33 @@ module GameDig
|
|
58
76
|
|
59
77
|
#----------------------------------------------------------------------------------------------------
|
60
78
|
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
!!(which 'gamedig')
|
79
|
+
def self.perform_service_query(type:, host:, port: nil, max_attempts: nil, socket_timeout: nil, attempt_timeout: nil, given_port_only: nil, debug: nil, request_rules: nil)
|
80
|
+
ensure_node_service_is_up
|
81
|
+
hostname = host
|
82
|
+
hostname += ":#{port}" if port
|
83
|
+
uri = URI("http://127.0.0.1:24445/#{type}/#{hostname}")
|
84
|
+
res = Net::HTTP.get_response(uri)
|
85
|
+
res.body
|
69
86
|
end
|
70
87
|
|
71
88
|
#----------------------------------------------------------------------------------------------------
|
72
89
|
|
73
|
-
def self.
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
90
|
+
def self.ensure_node_service_is_up
|
91
|
+
max_counter = 100
|
92
|
+
counter = 0
|
93
|
+
unless @@node_service_up
|
94
|
+
loop do
|
95
|
+
counter += 1
|
96
|
+
if GameDigHelper.node_service_running?
|
97
|
+
break
|
98
|
+
elsif counter >= max_counter
|
99
|
+
raise "Node gamedig service did not boot up properly ..."
|
100
|
+
break
|
101
|
+
end
|
102
|
+
sleep 0.1
|
79
103
|
end
|
104
|
+
@@node_service_up = true
|
80
105
|
end
|
81
|
-
nil
|
82
106
|
end
|
83
107
|
|
84
108
|
#----------------------------------------------------------------------------------------------------
|
@@ -0,0 +1,46 @@
|
|
1
|
+
const Gamedig = require('gamedig');
|
2
|
+
const Hapi = require('@hapi/hapi');
|
3
|
+
|
4
|
+
const server = Hapi.server({
|
5
|
+
port: 24445,
|
6
|
+
host: 'localhost'
|
7
|
+
});
|
8
|
+
|
9
|
+
const init = async () => {
|
10
|
+
|
11
|
+
server.route({
|
12
|
+
method: 'GET',
|
13
|
+
path: '/exit',
|
14
|
+
handler: async (request, h) => {
|
15
|
+
server.stop();
|
16
|
+
process.exit(0);
|
17
|
+
return '';
|
18
|
+
}
|
19
|
+
});
|
20
|
+
|
21
|
+
server.route({
|
22
|
+
method: 'GET',
|
23
|
+
path: '/{type}/{ip}',
|
24
|
+
handler: async (request, h) => {
|
25
|
+
|
26
|
+
const { type, ip } = request.params;
|
27
|
+
const [ host, port ] = ip.split(':')
|
28
|
+
|
29
|
+
const serverData = await Gamedig.query({
|
30
|
+
type: type,
|
31
|
+
host,
|
32
|
+
port
|
33
|
+
});
|
34
|
+
return serverData;
|
35
|
+
}
|
36
|
+
});
|
37
|
+
|
38
|
+
await server.start();
|
39
|
+
};
|
40
|
+
|
41
|
+
process.on('unhandledRejection', (err) => {
|
42
|
+
console.error(err);
|
43
|
+
});
|
44
|
+
|
45
|
+
init();
|
46
|
+
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: game_dig
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matthäus Beyrle
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-12-
|
11
|
+
date: 2022-12-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -97,11 +97,16 @@ files:
|
|
97
97
|
- bin/console
|
98
98
|
- bin/setup
|
99
99
|
- cli/pry.rb
|
100
|
+
- cli/pry_service.rb
|
100
101
|
- game_dig.gemspec
|
101
102
|
- lib/custom_errors/game_dig_cli_not_found.rb
|
102
103
|
- lib/custom_errors/game_dig_error.rb
|
103
104
|
- lib/game_dig.rb
|
105
|
+
- lib/game_dig/game_dig_helper.rb
|
106
|
+
- lib/game_dig/service.rb
|
104
107
|
- lib/game_dig/version.rb
|
108
|
+
- lib/node/gamedig-service.js
|
109
|
+
- lib/node/package.json
|
105
110
|
homepage: https://github.com/magynhard/ruby-game_dig
|
106
111
|
licenses:
|
107
112
|
- MIT
|