Compare commits

..

5 Commits
v0.2.0 ... main

Author SHA1 Message Date
5192c9f694 send a single joke 2026-02-18 21:30:39 +00:00
eeae1c76b4 add Taskfile for bumping manifest version 2026-02-18 11:27:20 +00:00
fa02d0c65e the timeouts hash means we can simplify the logic in CLI, GUI examples
colour codes removed from response output.
2026-02-18 11:19:09 +00:00
9209c705ce fixes bug skipping first char of response 2026-02-18 11:18:25 +00:00
cb90ad8030 upd README 2026-02-17 21:45:56 +00:00
6 changed files with 33 additions and 39 deletions

View File

@ -38,16 +38,14 @@ finally {
## Rcon Class ## Rcon Class
#### `Send($cmd) | Send($cmd, $timeout)` #### `Send($cmd)`
```powershell ```powershell
$rcon.Send("mapname") $rcon.Send("mapname")
$rcon.Send("g_gametype dm") $rcon.Send("g_gametype dm")
$rcon.Send("map_rotate", 2000) $rcon.Send("map_rotate")
``` ```
If the command returns a response it will be printed to the console. If the command returns a response it will be printed to the console.
Pass an optional timeout (ms) for commands that return responses in fragments. (status, map_rotate etc...)

15
Taskfile.yml Normal file
View File

@ -0,0 +1,15 @@
version: '3'
tasks:
bump:
desc: 'Bump the module version in the .psd1 file. Usage: "task bump -- show" or "task bump -- [patch|minor|major]".'
preconditions:
- sh: 'pwsh -c "if (Get-Command bump) { exit 0 } else { exit 1 }"'
msg: "The 'bump' command is not available. Please install the required tools to use this command."
cmds:
- |
{{if eq .CLI_ARGS "show"}}
pwsh -c "bump show -f lib/Q3Rcon.psd1 -p \"ModuleVersion\s*=\s'(\d+\.\d+\.\d+)'\""
{{else}}
pwsh -c "bump {{.CLI_ARGS}} -w -f lib/Q3Rcon.psd1 -p \"ModuleVersion\s*=\s'(\d+\.\d+\.\d+)'\""
{{end}}

View File

@ -12,20 +12,15 @@ function Read-HostUntilEmpty {
break break
} }
if ($line -in @('fast_restart', 'map_rotate', 'map_restart')) { $resp = $rcon.Send($line)
$cmd = $line -replace '(?:^|_)(\p{L})', { $_.Groups[1].Value.ToUpper() } Write-Host (Remove-ColourCodes $resp)
$rcon.$cmd()
}
elseif ($line.StartsWith('map mp_')) {
$mapname = $line.Split()[1]
$rcon.SetMap($mapname)
}
else {
$rcon.Send($line)
}
} }
} }
function Remove-ColourCodes($str) {
return $str -replace '\^[0-9]', ''
}
function Get-ConnFromPSD1 { function Get-ConnFromPSD1 {
$configpath = Join-Path $PSScriptRoot 'config.psd1' $configpath = Join-Path $PSScriptRoot 'config.psd1'
return Import-PowerShellDataFile -Path $configpath return Import-PowerShellDataFile -Path $configpath

View File

@ -75,27 +75,19 @@ function Send-RconCommand() {
param($rcon) param($rcon)
$line = $OTB.Text $line = $OTB.Text
$line | Write-Debug Write-Debug "Sending command: $line"
if ($line -in @('fast_restart', 'map_rotate', 'map_restart')) { $resp = $rcon.Send($line)
$RLbl.Text = ''
$cmd = $line -replace '(?:^|_)(\p{L})', { $_.Groups[1].Value.ToUpper() }
$rcon.$cmd()
}
elseif ($line.StartsWith('map mp_')) {
$RLbl.Text = ''
$mapname = $line.Split()[1]
$rcon.SetMap($mapname)
}
else {
$resp = $rcon.Send($line)
}
if ($resp -match '^["](?<name>[a-z_]+)["]\sis[:]\s["](?<value>.*?)\^7["]\s') { if ($resp -match '^["](?<name>[a-z_]+)["]\sis[:]\s["](?<value>.*?)\^7["]\s') {
$RLbl.Text = $Matches.name + ': ' + $Matches.value $RLbl.Text = Remove-ColourCodes "$($Matches.name): $($Matches.value)"
} }
$OTB.Text = '' $OTB.Text = ''
} }
function Remove-ColourCodes($str) {
return $str -replace '\^[0-9]', ''
}
function Get-ConnFromPSD1 { function Get-ConnFromPSD1 {
$configpath = Join-Path $PSScriptRoot 'config.psd1' $configpath = Join-Path $PSScriptRoot 'config.psd1'

View File

@ -16,7 +16,7 @@ function Send-Message {
param($rcon) param($rcon)
$msg = Get-DadJoke $msg = Get-DadJoke
$msg | Write-Debug Write-Debug "Sending message: $msg"
$rcon.Say($msg) $rcon.Say($msg)
} }
@ -25,13 +25,7 @@ try {
$conn = Get-ConnFromPSD1 $conn = Get-ConnFromPSD1
$rcon = Connect-Rcon -hostname $conn.host -port $conn.port -passwd $conn.passwd $rcon = Connect-Rcon -hostname $conn.host -port $conn.port -passwd $conn.passwd
$stopWatch = [system.diagnostics.stopwatch]::StartNew() Send-Message -rcon $rcon
$timeSpan = New-TimeSpan -Seconds 30
do {
Send-Message -rcon $rcon
Start-Sleep -Seconds 10
} until ($stopWatch.Elapsed -ge $timeSpan)
$stopWatch.Stop()
} }
finally { finally {
Disconnect-Rcon -rcon $rcon Disconnect-Rcon -rcon $rcon

View File

@ -122,7 +122,7 @@ class Base {
try { try {
$bytesReceived = $this._socket.Receive($this._receiveBuffer) $bytesReceived = $this._socket.Receive($this._receiveBuffer)
if ($bytesReceived -gt 0) { if ($bytesReceived -gt 0) {
$dataStartIndex = [Math]::Min($headerLength, $bytesReceived) $dataStartIndex = [Math]::Min($headerLength - 1, $bytesReceived)
$responseText = [System.Text.Encoding]::ASCII.GetString($this._receiveBuffer, $dataStartIndex, $bytesReceived - $dataStartIndex) $responseText = [System.Text.Encoding]::ASCII.GetString($this._receiveBuffer, $dataStartIndex, $bytesReceived - $dataStartIndex)
$responseData.Append($responseText) | Out-Null $responseData.Append($responseText) | Out-Null
} }