rcon_cs 0.1.0 → 0.2.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/CHANGELOG.md +8 -1
- data/Makefile +6 -0
- data/lib/rcon_cs/servers/source_server.rb +3 -2
- data/lib/rcon_cs/utils/parsers.rb +43 -2
- data/lib/rcon_cs/version.rb +1 -1
- data/sig/rcon_cs/servers/source_server.rbs +2 -2
- data/sig/rcon_cs/utils/parsers.rbs +3 -1
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d3d874def73226b86e0c089e8375a5b7a8734bd15be19d70a86d655721e81be4
|
4
|
+
data.tar.gz: 26605296555fca3e54b8c1d99391de7cd9a150f90162f6d4789bd0c926b86d32
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4e75660a832bd59353d86d0c8176c68010196cd5ffa61bfd76242284f4172a6e8f470f0450d073dd40c3884385f4e9b4fbc68bbfa81ffcdebe021f315fba50f2
|
7
|
+
data.tar.gz: 39f7fb861f97df3d9c2e3ecf41e8f182e75f2509028e3d6f0f0992a16ea39276a2dc9d49ac06fa6160a316548c6d6ae935bd588543bb7fc1211a9cae70217caf
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,12 @@
|
|
1
|
-
##
|
1
|
+
## Changelog
|
2
|
+
|
3
|
+
## [0.2.0] - 2025-03-25
|
4
|
+
- Add player parser to source server
|
5
|
+
|
6
|
+
## [0.1.1] - 2025-03-19
|
7
|
+
- Bump to test trigger automated release on main branch
|
2
8
|
|
3
9
|
## [0.1.0] - 2025-03-20
|
4
10
|
|
5
11
|
- Initial release
|
12
|
+
- Added server info
|
data/Makefile
ADDED
@@ -23,11 +23,12 @@ module RconCs
|
|
23
23
|
|
24
24
|
def fetch_info
|
25
25
|
response = send_packet(Packets::InfoPacket.new)
|
26
|
-
@info =
|
26
|
+
@info = parse_server_info(response.raw_body)
|
27
27
|
end
|
28
28
|
|
29
29
|
def fetch_players
|
30
|
-
|
30
|
+
response = send_packet(Packets::PlayersPacket.new)
|
31
|
+
@players = parse_players(response.raw_body)
|
31
32
|
end
|
32
33
|
|
33
34
|
def send_packet(packet)
|
@@ -5,7 +5,7 @@ module RconCs
|
|
5
5
|
module Utils
|
6
6
|
# Utility parser methods
|
7
7
|
module Parsers
|
8
|
-
def
|
8
|
+
def parse_server_info(data)
|
9
9
|
body = data[4..]
|
10
10
|
|
11
11
|
result = {}
|
@@ -64,7 +64,7 @@ module RconCs
|
|
64
64
|
end
|
65
65
|
|
66
66
|
if edf & 0x10
|
67
|
-
result[:steam_id] = body[0..7].unpack1("Q<")
|
67
|
+
result[:steam_id] = body[0..7].unpack1("Q<")
|
68
68
|
body = body[8..]
|
69
69
|
end
|
70
70
|
|
@@ -84,6 +84,47 @@ module RconCs
|
|
84
84
|
result
|
85
85
|
end
|
86
86
|
|
87
|
+
def parse_players(data)
|
88
|
+
body = data[4..]
|
89
|
+
|
90
|
+
raise "Invalid packet type: #{body[0]}" unless body[0] == "D"
|
91
|
+
|
92
|
+
num_of_players = body[1].ord
|
93
|
+
body = body[2..]
|
94
|
+
|
95
|
+
result = []
|
96
|
+
offset = 0
|
97
|
+
|
98
|
+
num_of_players.times do |player_idx|
|
99
|
+
# Ensure enough data remains
|
100
|
+
raise "Insufficient data for player #{player_idx}" if offset >= body.length
|
101
|
+
|
102
|
+
offset += 1
|
103
|
+
|
104
|
+
name_end = body[offset..].index("\x00")
|
105
|
+
raise "No null terminator for player #{player_idx} name" unless name_end
|
106
|
+
|
107
|
+
name = body[offset...(offset + name_end)].force_encoding("UTF-8")
|
108
|
+
offset += name_end + 1
|
109
|
+
|
110
|
+
# Ensure enough bytes for score and duration (4 each)
|
111
|
+
raise "Missing score/duration for player #{player_idx}" if offset + 8 > body.length
|
112
|
+
|
113
|
+
# Score (4 bytes, little-endian long)
|
114
|
+
score = body[offset...(offset + 4)].unpack1("l<")
|
115
|
+
offset += 4
|
116
|
+
|
117
|
+
# Duration (4 bytes, little-endian float)
|
118
|
+
duration = body[offset...(offset + 4)].unpack1("e")
|
119
|
+
offset += 4
|
120
|
+
|
121
|
+
result << { name: name, score: score, duration: duration }
|
122
|
+
end
|
123
|
+
|
124
|
+
warn "Extra data after parsing: #{body[offset..].bytes}" if offset < body.length
|
125
|
+
|
126
|
+
result
|
127
|
+
end
|
87
128
|
end
|
88
129
|
end
|
89
130
|
end
|
data/lib/rcon_cs/version.rb
CHANGED
@@ -3,10 +3,10 @@ module RconCs
|
|
3
3
|
class SourceServer
|
4
4
|
@socket: UDPSocket
|
5
5
|
|
6
|
-
attr_reader info:
|
6
|
+
attr_reader info: hash[string, string | int]
|
7
7
|
attr_reader ip_address: string
|
8
8
|
attr_reader ping: float
|
9
|
-
attr_reader players:
|
9
|
+
attr_reader players: []
|
10
10
|
attr_reader port: int
|
11
11
|
attr_reader rules: string
|
12
12
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rcon_cs
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mohit Kumar Yadav
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2025-03-
|
11
|
+
date: 2025-03-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|
@@ -52,7 +52,7 @@ dependencies:
|
|
52
52
|
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
|
-
description:
|
55
|
+
description: It's implements source RCON and Query protocol for Counter Strike 2 servers.
|
56
56
|
email:
|
57
57
|
- me@only4.dev
|
58
58
|
executables: []
|
@@ -65,6 +65,7 @@ files:
|
|
65
65
|
- CHANGELOG.md
|
66
66
|
- CODE_OF_CONDUCT.md
|
67
67
|
- LICENSE.txt
|
68
|
+
- Makefile
|
68
69
|
- README.md
|
69
70
|
- Rakefile
|
70
71
|
- lib/rcon_cs.rb
|
@@ -106,5 +107,5 @@ requirements: []
|
|
106
107
|
rubygems_version: 3.5.11
|
107
108
|
signing_key:
|
108
109
|
specification_version: 4
|
109
|
-
summary:
|
110
|
+
summary: It's an RCON client for Counter Strike 2 servers.
|
110
111
|
test_files: []
|