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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a35f0890bfa6a1e073c9a109c1053c501e0b8dd07d34e38db3053dfcb06adb92
4
- data.tar.gz: 58e3e2706addd1fae88a8d7238733636a2c8df1ca561812e0bc5470974f58fb5
3
+ metadata.gz: 50af1238b5a2d73aa32fbfb3133fd7d712fc8bda4a93ff7554af96cc7dd79c4c
4
+ data.tar.gz: 57e6ed4f3ba487949c8fa4e59066e32296ff3cffa4f02bea78906b826eb2eb7e
5
5
  SHA512:
6
- metadata.gz: 88761daf9c0c904fb084c57521fd359e656c109923d27f8497706886b01c6a50851ea6c4f508ac0541740c1459ebff38d49a90881205a69d0af7a762426d242a
7
- data.tar.gz: 9a4ddaa7044ead4b99974e6d6167a4c6e5ba533cc8d8bf1f5ab3ee06a5054705520ab3bcddf7c206b31d55d64072078b3e6b4f6ca1fa48375073f65f3b7585ea
6
+ metadata.gz: 8105d17dd790d484dea4c776eb0862376fbd7a19c29e9b1a331a6f842aa5fc0db91c1125c644b00311fd58baa429d981476c00a85f4f39678c8be8efeeb2629d
7
+ data.tar.gz: 3b2e24fa5f48c8e666b1bc0890f9f31a250d152b6142a6980c8b73f2f0b000bd60d2723aa8cebe2c75ed2ab4ada0d7dfcc52427da737f049ceda5e5da3c16ff0
data/CHANGELOG.md CHANGED
@@ -1,9 +1,15 @@
1
1
  ## Changelog
2
2
 
3
- ## [0.1.0] - 2025-03-20
3
+ ## [0.3.0] - 2025-03-25
4
+ - Fix UDPSocket not defined error
4
5
 
5
- - Initial release
6
- - Added server info
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,4 +1,5 @@
1
1
  # RconCs
2
+ [![Gem Version](https://badge.fury.io/rb/rcon_cs.svg?icon=si%3Arubygems)](https://badge.fury.io/rb/rcon_cs)
2
3
 
3
4
  TODO: Delete this and the text below, and describe your gem
4
5
 
@@ -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 = parse_cs2_server_info(response.raw_body)
28
+ @info = parse_server_info(response.raw_body)
27
29
  end
28
30
 
29
31
  def fetch_players
30
- @players = send_packet(Packets::PlayersPacket.new)
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 parse_cs2_server_info(data)
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<") # Little-endian 64-bit
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RconCs
4
- VERSION = "0.1.1"
4
+ VERSION = "0.3.0"
5
5
  end
@@ -3,10 +3,10 @@ module RconCs
3
3
  class SourceServer
4
4
  @socket: UDPSocket
5
5
 
6
- attr_reader info: Responses::QueryResponse
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: Responses::QueryResponse
9
+ attr_reader players: []
10
10
  attr_reader port: int
11
11
  attr_reader rules: string
12
12
 
@@ -1,7 +1,9 @@
1
1
  module RconCs
2
2
  module Utils
3
3
  module Parsers
4
- def parse_cs2_server_info: -> hash[string, string | int]
4
+ def parse_players: -> []
5
+
6
+ def parse_server_info: -> hash[string, string | int]
5
7
  end
6
8
  end
7
9
  end
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.1.1
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-24 00:00:00.000000000 Z
11
+ date: 2025-03-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec