rcon_cs 0.1.1 → 0.3.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 +9 -3
- data/README.md +1 -0
- data/lib/rcon_cs/servers/source_server.rb +5 -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 +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 50af1238b5a2d73aa32fbfb3133fd7d712fc8bda4a93ff7554af96cc7dd79c4c
|
4
|
+
data.tar.gz: 57e6ed4f3ba487949c8fa4e59066e32296ff3cffa4f02bea78906b826eb2eb7e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8105d17dd790d484dea4c776eb0862376fbd7a19c29e9b1a331a6f842aa5fc0db91c1125c644b00311fd58baa429d981476c00a85f4f39678c8be8efeeb2629d
|
7
|
+
data.tar.gz: 3b2e24fa5f48c8e666b1bc0890f9f31a250d152b6142a6980c8b73f2f0b000bd60d2723aa8cebe2c75ed2ab4ada0d7dfcc52427da737f049ceda5e5da3c16ff0
|
data/CHANGELOG.md
CHANGED
@@ -1,9 +1,15 @@
|
|
1
1
|
## Changelog
|
2
2
|
|
3
|
-
## [0.
|
3
|
+
## [0.3.0] - 2025-03-25
|
4
|
+
- Fix UDPSocket not defined error
|
4
5
|
|
5
|
-
-
|
6
|
-
-
|
6
|
+
## [0.2.0] - 2025-03-25
|
7
|
+
- Add player parser to source server
|
7
8
|
|
8
9
|
## [0.1.1] - 2025-03-19
|
9
10
|
- Bump to test trigger automated release on main branch
|
11
|
+
|
12
|
+
## [0.1.0] - 2025-03-20
|
13
|
+
|
14
|
+
- Initial release
|
15
|
+
- Added server info
|
data/README.md
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "socket"
|
4
|
+
|
3
5
|
require "./lib/rcon_cs/utils/parsers"
|
4
6
|
|
5
7
|
module RconCs
|
@@ -23,11 +25,12 @@ module RconCs
|
|
23
25
|
|
24
26
|
def fetch_info
|
25
27
|
response = send_packet(Packets::InfoPacket.new)
|
26
|
-
@info =
|
28
|
+
@info = parse_server_info(response.raw_body)
|
27
29
|
end
|
28
30
|
|
29
31
|
def fetch_players
|
30
|
-
|
32
|
+
response = send_packet(Packets::PlayersPacket.new)
|
33
|
+
@players = parse_players(response.raw_body)
|
31
34
|
end
|
32
35
|
|
33
36
|
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.3.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-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|