gamespy_query 0.2.0pre3 → 0.2.0pre4
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/gamespy_query/base.rb +9 -2
- data/lib/gamespy_query/parser.rb +4 -4
- data/lib/gamespy_query/socket.rb +0 -1
- data/lib/gamespy_query/version.rb +1 -1
- data/test/units/parser_test.rb +3 -3
- data/test/units/socket_test.rb +15 -13
- metadata +7 -7
data/lib/gamespy_query/base.rb
CHANGED
@@ -106,12 +106,19 @@ STR
|
|
106
106
|
def encode_string(str)
|
107
107
|
#Tools.debug {"Getting string #{str}"}
|
108
108
|
#System::Text::Encoding.UTF8.GetString(System::Array.of(System::Byte).new(str.bytes.to_a)).to_s # # begin; System::Text::Encoding.USASCII.GetString(reply[0]).to_s; rescue nil, Exception => e; Tools.log_exception(e); reply[0].map {|e| e.chr}.join; end
|
109
|
+
# TODO: Temporary disabled due to issues with the encoded strings
|
110
|
+
=begin
|
109
111
|
begin
|
110
|
-
str.
|
112
|
+
# str.force_encoding(STR_UTF8)
|
113
|
+
(str + ' ').encode(STR_UTF8, STR_UTF8, invalid: :replace, undef: :replace)[0..-3]
|
111
114
|
rescue nil, Exception => e
|
115
|
+
# Fallback - convert to UTF and replace any invalid or undefined
|
112
116
|
Tools.log_exception e
|
113
|
-
str.encode(
|
117
|
+
str.encode(STR_UTF8, invalid: :replace, undef: :replace)
|
114
118
|
end
|
119
|
+
=end
|
120
|
+
# Fallback - convert to UTF and replace any invalid or undefined
|
121
|
+
str.encode(STR_UTF8, invalid: :replace, undef: :replace)
|
115
122
|
end
|
116
123
|
end
|
117
124
|
|
data/lib/gamespy_query/parser.rb
CHANGED
@@ -75,7 +75,7 @@ module GamespyQuery
|
|
75
75
|
end
|
76
76
|
|
77
77
|
# Parse player_data
|
78
|
-
data[:players] = parse_player_data(
|
78
|
+
data[:players] = parse_player_data(player_data)
|
79
79
|
|
80
80
|
data
|
81
81
|
end
|
@@ -165,7 +165,7 @@ module GamespyQuery
|
|
165
165
|
# Parse the data - \x00 is printed after a non-nil entry, otherwise \x00 means nil (e.g empty team)
|
166
166
|
until str.empty?
|
167
167
|
entry = str[RX_X0_SPEC]
|
168
|
-
player_data[player_data.keys[i]] <<
|
168
|
+
player_data[player_data.keys[i]] << entry.sub(STR_X0, STR_EMPTY)
|
169
169
|
str.sub!(entry, STR_EMPTY)
|
170
170
|
end
|
171
171
|
|
@@ -178,11 +178,11 @@ module GamespyQuery
|
|
178
178
|
next # ignore
|
179
179
|
else
|
180
180
|
if overwrite
|
181
|
-
new_player_data[-1] = info # Overwrite latest entry
|
181
|
+
new_player_data[-1] = encode_string(info) # Overwrite latest entry
|
182
182
|
overwrite = false # done the overwrite
|
183
183
|
else
|
184
184
|
#break if new_player_data.size == num_players
|
185
|
-
new_player_data << info # insert entry
|
185
|
+
new_player_data << encode_string(info) # insert entry
|
186
186
|
end
|
187
187
|
end
|
188
188
|
end
|
data/lib/gamespy_query/socket.rb
CHANGED
data/test/units/parser_test.rb
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
require 'teststrap'
|
2
2
|
|
3
3
|
context "Parser" do
|
4
|
-
|
4
|
+
default_data = [
|
5
5
|
"\x00\x04\x05\x06\asplitnum\x00\x00\x00gamever\x001.59.79548\x00hostname\x00-=WASP=- Warfare CO (Prime)\x00mapname\x00takistan\x00gametype\x00CTI\x00numplayers\x0046\x00numteams\x000\x00maxplayers\x0054\x00gamemode\x00openplaying\x00timelimit\x0015\x00password\x000\x00param1\x000\x00param2\x000\x00currentVersion\x00159\x00requiredVersion\x00159\x00mod\x00Arma 2;Arma 2: Operation Arrowhead;Arma 2: British Armed Forces (Lite);Arma 2: Private Military Company (Lite)\x00equalModRequired\x000\x00gameState\x007\x00dedicated\x001\x00platform\x00linux\x00language\x0065545\x00difficulty\x002\x00mission\x00[54] Warfare BE V2.069 - Takistan\x00gamename\x00arma2oapc\x00sv_battleye\x001\x00verifySignatures\x001\x00signatures\x00bi;WarFXPE;GLT_ADDONS;warFXsunlight;TGW_Zeroing;trsm_oa;soa110;SMK;jsrsfa;v2ECL;CBA_v0-7-3;ZEU_test;TRSM;TracersWAR;bi2;VopSound;cba_b158;acex_sm;WarFXLighting;gdtmod_plants2;TGW_Thermal;cba_b151;ASR;...\x00modhash\x00PMC v. 1.01;BAF v. 1.02;da39a3ee5e6b4b0d3255bfef95601890afd80709;\x00hash\x00f8c806b971abb935747da3900cab55599c0bc60c\x00\x00\x01player_\x00\x00Skilllos\x00Cool Hand\x00Viktor Reznov\x00Alchemist(HUN)\x00General Heinkel [GER]\x00Max\x00\xD0\x94\xD1\x80\xD0\xBE\xD0\xBD\xD0\xB3\xD0\xBE\x00letchik\x00Angerbode\x00TiDus\x00DrHat\x00Kermit\x00[UaS] snicka\x00Wedel\x00Dnalir [NOR]\x00Davor\x00Cateye(GER)\x00Bamse\x00Jorj\x00POMbI4\x00Daredevil\x00DrSMOKE\x00Vollpfosten\x00Maddin\x00-=[LRRP]=-Sentinel(NL)\x00Husky\x00Scumhawk\x00Bone-CH\x00Jarzah\x00I./KG40_Razor\x00Cpl.Bouiss\x00nAh\x00Tremor\x00Diamm\x00TUROCK_(FR-VODKA)\x00j.moss\x00FOKS\x00Phoenix\x00AfterShave\x00Coupe\x00Mitradis\x00Daniel\x00Flanker\x00Sig\x00_DPVf_hinkel\x00Random Sequence\x00\x00team_\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Ru\x00SO\x00\x00\x00\x00\x00\x00\x00\x00TF\x00\x00\x00\x00UTGPrivates\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00score_\x00\x00",
|
6
6
|
"\x00\x04\x05\x06\asplitnum\x00\x81\x01score_\x00\x00371\x00314\x00335\x0038\x00224\x0036\x0096\x0083\x0042\x00237\x0037\x00137\x00212\x0082\x0041\x0042\x0035\x0073\x0094\x0028\x00127\x0045\x00107\x0030\x00-2\x0083\x002\x0026\x0023\x0034\x0010\x0056\x0016\x006\x0036\x001\x000\x001\x000\x003\x000\x002\x001\x000\x0020\x000\x00\x00deaths_\x00\x0024\x0017\x0018\x0015\x0028\x0025\x0027\x0029\x007\x0010\x008\x0011\x008\x0011\x0016\x0015\x0016\x006\x0010\x0023\x0038\x003\x0017\x003\x002\x007\x002\x001\x004\x0014\x002\x004\x002\x000\x0019\x005\x001\x004\x004\x000\x003\x002\x000\x000\x008\x000\x00\x00\x00\x02\x00"
|
7
7
|
]
|
8
|
-
setup { GamespyQuery::Parser.new(
|
8
|
+
setup { GamespyQuery::Parser.new(default_data) }
|
9
9
|
|
10
|
-
asserts("Packets assigned") { topic.packets }.same_elements
|
10
|
+
asserts("Packets assigned") { topic.packets }.same_elements default_data
|
11
11
|
|
12
12
|
context "Parsed Output" do
|
13
13
|
setup { topic.parse }
|
data/test/units/socket_test.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'teststrap'
|
2
2
|
|
3
3
|
context "Socket" do
|
4
|
-
|
4
|
+
default_data = [
|
5
5
|
"\x00\x04\x05\x06\asplitnum\x00\x00\x00gamever\x001.59.79548\x00hostname\x00-=WASP=- Warfare CO (Prime)\x00mapname\x00takistan\x00gametype\x00CTI\x00numplayers\x0046\x00numteams\x000\x00maxplayers\x0054\x00gamemode\x00openplaying\x00timelimit\x0015\x00password\x000\x00param1\x000\x00param2\x000\x00currentVersion\x00159\x00requiredVersion\x00159\x00mod\x00Arma 2;Arma 2: Operation Arrowhead;Arma 2: British Armed Forces (Lite);Arma 2: Private Military Company (Lite)\x00equalModRequired\x000\x00gameState\x007\x00dedicated\x001\x00platform\x00linux\x00language\x0065545\x00difficulty\x002\x00mission\x00[54] Warfare BE V2.069 - Takistan\x00gamename\x00arma2oapc\x00sv_battleye\x001\x00verifySignatures\x001\x00signatures\x00bi;WarFXPE;GLT_ADDONS;warFXsunlight;TGW_Zeroing;trsm_oa;soa110;SMK;jsrsfa;v2ECL;CBA_v0-7-3;ZEU_test;TRSM;TracersWAR;bi2;VopSound;cba_b158;acex_sm;WarFXLighting;gdtmod_plants2;TGW_Thermal;cba_b151;ASR;...\x00modhash\x00PMC v. 1.01;BAF v. 1.02;da39a3ee5e6b4b0d3255bfef95601890afd80709;\x00hash\x00f8c806b971abb935747da3900cab55599c0bc60c\x00\x00\x01player_\x00\x00Skilllos\x00Cool Hand\x00Viktor Reznov\x00Alchemist(HUN)\x00General Heinkel [GER]\x00Max\x00\xD0\x94\xD1\x80\xD0\xBE\xD0\xBD\xD0\xB3\xD0\xBE\x00letchik\x00Angerbode\x00TiDus\x00DrHat\x00Kermit\x00[UaS] snicka\x00Wedel\x00Dnalir [NOR]\x00Davor\x00Cateye(GER)\x00Bamse\x00Jorj\x00POMbI4\x00Daredevil\x00DrSMOKE\x00Vollpfosten\x00Maddin\x00-=[LRRP]=-Sentinel(NL)\x00Husky\x00Scumhawk\x00Bone-CH\x00Jarzah\x00I./KG40_Razor\x00Cpl.Bouiss\x00nAh\x00Tremor\x00Diamm\x00TUROCK_(FR-VODKA)\x00j.moss\x00FOKS\x00Phoenix\x00AfterShave\x00Coupe\x00Mitradis\x00Daniel\x00Flanker\x00Sig\x00_DPVf_hinkel\x00Random Sequence\x00\x00team_\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Ru\x00SO\x00\x00\x00\x00\x00\x00\x00\x00TF\x00\x00\x00\x00UTGPrivates\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00score_\x00\x00",
|
6
6
|
"\x00\x04\x05\x06\asplitnum\x00\x81\x01score_\x00\x00371\x00314\x00335\x0038\x00224\x0036\x0096\x0083\x0042\x00237\x0037\x00137\x00212\x0082\x0041\x0042\x0035\x0073\x0094\x0028\x00127\x0045\x00107\x0030\x00-2\x0083\x002\x0026\x0023\x0034\x0010\x0056\x0016\x006\x0036\x001\x000\x001\x000\x003\x000\x002\x001\x000\x0020\x000\x00\x00deaths_\x00\x0024\x0017\x0018\x0015\x0028\x0025\x0027\x0029\x007\x0010\x008\x0011\x008\x0011\x0016\x0015\x0016\x006\x0010\x0023\x0038\x003\x0017\x003\x002\x007\x002\x001\x004\x0014\x002\x004\x002\x000\x0019\x005\x001\x004\x004\x000\x003\x002\x000\x000\x008\x000\x00\x00\x00\x02\x00"
|
7
7
|
]
|
@@ -10,15 +10,15 @@ context "Socket" do
|
|
10
10
|
|
11
11
|
denies("Confirm valid") { topic.valid? }
|
12
12
|
|
13
|
-
asserts("handle_write") { topic.state = 0; topic.handle_write }.nil
|
14
|
-
asserts("handle_read") { topic.state = 1; topic.handle_read }.nil
|
15
|
-
asserts("handle_write") { topic.state = 2; topic.handle_write }.nil
|
16
|
-
asserts("handle_read") { topic.state = 3; topic.handle_read }.nil
|
17
|
-
asserts("handle_read") { topic.state = 4; topic.handle_read }.nil
|
13
|
+
#asserts("handle_write") { topic.state = 0; topic.handle_write }.nil
|
14
|
+
#asserts("handle_read") { topic.state = 1; topic.handle_read }.nil
|
15
|
+
#asserts("handle_write") { topic.state = 2; topic.handle_write }.nil
|
16
|
+
#asserts("handle_read") { topic.state = 3; topic.handle_read }.nil
|
17
|
+
#asserts("handle_read") { topic.state = 4; topic.handle_read }.nil
|
18
18
|
asserts("Set state 5, confirm valid") { topic.state = 5; topic.valid? }
|
19
19
|
|
20
|
-
denies("handle_write") { topic.state = 1; topic.handle_write }
|
21
|
-
denies("handle_read") { topic.state = 0; topic.handle_read }
|
20
|
+
#denies("handle_write") { topic.state = 1; topic.handle_write }
|
21
|
+
#denies("handle_read") { topic.state = 0; topic.handle_read }
|
22
22
|
|
23
23
|
|
24
24
|
# TODO
|
@@ -34,7 +34,7 @@ context "Socket" do
|
|
34
34
|
asserts("sync") { topic.sync }
|
35
35
|
|
36
36
|
context "Sync custom" do
|
37
|
-
setup { topic.sync(
|
37
|
+
setup { topic.sync(default_data) }
|
38
38
|
asserts("Is a hash") { topic }.is_a?(Hash)
|
39
39
|
|
40
40
|
context "Players" do
|
@@ -46,8 +46,8 @@ context "Socket" do
|
|
46
46
|
|
47
47
|
asserts("name") { topic[:name] }.equals "-=[LRRP]=-Sentinel(NL)"
|
48
48
|
asserts("team") { topic[:team] }.equals ""
|
49
|
-
asserts("score") { topic[:score] }.equals -2
|
50
|
-
asserts("deaths") { topic[:deaths] }.equals 2
|
49
|
+
asserts("score") { topic[:score] }.equals "-2"
|
50
|
+
asserts("deaths") { topic[:deaths] }.equals "2"
|
51
51
|
end
|
52
52
|
|
53
53
|
context "Player 10" do
|
@@ -55,8 +55,8 @@ context "Socket" do
|
|
55
55
|
|
56
56
|
asserts("name") { topic[:name] }.equals "Coupe"
|
57
57
|
asserts("team") { topic[:team] }.equals ""
|
58
|
-
asserts("score") { topic[:score] }.equals 3
|
59
|
-
asserts("deaths") { topic[:deaths] }.equals 0
|
58
|
+
asserts("score") { topic[:score] }.equals "3"
|
59
|
+
asserts("deaths") { topic[:deaths] }.equals "0"
|
60
60
|
end
|
61
61
|
|
62
62
|
end
|
@@ -66,8 +66,10 @@ context "Socket" do
|
|
66
66
|
end
|
67
67
|
|
68
68
|
# TODO
|
69
|
+
=begin
|
69
70
|
context "MultiSocket" do
|
70
71
|
setup { GamespyQuery::MultiSocket }
|
71
72
|
|
72
73
|
end
|
74
|
+
=end
|
73
75
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gamespy_query
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.0pre4
|
5
5
|
prerelease: 5
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -13,7 +13,7 @@ date: 2012-03-10 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: cri
|
16
|
-
requirement: &
|
16
|
+
requirement: &19620600 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *19620600
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: riot
|
27
|
-
requirement: &
|
27
|
+
requirement: &19619540 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *19619540
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: yard
|
38
|
-
requirement: &
|
38
|
+
requirement: &19618960 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,7 +43,7 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *19618960
|
47
47
|
description: ''
|
48
48
|
email:
|
49
49
|
- sb@dev-heaven.net
|