Basic Steam RCON Example (Rust)
After spending time over Christmas coding a tool to query Steam servers for information. I’ve now been taking the next steps… Sending data to a Steam server!
For this example, I’m going to be using a Rust Dedicated Server, to send a simple command, then in future posts show how I sent scheduled commands (such as adverts, messages and other routine tasks which you would expect a Rust server to run).
First things first, after learning the hard way; Don’t run your Rust server with rcon.web = 1. It’s a new protocol, and I found it almost impossible to get working. Maybe if I had more time and patience, I could have cracked it. However, using the old protocol (which I assume is steam’s rcon protocol) is much easier.
Here’s the startup command I used when starting the Rust server (notice rcon.web 0):
./RustDedicated -batchmode +server.ip 127.0.0.1 +server.port 28015 +server.tickrate 30 +server.hostname "Server Name" +server.identity "rust-server" +server.maxplayers 250 +server.worldsize 3000 +server.saveinterval 300 +rcon.web 0 +rcon.ip 127.0.0.1 +rcon.port 28016 +rcon.password "Password" -logfile "gamelog-2017-01-22-22-47-05.log"
Code time!
Again I’m using xPaw’s SourceQuery. Here’s a simple example of how to send a command via RCON:
<?php
require __DIR__ . '/SourceQuery/bootstrap.php';
use xPaw\SourceQuery\SourceQuery;
define( 'SQ_TIMEOUT', 1 );
define( 'SQ_ENGINE', SourceQuery::SOURCE );
// Init SourceQuery
$Query = new SourceQuery( );
// Connect to the server
$Query->Connect("<IP>", "<PORT>", SQ_TIMEOUT, SQ_ENGINE);
// Auth
$Query->SetRconPassword( "<Password>" );
// Run the "status" command and return
var_dump($Query->Rcon( "status" ));
// Disconnect
$Query->Disconnect( );
Result!
Which outputs the following:
root@web01:/var/www/zurk/scripts/rcon# php test.php
string(269) "hostname: Server Name
version : 1955 secure (secure mode enabled, connected to Steam3)
map : Procedural Map
players : 0 (250 max) (0 queued) (0 joining)
id name ping connected addr owner violation kicks
"
In the next post, I’ll be writing about how I took this simple example, and made a scheduled messaging system. Until then!