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!