<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>https://wiki.soldat.pl/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Jrgp</id>
		<title>Soldat Community Wiki - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="https://wiki.soldat.pl/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Jrgp"/>
		<link rel="alternate" type="text/html" href="https://wiki.soldat.pl/index.php/Special:Contributions/Jrgp"/>
		<updated>2026-05-26T04:29:56Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>https://wiki.soldat.pl/index.php?title=Lobby_HTTP_API&amp;diff=1878</id>
		<title>Lobby HTTP API</title>
		<link rel="alternate" type="text/html" href="https://wiki.soldat.pl/index.php?title=Lobby_HTTP_API&amp;diff=1878"/>
				<updated>2017-09-02T10:02:33Z</updated>
		
		<summary type="html">&lt;p&gt;Jrgp: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Recently, we added a standard json-based REST HTTP API to make getting the list of Soldat servers much easier for third party applications, compared to the legacy [[Client-Lobby_Protocol]].&lt;br /&gt;
&lt;br /&gt;
* URL: http://api.soldat.pl (https is also supported)&lt;br /&gt;
* CORS headers are present so this can be used via ajax.&lt;br /&gt;
* [https://forums.soldat.pl/index.php?topic=44915.0 Forum thread] where this was originally announced. Feel free to comment on this thread with feature requests.&lt;br /&gt;
&lt;br /&gt;
== List all servers, with filters ==&lt;br /&gt;
&lt;br /&gt;
 http://api.soldat.pl/v0/servers&lt;br /&gt;
&lt;br /&gt;
List all Soldat servers. You can provide a combination of the following GET parameters as filters. The pipes represent unique options, and the 3 dots represent other options which you can guess.&lt;br /&gt;
&lt;br /&gt;
  ?os=linux|mac|windows&lt;br /&gt;
  ?gamestyle=DM|PM|TM|CTF|RM|INF|HTF&lt;br /&gt;
  ?country=US|DE|...&lt;br /&gt;
  ?version=1.7.1|1.6.1|...&lt;br /&gt;
  ?empty=yes|no&lt;br /&gt;
  ?full=yes|no&lt;br /&gt;
  ?bots=yes|no&lt;br /&gt;
  ?private=yes|no&lt;br /&gt;
  ?realistic=yes|no&lt;br /&gt;
  ?survival=yes|no&lt;br /&gt;
  ?advanced=yes|no&lt;br /&gt;
&lt;br /&gt;
Example URL filtering servers that aren't empty and don't have bots:&lt;br /&gt;
&lt;br /&gt;
 http://api.soldat.pl/v0/servers?empty=no&amp;amp;bots=no&lt;br /&gt;
&lt;br /&gt;
Example response:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
    &amp;quot;Servers&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;AC&amp;quot;: false,&lt;br /&gt;
            &amp;quot;Advanced&amp;quot;: false,&lt;br /&gt;
            &amp;quot;BonusFreq&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;ConnectionType&amp;quot;: 3,&lt;br /&gt;
            &amp;quot;Country&amp;quot;: &amp;quot;US&amp;quot;,&lt;br /&gt;
            &amp;quot;CurrentMap&amp;quot;: &amp;quot;ctf_Viet&amp;quot;,&lt;br /&gt;
            &amp;quot;Dedicated&amp;quot;: true,&lt;br /&gt;
            &amp;quot;GameStyle&amp;quot;: &amp;quot;CTF&amp;quot;,&lt;br /&gt;
            &amp;quot;IP&amp;quot;: &amp;quot;108.61.204.90&amp;quot;,&lt;br /&gt;
            &amp;quot;Info&amp;quot;: &amp;quot;~ facebook.com/AUS7RAL12 | #austral12soldat @ Qnet&amp;quot;,&lt;br /&gt;
            &amp;quot;MaxPlayers&amp;quot;: 12,&lt;br /&gt;
            &amp;quot;Name&amp;quot;: &amp;quot;=AUS7RAL|12 OneShots&amp;quot;,&lt;br /&gt;
            &amp;quot;NumBots&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;NumPlayers&amp;quot;: 1,&lt;br /&gt;
            &amp;quot;OS&amp;quot;: &amp;quot;linux&amp;quot;,&lt;br /&gt;
            &amp;quot;Port&amp;quot;: 23075,&lt;br /&gt;
            &amp;quot;Private&amp;quot;: false,&lt;br /&gt;
            &amp;quot;Realistic&amp;quot;: false,&lt;br /&gt;
            &amp;quot;Respawn&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;Survival&amp;quot;: false,&lt;br /&gt;
            &amp;quot;Version&amp;quot;: &amp;quot;1.7.1&amp;quot;,&lt;br /&gt;
            &amp;quot;WM&amp;quot;: false&lt;br /&gt;
        }&lt;br /&gt;
     ]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Get data on server ==&lt;br /&gt;
&lt;br /&gt;
 http://api.soldat.pl/v0/server/$ip/$port&lt;br /&gt;
&lt;br /&gt;
Example response:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
    &amp;quot;AC&amp;quot;: false,&lt;br /&gt;
    &amp;quot;Advanced&amp;quot;: false,&lt;br /&gt;
    &amp;quot;BonusFreq&amp;quot;: 0,&lt;br /&gt;
    &amp;quot;ConnectionType&amp;quot;: 3,&lt;br /&gt;
    &amp;quot;Country&amp;quot;: &amp;quot;US&amp;quot;,&lt;br /&gt;
    &amp;quot;CurrentMap&amp;quot;: &amp;quot;Island2k5&amp;quot;,&lt;br /&gt;
    &amp;quot;Dedicated&amp;quot;: true,&lt;br /&gt;
    &amp;quot;GameStyle&amp;quot;: &amp;quot;DM&amp;quot;,&lt;br /&gt;
    &amp;quot;IP&amp;quot;: &amp;quot;207.152.134.13&amp;quot;,&lt;br /&gt;
    &amp;quot;Info&amp;quot;: &amp;quot;Eat Moar Chik'n&amp;quot;,&lt;br /&gt;
    &amp;quot;MaxPlayers&amp;quot;: 10,&lt;br /&gt;
    &amp;quot;Name&amp;quot;: &amp;quot;Drop a Penny&amp;quot;,&lt;br /&gt;
    &amp;quot;NumBots&amp;quot;: 0,&lt;br /&gt;
    &amp;quot;NumPlayers&amp;quot;: 0,&lt;br /&gt;
    &amp;quot;OS&amp;quot;: &amp;quot;windows&amp;quot;,&lt;br /&gt;
    &amp;quot;Port&amp;quot;: 23073,&lt;br /&gt;
    &amp;quot;Private&amp;quot;: false,&lt;br /&gt;
    &amp;quot;Realistic&amp;quot;: true,&lt;br /&gt;
    &amp;quot;Respawn&amp;quot;: 0,&lt;br /&gt;
    &amp;quot;Survival&amp;quot;: false,&lt;br /&gt;
    &amp;quot;Version&amp;quot;: &amp;quot;1.7.1&amp;quot;,&lt;br /&gt;
    &amp;quot;WM&amp;quot;: false&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Get players for a server ==&lt;br /&gt;
&lt;br /&gt;
 http://api.soldat.pl/v0/server/$ip/$port/players&lt;br /&gt;
&lt;br /&gt;
This will make the lobby use the file download protocol to grab that server's gamestat.txt file and parse and display the players currently in the server. FYI: This makes use of caching to prevent abuse.&lt;br /&gt;
&lt;br /&gt;
Example response:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
    &amp;quot;Players&amp;quot;: [&lt;br /&gt;
        &amp;quot;/././a.d.i.d.a.s/././&amp;quot;,&lt;br /&gt;
        &amp;quot;Alvarez&amp;quot;,&lt;br /&gt;
        &amp;quot;Freedom Fighter&amp;quot;,&lt;br /&gt;
        &amp;quot;Guenther Gummibrot&amp;quot;,&lt;br /&gt;
        &amp;quot;summer camp&amp;quot;,&lt;br /&gt;
        &amp;quot;|TPF. GottenSikici&amp;quot;&lt;br /&gt;
    ]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
[[Category:Server]]&lt;/div&gt;</summary>
		<author><name>Jrgp</name></author>	</entry>

	<entry>
		<id>https://wiki.soldat.pl/index.php?title=Lobby_HTTP_API&amp;diff=1877</id>
		<title>Lobby HTTP API</title>
		<link rel="alternate" type="text/html" href="https://wiki.soldat.pl/index.php?title=Lobby_HTTP_API&amp;diff=1877"/>
				<updated>2017-09-01T08:15:51Z</updated>
		
		<summary type="html">&lt;p&gt;Jrgp: /* List all servers, with filters */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Recently, we added a standard json-based REST HTTP API to make getting the list of Soldat servers much easier for third party applications, compared to the legacy [[Client-Lobby_Protocol]].&lt;br /&gt;
&lt;br /&gt;
* URL: http://api.soldat.pl (https is also supported)&lt;br /&gt;
* CORS headers are present so this can be used via ajax.&lt;br /&gt;
* [https://forums.soldat.pl/index.php?topic=44915.0 Forum thread] where this was originally announced&lt;br /&gt;
&lt;br /&gt;
== List all servers, with filters ==&lt;br /&gt;
&lt;br /&gt;
 http://api.soldat.pl/v0/servers&lt;br /&gt;
&lt;br /&gt;
List all Soldat servers. You can provide a combination of the following GET parameters as filters. The pipes represent unique options, and the 3 dots represent other options which you can guess.&lt;br /&gt;
&lt;br /&gt;
  ?os=linux|mac|windows&lt;br /&gt;
  ?gamestyle=DM|PM|TM|CTF|RM|INF|HTF&lt;br /&gt;
  ?country=US|DE|...&lt;br /&gt;
  ?version=1.7.1|1.6.1|...&lt;br /&gt;
  ?empty=yes|no&lt;br /&gt;
  ?full=yes|no&lt;br /&gt;
  ?bots=yes|no&lt;br /&gt;
  ?private=yes|no&lt;br /&gt;
  ?realistic=yes|no&lt;br /&gt;
  ?survival=yes|no&lt;br /&gt;
  ?advanced=yes|no&lt;br /&gt;
&lt;br /&gt;
Example URL filtering servers that aren't empty and don't have bots:&lt;br /&gt;
&lt;br /&gt;
 http://api.soldat.pl/v0/servers?empty=no&amp;amp;bots=no&lt;br /&gt;
&lt;br /&gt;
Example response:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
    &amp;quot;Servers&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;AC&amp;quot;: false,&lt;br /&gt;
            &amp;quot;Advanced&amp;quot;: false,&lt;br /&gt;
            &amp;quot;BonusFreq&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;ConnectionType&amp;quot;: 3,&lt;br /&gt;
            &amp;quot;Country&amp;quot;: &amp;quot;US&amp;quot;,&lt;br /&gt;
            &amp;quot;CurrentMap&amp;quot;: &amp;quot;ctf_Viet&amp;quot;,&lt;br /&gt;
            &amp;quot;Dedicated&amp;quot;: true,&lt;br /&gt;
            &amp;quot;GameStyle&amp;quot;: &amp;quot;CTF&amp;quot;,&lt;br /&gt;
            &amp;quot;IP&amp;quot;: &amp;quot;108.61.204.90&amp;quot;,&lt;br /&gt;
            &amp;quot;Info&amp;quot;: &amp;quot;~ facebook.com/AUS7RAL12 | #austral12soldat @ Qnet&amp;quot;,&lt;br /&gt;
            &amp;quot;MaxPlayers&amp;quot;: 12,&lt;br /&gt;
            &amp;quot;Name&amp;quot;: &amp;quot;=AUS7RAL|12 OneShots&amp;quot;,&lt;br /&gt;
            &amp;quot;NumBots&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;NumPlayers&amp;quot;: 1,&lt;br /&gt;
            &amp;quot;OS&amp;quot;: &amp;quot;linux&amp;quot;,&lt;br /&gt;
            &amp;quot;Port&amp;quot;: 23075,&lt;br /&gt;
            &amp;quot;Private&amp;quot;: false,&lt;br /&gt;
            &amp;quot;Realistic&amp;quot;: false,&lt;br /&gt;
            &amp;quot;Respawn&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;Survival&amp;quot;: false,&lt;br /&gt;
            &amp;quot;Version&amp;quot;: &amp;quot;1.7.1&amp;quot;,&lt;br /&gt;
            &amp;quot;WM&amp;quot;: false&lt;br /&gt;
        }&lt;br /&gt;
     ]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Get data on server ==&lt;br /&gt;
&lt;br /&gt;
 http://api.soldat.pl/v0/server/$ip/$port&lt;br /&gt;
&lt;br /&gt;
Example response:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
    &amp;quot;AC&amp;quot;: false,&lt;br /&gt;
    &amp;quot;Advanced&amp;quot;: false,&lt;br /&gt;
    &amp;quot;BonusFreq&amp;quot;: 0,&lt;br /&gt;
    &amp;quot;ConnectionType&amp;quot;: 3,&lt;br /&gt;
    &amp;quot;Country&amp;quot;: &amp;quot;US&amp;quot;,&lt;br /&gt;
    &amp;quot;CurrentMap&amp;quot;: &amp;quot;Island2k5&amp;quot;,&lt;br /&gt;
    &amp;quot;Dedicated&amp;quot;: true,&lt;br /&gt;
    &amp;quot;GameStyle&amp;quot;: &amp;quot;DM&amp;quot;,&lt;br /&gt;
    &amp;quot;IP&amp;quot;: &amp;quot;207.152.134.13&amp;quot;,&lt;br /&gt;
    &amp;quot;Info&amp;quot;: &amp;quot;Eat Moar Chik'n&amp;quot;,&lt;br /&gt;
    &amp;quot;MaxPlayers&amp;quot;: 10,&lt;br /&gt;
    &amp;quot;Name&amp;quot;: &amp;quot;Drop a Penny&amp;quot;,&lt;br /&gt;
    &amp;quot;NumBots&amp;quot;: 0,&lt;br /&gt;
    &amp;quot;NumPlayers&amp;quot;: 0,&lt;br /&gt;
    &amp;quot;OS&amp;quot;: &amp;quot;windows&amp;quot;,&lt;br /&gt;
    &amp;quot;Port&amp;quot;: 23073,&lt;br /&gt;
    &amp;quot;Private&amp;quot;: false,&lt;br /&gt;
    &amp;quot;Realistic&amp;quot;: true,&lt;br /&gt;
    &amp;quot;Respawn&amp;quot;: 0,&lt;br /&gt;
    &amp;quot;Survival&amp;quot;: false,&lt;br /&gt;
    &amp;quot;Version&amp;quot;: &amp;quot;1.7.1&amp;quot;,&lt;br /&gt;
    &amp;quot;WM&amp;quot;: false&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Get players for a server ==&lt;br /&gt;
&lt;br /&gt;
 http://api.soldat.pl/v0/server/$ip/$port/players&lt;br /&gt;
&lt;br /&gt;
This will make the lobby use the file download protocol to grab that server's gamestat.txt file and parse and display the players currently in the server. FYI: This makes use of caching to prevent abuse.&lt;br /&gt;
&lt;br /&gt;
Example response:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
    &amp;quot;Players&amp;quot;: [&lt;br /&gt;
        &amp;quot;/././a.d.i.d.a.s/././&amp;quot;,&lt;br /&gt;
        &amp;quot;Alvarez&amp;quot;,&lt;br /&gt;
        &amp;quot;Freedom Fighter&amp;quot;,&lt;br /&gt;
        &amp;quot;Guenther Gummibrot&amp;quot;,&lt;br /&gt;
        &amp;quot;summer camp&amp;quot;,&lt;br /&gt;
        &amp;quot;|TPF. GottenSikici&amp;quot;&lt;br /&gt;
    ]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
[[Category:Server]]&lt;/div&gt;</summary>
		<author><name>Jrgp</name></author>	</entry>

	<entry>
		<id>https://wiki.soldat.pl/index.php?title=Lobby_HTTP_API&amp;diff=1876</id>
		<title>Lobby HTTP API</title>
		<link rel="alternate" type="text/html" href="https://wiki.soldat.pl/index.php?title=Lobby_HTTP_API&amp;diff=1876"/>
				<updated>2017-09-01T08:15:23Z</updated>
		
		<summary type="html">&lt;p&gt;Jrgp: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Recently, we added a standard json-based REST HTTP API to make getting the list of Soldat servers much easier for third party applications, compared to the legacy [[Client-Lobby_Protocol]].&lt;br /&gt;
&lt;br /&gt;
* URL: http://api.soldat.pl (https is also supported)&lt;br /&gt;
* CORS headers are present so this can be used via ajax.&lt;br /&gt;
* [https://forums.soldat.pl/index.php?topic=44915.0 Forum thread] where this was originally announced&lt;br /&gt;
&lt;br /&gt;
== List all servers, with filters ==&lt;br /&gt;
&lt;br /&gt;
 http://api.soldat.pl/v0/servers&lt;br /&gt;
&lt;br /&gt;
List all Soldat servers. You can provide a combination of these GET parameters as filters:&lt;br /&gt;
&lt;br /&gt;
  ?os=linux|mac|windows&lt;br /&gt;
  ?gamestyle=DM|PM|TM|CTF|RM|INF|HTF&lt;br /&gt;
  ?country=US|DE|...&lt;br /&gt;
  ?version=1.7.1|1.6.1|...&lt;br /&gt;
  ?empty=yes|no&lt;br /&gt;
  ?full=yes|no&lt;br /&gt;
  ?bots=yes|no&lt;br /&gt;
  ?private=yes|no&lt;br /&gt;
  ?realistic=yes|no&lt;br /&gt;
  ?survival=yes|no&lt;br /&gt;
  ?advanced=yes|no&lt;br /&gt;
&lt;br /&gt;
Example URL filtering servers that aren't empty and don't have bots:&lt;br /&gt;
&lt;br /&gt;
 http://api.soldat.pl/v0/servers?empty=no&amp;amp;bots=no&lt;br /&gt;
&lt;br /&gt;
Example response:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
    &amp;quot;Servers&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;AC&amp;quot;: false,&lt;br /&gt;
            &amp;quot;Advanced&amp;quot;: false,&lt;br /&gt;
            &amp;quot;BonusFreq&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;ConnectionType&amp;quot;: 3,&lt;br /&gt;
            &amp;quot;Country&amp;quot;: &amp;quot;US&amp;quot;,&lt;br /&gt;
            &amp;quot;CurrentMap&amp;quot;: &amp;quot;ctf_Viet&amp;quot;,&lt;br /&gt;
            &amp;quot;Dedicated&amp;quot;: true,&lt;br /&gt;
            &amp;quot;GameStyle&amp;quot;: &amp;quot;CTF&amp;quot;,&lt;br /&gt;
            &amp;quot;IP&amp;quot;: &amp;quot;108.61.204.90&amp;quot;,&lt;br /&gt;
            &amp;quot;Info&amp;quot;: &amp;quot;~ facebook.com/AUS7RAL12 | #austral12soldat @ Qnet&amp;quot;,&lt;br /&gt;
            &amp;quot;MaxPlayers&amp;quot;: 12,&lt;br /&gt;
            &amp;quot;Name&amp;quot;: &amp;quot;=AUS7RAL|12 OneShots&amp;quot;,&lt;br /&gt;
            &amp;quot;NumBots&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;NumPlayers&amp;quot;: 1,&lt;br /&gt;
            &amp;quot;OS&amp;quot;: &amp;quot;linux&amp;quot;,&lt;br /&gt;
            &amp;quot;Port&amp;quot;: 23075,&lt;br /&gt;
            &amp;quot;Private&amp;quot;: false,&lt;br /&gt;
            &amp;quot;Realistic&amp;quot;: false,&lt;br /&gt;
            &amp;quot;Respawn&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;Survival&amp;quot;: false,&lt;br /&gt;
            &amp;quot;Version&amp;quot;: &amp;quot;1.7.1&amp;quot;,&lt;br /&gt;
            &amp;quot;WM&amp;quot;: false&lt;br /&gt;
        }&lt;br /&gt;
     ]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Get data on server ==&lt;br /&gt;
&lt;br /&gt;
 http://api.soldat.pl/v0/server/$ip/$port&lt;br /&gt;
&lt;br /&gt;
Example response:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
    &amp;quot;AC&amp;quot;: false,&lt;br /&gt;
    &amp;quot;Advanced&amp;quot;: false,&lt;br /&gt;
    &amp;quot;BonusFreq&amp;quot;: 0,&lt;br /&gt;
    &amp;quot;ConnectionType&amp;quot;: 3,&lt;br /&gt;
    &amp;quot;Country&amp;quot;: &amp;quot;US&amp;quot;,&lt;br /&gt;
    &amp;quot;CurrentMap&amp;quot;: &amp;quot;Island2k5&amp;quot;,&lt;br /&gt;
    &amp;quot;Dedicated&amp;quot;: true,&lt;br /&gt;
    &amp;quot;GameStyle&amp;quot;: &amp;quot;DM&amp;quot;,&lt;br /&gt;
    &amp;quot;IP&amp;quot;: &amp;quot;207.152.134.13&amp;quot;,&lt;br /&gt;
    &amp;quot;Info&amp;quot;: &amp;quot;Eat Moar Chik'n&amp;quot;,&lt;br /&gt;
    &amp;quot;MaxPlayers&amp;quot;: 10,&lt;br /&gt;
    &amp;quot;Name&amp;quot;: &amp;quot;Drop a Penny&amp;quot;,&lt;br /&gt;
    &amp;quot;NumBots&amp;quot;: 0,&lt;br /&gt;
    &amp;quot;NumPlayers&amp;quot;: 0,&lt;br /&gt;
    &amp;quot;OS&amp;quot;: &amp;quot;windows&amp;quot;,&lt;br /&gt;
    &amp;quot;Port&amp;quot;: 23073,&lt;br /&gt;
    &amp;quot;Private&amp;quot;: false,&lt;br /&gt;
    &amp;quot;Realistic&amp;quot;: true,&lt;br /&gt;
    &amp;quot;Respawn&amp;quot;: 0,&lt;br /&gt;
    &amp;quot;Survival&amp;quot;: false,&lt;br /&gt;
    &amp;quot;Version&amp;quot;: &amp;quot;1.7.1&amp;quot;,&lt;br /&gt;
    &amp;quot;WM&amp;quot;: false&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Get players for a server ==&lt;br /&gt;
&lt;br /&gt;
 http://api.soldat.pl/v0/server/$ip/$port/players&lt;br /&gt;
&lt;br /&gt;
This will make the lobby use the file download protocol to grab that server's gamestat.txt file and parse and display the players currently in the server. FYI: This makes use of caching to prevent abuse.&lt;br /&gt;
&lt;br /&gt;
Example response:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
    &amp;quot;Players&amp;quot;: [&lt;br /&gt;
        &amp;quot;/././a.d.i.d.a.s/././&amp;quot;,&lt;br /&gt;
        &amp;quot;Alvarez&amp;quot;,&lt;br /&gt;
        &amp;quot;Freedom Fighter&amp;quot;,&lt;br /&gt;
        &amp;quot;Guenther Gummibrot&amp;quot;,&lt;br /&gt;
        &amp;quot;summer camp&amp;quot;,&lt;br /&gt;
        &amp;quot;|TPF. GottenSikici&amp;quot;&lt;br /&gt;
    ]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
[[Category:Server]]&lt;/div&gt;</summary>
		<author><name>Jrgp</name></author>	</entry>

	<entry>
		<id>https://wiki.soldat.pl/index.php?title=Lobby_Protocol&amp;diff=1875</id>
		<title>Lobby Protocol</title>
		<link rel="alternate" type="text/html" href="https://wiki.soldat.pl/index.php?title=Lobby_Protocol&amp;diff=1875"/>
				<updated>2017-09-01T08:13:29Z</updated>
		
		<summary type="html">&lt;p&gt;Jrgp: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;There are two available lobby server protocols for public use&lt;br /&gt;
* The [[Client-Lobby Protocol]], used by the Soldat client&lt;br /&gt;
* The [[Lobby HTTP API]], a re-implementation of the above but over HTTP/JSON for easy access.&lt;br /&gt;
* The [[3rd party lobby protocol]], intended for use by 3rd party application developers.  This protocol does not exist, but naturally evolved into the [https://wiki.kag2d.com/wiki/API KAG API] in use by later THD games.&lt;/div&gt;</summary>
		<author><name>Jrgp</name></author>	</entry>

	<entry>
		<id>https://wiki.soldat.pl/index.php?title=Lobby_HTTP_API&amp;diff=1874</id>
		<title>Lobby HTTP API</title>
		<link rel="alternate" type="text/html" href="https://wiki.soldat.pl/index.php?title=Lobby_HTTP_API&amp;diff=1874"/>
				<updated>2017-09-01T08:10:41Z</updated>
		
		<summary type="html">&lt;p&gt;Jrgp: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Recently, we added a standard json-based REST HTTP API to make getting the list of Soldat servers much easier for third party applications, compared to the legacy [[Client-Lobby_Protocol]].&lt;br /&gt;
&lt;br /&gt;
* URL: http://api.soldat.pl (https is also supported)&lt;br /&gt;
* CORS headers are present so this can be used via ajax.&lt;br /&gt;
* [https://forums.soldat.pl/index.php?topic=44915.0 Forum thread] where this was originally announced&lt;br /&gt;
&lt;br /&gt;
== List all servers, with filters ==&lt;br /&gt;
&lt;br /&gt;
 http://api.soldat.pl/v0/servers&lt;br /&gt;
&lt;br /&gt;
List all Soldat servers. You can provide a combination of these GET parameters as filters:&lt;br /&gt;
&lt;br /&gt;
  ?os=linux|mac|windows&lt;br /&gt;
  ?gamestyle=DM|PM|TM|CTF|RM|INF|HTF&lt;br /&gt;
  ?country=US|DE|...&lt;br /&gt;
  ?version=1.7.1|1.6.1|...&lt;br /&gt;
  ?empty=yes|no&lt;br /&gt;
  ?full=yes|no&lt;br /&gt;
  ?bots=yes|no&lt;br /&gt;
  ?private=yes|no&lt;br /&gt;
  ?realistic=yes|no&lt;br /&gt;
  ?survival=yes|no&lt;br /&gt;
  ?advanced=yes|no&lt;br /&gt;
&lt;br /&gt;
Example URL filtering servers that aren't empty and don't have bots:&lt;br /&gt;
&lt;br /&gt;
 http://api.soldat.pl/v0/servers?empty=no&amp;amp;bots=no&lt;br /&gt;
&lt;br /&gt;
Example response:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
    &amp;quot;Servers&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;AC&amp;quot;: false,&lt;br /&gt;
            &amp;quot;Advanced&amp;quot;: false,&lt;br /&gt;
            &amp;quot;BonusFreq&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;ConnectionType&amp;quot;: 3,&lt;br /&gt;
            &amp;quot;Country&amp;quot;: &amp;quot;FR&amp;quot;,&lt;br /&gt;
            &amp;quot;CurrentMap&amp;quot;: &amp;quot;Blox&amp;quot;,&lt;br /&gt;
            &amp;quot;Dedicated&amp;quot;: true,&lt;br /&gt;
            &amp;quot;GameStyle&amp;quot;: &amp;quot;DM&amp;quot;,&lt;br /&gt;
            &amp;quot;IP&amp;quot;: &amp;quot;5.135.160.192&amp;quot;,&lt;br /&gt;
            &amp;quot;Info&amp;quot;: &amp;quot;GamingCrew.pl&amp;quot;,&lt;br /&gt;
            &amp;quot;MaxPlayers&amp;quot;: 5,&lt;br /&gt;
            &amp;quot;Name&amp;quot;: &amp;quot;GamingCrew.pl[1vs1]#2&amp;quot;,&lt;br /&gt;
            &amp;quot;NumBots&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;NumPlayers&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;OS&amp;quot;: &amp;quot;linux&amp;quot;,&lt;br /&gt;
            &amp;quot;Port&amp;quot;: 23078,&lt;br /&gt;
            &amp;quot;Private&amp;quot;: false,&lt;br /&gt;
            &amp;quot;Realistic&amp;quot;: false,&lt;br /&gt;
            &amp;quot;Respawn&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;Survival&amp;quot;: false,&lt;br /&gt;
            &amp;quot;Version&amp;quot;: &amp;quot;1.7.1&amp;quot;,&lt;br /&gt;
            &amp;quot;WM&amp;quot;: false&lt;br /&gt;
        }]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Get data on server ==&lt;br /&gt;
&lt;br /&gt;
 http://api.soldat.pl/v0/server/$ip/$port&lt;br /&gt;
&lt;br /&gt;
Example response:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
    &amp;quot;AC&amp;quot;: false,&lt;br /&gt;
    &amp;quot;Advanced&amp;quot;: false,&lt;br /&gt;
    &amp;quot;BonusFreq&amp;quot;: 0,&lt;br /&gt;
    &amp;quot;ConnectionType&amp;quot;: 3,&lt;br /&gt;
    &amp;quot;Country&amp;quot;: &amp;quot;US&amp;quot;,&lt;br /&gt;
    &amp;quot;CurrentMap&amp;quot;: &amp;quot;Island2k5&amp;quot;,&lt;br /&gt;
    &amp;quot;Dedicated&amp;quot;: true,&lt;br /&gt;
    &amp;quot;GameStyle&amp;quot;: &amp;quot;DM&amp;quot;,&lt;br /&gt;
    &amp;quot;IP&amp;quot;: &amp;quot;207.152.134.13&amp;quot;,&lt;br /&gt;
    &amp;quot;Info&amp;quot;: &amp;quot;Eat Moar Chik'n&amp;quot;,&lt;br /&gt;
    &amp;quot;MaxPlayers&amp;quot;: 10,&lt;br /&gt;
    &amp;quot;Name&amp;quot;: &amp;quot;Drop a Penny&amp;quot;,&lt;br /&gt;
    &amp;quot;NumBots&amp;quot;: 0,&lt;br /&gt;
    &amp;quot;NumPlayers&amp;quot;: 0,&lt;br /&gt;
    &amp;quot;OS&amp;quot;: &amp;quot;windows&amp;quot;,&lt;br /&gt;
    &amp;quot;Port&amp;quot;: 23073,&lt;br /&gt;
    &amp;quot;Private&amp;quot;: false,&lt;br /&gt;
    &amp;quot;Realistic&amp;quot;: true,&lt;br /&gt;
    &amp;quot;Respawn&amp;quot;: 0,&lt;br /&gt;
    &amp;quot;Survival&amp;quot;: false,&lt;br /&gt;
    &amp;quot;Version&amp;quot;: &amp;quot;1.7.1&amp;quot;,&lt;br /&gt;
    &amp;quot;WM&amp;quot;: false&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Get players for a server ==&lt;br /&gt;
&lt;br /&gt;
 http://api.soldat.pl/v0/server/$ip/$port/players&lt;br /&gt;
&lt;br /&gt;
This will make the lobby use the file download protocol to grab that server's gamestat.txt file and parse and display the players currently in the server. FYI: This makes use of caching to prevent abuse.&lt;br /&gt;
&lt;br /&gt;
Example response:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
    &amp;quot;Players&amp;quot;: [&lt;br /&gt;
        &amp;quot;/././a.d.i.d.a.s/././&amp;quot;,&lt;br /&gt;
        &amp;quot;Alvarez&amp;quot;,&lt;br /&gt;
        &amp;quot;Freedom Fighter&amp;quot;,&lt;br /&gt;
        &amp;quot;Guenther Gummibrot&amp;quot;,&lt;br /&gt;
        &amp;quot;summer camp&amp;quot;,&lt;br /&gt;
        &amp;quot;|TPF. GottenSikici&amp;quot;&lt;br /&gt;
    ]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
[[Category:Server]]&lt;/div&gt;</summary>
		<author><name>Jrgp</name></author>	</entry>

	<entry>
		<id>https://wiki.soldat.pl/index.php?title=Lobby_HTTP_API&amp;diff=1873</id>
		<title>Lobby HTTP API</title>
		<link rel="alternate" type="text/html" href="https://wiki.soldat.pl/index.php?title=Lobby_HTTP_API&amp;diff=1873"/>
				<updated>2017-09-01T08:08:40Z</updated>
		
		<summary type="html">&lt;p&gt;Jrgp: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Recently, we added a standard json-based REST HTTP API to make getting the list of Soldat servers much easier for third party applications, compared to the legacy [[Client-Lobby_Protocol]].&lt;br /&gt;
&lt;br /&gt;
* URL: http://api.soldat.pl (https is also supported)&lt;br /&gt;
* CORS headers are present so this can be used via ajax.&lt;br /&gt;
* [https://forums.soldat.pl/index.php?topic=44915.0 Forum thread] where this was originally announced&lt;br /&gt;
&lt;br /&gt;
== List all servers, with filters ==&lt;br /&gt;
&lt;br /&gt;
 http://api.soldat.pl/v0/servers&lt;br /&gt;
&lt;br /&gt;
List all Soldat servers. You can provide a combination of these GET parameters as filters:&lt;br /&gt;
&lt;br /&gt;
  ?os=linux|mac|windows&lt;br /&gt;
  ?gamestyle=DM|PM|TM|CTF|RM|INF|HTF&lt;br /&gt;
  ?country=US|DE|...&lt;br /&gt;
  ?version=1.7.1|1.6.1|...&lt;br /&gt;
  ?empty=yes|no&lt;br /&gt;
  ?full=yes|no&lt;br /&gt;
  ?bots=yes|no&lt;br /&gt;
  ?private=yes|no&lt;br /&gt;
  ?realistic=yes|no&lt;br /&gt;
  ?survival=yes|no&lt;br /&gt;
  ?advanced=yes|no&lt;br /&gt;
&lt;br /&gt;
Example response:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
    &amp;quot;Servers&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;AC&amp;quot;: false,&lt;br /&gt;
            &amp;quot;Advanced&amp;quot;: false,&lt;br /&gt;
            &amp;quot;BonusFreq&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;ConnectionType&amp;quot;: 3,&lt;br /&gt;
            &amp;quot;Country&amp;quot;: &amp;quot;FR&amp;quot;,&lt;br /&gt;
            &amp;quot;CurrentMap&amp;quot;: &amp;quot;Blox&amp;quot;,&lt;br /&gt;
            &amp;quot;Dedicated&amp;quot;: true,&lt;br /&gt;
            &amp;quot;GameStyle&amp;quot;: &amp;quot;DM&amp;quot;,&lt;br /&gt;
            &amp;quot;IP&amp;quot;: &amp;quot;5.135.160.192&amp;quot;,&lt;br /&gt;
            &amp;quot;Info&amp;quot;: &amp;quot;GamingCrew.pl&amp;quot;,&lt;br /&gt;
            &amp;quot;MaxPlayers&amp;quot;: 5,&lt;br /&gt;
            &amp;quot;Name&amp;quot;: &amp;quot;GamingCrew.pl[1vs1]#2&amp;quot;,&lt;br /&gt;
            &amp;quot;NumBots&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;NumPlayers&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;OS&amp;quot;: &amp;quot;linux&amp;quot;,&lt;br /&gt;
            &amp;quot;Port&amp;quot;: 23078,&lt;br /&gt;
            &amp;quot;Private&amp;quot;: false,&lt;br /&gt;
            &amp;quot;Realistic&amp;quot;: false,&lt;br /&gt;
            &amp;quot;Respawn&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;Survival&amp;quot;: false,&lt;br /&gt;
            &amp;quot;Version&amp;quot;: &amp;quot;1.7.1&amp;quot;,&lt;br /&gt;
            &amp;quot;WM&amp;quot;: false&lt;br /&gt;
        }]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Get data on server ==&lt;br /&gt;
&lt;br /&gt;
 http://api.soldat.pl/v0/server/$ip/$port&lt;br /&gt;
&lt;br /&gt;
Example response:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
    &amp;quot;AC&amp;quot;: false,&lt;br /&gt;
    &amp;quot;Advanced&amp;quot;: false,&lt;br /&gt;
    &amp;quot;BonusFreq&amp;quot;: 0,&lt;br /&gt;
    &amp;quot;ConnectionType&amp;quot;: 3,&lt;br /&gt;
    &amp;quot;Country&amp;quot;: &amp;quot;US&amp;quot;,&lt;br /&gt;
    &amp;quot;CurrentMap&amp;quot;: &amp;quot;Island2k5&amp;quot;,&lt;br /&gt;
    &amp;quot;Dedicated&amp;quot;: true,&lt;br /&gt;
    &amp;quot;GameStyle&amp;quot;: &amp;quot;DM&amp;quot;,&lt;br /&gt;
    &amp;quot;IP&amp;quot;: &amp;quot;207.152.134.13&amp;quot;,&lt;br /&gt;
    &amp;quot;Info&amp;quot;: &amp;quot;Eat Moar Chik'n&amp;quot;,&lt;br /&gt;
    &amp;quot;MaxPlayers&amp;quot;: 10,&lt;br /&gt;
    &amp;quot;Name&amp;quot;: &amp;quot;Drop a Penny&amp;quot;,&lt;br /&gt;
    &amp;quot;NumBots&amp;quot;: 0,&lt;br /&gt;
    &amp;quot;NumPlayers&amp;quot;: 0,&lt;br /&gt;
    &amp;quot;OS&amp;quot;: &amp;quot;windows&amp;quot;,&lt;br /&gt;
    &amp;quot;Port&amp;quot;: 23073,&lt;br /&gt;
    &amp;quot;Private&amp;quot;: false,&lt;br /&gt;
    &amp;quot;Realistic&amp;quot;: true,&lt;br /&gt;
    &amp;quot;Respawn&amp;quot;: 0,&lt;br /&gt;
    &amp;quot;Survival&amp;quot;: false,&lt;br /&gt;
    &amp;quot;Version&amp;quot;: &amp;quot;1.7.1&amp;quot;,&lt;br /&gt;
    &amp;quot;WM&amp;quot;: false&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Get players for a server ==&lt;br /&gt;
&lt;br /&gt;
 http://api.soldat.pl/v0/server/$ip/$port/players&lt;br /&gt;
&lt;br /&gt;
This will make the lobby use the file download protocol to grab that server's gamestat.txt file and parse and display the players currently in the server. FYI: This makes use of caching to prevent abuse.&lt;br /&gt;
&lt;br /&gt;
Example response:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
    &amp;quot;Players&amp;quot;: [&lt;br /&gt;
        &amp;quot;/././a.d.i.d.a.s/././&amp;quot;,&lt;br /&gt;
        &amp;quot;Alvarez&amp;quot;,&lt;br /&gt;
        &amp;quot;Freedom Fighter&amp;quot;,&lt;br /&gt;
        &amp;quot;Guenther Gummibrot&amp;quot;,&lt;br /&gt;
        &amp;quot;summer camp&amp;quot;,&lt;br /&gt;
        &amp;quot;|TPF. GottenSikici&amp;quot;&lt;br /&gt;
    ]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
[[Category:Server]]&lt;/div&gt;</summary>
		<author><name>Jrgp</name></author>	</entry>

	<entry>
		<id>https://wiki.soldat.pl/index.php?title=Lobby_HTTP_API&amp;diff=1872</id>
		<title>Lobby HTTP API</title>
		<link rel="alternate" type="text/html" href="https://wiki.soldat.pl/index.php?title=Lobby_HTTP_API&amp;diff=1872"/>
				<updated>2017-09-01T07:57:10Z</updated>
		
		<summary type="html">&lt;p&gt;Jrgp: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Recently, we added a standard json-based REST HTTP API to make getting the list of Soldat servers much easier for third party applications, compared to the legacy [[Client-Lobby_Protocol]].&lt;br /&gt;
&lt;br /&gt;
URL: http://api.soldat.pl (https is also supported)&lt;br /&gt;
CORS headers are present so this can be used via ajax.&lt;br /&gt;
&lt;br /&gt;
== List all servers, with filters ==&lt;br /&gt;
&lt;br /&gt;
 http://api.soldat.pl/v0/servers&lt;br /&gt;
&lt;br /&gt;
List all Soldat servers. You can provide a combination of these GET parameters as filters:&lt;br /&gt;
&lt;br /&gt;
  ?os=linux|mac|windows&lt;br /&gt;
  ?gamestyle=DM|PM|TM|CTF|RM|INF|HTF&lt;br /&gt;
  ?country=US|DE|...&lt;br /&gt;
  ?version=1.7.1|1.6.1|...&lt;br /&gt;
  ?empty=yes|no&lt;br /&gt;
  ?full=yes|no&lt;br /&gt;
  ?bots=yes|no&lt;br /&gt;
  ?private=yes|no&lt;br /&gt;
  ?realistic=yes|no&lt;br /&gt;
  ?survival=yes|no&lt;br /&gt;
  ?advanced=yes|no&lt;br /&gt;
&lt;br /&gt;
Example response:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
    &amp;quot;Servers&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;AC&amp;quot;: false,&lt;br /&gt;
            &amp;quot;Advanced&amp;quot;: false,&lt;br /&gt;
            &amp;quot;BonusFreq&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;ConnectionType&amp;quot;: 3,&lt;br /&gt;
            &amp;quot;Country&amp;quot;: &amp;quot;FR&amp;quot;,&lt;br /&gt;
            &amp;quot;CurrentMap&amp;quot;: &amp;quot;Blox&amp;quot;,&lt;br /&gt;
            &amp;quot;Dedicated&amp;quot;: true,&lt;br /&gt;
            &amp;quot;GameStyle&amp;quot;: &amp;quot;DM&amp;quot;,&lt;br /&gt;
            &amp;quot;IP&amp;quot;: &amp;quot;5.135.160.192&amp;quot;,&lt;br /&gt;
            &amp;quot;Info&amp;quot;: &amp;quot;GamingCrew.pl&amp;quot;,&lt;br /&gt;
            &amp;quot;MaxPlayers&amp;quot;: 5,&lt;br /&gt;
            &amp;quot;Name&amp;quot;: &amp;quot;GamingCrew.pl[1vs1]#2&amp;quot;,&lt;br /&gt;
            &amp;quot;NumBots&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;NumPlayers&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;OS&amp;quot;: &amp;quot;linux&amp;quot;,&lt;br /&gt;
            &amp;quot;Port&amp;quot;: 23078,&lt;br /&gt;
            &amp;quot;Private&amp;quot;: false,&lt;br /&gt;
            &amp;quot;Realistic&amp;quot;: false,&lt;br /&gt;
            &amp;quot;Respawn&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;Survival&amp;quot;: false,&lt;br /&gt;
            &amp;quot;Version&amp;quot;: &amp;quot;1.7.1&amp;quot;,&lt;br /&gt;
            &amp;quot;WM&amp;quot;: false&lt;br /&gt;
        }]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Get data on server ==&lt;br /&gt;
&lt;br /&gt;
 http://api.soldat.pl/v0/server/$ip/$port&lt;br /&gt;
&lt;br /&gt;
Example response:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
    &amp;quot;AC&amp;quot;: false,&lt;br /&gt;
    &amp;quot;Advanced&amp;quot;: false,&lt;br /&gt;
    &amp;quot;BonusFreq&amp;quot;: 0,&lt;br /&gt;
    &amp;quot;ConnectionType&amp;quot;: 3,&lt;br /&gt;
    &amp;quot;Country&amp;quot;: &amp;quot;US&amp;quot;,&lt;br /&gt;
    &amp;quot;CurrentMap&amp;quot;: &amp;quot;Island2k5&amp;quot;,&lt;br /&gt;
    &amp;quot;Dedicated&amp;quot;: true,&lt;br /&gt;
    &amp;quot;GameStyle&amp;quot;: &amp;quot;DM&amp;quot;,&lt;br /&gt;
    &amp;quot;IP&amp;quot;: &amp;quot;207.152.134.13&amp;quot;,&lt;br /&gt;
    &amp;quot;Info&amp;quot;: &amp;quot;Eat Moar Chik'n&amp;quot;,&lt;br /&gt;
    &amp;quot;MaxPlayers&amp;quot;: 10,&lt;br /&gt;
    &amp;quot;Name&amp;quot;: &amp;quot;Drop a Penny&amp;quot;,&lt;br /&gt;
    &amp;quot;NumBots&amp;quot;: 0,&lt;br /&gt;
    &amp;quot;NumPlayers&amp;quot;: 0,&lt;br /&gt;
    &amp;quot;OS&amp;quot;: &amp;quot;windows&amp;quot;,&lt;br /&gt;
    &amp;quot;Port&amp;quot;: 23073,&lt;br /&gt;
    &amp;quot;Private&amp;quot;: false,&lt;br /&gt;
    &amp;quot;Realistic&amp;quot;: true,&lt;br /&gt;
    &amp;quot;Respawn&amp;quot;: 0,&lt;br /&gt;
    &amp;quot;Survival&amp;quot;: false,&lt;br /&gt;
    &amp;quot;Version&amp;quot;: &amp;quot;1.7.1&amp;quot;,&lt;br /&gt;
    &amp;quot;WM&amp;quot;: false&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Get players for a server ==&lt;br /&gt;
&lt;br /&gt;
 http://api.soldat.pl/v0/server/$ip/$port/players&lt;br /&gt;
&lt;br /&gt;
This will make the lobby use the file download protocol to grab that server's gamestat.txt file and parse and display the players currently in the server. FYI: This makes use of caching to prevent abuse.&lt;br /&gt;
&lt;br /&gt;
Example response:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
    &amp;quot;Players&amp;quot;: [&lt;br /&gt;
        &amp;quot;/././a.d.i.d.a.s/././&amp;quot;,&lt;br /&gt;
        &amp;quot;Alvarez&amp;quot;,&lt;br /&gt;
        &amp;quot;Freedom Fighter&amp;quot;,&lt;br /&gt;
        &amp;quot;Guenther Gummibrot&amp;quot;,&lt;br /&gt;
        &amp;quot;summer camp&amp;quot;,&lt;br /&gt;
        &amp;quot;|TPF. GottenSikici&amp;quot;&lt;br /&gt;
    ]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
[[Category:Server]]&lt;/div&gt;</summary>
		<author><name>Jrgp</name></author>	</entry>

	<entry>
		<id>https://wiki.soldat.pl/index.php?title=Lobby_HTTP_API&amp;diff=1871</id>
		<title>Lobby HTTP API</title>
		<link rel="alternate" type="text/html" href="https://wiki.soldat.pl/index.php?title=Lobby_HTTP_API&amp;diff=1871"/>
				<updated>2017-09-01T07:55:41Z</updated>
		
		<summary type="html">&lt;p&gt;Jrgp: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Recently, we added a standard json-based REST HTTP API to make getting the list of Soldat servers much easier for third party applications.&lt;br /&gt;
&lt;br /&gt;
URL: http://api.soldat.pl (https is also supported)&lt;br /&gt;
CORS headers are present so this can be used via ajax.&lt;br /&gt;
&lt;br /&gt;
== List all servers, with filters ==&lt;br /&gt;
&lt;br /&gt;
 http://api.soldat.pl/v0/servers&lt;br /&gt;
&lt;br /&gt;
List all Soldat servers. You can provide a combination of these GET parameters as filters:&lt;br /&gt;
&lt;br /&gt;
  ?os=linux|mac|windows&lt;br /&gt;
  ?gamestyle=DM|PM|TM|CTF|RM|INF|HTF&lt;br /&gt;
  ?country=US|DE|...&lt;br /&gt;
  ?version=1.7.1|1.6.1|...&lt;br /&gt;
  ?empty=yes|no&lt;br /&gt;
  ?full=yes|no&lt;br /&gt;
  ?bots=yes|no&lt;br /&gt;
  ?private=yes|no&lt;br /&gt;
  ?realistic=yes|no&lt;br /&gt;
  ?survival=yes|no&lt;br /&gt;
  ?advanced=yes|no&lt;br /&gt;
&lt;br /&gt;
Example response:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
    &amp;quot;Servers&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;AC&amp;quot;: false,&lt;br /&gt;
            &amp;quot;Advanced&amp;quot;: false,&lt;br /&gt;
            &amp;quot;BonusFreq&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;ConnectionType&amp;quot;: 3,&lt;br /&gt;
            &amp;quot;Country&amp;quot;: &amp;quot;FR&amp;quot;,&lt;br /&gt;
            &amp;quot;CurrentMap&amp;quot;: &amp;quot;Blox&amp;quot;,&lt;br /&gt;
            &amp;quot;Dedicated&amp;quot;: true,&lt;br /&gt;
            &amp;quot;GameStyle&amp;quot;: &amp;quot;DM&amp;quot;,&lt;br /&gt;
            &amp;quot;IP&amp;quot;: &amp;quot;5.135.160.192&amp;quot;,&lt;br /&gt;
            &amp;quot;Info&amp;quot;: &amp;quot;GamingCrew.pl&amp;quot;,&lt;br /&gt;
            &amp;quot;MaxPlayers&amp;quot;: 5,&lt;br /&gt;
            &amp;quot;Name&amp;quot;: &amp;quot;GamingCrew.pl[1vs1]#2&amp;quot;,&lt;br /&gt;
            &amp;quot;NumBots&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;NumPlayers&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;OS&amp;quot;: &amp;quot;linux&amp;quot;,&lt;br /&gt;
            &amp;quot;Port&amp;quot;: 23078,&lt;br /&gt;
            &amp;quot;Private&amp;quot;: false,&lt;br /&gt;
            &amp;quot;Realistic&amp;quot;: false,&lt;br /&gt;
            &amp;quot;Respawn&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;Survival&amp;quot;: false,&lt;br /&gt;
            &amp;quot;Version&amp;quot;: &amp;quot;1.7.1&amp;quot;,&lt;br /&gt;
            &amp;quot;WM&amp;quot;: false&lt;br /&gt;
        }]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Get data on server ==&lt;br /&gt;
&lt;br /&gt;
 http://api.soldat.pl/v0/server/$ip/$port&lt;br /&gt;
&lt;br /&gt;
Example response:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
    &amp;quot;AC&amp;quot;: false,&lt;br /&gt;
    &amp;quot;Advanced&amp;quot;: false,&lt;br /&gt;
    &amp;quot;BonusFreq&amp;quot;: 0,&lt;br /&gt;
    &amp;quot;ConnectionType&amp;quot;: 3,&lt;br /&gt;
    &amp;quot;Country&amp;quot;: &amp;quot;US&amp;quot;,&lt;br /&gt;
    &amp;quot;CurrentMap&amp;quot;: &amp;quot;Island2k5&amp;quot;,&lt;br /&gt;
    &amp;quot;Dedicated&amp;quot;: true,&lt;br /&gt;
    &amp;quot;GameStyle&amp;quot;: &amp;quot;DM&amp;quot;,&lt;br /&gt;
    &amp;quot;IP&amp;quot;: &amp;quot;207.152.134.13&amp;quot;,&lt;br /&gt;
    &amp;quot;Info&amp;quot;: &amp;quot;Eat Moar Chik'n&amp;quot;,&lt;br /&gt;
    &amp;quot;MaxPlayers&amp;quot;: 10,&lt;br /&gt;
    &amp;quot;Name&amp;quot;: &amp;quot;Drop a Penny&amp;quot;,&lt;br /&gt;
    &amp;quot;NumBots&amp;quot;: 0,&lt;br /&gt;
    &amp;quot;NumPlayers&amp;quot;: 0,&lt;br /&gt;
    &amp;quot;OS&amp;quot;: &amp;quot;windows&amp;quot;,&lt;br /&gt;
    &amp;quot;Port&amp;quot;: 23073,&lt;br /&gt;
    &amp;quot;Private&amp;quot;: false,&lt;br /&gt;
    &amp;quot;Realistic&amp;quot;: true,&lt;br /&gt;
    &amp;quot;Respawn&amp;quot;: 0,&lt;br /&gt;
    &amp;quot;Survival&amp;quot;: false,&lt;br /&gt;
    &amp;quot;Version&amp;quot;: &amp;quot;1.7.1&amp;quot;,&lt;br /&gt;
    &amp;quot;WM&amp;quot;: false&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Get players for a server ==&lt;br /&gt;
&lt;br /&gt;
 http://api.soldat.pl/v0/server/$ip/$port/players&lt;br /&gt;
&lt;br /&gt;
This will make the lobby use the file download protocol to grab that server's gamestat.txt file and parse and display the players currently in the server. FYI: This makes use of caching to prevent abuse.&lt;br /&gt;
&lt;br /&gt;
Example response:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
    &amp;quot;Players&amp;quot;: [&lt;br /&gt;
        &amp;quot;/././a.d.i.d.a.s/././&amp;quot;,&lt;br /&gt;
        &amp;quot;Alvarez&amp;quot;,&lt;br /&gt;
        &amp;quot;Freedom Fighter&amp;quot;,&lt;br /&gt;
        &amp;quot;Guenther Gummibrot&amp;quot;,&lt;br /&gt;
        &amp;quot;summer camp&amp;quot;,&lt;br /&gt;
        &amp;quot;|TPF. GottenSikici&amp;quot;&lt;br /&gt;
    ]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
[[Category:Server]]&lt;/div&gt;</summary>
		<author><name>Jrgp</name></author>	</entry>

	<entry>
		<id>https://wiki.soldat.pl/index.php?title=Lobby_HTTP_API&amp;diff=1870</id>
		<title>Lobby HTTP API</title>
		<link rel="alternate" type="text/html" href="https://wiki.soldat.pl/index.php?title=Lobby_HTTP_API&amp;diff=1870"/>
				<updated>2017-09-01T07:54:22Z</updated>
		
		<summary type="html">&lt;p&gt;Jrgp: add http api docs&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Recently, we added a standard json-based REST HTTP API to make getting the list of Soldat servers much easier for third party applications.&lt;br /&gt;
&lt;br /&gt;
URL: http://api.soldat.pl (https is also supported)&lt;br /&gt;
CORS headers are present so this can be used via ajax.&lt;br /&gt;
&lt;br /&gt;
== List all servers, with filters ==&lt;br /&gt;
&lt;br /&gt;
 http://api.soldat.pl/v0/servers&lt;br /&gt;
&lt;br /&gt;
List all Soldat servers. You can provide a combination of these GET parameters as filters:&lt;br /&gt;
&lt;br /&gt;
  ?os=linux|mac|windows&lt;br /&gt;
  ?gamestyle=DM|PM|TM|CTF|RM|INF|HTF&lt;br /&gt;
  ?country=US|DE|...&lt;br /&gt;
  ?version=1.7.1|1.6.1|...&lt;br /&gt;
  ?empty=yes|no&lt;br /&gt;
  ?full=yes|no&lt;br /&gt;
  ?bots=yes|no&lt;br /&gt;
  ?private=yes|no&lt;br /&gt;
  ?realistic=yes|no&lt;br /&gt;
  ?survival=yes|no&lt;br /&gt;
  ?advanced=yes|no&lt;br /&gt;
&lt;br /&gt;
Example response:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
    &amp;quot;Servers&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;AC&amp;quot;: false,&lt;br /&gt;
            &amp;quot;Advanced&amp;quot;: false,&lt;br /&gt;
            &amp;quot;BonusFreq&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;ConnectionType&amp;quot;: 3,&lt;br /&gt;
            &amp;quot;Country&amp;quot;: &amp;quot;FR&amp;quot;,&lt;br /&gt;
            &amp;quot;CurrentMap&amp;quot;: &amp;quot;Blox&amp;quot;,&lt;br /&gt;
            &amp;quot;Dedicated&amp;quot;: true,&lt;br /&gt;
            &amp;quot;GameStyle&amp;quot;: &amp;quot;DM&amp;quot;,&lt;br /&gt;
            &amp;quot;IP&amp;quot;: &amp;quot;5.135.160.192&amp;quot;,&lt;br /&gt;
            &amp;quot;Info&amp;quot;: &amp;quot;GamingCrew.pl&amp;quot;,&lt;br /&gt;
            &amp;quot;MaxPlayers&amp;quot;: 5,&lt;br /&gt;
            &amp;quot;Name&amp;quot;: &amp;quot;GamingCrew.pl[1vs1]#2&amp;quot;,&lt;br /&gt;
            &amp;quot;NumBots&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;NumPlayers&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;OS&amp;quot;: &amp;quot;linux&amp;quot;,&lt;br /&gt;
            &amp;quot;Port&amp;quot;: 23078,&lt;br /&gt;
            &amp;quot;Private&amp;quot;: false,&lt;br /&gt;
            &amp;quot;Realistic&amp;quot;: false,&lt;br /&gt;
            &amp;quot;Respawn&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;Survival&amp;quot;: false,&lt;br /&gt;
            &amp;quot;Version&amp;quot;: &amp;quot;1.7.1&amp;quot;,&lt;br /&gt;
            &amp;quot;WM&amp;quot;: false&lt;br /&gt;
        }]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Get data on server ==&lt;br /&gt;
&lt;br /&gt;
 http://api.soldat.pl/v0/server/$ip/$port&lt;br /&gt;
&lt;br /&gt;
Example response:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
    &amp;quot;AC&amp;quot;: false,&lt;br /&gt;
    &amp;quot;Advanced&amp;quot;: false,&lt;br /&gt;
    &amp;quot;BonusFreq&amp;quot;: 0,&lt;br /&gt;
    &amp;quot;ConnectionType&amp;quot;: 3,&lt;br /&gt;
    &amp;quot;Country&amp;quot;: &amp;quot;US&amp;quot;,&lt;br /&gt;
    &amp;quot;CurrentMap&amp;quot;: &amp;quot;Island2k5&amp;quot;,&lt;br /&gt;
    &amp;quot;Dedicated&amp;quot;: true,&lt;br /&gt;
    &amp;quot;GameStyle&amp;quot;: &amp;quot;DM&amp;quot;,&lt;br /&gt;
    &amp;quot;IP&amp;quot;: &amp;quot;207.152.134.13&amp;quot;,&lt;br /&gt;
    &amp;quot;Info&amp;quot;: &amp;quot;Eat Moar Chik'n&amp;quot;,&lt;br /&gt;
    &amp;quot;MaxPlayers&amp;quot;: 10,&lt;br /&gt;
    &amp;quot;Name&amp;quot;: &amp;quot;Drop a Penny&amp;quot;,&lt;br /&gt;
    &amp;quot;NumBots&amp;quot;: 0,&lt;br /&gt;
    &amp;quot;NumPlayers&amp;quot;: 0,&lt;br /&gt;
    &amp;quot;OS&amp;quot;: &amp;quot;windows&amp;quot;,&lt;br /&gt;
    &amp;quot;Port&amp;quot;: 23073,&lt;br /&gt;
    &amp;quot;Private&amp;quot;: false,&lt;br /&gt;
    &amp;quot;Realistic&amp;quot;: true,&lt;br /&gt;
    &amp;quot;Respawn&amp;quot;: 0,&lt;br /&gt;
    &amp;quot;Survival&amp;quot;: false,&lt;br /&gt;
    &amp;quot;Version&amp;quot;: &amp;quot;1.7.1&amp;quot;,&lt;br /&gt;
    &amp;quot;WM&amp;quot;: false&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Get players for a server ==&lt;br /&gt;
&lt;br /&gt;
 http://api.soldat.pl/v0/server/$ip/$port/players&lt;br /&gt;
&lt;br /&gt;
This will make the lobby use the file download protocol to grab that server's gamestat.txt file and parse and display the players currently in the server. FYI: This makes use of caching to prevent abuse.&lt;br /&gt;
&lt;br /&gt;
Example response:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
    &amp;quot;Players&amp;quot;: [&lt;br /&gt;
        &amp;quot;/././a.d.i.d.a.s/././&amp;quot;,&lt;br /&gt;
        &amp;quot;Alvarez&amp;quot;,&lt;br /&gt;
        &amp;quot;Freedom Fighter&amp;quot;,&lt;br /&gt;
        &amp;quot;Guenther Gummibrot&amp;quot;,&lt;br /&gt;
        &amp;quot;summer camp&amp;quot;,&lt;br /&gt;
        &amp;quot;|TPF. GottenSikici&amp;quot;&lt;br /&gt;
    ]&lt;br /&gt;
 }&lt;/div&gt;</summary>
		<author><name>Jrgp</name></author>	</entry>

	<entry>
		<id>https://wiki.soldat.pl/index.php?title=Main_Page&amp;diff=1869</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.soldat.pl/index.php?title=Main_Page&amp;diff=1869"/>
				<updated>2017-09-01T07:40:48Z</updated>
		
		<summary type="html">&lt;p&gt;Jrgp: adding lobby http link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
== Welcome to the Soldat Wiki ==&lt;br /&gt;
&lt;br /&gt;
Here you'll find reference to most of the common topics discussed in the [irc://irc.quakenet.org/#soldat.devs channel] and [http://forums.soldat.pl Forum]. If you found bugs or have suggestions please contact us on [irc://irc.quakenet.org/#soldat.devs #soldat.devs at QuakeNet].  Latest information about Soldat can be always found at the [http://forums.soldat.pl Official Soldat Forum].  This wiki is intended as a location for the more specific and more technical knowledge about Soldat, including running Servers, writing Scripts or checking Tutorials about every aspect of game.  &lt;br /&gt;
&lt;br /&gt;
{| width=100%&lt;br /&gt;
| style=&amp;quot;width: 50%; vertical-align: top&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
===Server General===&lt;br /&gt;
*[[Server|Introduction]]&lt;br /&gt;
*[[Server Configuration]]&lt;br /&gt;
*[[Commands|Commands Reference]]&lt;br /&gt;
*[[Logging|Logging]]&lt;br /&gt;
*[[BattlEye|BattlEye Anti-Cheat Engine]]&lt;br /&gt;
&lt;br /&gt;
===Server Scripting===&lt;br /&gt;
*[[Scripting_basics|Introduction]]&lt;br /&gt;
*[[Server Scripting]]&lt;br /&gt;
*[[Script Core 3]]&lt;br /&gt;
*[[Scripts Database]]&lt;br /&gt;
&lt;br /&gt;
===General Technical Information===&lt;br /&gt;
*[[Ports|About Ports, Protocols and Forwarding]]&lt;br /&gt;
*[[Testing your connectivity|Testing Your Connectivity]]&lt;br /&gt;
*[[Refresh|Using the REFRESH Packet]]&lt;br /&gt;
*[[Refreshx|Using the REFRESHX (eXtended) Packet]]&lt;br /&gt;
*[[Raw_commands|RAW Commands]]&lt;br /&gt;
*[[Command line arguments|Command Line Arguments]]&lt;br /&gt;
*[[Map|Map File Structure]]&lt;br /&gt;
*[[Download_thread|Map/Files Downloading]]&lt;br /&gt;
*[[Lobby Protocol]]&lt;br /&gt;
*[[Lobby HTTP API]] '''(new)'''&lt;br /&gt;
*[[Bandwidth|About Bandwidth]]&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;width: 50%; vertical-align: top&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
===Soldat General===&lt;br /&gt;
*[[Soldat|Introduction]]&lt;br /&gt;
*[[Soldat History]]&lt;br /&gt;
*[[Soldat Community]]&lt;br /&gt;
*[[Version History]]&lt;br /&gt;
*[[Third-Party Tools]]&lt;br /&gt;
&lt;br /&gt;
=== Tutorials ===&lt;br /&gt;
*[[First Server|Your First Server - Know How]]&lt;br /&gt;
*[[Mapping Tutorial|First steps in Polyworks]]&lt;br /&gt;
*[[Advanced Mapping Tutorial|Advanced Mapping Tutorial]]&lt;br /&gt;
*[[Map Sceneries|All Basic Information about sceneries]]&lt;br /&gt;
*[[Map Waypoints|Basic Information about Waypoints]]&lt;br /&gt;
*[[Mod.ini|Modding information on how to use the mod.ini file]]&lt;br /&gt;
&lt;br /&gt;
=== Game and Gameplay ===&lt;br /&gt;
*[[Game Settings|Information about Soldat configuration]]&lt;br /&gt;
*[[Ingame Settings| Information about Ingame options]]&lt;br /&gt;
*[[Lobby Overview| Lobby Overview]]&lt;br /&gt;
*[[Profiles and Taunts| Information about Profiles and Taunts]]&lt;br /&gt;
*[[Game Types| Types of Games in Soldat]]&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Jrgp</name></author>	</entry>

	<entry>
		<id>https://wiki.soldat.pl/index.php?title=User:Jrgp&amp;diff=1497</id>
		<title>User:Jrgp</title>
		<link rel="alternate" type="text/html" href="https://wiki.soldat.pl/index.php?title=User:Jrgp&amp;diff=1497"/>
				<updated>2014-04-05T10:38:16Z</updated>
		
		<summary type="html">&lt;p&gt;Jrgp: Created page with &amp;quot;My name is jrgp. Me and Ryan (FliesLikeABrick) form THD's resident sysadmin team. Let me or him know when stuff breaks. I typically have more time than he does so contacting m...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;My name is jrgp. Me and Ryan (FliesLikeABrick) form THD's resident sysadmin team. Let me or him know when stuff breaks. I typically have more time than he does so contacting me first might be better.&lt;br /&gt;
&lt;br /&gt;
Contact me here: joe@u13.net or over the forums&lt;/div&gt;</summary>
		<author><name>Jrgp</name></author>	</entry>

	<entry>
		<id>https://wiki.soldat.pl/index.php?title=User:Akinaro&amp;diff=1496</id>
		<title>User:Akinaro</title>
		<link rel="alternate" type="text/html" href="https://wiki.soldat.pl/index.php?title=User:Akinaro&amp;diff=1496"/>
				<updated>2014-04-05T10:28:28Z</updated>
		
		<summary type="html">&lt;p&gt;Jrgp: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;If you reading this its mean that you lost or you love me and you searching for my address.&lt;br /&gt;
But I have Sad news for you: I'm just bored internet Bot. '''''No you're not /jrgp'''''&lt;br /&gt;
&lt;br /&gt;
Beside, thx to my awesomenes You have wiki.soldat.pl not old empty and forgotten devs.soldat site that even Admins doesn't visits :D :D '''''Yes I do /jrgp'''''&lt;br /&gt;
&lt;br /&gt;
I hope I can make this site to look like real wiki rather than forgotten server/scripts database...&lt;/div&gt;</summary>
		<author><name>Jrgp</name></author>	</entry>

	<entry>
		<id>https://wiki.soldat.pl/index.php?title=Main_Page&amp;diff=1495</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.soldat.pl/index.php?title=Main_Page&amp;diff=1495"/>
				<updated>2014-04-05T10:14:31Z</updated>
		
		<summary type="html">&lt;p&gt;Jrgp: /* Game and Gameplay */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| style=&amp;quot;color:black; background-color:#ffcccc;&amp;quot; cellpadding=&amp;quot;10&amp;quot; class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|The old Soldat Devs wiki has become plagued with spam and other problems.  We are working on migrating all content to this new wiki, but you can find the old content at http://devs-old.soldat.pl for now.  Please feel free to register and copy pages over! We need all the help we can get.&lt;br /&gt;
|}&lt;br /&gt;
__NOTOC__&lt;br /&gt;
== Welcome to the Soldat Wiki ==&lt;br /&gt;
&lt;br /&gt;
Here you'll find reference to most of the common topics discussed in the [irc://irc.quakenet.org/#soldat.devs channel] and [http://forums.soldat.pl Forum]. If you found bugs or have suggestions please contact us on [irc://irc.quakenet.org/#soldat.devs #soldat.devs at QuakeNet].  Latest information about Soldat can be always found at the [http://forums.soldat.pl Official Soldat Forum].  This wiki is intended as a location for the more specific and more technical knowledge about Soldat, including running Servers, writing Scripts or checking Tutorials about every aspect of game.  &lt;br /&gt;
&lt;br /&gt;
{| width=100%&lt;br /&gt;
| style=&amp;quot;width: 50%; vertical-align: top&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
===Server General===&lt;br /&gt;
*[[Server|Introduction]]&lt;br /&gt;
*[[Server Configuration]]&lt;br /&gt;
*[[Commands|Commands Reference]]&lt;br /&gt;
*[[Logging|Logging]]&lt;br /&gt;
*[[BattlEye|BattlEye Anti-Cheat Engine]]&lt;br /&gt;
&lt;br /&gt;
===Server Scripting===&lt;br /&gt;
*[[Scripting_basics|Introduction]]&lt;br /&gt;
*[[Server Scripting]]&lt;br /&gt;
*[[Script Core 3]]&lt;br /&gt;
*[[Scripts Database]]&lt;br /&gt;
&lt;br /&gt;
===General Technical Information===&lt;br /&gt;
*[[Ports|About Ports, Protocols and Forwarding]]&lt;br /&gt;
*[[Testing your connectivity|Testing Your Connectivity]]&lt;br /&gt;
*[[Refresh|Using the REFRESH Packet]]&lt;br /&gt;
*[[Refreshx|Using the REFRESHX (eXtended) Packet]]&lt;br /&gt;
*[[Raw_commands|RAW Commands]]&lt;br /&gt;
*[[Command line arguments|Command Line Arguments]]&lt;br /&gt;
*[[Map|Map File Structure]]&lt;br /&gt;
*[[Download_thread|Map/Files Downloading]]&lt;br /&gt;
*[[Lobby Protocol]]&lt;br /&gt;
*[[Bandwidth|About Bandwidth]]&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;width: 50%; vertical-align: top&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
===Soldat General===&lt;br /&gt;
*[[Soldat|Introduction]]&lt;br /&gt;
*[[Soldat History]]&lt;br /&gt;
*[[Soldat Community]]&lt;br /&gt;
*[[Version History]]&lt;br /&gt;
&lt;br /&gt;
=== Tutorials ===&lt;br /&gt;
*[[First Server|Your First Server - Know How]]&lt;br /&gt;
*[[Mapping Tutorial|First steps in Polyworks]]&lt;br /&gt;
*[[Advanced Mapping Tutorial|Advanced Mapping Tutorial]]&lt;br /&gt;
*[[Map Sceneries|All Basic Information about sceneries]]&lt;br /&gt;
*[[Map Waypoints|Basic Information about Waypoints]]&lt;br /&gt;
&lt;br /&gt;
=== Game and Gameplay ===&lt;br /&gt;
*[[Game Settings|Information about Soldat configuration]]&lt;br /&gt;
*[[Ingame Settings| Information about Ingame options]]&lt;br /&gt;
*[[Lobby Overview| Lobby Overview]]&lt;br /&gt;
*[[Profiles and Taunts| Information about Profiles and Taunts]]&lt;br /&gt;
*[[Game Types| Types of Games in Soldat]]&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Jrgp</name></author>	</entry>

	<entry>
		<id>https://wiki.soldat.pl/index.php?title=Refresh&amp;diff=1243</id>
		<title>Refresh</title>
		<link rel="alternate" type="text/html" href="https://wiki.soldat.pl/index.php?title=Refresh&amp;diff=1243"/>
				<updated>2013-09-01T08:40:03Z</updated>
		
		<summary type="html">&lt;p&gt;Jrgp: added python version&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The '''REFRESH''' is a [[Raw_commands|Raw command]] used in [[Soldat]] to give [[admin client|admin clients]] information about the [[server]].&lt;br /&gt;
The 1188 byte-long REFRESH-packet is sent right after REFRESH\r\n.&lt;br /&gt;
&lt;br /&gt;
==Structure==&lt;br /&gt;
&lt;br /&gt;
* Player&lt;br /&gt;
** Names&lt;br /&gt;
** Teams&lt;br /&gt;
** Kills&lt;br /&gt;
** Deaths&lt;br /&gt;
** Pings&lt;br /&gt;
** IDs&lt;br /&gt;
** IPs&lt;br /&gt;
* Team Scores&lt;br /&gt;
* Map Name&lt;br /&gt;
* Time Limit&lt;br /&gt;
* Kill Limit&lt;br /&gt;
* Gamestyle&lt;br /&gt;
&lt;br /&gt;
==Implementations==&lt;br /&gt;
&lt;br /&gt;
===Pascal===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
const&lt;br /&gt;
PLAYERNAME_CHARS = 24;&lt;br /&gt;
&lt;br /&gt;
TMsg_Refresh = packed record&lt;br /&gt;
Name : array[1..32] of string[PLAYERNAME_CHARS];&lt;br /&gt;
Team : array[1..32] of byte;&lt;br /&gt;
Kills : array[1..32] of word;&lt;br /&gt;
Deaths : array[1..32] of word;&lt;br /&gt;
Ping : array[1..32] of byte;&lt;br /&gt;
Number : array[1..32] of byte;&lt;br /&gt;
IP : array[1..32,1..4] of byte;&lt;br /&gt;
TeamScore : array[1..4] of word;&lt;br /&gt;
MapName : string[16];&lt;br /&gt;
TimeLimit, CurrentTime : integer;&lt;br /&gt;
KillLimit : word;&lt;br /&gt;
GameStyle : byte;&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===C++===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
typedef unsigned char byte;&lt;br /&gt;
typedef unsigned short word;&lt;br /&gt;
typedef unsigned long dword;&lt;br /&gt;
&lt;br /&gt;
#pragma pack(push, 1)&lt;br /&gt;
struct RefreshPacket {&lt;br /&gt;
struct {&lt;br /&gt;
    byte iLen;&lt;br /&gt;
    char cName[24];&lt;br /&gt;
} sName[32];&lt;br /&gt;
byte iTeam[32];&lt;br /&gt;
word iKills[32];&lt;br /&gt;
word iDeaths[32];&lt;br /&gt;
byte iPing[32];&lt;br /&gt;
byte iNumber[32];&lt;br /&gt;
union {&lt;br /&gt;
    dword iLong;&lt;br /&gt;
    byte iPiece[4];&lt;br /&gt;
} uIp[32];&lt;br /&gt;
word iTeamScore[4];&lt;br /&gt;
struct {&lt;br /&gt;
    byte iLen;&lt;br /&gt;
    char cMap[16];&lt;br /&gt;
} sMap;&lt;br /&gt;
dword iTimeLimit;&lt;br /&gt;
dword iCurrentTime;&lt;br /&gt;
word iKillLimit;&lt;br /&gt;
byte iGameStyle;&lt;br /&gt;
};&lt;br /&gt;
#pragma pack(pop)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====C++ Parser====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef _H_SOLDATINFO_&lt;br /&gt;
#define _H_SOLDATINFO_&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;vector&amp;gt;&lt;br /&gt;
#include &amp;lt;string&amp;gt;&lt;br /&gt;
#include &amp;lt;sstream&amp;gt;&lt;br /&gt;
#include &amp;lt;stdexcept&amp;gt;&lt;br /&gt;
&lt;br /&gt;
class SoldatInfo&lt;br /&gt;
{&lt;br /&gt;
    public:&lt;br /&gt;
        // Class to hold player and spectator data&lt;br /&gt;
        class Client&lt;br /&gt;
        {&lt;br /&gt;
            private:&lt;br /&gt;
                int id;&lt;br /&gt;
                int team;&lt;br /&gt;
                int kills;&lt;br /&gt;
                int deaths;&lt;br /&gt;
                int ping;&lt;br /&gt;
                std::string name;&lt;br /&gt;
                std::string ip;&lt;br /&gt;
&lt;br /&gt;
            public:&lt;br /&gt;
                Client(int _id, int _team, int _kills, int _deaths, int _ping, std::string _name, std::string _ip)&lt;br /&gt;
                    :   id(_id),&lt;br /&gt;
                        team(_team),&lt;br /&gt;
                        kills(_kills),&lt;br /&gt;
                        deaths(_deaths),&lt;br /&gt;
                        ping(_ping),&lt;br /&gt;
                        name(_name),&lt;br /&gt;
                        ip(_ip)&lt;br /&gt;
                {&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                // Returns player id&lt;br /&gt;
                int Id() const&lt;br /&gt;
                {&lt;br /&gt;
                    return id;&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                // Returns player team&lt;br /&gt;
                int Team() const&lt;br /&gt;
                {&lt;br /&gt;
                    return team;&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                // Returns player kills&lt;br /&gt;
                int Kills() const&lt;br /&gt;
                {&lt;br /&gt;
                    return kills;&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                // Returns player deaths&lt;br /&gt;
                int Deaths() const&lt;br /&gt;
                {&lt;br /&gt;
                    return deaths;&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                // Returns player ping&lt;br /&gt;
                int Ping() const&lt;br /&gt;
                {&lt;br /&gt;
                    return ping;&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                // Returns player name&lt;br /&gt;
                std::string Name() const&lt;br /&gt;
                {&lt;br /&gt;
                    return name;&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                // Returns player id&lt;br /&gt;
                std::string Ip() const&lt;br /&gt;
                {&lt;br /&gt;
                    return ip;&lt;br /&gt;
                }&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
        // typedefs for client iterators&lt;br /&gt;
        typedef std::vector&amp;lt;Client&amp;gt;::iterator iterator;&lt;br /&gt;
        typedef std::vector&amp;lt;Client&amp;gt;::const_iterator const_iterator;&lt;br /&gt;
        typedef std::vector&amp;lt;Client&amp;gt;::reverse_iterator reverse_iterator;&lt;br /&gt;
        typedef std::vector&amp;lt;Client&amp;gt;::const_reverse_iterator const_reverse_iterator;&lt;br /&gt;
&lt;br /&gt;
    private:&lt;br /&gt;
        // Internal typedefs&lt;br /&gt;
        typedef unsigned char byte;&lt;br /&gt;
        typedef unsigned short ushort;&lt;br /&gt;
        typedef unsigned long ulong;&lt;br /&gt;
&lt;br /&gt;
        // Internal compile-time constants to save some typing (these will be computed by the compiler)&lt;br /&gt;
        enum&lt;br /&gt;
        {&lt;br /&gt;
            MAX_PLAYERS         = 32,&lt;br /&gt;
            NAME_LENGTH         = 24,&lt;br /&gt;
            MAP_LENGTH          = 16,&lt;br /&gt;
            PLAYERS_OFFSET      = 0,&lt;br /&gt;
            TEAMS_OFFSET        = PLAYERS_OFFSET + MAX_PLAYERS * (NAME_LENGTH + 1),&lt;br /&gt;
            KILLS_OFFSET        = TEAMS_OFFSET + MAX_PLAYERS,&lt;br /&gt;
            DEATHS_OFFSET       = KILLS_OFFSET + MAX_PLAYERS * 2,&lt;br /&gt;
            PINGS_OFFSET        = DEATHS_OFFSET + MAX_PLAYERS * 2,&lt;br /&gt;
            IDS_OFFSET          = PINGS_OFFSET + MAX_PLAYERS,&lt;br /&gt;
            IPS_OFFSET          = IDS_OFFSET + MAX_PLAYERS,&lt;br /&gt;
            INFO_OFFSET         = IPS_OFFSET + MAX_PLAYERS * 4&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
        // Some private members for internal usage&lt;br /&gt;
        bool empty;&lt;br /&gt;
&lt;br /&gt;
        int team_scores[4];&lt;br /&gt;
        int time_limit;&lt;br /&gt;
        int cur_time;&lt;br /&gt;
        int kill_limit;&lt;br /&gt;
        int game_mode;&lt;br /&gt;
&lt;br /&gt;
        std::string map;&lt;br /&gt;
&lt;br /&gt;
        std::vector&amp;lt;Client&amp;gt; players;&lt;br /&gt;
        std::vector&amp;lt;Client&amp;gt; specs;&lt;br /&gt;
&lt;br /&gt;
        // Convert ushort from little endian to host byte order&lt;br /&gt;
        ushort ltohs(const byte *leshort) const&lt;br /&gt;
        {&lt;br /&gt;
            // In little endian byte order the least significant byte is first&lt;br /&gt;
            // To convert to host byte order we OR the low order byte with the&lt;br /&gt;
            // shifted high order byte, this works for both host byte orders&lt;br /&gt;
            return (leshort[0] | (leshort[1] &amp;lt;&amp;lt; 8));&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Convert ulong from little endian to host byte order&lt;br /&gt;
        ulong ltohl(const byte *lelong) const&lt;br /&gt;
        {&lt;br /&gt;
            // The same logic applies here, we just need to do it with 4 bytes instead of 2&lt;br /&gt;
            return (lelong[0] | (lelong[1] &amp;lt;&amp;lt; 8) | (lelong[2] &amp;lt;&amp;lt; 16) | (lelong[3] &amp;lt;&amp;lt; 24));&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        void ThrowOnEmpty() const&lt;br /&gt;
        {&lt;br /&gt;
            if (empty)&lt;br /&gt;
                throw std::logic_error(&amp;quot;soldat info object initialized but empty&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    public:&lt;br /&gt;
        // This constructor initializes an empty SoldatInfo object&lt;br /&gt;
        // NOTE. It is illegal to call any methods on an empty info object&lt;br /&gt;
        // Doing so will throw an exception of std::logic_error&lt;br /&gt;
        SoldatInfo() : empty(true)&lt;br /&gt;
        {&lt;br /&gt;
            // We need to tell our indexers that our object is empty as well!&lt;br /&gt;
            Players.base = this;&lt;br /&gt;
            Specs.base = this;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // This constructor takes a pointer to the buffer which contains the REFRESH packet&lt;br /&gt;
        // it assumes that you send it a valid REFRESH packet, eg. a packet of 1188 bytes&lt;br /&gt;
        SoldatInfo(const byte *packet) : empty(false)&lt;br /&gt;
        {&lt;br /&gt;
            // This will be used to keep track of our get pointer to packet&lt;br /&gt;
            const byte *packet_ptr;&lt;br /&gt;
&lt;br /&gt;
            // Iterate through players&lt;br /&gt;
            for (int i = 0; i &amp;lt; MAX_PLAYERS; i++)&lt;br /&gt;
            {&lt;br /&gt;
                // First let's make sure this is a valid player&lt;br /&gt;
                packet_ptr = packet + TEAMS_OFFSET + i;&lt;br /&gt;
                int team = *packet_ptr;&lt;br /&gt;
&lt;br /&gt;
                // The team variable will be:&lt;br /&gt;
                //     0 if the player is a valid player in non team based game mode&lt;br /&gt;
                //   1-4 if the player is a valid player in a team based game mode&lt;br /&gt;
                //     5 if the player is a spectator&lt;br /&gt;
                // This section of code is rather self explationary so I won't comment it much&lt;br /&gt;
                if (team &amp;gt; 5)&lt;br /&gt;
                    continue;&lt;br /&gt;
&lt;br /&gt;
                // This might require a quick explanation, REFRESH packet stores names as length-prefixed string&lt;br /&gt;
                // So we first retrieve the length, and then build a std::string object according to the length&lt;br /&gt;
                packet_ptr = packet + PLAYERS_OFFSET + i * (NAME_LENGTH + 1);&lt;br /&gt;
                int len = *packet_ptr++;&lt;br /&gt;
                const char *name_ptr = reinterpret_cast&amp;lt;const char*&amp;gt;(packet_ptr);&lt;br /&gt;
                std::string name(name_ptr, len);&lt;br /&gt;
&lt;br /&gt;
                packet_ptr = packet + KILLS_OFFSET + i * 2;&lt;br /&gt;
                int kills = ltohs(packet_ptr);&lt;br /&gt;
&lt;br /&gt;
                packet_ptr = packet + DEATHS_OFFSET + i * 2;&lt;br /&gt;
                int deaths = ltohs(packet_ptr);&lt;br /&gt;
&lt;br /&gt;
                packet_ptr = packet + PINGS_OFFSET + i;&lt;br /&gt;
                int ping = *packet_ptr;&lt;br /&gt;
&lt;br /&gt;
                packet_ptr = packet + IDS_OFFSET + i;&lt;br /&gt;
                int id = *packet_ptr;&lt;br /&gt;
&lt;br /&gt;
                // The following code might also require some briefing&lt;br /&gt;
                // Soldat stores IPs in network byte order (big endian), unlike its other data&lt;br /&gt;
                // Because most likely many people aren't interested in having an ip in long integral form&lt;br /&gt;
                // we'll generate a dotted version of it. If you really need the long version, you can use&lt;br /&gt;
                // eg. inet_addr(ip) to convert it (see MSDN for example)&lt;br /&gt;
                packet_ptr = packet + IPS_OFFSET + i * 4;&lt;br /&gt;
                std::ostringstream ip;&lt;br /&gt;
                ip &amp;lt;&amp;lt; (int)packet_ptr[0] &amp;lt;&amp;lt; &amp;quot;.&amp;quot; &amp;lt;&amp;lt; (int)packet_ptr[1] &amp;lt;&amp;lt; &amp;quot;.&amp;quot; &amp;lt;&amp;lt; (int)packet_ptr[2] &amp;lt;&amp;lt; &amp;quot;.&amp;quot; &amp;lt;&amp;lt; (int)packet_ptr[3];&lt;br /&gt;
&lt;br /&gt;
                // Now we have all the necessary data, let's build our player object, and then add it to either players or specs&lt;br /&gt;
                Client p(id, team, kills, deaths, ping, name, ip.str());&lt;br /&gt;
&lt;br /&gt;
                if (team &amp;lt; 5)&lt;br /&gt;
                    players.push_back(p);&lt;br /&gt;
                else&lt;br /&gt;
                    specs.push_back(p);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            // The rest of the data is easy to retrieve, let's point our get pointer to the section after the players&lt;br /&gt;
            packet_ptr = packet + INFO_OFFSET;&lt;br /&gt;
&lt;br /&gt;
            // Again, this code is pretty self explationary, so no comments are needed&lt;br /&gt;
            for (int i = 0; i &amp;lt; 4; i++)&lt;br /&gt;
            {&lt;br /&gt;
                team_scores[i] = ltohs(packet_ptr);&lt;br /&gt;
                packet_ptr += 2;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            // We use the same technique to read the map name as we used to read players' names&lt;br /&gt;
            int len = *packet_ptr++;&lt;br /&gt;
            const char *name_ptr = reinterpret_cast&amp;lt;const char*&amp;gt;(packet_ptr);&lt;br /&gt;
            map = std::string(name_ptr, len);&lt;br /&gt;
            packet_ptr += MAP_LENGTH;&lt;br /&gt;
&lt;br /&gt;
            // The time data in the packet are stored as ticks (1 sec = 60 ticks)&lt;br /&gt;
            // Since time limit can only be specified in minutes, let's convert it to mins as well&lt;br /&gt;
            time_limit = TicksToMins(ltohl(packet_ptr));&lt;br /&gt;
            packet_ptr += 4;&lt;br /&gt;
&lt;br /&gt;
            // It is unlikely that anyone needs the current time as precise as ticks, but you never know&lt;br /&gt;
            // which is why we won't convert it; Instead we'll provide an auxiliary method for converting (just a simple div by 60)&lt;br /&gt;
            cur_time = ltohl(packet_ptr);&lt;br /&gt;
            packet_ptr += 4;&lt;br /&gt;
&lt;br /&gt;
            kill_limit = ltohs(packet_ptr);&lt;br /&gt;
            packet_ptr += 2;&lt;br /&gt;
&lt;br /&gt;
            game_mode = *packet_ptr;&lt;br /&gt;
&lt;br /&gt;
            // Lastly let's initialize our client indexers&lt;br /&gt;
            Players.base = this;&lt;br /&gt;
            Players.clients = &amp;amp;players;&lt;br /&gt;
&lt;br /&gt;
            Specs.base = this;&lt;br /&gt;
            Specs.clients = &amp;amp;specs;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // NOTE. Because our class uses standard container std::vector and standard string std::string&lt;br /&gt;
        // We do not need to provide our own copy constructor, assignment operator or destructor, because&lt;br /&gt;
        // these types provide them, so we can rely on default shallow copy -mechanism our compiler provides&lt;br /&gt;
        // If you want to make this type extensible, you might want to provide an empty virtual destructor though&lt;br /&gt;
&lt;br /&gt;
        // The following methods are just getters to encapsulate the private data&lt;br /&gt;
&lt;br /&gt;
        // Returns whether object is empty or not&lt;br /&gt;
        bool Empty() const&lt;br /&gt;
        {&lt;br /&gt;
            return empty;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Returns the game mode&lt;br /&gt;
        int Gamemode() const&lt;br /&gt;
        {&lt;br /&gt;
            ThrowOnEmpty();&lt;br /&gt;
            return game_mode;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Returns map name&lt;br /&gt;
        std::string Map() const&lt;br /&gt;
        {&lt;br /&gt;
            ThrowOnEmpty();&lt;br /&gt;
            return map;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Returns current time in ticks&lt;br /&gt;
        int Timeleft() const&lt;br /&gt;
        {&lt;br /&gt;
            ThrowOnEmpty();&lt;br /&gt;
            return cur_time;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Returns time limit in mins&lt;br /&gt;
        int Timelimit() const&lt;br /&gt;
        {&lt;br /&gt;
            ThrowOnEmpty();&lt;br /&gt;
            return time_limit;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Returns the kill/score/point limit&lt;br /&gt;
        int Limit() const&lt;br /&gt;
        {&lt;br /&gt;
            ThrowOnEmpty();&lt;br /&gt;
            return kill_limit;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Returns team score&lt;br /&gt;
        // Throws std::out_of_range on invalid subscript&lt;br /&gt;
        int Teamscore(int team) const&lt;br /&gt;
        {&lt;br /&gt;
            ThrowOnEmpty();&lt;br /&gt;
&lt;br /&gt;
            if (team &amp;lt; 1 || team &amp;gt; 4)&lt;br /&gt;
                throw std::out_of_range(&amp;quot;invalid team subscript&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            return team_scores[team-1];&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Returns number of players&lt;br /&gt;
        int NumPlayers() const&lt;br /&gt;
        {&lt;br /&gt;
            ThrowOnEmpty();&lt;br /&gt;
            return static_cast&amp;lt;int&amp;gt;(players.size());&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Returns number of specs&lt;br /&gt;
        int NumSpecs() const&lt;br /&gt;
        {&lt;br /&gt;
            ThrowOnEmpty();&lt;br /&gt;
            return static_cast&amp;lt;int&amp;gt;(specs.size());&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // A simple hack to support array-like syntax for clients :)&lt;br /&gt;
        // Also provides an interface that supports STL iterators&lt;br /&gt;
        struct&lt;br /&gt;
        {&lt;br /&gt;
            friend class SoldatInfo;&lt;br /&gt;
&lt;br /&gt;
            private:&lt;br /&gt;
                SoldatInfo* base;&lt;br /&gt;
                std::vector&amp;lt;Client&amp;gt;* clients;&lt;br /&gt;
&lt;br /&gt;
            public:&lt;br /&gt;
                // Indexers, throws std::ouf_of_range if client is out of range&lt;br /&gt;
                Client&amp;amp; operator[](int client)&lt;br /&gt;
                {&lt;br /&gt;
                    base-&amp;gt;ThrowOnEmpty();&lt;br /&gt;
                    return clients-&amp;gt;at(client);&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                const Client&amp;amp; operator[](int client) const&lt;br /&gt;
                {&lt;br /&gt;
                    base-&amp;gt;ThrowOnEmpty();&lt;br /&gt;
                    return clients-&amp;gt;at(client);&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                // Iterator interface, supports iterators, const_iterators, reverse_iterators and const_reverse_iterators&lt;br /&gt;
                iterator begin()&lt;br /&gt;
                {&lt;br /&gt;
                    base-&amp;gt;ThrowOnEmpty();&lt;br /&gt;
                    return clients-&amp;gt;begin();&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                const_iterator begin() const&lt;br /&gt;
                {&lt;br /&gt;
                    base-&amp;gt;ThrowOnEmpty();&lt;br /&gt;
                    return clients-&amp;gt;begin();&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                iterator end()&lt;br /&gt;
                {&lt;br /&gt;
                    base-&amp;gt;ThrowOnEmpty();&lt;br /&gt;
                    return clients-&amp;gt;end();&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                const_iterator end() const&lt;br /&gt;
                {&lt;br /&gt;
                    base-&amp;gt;ThrowOnEmpty();&lt;br /&gt;
                    return clients-&amp;gt;end();&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                reverse_iterator rbegin()&lt;br /&gt;
                {&lt;br /&gt;
                    base-&amp;gt;ThrowOnEmpty();&lt;br /&gt;
                    return clients-&amp;gt;rbegin();&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                const_reverse_iterator rbegin() const&lt;br /&gt;
                {&lt;br /&gt;
                    base-&amp;gt;ThrowOnEmpty();&lt;br /&gt;
                    return clients-&amp;gt;rbegin();&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                reverse_iterator rend()&lt;br /&gt;
                {&lt;br /&gt;
                    base-&amp;gt;ThrowOnEmpty();&lt;br /&gt;
                    return clients-&amp;gt;rend();&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                const_reverse_iterator rend() const&lt;br /&gt;
                {&lt;br /&gt;
                    base-&amp;gt;ThrowOnEmpty();&lt;br /&gt;
                    return clients-&amp;gt;rend();&lt;br /&gt;
                }&lt;br /&gt;
        } Players, Specs;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        // The following methods are static auxiliary methods&lt;br /&gt;
&lt;br /&gt;
        // Returns a string representation of a given gamemode&lt;br /&gt;
        // Throws std::out_of_range on invalid subscript&lt;br /&gt;
        static std::string GamemodeToStr(int gamemode)&lt;br /&gt;
        {&lt;br /&gt;
            static const char *gamemodes[] = {&lt;br /&gt;
                &amp;quot;Deathmatch&amp;quot;,&lt;br /&gt;
                &amp;quot;Pointmatch&amp;quot;,&lt;br /&gt;
                &amp;quot;Teammatch&amp;quot;,&lt;br /&gt;
                &amp;quot;Capture the Flag&amp;quot;,&lt;br /&gt;
                &amp;quot;Rambomatch&amp;quot;,&lt;br /&gt;
                &amp;quot;Infiltration&amp;quot;,&lt;br /&gt;
                &amp;quot;Hold the Flag&amp;quot;&lt;br /&gt;
            };&lt;br /&gt;
&lt;br /&gt;
            if (gamemode &amp;lt; 0 || gamemode &amp;gt; 6)&lt;br /&gt;
                throw std::out_of_range(&amp;quot;invalid gamemode subscript&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            return gamemodes[gamemode];&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Returns a string representation of a given team&lt;br /&gt;
        // Throws std::out_of_range on invalid subscript&lt;br /&gt;
        static std::string TeamToStr(int team)&lt;br /&gt;
        {&lt;br /&gt;
            static const char *teams[] = {&lt;br /&gt;
                &amp;quot;None&amp;quot;,&lt;br /&gt;
                &amp;quot;Alpha&amp;quot;,&lt;br /&gt;
                &amp;quot;Bravo&amp;quot;,&lt;br /&gt;
                &amp;quot;Charlie&amp;quot;,&lt;br /&gt;
                &amp;quot;Delta&amp;quot;,&lt;br /&gt;
                &amp;quot;Spectator&amp;quot;&lt;br /&gt;
            };&lt;br /&gt;
&lt;br /&gt;
            if (team &amp;lt; 0 || team &amp;gt; 4)&lt;br /&gt;
                throw std::out_of_range(&amp;quot;invalid team subscript&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            return teams[team];&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Converts ticks to seconds&lt;br /&gt;
        static int TicksToSecs(int ticks)&lt;br /&gt;
        {&lt;br /&gt;
            return (ticks / 60);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Converts ticks to minutes&lt;br /&gt;
        static int TicksToMins(int ticks)&lt;br /&gt;
        {&lt;br /&gt;
            return (TicksToSecs(ticks) / 60);&lt;br /&gt;
        }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Visual Basic===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vb&amp;quot;&amp;gt;&lt;br /&gt;
Private Type RefreshPacket&lt;br /&gt;
    PlayerName(31) As String&lt;br /&gt;
    Team(31) As Byte&lt;br /&gt;
    Kills(31) As Long&lt;br /&gt;
    Deaths(31) As Long&lt;br /&gt;
    Ping(31) As Byte&lt;br /&gt;
    Number(31) As Byte&lt;br /&gt;
    IP(31, 3) As Byte&lt;br /&gt;
    TeamScore(3) As Long&lt;br /&gt;
    MapName As String&lt;br /&gt;
    TimeLimit As Double&lt;br /&gt;
    CurrentTime  As Double&lt;br /&gt;
    KillLimit As Long&lt;br /&gt;
    GameStyle As Byte&lt;br /&gt;
End Type&lt;br /&gt;
&lt;br /&gt;
Private Function parseRefreshPacket(packet() As Byte, Optional offset As Byte = 0) As RefreshPacket&lt;br /&gt;
    Dim i As Integer&lt;br /&gt;
    Dim k As Integer&lt;br /&gt;
    Dim j As Integer&lt;br /&gt;
    Dim length As Byte&lt;br /&gt;
    i = offset&lt;br /&gt;
    With parseRefreshPacket&lt;br /&gt;
        For k = 0 To 31&lt;br /&gt;
            length = packet(i)&lt;br /&gt;
            i = i + 1&lt;br /&gt;
            For j = 0 To 23&lt;br /&gt;
                .PlayerName(k) = .PlayerName(k) + Chr(packet(i))&lt;br /&gt;
                i = i + 1&lt;br /&gt;
            Next j&lt;br /&gt;
            .PlayerName(k) = Left(.PlayerName(k), length)&lt;br /&gt;
        Next k&lt;br /&gt;
        For k = 0 To 31&lt;br /&gt;
           .Team(k) = packet(i)&lt;br /&gt;
            i = i + 1&lt;br /&gt;
        Next k&lt;br /&gt;
        For k = 0 To 31&lt;br /&gt;
            .Kills(k) = packet(i) + (packet(i + 1) * 256&amp;amp;)&lt;br /&gt;
            i = i + 2&lt;br /&gt;
        Next k&lt;br /&gt;
        For k = 0 To 31&lt;br /&gt;
            .Deaths(k) = packet(i) + (packet(i + 1) * 256&amp;amp;)&lt;br /&gt;
            i = i + 2&lt;br /&gt;
        Next k&lt;br /&gt;
        For k = 0 To 31&lt;br /&gt;
            .Ping(k) = packet(i)&lt;br /&gt;
            i = i + 1&lt;br /&gt;
        Next k&lt;br /&gt;
        For k = 0 To 31&lt;br /&gt;
            .Number(k) = packet(i)&lt;br /&gt;
            i = i + 1&lt;br /&gt;
        Next k&lt;br /&gt;
        For k = 0 To 31&lt;br /&gt;
            For j = 0 To 3&lt;br /&gt;
                .IP(k, j) = packet(i)&lt;br /&gt;
                i = i + 1&lt;br /&gt;
            Next j&lt;br /&gt;
        Next k&lt;br /&gt;
        For k = 0 To 3&lt;br /&gt;
            .TeamScore(k) = packet(i) + (packet(i + 1) * 256&amp;amp;)&lt;br /&gt;
            i = i + 2&lt;br /&gt;
        Next k&lt;br /&gt;
        length = packet(i)&lt;br /&gt;
        i = i + 1&lt;br /&gt;
        For k = 0 To 15&lt;br /&gt;
            .MapName = .MapName + Chr(packet(i))&lt;br /&gt;
            i = i + 1&lt;br /&gt;
        Next k&lt;br /&gt;
        .MapName = Left(.MapName, length)&lt;br /&gt;
        For k = 0 To 3&lt;br /&gt;
            .TimeLimit = .TimeLimit + (packet(i) * (256&amp;amp; ^ k))&lt;br /&gt;
            i = i + 1&lt;br /&gt;
        Next k&lt;br /&gt;
        For k = 0 To 3&lt;br /&gt;
            .CurrentTime = .CurrentTime + (packet(i) * (256&amp;amp; ^ k))&lt;br /&gt;
            i = i + 1&lt;br /&gt;
        Next k&lt;br /&gt;
        .KillLimit = packet(i) + (packet(i + 1) * 256&amp;amp;)&lt;br /&gt;
        i = i + 2&lt;br /&gt;
        .GameStyle = packet(i)&lt;br /&gt;
    End With&lt;br /&gt;
End Function&lt;br /&gt;
&lt;br /&gt;
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)&lt;br /&gt;
    Static refresh As Boolean&lt;br /&gt;
    Dim tempstring As String&lt;br /&gt;
    Dim Buffer() As Byte&lt;br /&gt;
    dim packet as RefreshPacket&lt;br /&gt;
    Winsock1.GetData Buffer&lt;br /&gt;
    tempstring = StrConv(Buffer, vbUnicode)&lt;br /&gt;
    If Left(tempstring, 7) = &amp;quot;REFRESH&amp;quot; Then&lt;br /&gt;
        If Len(tempstring) = 9 Then&lt;br /&gt;
            refresh = True&lt;br /&gt;
        Else&lt;br /&gt;
            packet = parseRefreshPacket(Buffer, 9)&lt;br /&gt;
        End If&lt;br /&gt;
    ElseIf refresh And UBound(Buffer) = 1187 Then&lt;br /&gt;
        packet = parseRefreshPacket(Buffer)&lt;br /&gt;
        refresh = False&lt;br /&gt;
    Else&lt;br /&gt;
        Text1.Text = Text1.Text &amp;amp; tempstring&lt;br /&gt;
    End If&lt;br /&gt;
   &lt;br /&gt;
    Text1.SelStart = Len(Text1.Text)&lt;br /&gt;
    'todo: output the refresh packet data somewhere&lt;br /&gt;
End Sub&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===PHP===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
    function GetSoldatInfo(&amp;amp;$sock) {&lt;br /&gt;
        if (!$sock) return false;&lt;br /&gt;
        $info = array(&lt;br /&gt;
            'gamemode'    =&amp;gt; 0,&lt;br /&gt;
            'teammode'    =&amp;gt; false,&lt;br /&gt;
            'pointmode'    =&amp;gt; false,&lt;br /&gt;
            'players'     =&amp;gt; 0,&lt;br /&gt;
            'spectators'     =&amp;gt; 0,&lt;br /&gt;
            'map'        =&amp;gt; '',&lt;br /&gt;
            'timelimit'    =&amp;gt; 0,&lt;br /&gt;
            'currenttime'    =&amp;gt; 0,&lt;br /&gt;
            'timeleft'    =&amp;gt; 0,&lt;br /&gt;
            'limit'        =&amp;gt; 0,&lt;br /&gt;
            'player'    =&amp;gt; array(),&lt;br /&gt;
            'spectator'    =&amp;gt; array(),&lt;br /&gt;
            'team'        =&amp;gt; array()&lt;br /&gt;
        );&lt;br /&gt;
&lt;br /&gt;
        // Temporary array for players&lt;br /&gt;
        $players = array();&lt;br /&gt;
        for ($i = 0; $i &amp;lt; 32; $i++) {&lt;br /&gt;
            $players[$i] = array(&lt;br /&gt;
                'name'         =&amp;gt; '',&lt;br /&gt;
                'ip'         =&amp;gt; '',&lt;br /&gt;
                'id'         =&amp;gt; 0,&lt;br /&gt;
                'kills'        =&amp;gt; 0,&lt;br /&gt;
                'deaths'    =&amp;gt; 0,&lt;br /&gt;
                'team'        =&amp;gt; 0,&lt;br /&gt;
                'ping'        =&amp;gt; 0&lt;br /&gt;
            );&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Get player names&lt;br /&gt;
        for ($i = 0; $i &amp;lt; 32; $i++) {&lt;br /&gt;
            $data = fread($sock, 25);&lt;br /&gt;
            $len = ord($data[0]);&lt;br /&gt;
            $players[$i]['name'] = substr($data, 1, $len);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Get player teams&lt;br /&gt;
        for ($i = 0; $i &amp;lt; 32; $i++) {&lt;br /&gt;
            $data = fread($sock, 1);&lt;br /&gt;
            $players[$i]['team'] = ord($data);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Get player kills&lt;br /&gt;
        for ($i = 0; $i &amp;lt; 32; $i++) {&lt;br /&gt;
            $data = unpack(&amp;quot;v&amp;quot;, fread($sock, 2));&lt;br /&gt;
            $kills = $data[1];&lt;br /&gt;
            $players[$i]['kills'] = $kills;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Get player deaths&lt;br /&gt;
        for ($i = 0; $i &amp;lt; 32; $i++) {&lt;br /&gt;
            $data = unpack(&amp;quot;v&amp;quot;, fread($sock, 2));&lt;br /&gt;
            $deaths = $data[1];&lt;br /&gt;
            $players[$i]['deaths'] = $deaths;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Get player pings&lt;br /&gt;
        for ($i = 0; $i &amp;lt; 32; $i++) {&lt;br /&gt;
            $data = fread($sock, 1);&lt;br /&gt;
            $players[$i]['ping'] = ord($data);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Get player IDs&lt;br /&gt;
        for ($i = 0; $i &amp;lt; 32; $i++) {&lt;br /&gt;
            $data = fread($sock, 1);&lt;br /&gt;
            $players[$i]['id'] = ord($data);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Get player IPs&lt;br /&gt;
        for ($i = 0; $i &amp;lt; 32; $i++) {&lt;br /&gt;
            $data = unpack(&amp;quot;N&amp;quot;, fread($sock, 4));&lt;br /&gt;
            $players[$i]['ip'] = long2ip($data[1]);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Get team scores&lt;br /&gt;
        for ($i = 1; $i &amp;lt; 5; $i++) {&lt;br /&gt;
            $data = unpack(&amp;quot;v&amp;quot;, fread($sock, 2));&lt;br /&gt;
            $score = $data[1];&lt;br /&gt;
            $info['team'][$i] = $score;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Get map name&lt;br /&gt;
        $data = fread($sock, 17);&lt;br /&gt;
        $len = ord($data[0]);&lt;br /&gt;
        $info['map'] = substr($data, 1, $len);&lt;br /&gt;
&lt;br /&gt;
        // Get time limit &amp;amp; current time, and form timeleft&lt;br /&gt;
        $data = unpack(&amp;quot;V&amp;quot;, fread($sock, 4));&lt;br /&gt;
        $timelimit = $data[1];&lt;br /&gt;
        $info['timelimit'] = $timelimit;&lt;br /&gt;
        $data = unpack(&amp;quot;V&amp;quot;, fread($sock, 4));&lt;br /&gt;
        $currenttime = $data[1];&lt;br /&gt;
        $info['currenttime'] = $timelimit - $currenttime;&lt;br /&gt;
&lt;br /&gt;
        $timeleft = $currenttime;&lt;br /&gt;
        $temp = (floor($timeleft / 60) % 60);&lt;br /&gt;
        $info['timeleft'] = floor($timeleft / 3600) . ':' . ($temp &amp;lt; 10 ? '0' : '') . $temp;&lt;br /&gt;
&lt;br /&gt;
        // Get kill limit&lt;br /&gt;
        $data = unpack(&amp;quot;v&amp;quot;, fread($sock, 2));&lt;br /&gt;
        $limit = $data[1];&lt;br /&gt;
        $info['limit'] = $limit;&lt;br /&gt;
&lt;br /&gt;
        // Get gamestyle&lt;br /&gt;
        $data = fread($sock, 1);&lt;br /&gt;
        $gamestyle = ord($data);&lt;br /&gt;
        $info['gamemode'] = $gamestyle;&lt;br /&gt;
        if ($gamestyle == 2 || $gamestyle == 3 || $gamestyle == 5 || $gamestyle == 6) {&lt;br /&gt;
            $info['teammode'] = true;&lt;br /&gt;
            if ($gamestyle != 2) { $info['pointmode'] = true; }&lt;br /&gt;
        }&lt;br /&gt;
        if ($gamestyle != 2) {&lt;br /&gt;
            if ($gamestyle != 3 &amp;amp;&amp;amp; $gamestyle != 5) {&lt;br /&gt;
                unset($info['team'][1]);&lt;br /&gt;
                unset($info['team'][2]);&lt;br /&gt;
            }&lt;br /&gt;
            unset($info['team'][3]);&lt;br /&gt;
            unset($info['team'][4]);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        foreach ($players as $player) {&lt;br /&gt;
            if ($player['team'] &amp;lt; 5) {&lt;br /&gt;
                $info['players']++;&lt;br /&gt;
                $info['player'][] = $player;&lt;br /&gt;
            }&lt;br /&gt;
            else if ($player['team'] == 5) {&lt;br /&gt;
                $info['spectators']++;&lt;br /&gt;
                $info['spectator'][] = $player;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return $info;&lt;br /&gt;
    }&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Example Usage====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
    $s = @fsockopen(&amp;quot;localhost&amp;quot;, 23073);&lt;br /&gt;
    if ($s) {&lt;br /&gt;
        $info = array();&lt;br /&gt;
        fputs($s, &amp;quot;password\n&amp;quot;);&lt;br /&gt;
        fputs($s, &amp;quot;REFRESH\n&amp;quot;);&lt;br /&gt;
        while(1) {&lt;br /&gt;
            $data = trim(fgets($s, 1024));&lt;br /&gt;
            if (!$data) break;&lt;br /&gt;
            else if ($data == &amp;quot;REFRESH&amp;quot;) {&lt;br /&gt;
                $info = GetSoldatInfo($s);&lt;br /&gt;
                break;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        fclose($s);&lt;br /&gt;
&lt;br /&gt;
        // Make sure the REFRESH packet was received&lt;br /&gt;
        if ($info) {&lt;br /&gt;
            // You can now use the $info array to check different stuff from server, check the function for the array's elements&lt;br /&gt;
            // Remember that the gamemode value is a number, so to get the string do something like:&lt;br /&gt;
            $gamemodes = array(&lt;br /&gt;
                0 =&amp;gt; 'Deathmatch',&lt;br /&gt;
                1 =&amp;gt; 'Pointmatch',&lt;br /&gt;
                2 =&amp;gt; 'Teammatch',&lt;br /&gt;
                3 =&amp;gt; 'Capture The Flag',&lt;br /&gt;
                4 =&amp;gt; 'Rambomatch',&lt;br /&gt;
                5 =&amp;gt; 'Infiltration',&lt;br /&gt;
                6 =&amp;gt; 'Hold The Flag'&lt;br /&gt;
            );&lt;br /&gt;
            $gamemode_str = $gamemodes[$info['gamemode']];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Ruby===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
socket = TCPsocket.open(server, port)&lt;br /&gt;
socket.puts(password)&lt;br /&gt;
&lt;br /&gt;
while data=socket.gets.strip&lt;br /&gt;
  if data =~ /REFRESH/&lt;br /&gt;
    refresh = &amp;quot;&amp;quot;&lt;br /&gt;
    socket.read(1188, refresh)&lt;br /&gt;
    info = refresh.unpack(&amp;quot;CA24CA24CA24CA24CA24CA24CA24CA24CA24CA24CA24CA24CA24CA24CA24CA24CA24CA24CA24CA24CA24CA24CA24CA24CA24CA24CA24CA24CA24CA24CA24CA24C32S32S32C32C32C32C32C32C32S4CA16l2SC&amp;quot;)      names = Array.new(32, &amp;quot;&amp;quot;)&lt;br /&gt;
      teams = Array.new(32, 0)&lt;br /&gt;
      kills = Array.new(32, 0)&lt;br /&gt;
      deaths = Array.new(32, 0)&lt;br /&gt;
      pings = Array.new(32, 0)&lt;br /&gt;
      numbers = Array.new(32, 0)&lt;br /&gt;
      ips =Array.new(32, Array.new(4, 0))&lt;br /&gt;
      teamscore = Array.new(4, 0)&lt;br /&gt;
      mapname = &amp;quot;&amp;quot;&lt;br /&gt;
      timelimit = 0&lt;br /&gt;
      currenttime = 0&lt;br /&gt;
      killlimit = 0&lt;br /&gt;
      gamestyle = 0&lt;br /&gt;
      32.times do |i|&lt;br /&gt;
        names[i] = info[2*i+1].to_s[0, info[2*i]]&lt;br /&gt;
        teams[i] = info[i+64]&lt;br /&gt;
        kills[i] = info[i+96]&lt;br /&gt;
        deaths[i] = info[i+128]&lt;br /&gt;
        pings[i] = info[i+160]&lt;br /&gt;
        numbers[i] = info[i+192]&lt;br /&gt;
        4.times do |j|&lt;br /&gt;
          ips[i][j] = info[(i-1)*4+j+224]&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
      4.times do |i|&lt;br /&gt;
        teamscore[i] = info[i+352]&lt;br /&gt;
      end&lt;br /&gt;
      mapname = info[357][0,info[356]]&lt;br /&gt;
      timelimit = info[358]&lt;br /&gt;
      currenttime = info[359]&lt;br /&gt;
      killlimit = info[360]&lt;br /&gt;
      gamestyle = info[361]&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===TCL===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;tcl&amp;quot;&amp;gt;&lt;br /&gt;
proc Soldat:ParseRefresh packet {&lt;br /&gt;
    if { [string length $packet] != 1188 } {&lt;br /&gt;
        return&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    binary scan $packet &amp;quot;@800c32s32s32c32c32I32s4ca16iisc&amp;quot; teams kills deaths pings numbers ips scores map_len map timelimit timeleft limit gamemode&lt;br /&gt;
&lt;br /&gt;
    set players {}&lt;br /&gt;
    set specs {}&lt;br /&gt;
&lt;br /&gt;
    for { set i 0 } { $i &amp;lt; 32 } { incr i } {&lt;br /&gt;
        set team [lindex $teams $i]&lt;br /&gt;
        if {$team != -1} {&lt;br /&gt;
            binary scan $packet &amp;quot;@[expr $i*25]ca24&amp;quot; name_len name&lt;br /&gt;
            set ip [lindex $ips $i]&lt;br /&gt;
            set ip [join [list [expr ($ip &amp;gt;&amp;gt; 24) &amp;amp; 0xFF] [expr ($ip &amp;gt;&amp;gt; 16) &amp;amp; 0xFF] [expr ($ip &amp;gt;&amp;gt; 8) &amp;amp; 0xFF] [expr $ip &amp;amp; 0xFF]] .]&lt;br /&gt;
&lt;br /&gt;
            array set player [list id      [expr [lindex $numbers $i] &amp;amp; 0xFF] \&lt;br /&gt;
                name    [string range $name 0 [expr $name_len-1]] \&lt;br /&gt;
                team    $team \&lt;br /&gt;
                kills   [expr [lindex $kills $i] &amp;amp; 0xFFFF] \&lt;br /&gt;
                deaths  [expr [lindex $deaths $i] &amp;amp; 0xFFFF] \&lt;br /&gt;
                ping    [expr [lindex $pings $i] &amp;amp; 0xFF] \&lt;br /&gt;
                ip      $ip]&lt;br /&gt;
&lt;br /&gt;
            if {$team &amp;lt; 5} {&lt;br /&gt;
                lappend players [array get player]&lt;br /&gt;
            } else {&lt;br /&gt;
                lappend specs [array get player]&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for { set i 0 } { $i &amp;lt; 4 } { incr i } {&lt;br /&gt;
        set scores [lreplace $scores $i $i [expr [lindex $scores $i] &amp;amp; 0xFFFF]]&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    array set info [list gamemode    $gamemode \&lt;br /&gt;
        num_players [llength $players] \&lt;br /&gt;
        num_specs   [llength $specs] \&lt;br /&gt;
        map         [string range $map 0 [expr $map_len-1]] \&lt;br /&gt;
        scores      $scores \&lt;br /&gt;
        limit       $limit \&lt;br /&gt;
        timelimit   [expr $timelimit / 3600] \&lt;br /&gt;
        timeleft    [expr $timeleft / 60] \&lt;br /&gt;
        players     $players \&lt;br /&gt;
        specs       $specs]&lt;br /&gt;
&lt;br /&gt;
    return [array get info]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===D===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;D&amp;quot;&amp;gt;&lt;br /&gt;
/* This is an example usage of the refresh packet in the D programming language.&lt;br /&gt;
 * It's a _VERY_ simple client that connects and echo's server actions to the console.&lt;br /&gt;
 * The refresh packet is parsed to the &amp;quot;Server&amp;quot; struct. Use this for anything you want&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
import std.stdio;&lt;br /&gt;
import std.socket;&lt;br /&gt;
import std.socketstream;&lt;br /&gt;
import std.string;&lt;br /&gt;
import std.thread;&lt;br /&gt;
import std.c.time;&lt;br /&gt;
&lt;br /&gt;
class Soldatserver&lt;br /&gt;
{&lt;br /&gt;
  const int REFRESH_INT = 3;&lt;br /&gt;
  // Raw structure for the refresh packet&lt;br /&gt;
  align(1) struct RawRefresh&lt;br /&gt;
  {&lt;br /&gt;
    // Player's name and the length&lt;br /&gt;
    align(1) struct Playername&lt;br /&gt;
    {&lt;br /&gt;
      byte len;&lt;br /&gt;
      char[24] name;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // Player's IP&lt;br /&gt;
    align(1) union IP&lt;br /&gt;
    {&lt;br /&gt;
      uint ilong;&lt;br /&gt;
      ubyte piece[4];&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // Map and length (needed to slice)&lt;br /&gt;
    align(1) struct Map&lt;br /&gt;
    {&lt;br /&gt;
      byte len;&lt;br /&gt;
      char[16] map;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    Playername[32] name;&lt;br /&gt;
    ubyte[32] team;&lt;br /&gt;
    ushort[32] kills;&lt;br /&gt;
    ushort[32] deaths;&lt;br /&gt;
    ubyte[32] ping;&lt;br /&gt;
    ubyte[32] number;&lt;br /&gt;
    IP[32] ip;&lt;br /&gt;
    &lt;br /&gt;
    ushort teamscore[4];&lt;br /&gt;
    Map map;&lt;br /&gt;
    uint timelimit;&lt;br /&gt;
    uint currenttime;&lt;br /&gt;
    ushort killlimit;&lt;br /&gt;
    byte gamestyle;  &lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  enum Modes { Deathmatch, Pointmatch, Teammatch, CaptureTheFlag, Rambomatch, Infiltration, HoldTheFlag};&lt;br /&gt;
  enum Teams { None, Alpha, Bravo, Charlie, Delta, Spectator };&lt;br /&gt;
  enum Stats { Name, Kills, Deaths, Team, Ping, IP, ID };&lt;br /&gt;
  &lt;br /&gt;
  // Structure to replace the original raw refresh, for better usage&lt;br /&gt;
  struct Server&lt;br /&gt;
  {&lt;br /&gt;
    struct Player&lt;br /&gt;
    {&lt;br /&gt;
      char[] name;&lt;br /&gt;
      ushort kills, deaths;&lt;br /&gt;
      ubyte ping, number;&lt;br /&gt;
      ubyte[] IP;&lt;br /&gt;
      ubyte ID;&lt;br /&gt;
      ubyte team;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    Player[32] players;&lt;br /&gt;
    char[] map;&lt;br /&gt;
    ushort[4] scores;&lt;br /&gt;
    ushort killlimit;&lt;br /&gt;
    uint timelimit, currenttime;&lt;br /&gt;
    byte gamestyle;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  char[] host, pass;&lt;br /&gt;
  int port;&lt;br /&gt;
  &lt;br /&gt;
  InternetHost ih;&lt;br /&gt;
  TcpSocket sock;&lt;br /&gt;
  InternetAddress ia;&lt;br /&gt;
  SocketStream stream;&lt;br /&gt;
  Thread t;&lt;br /&gt;
  Server server;&lt;br /&gt;
  &lt;br /&gt;
  // Constructor&lt;br /&gt;
  this(char[] host_a, int port_a, char[] pass_a, bool autoConnect = true)&lt;br /&gt;
  {&lt;br /&gt;
    host = host_a;&lt;br /&gt;
    port = port_a;&lt;br /&gt;
    pass = pass_a;&lt;br /&gt;
    t = new Thread(&amp;amp;refresh); // Create the Thread but don't start it yet&lt;br /&gt;
    &lt;br /&gt;
    if (autoConnect)&lt;br /&gt;
      connect();&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  int connect()&lt;br /&gt;
  {&lt;br /&gt;
    ih = new InternetHost;&lt;br /&gt;
    &lt;br /&gt;
    // Resolve hostname&lt;br /&gt;
    if (!ih.getHostByName(host))&lt;br /&gt;
    {&lt;br /&gt;
      writefln(&amp;quot;Unable to resolve hostname for \&amp;quot;%s\&amp;quot;&amp;quot;, host);&lt;br /&gt;
      return 1;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    ia = new InternetAddress(ih.addrList[0], port);&lt;br /&gt;
    sock = new TcpSocket();&lt;br /&gt;
    &lt;br /&gt;
    writefln(&amp;quot;Connecting to %s:%d...&amp;quot;, host, port);&lt;br /&gt;
    &lt;br /&gt;
    try&lt;br /&gt;
    {&lt;br /&gt;
      sock.connect(ia); // Connect!&lt;br /&gt;
    }&lt;br /&gt;
    catch (SocketException e)&lt;br /&gt;
    {&lt;br /&gt;
      // Duh, something went horribly wrong!&lt;br /&gt;
      writefln(&amp;quot;Can't connect to %s:%d... wrong Port?&amp;quot;, host, port);&lt;br /&gt;
      writefln(&amp;quot;Socket error code: %d&amp;quot;, e.errorCode);&lt;br /&gt;
      return 1;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    stream = new SocketStream(sock); // Socket stream to read from&lt;br /&gt;
    &lt;br /&gt;
    writefln(&amp;quot;Connected!\n~~~~~~~~~~~~~~~~~~~~~~~~~&amp;quot;);&lt;br /&gt;
    &lt;br /&gt;
    sock.send(pass ~ &amp;quot;\r\n&amp;quot;); // log in&lt;br /&gt;
    mainLoop(); // Jump in the main loop&lt;br /&gt;
    &lt;br /&gt;
    return 0;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  protected:&lt;br /&gt;
    &lt;br /&gt;
  int refresh() // our refresh thread - could return a void, tho&lt;br /&gt;
  {&lt;br /&gt;
    while (true)&lt;br /&gt;
    {&lt;br /&gt;
      sock.send(&amp;quot;REFRESH\r\n&amp;quot;);&lt;br /&gt;
      sleep(REFRESH_INT);&lt;br /&gt;
    }&lt;br /&gt;
    return 0;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  void mainLoop()&lt;br /&gt;
  {&lt;br /&gt;
    char[] buffer;&lt;br /&gt;
    byte fd;&lt;br /&gt;
    t.start(); // start our thread&lt;br /&gt;
    &lt;br /&gt;
    while (!stream.eof()) // keep on truckin' till we disconnect&lt;br /&gt;
    {&lt;br /&gt;
      buffer = stream.readLine();&lt;br /&gt;
      chomp(buffer); // remove trailing \r\n&lt;br /&gt;
      &lt;br /&gt;
      if (buffer == &amp;quot;REFRESH&amp;quot;)&lt;br /&gt;
        update();&lt;br /&gt;
      else&lt;br /&gt;
        printf(&amp;quot;%s\n&amp;quot;, toStringz(buffer));&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  void update()&lt;br /&gt;
  {&lt;br /&gt;
    byte fd;&lt;br /&gt;
    &lt;br /&gt;
    RawRefresh info;&lt;br /&gt;
    stream.read(fd); // Because readLine reads the line + \r, but leaves out \n, we must catch this first&lt;br /&gt;
    stream.readBlock(&amp;amp;info, info.sizeof);&lt;br /&gt;
    &lt;br /&gt;
    server = typeof(server).init; // reset the struct&lt;br /&gt;
    &lt;br /&gt;
    server.map = info.map.map[0..info.map.len];&lt;br /&gt;
    server.killlimit = info.killlimit;&lt;br /&gt;
    server.timelimit = info.timelimit;&lt;br /&gt;
    server.currenttime = info.currenttime;&lt;br /&gt;
    server.gamestyle = info.gamestyle;&lt;br /&gt;
    &lt;br /&gt;
    server.scores[] = info.teamscore;&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; 32; i++)&lt;br /&gt;
    {&lt;br /&gt;
      if (info.team[i] != 255)&lt;br /&gt;
      {&lt;br /&gt;
        int place = info.number[i];&lt;br /&gt;
        server.players[place].name = info.name[i].name[0..info.name[i].len];&lt;br /&gt;
        server.players[place].kills = info.kills[i];&lt;br /&gt;
        server.players[place].deaths = info.deaths[i];&lt;br /&gt;
        server.players[place].ping = info.ping[i];&lt;br /&gt;
        server.players[place].ID = info.number[i];&lt;br /&gt;
        server.players[place].IP = info.ip[i].piece[];&lt;br /&gt;
        server.players[place].team = info.team[i];&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  Soldatserver ss = new Soldatserver(&amp;quot;localhost&amp;quot;, 23073, &amp;quot;yourpass&amp;quot;);&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===C#===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
        public class RefreshPacket&lt;br /&gt;
        {    &lt;br /&gt;
            public string[] PlayerName = new string[32];&lt;br /&gt;
            public byte[] Team = new byte[32];&lt;br /&gt;
            public long[] Kills = new long[32];&lt;br /&gt;
            public long[] Deaths = new long[32];&lt;br /&gt;
            public byte[] Ping = new byte[32];&lt;br /&gt;
            public byte[] Number = new byte[32];&lt;br /&gt;
            public byte[,] IP = new byte[32, 4];&lt;br /&gt;
            public long[] TeamScore = new long[4];&lt;br /&gt;
            public string MapName;&lt;br /&gt;
            public long TimeLimit;&lt;br /&gt;
            public long CurrentTime;&lt;br /&gt;
            public long KillLimit;&lt;br /&gt;
            public byte GameStyle;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        private RefreshPacket parseRefreshPacket(byte[] packet, int offset)&lt;br /&gt;
        {&lt;br /&gt;
            int i = offset;&lt;br /&gt;
            byte length;&lt;br /&gt;
            RefreshPacket tempPacket = new RefreshPacket();&lt;br /&gt;
&lt;br /&gt;
            for (int k = 0; k &amp;lt; 32; k++)&lt;br /&gt;
            {&lt;br /&gt;
                length = packet[i];&lt;br /&gt;
                i++;&lt;br /&gt;
                for (int j = 0; j &amp;lt; 24; j++)&lt;br /&gt;
                {&lt;br /&gt;
                    tempPacket.PlayerName[k] += Convert.ToChar(packet[i]);&lt;br /&gt;
                    i++;&lt;br /&gt;
                }&lt;br /&gt;
                tempPacket.PlayerName[k] = left(tempPacket.PlayerName[k], length);&lt;br /&gt;
            }&lt;br /&gt;
            for (int k = 0; k &amp;lt; 32; k++)&lt;br /&gt;
            {&lt;br /&gt;
                tempPacket.Team[k] = packet[i];&lt;br /&gt;
                i++;&lt;br /&gt;
            }&lt;br /&gt;
            for (int k = 0; k &amp;lt; 32; k++)&lt;br /&gt;
            {&lt;br /&gt;
                tempPacket.Kills[k] = packet[i] + (packet[i + 1] * 256);&lt;br /&gt;
                i += 2;&lt;br /&gt;
            }&lt;br /&gt;
            for (int k = 0; k &amp;lt; 32; k++)&lt;br /&gt;
            {&lt;br /&gt;
                tempPacket.Deaths[k] = packet[i] + (packet[i + 1] * 256);&lt;br /&gt;
                i += 2;&lt;br /&gt;
            }&lt;br /&gt;
            for (int k = 0; k &amp;lt; 32; k++)&lt;br /&gt;
            {&lt;br /&gt;
                tempPacket.Ping[k] = packet[i];&lt;br /&gt;
                i++;&lt;br /&gt;
            }&lt;br /&gt;
            for (int k = 0; k &amp;lt; 32; k++)&lt;br /&gt;
            {&lt;br /&gt;
                tempPacket.Number[k] = packet[i];&lt;br /&gt;
                i++;&lt;br /&gt;
            }&lt;br /&gt;
            for (int k = 0; k &amp;lt; 32; k++)&lt;br /&gt;
            {&lt;br /&gt;
                for (int j = 0; j &amp;lt; 4; j++)&lt;br /&gt;
                {&lt;br /&gt;
                    tempPacket.IP[k, j] = packet[i];&lt;br /&gt;
                    i++;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            for (int k = 0; k &amp;lt; 4; k++)&lt;br /&gt;
            {&lt;br /&gt;
                tempPacket.TeamScore[k] = packet[i] + (packet[i + 1] * 256);&lt;br /&gt;
                i += 2;&lt;br /&gt;
            }&lt;br /&gt;
            length = packet[i];&lt;br /&gt;
            i++;&lt;br /&gt;
            for (int k = 0; k &amp;lt; 16; k++)&lt;br /&gt;
            {&lt;br /&gt;
                tempPacket.MapName += Convert.ToChar(packet[i]);&lt;br /&gt;
                i++;&lt;br /&gt;
            }&lt;br /&gt;
            tempPacket.MapName = left(tempPacket.MapName, length);&lt;br /&gt;
            for (int k = 0; k &amp;lt; 4; k++)&lt;br /&gt;
            {&lt;br /&gt;
                //You can use getTime() to return the time limit as a string in &amp;quot;MM:SS&amp;quot; format.&lt;br /&gt;
                tempPacket.TimeLimit += Convert.ToInt64(packet[i] * (Math.Pow(256, k)));&lt;br /&gt;
                i++;&lt;br /&gt;
            }&lt;br /&gt;
            for (int k = 0; k &amp;lt; 4; k++)&lt;br /&gt;
            {&lt;br /&gt;
                //You can use getTime() to return the time left as a string in &amp;quot;MM:SS&amp;quot; format.&lt;br /&gt;
                tempPacket.CurrentTime += Convert.ToInt64(packet[i] * (Math.Pow(256, k)));&lt;br /&gt;
                i++;&lt;br /&gt;
            }&lt;br /&gt;
            tempPacket.KillLimit = packet[i] + (packet[i + 1] * 256);&lt;br /&gt;
            i += 2;&lt;br /&gt;
            tempPacket.GameStyle = packet[i];&lt;br /&gt;
           &lt;br /&gt;
            &lt;br /&gt;
            return tempPacket;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        private string left(string word, int x)&lt;br /&gt;
        {&lt;br /&gt;
            if (x &amp;lt;= word.Length)&lt;br /&gt;
                word = word.Remove(x);&lt;br /&gt;
            return word;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        private string getTime(long ticks)&lt;br /&gt;
        {&lt;br /&gt;
            string time;&lt;br /&gt;
            time = getMinutes(ticks) + ':' + getSeconds(ticks);&lt;br /&gt;
            return time;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        private string getMinutes(long ticks)&lt;br /&gt;
        {&lt;br /&gt;
            int x;&lt;br /&gt;
            string minutes;&lt;br /&gt;
            x = ((Convert.ToInt32(ticks) / 60) / 60);&lt;br /&gt;
            minutes = Convert.ToString(x);&lt;br /&gt;
            return minutes;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        private string getSeconds(long ticks)&lt;br /&gt;
        {&lt;br /&gt;
            int x;&lt;br /&gt;
            string seconds;&lt;br /&gt;
            x = ((Convert.ToInt32(ticks) / 60) % 60);&lt;br /&gt;
            seconds = Convert.ToString(x);&lt;br /&gt;
            if (seconds.Length == 1)&lt;br /&gt;
                seconds = '0' + seconds;&lt;br /&gt;
            return seconds;&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Haskell===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;haskell&amp;quot;&amp;gt;&lt;br /&gt;
module Main where&lt;br /&gt;
&lt;br /&gt;
{-&lt;br /&gt;
 - As with almost every code ever written in Haskell, this can surely be cut down to&lt;br /&gt;
 - less than half of it's current size, but for demonstration purpose I'll leave it &lt;br /&gt;
 - as is :)&lt;br /&gt;
 - &lt;br /&gt;
 - The Data.Binary module is not part of the current GHC distribution (GHC 6.10.3).&lt;br /&gt;
 - However, it's in the HackageDB on Haskell.org:&lt;br /&gt;
 - http://hackage.haskell.org/package/binary-0.5.0.1&lt;br /&gt;
 -}&lt;br /&gt;
&lt;br /&gt;
import System.IO&lt;br /&gt;
import Control.Exception&lt;br /&gt;
import Control.Monad&lt;br /&gt;
import qualified Data.ByteString.Lazy.Char8 as B8&lt;br /&gt;
import Data.Binary.Get -- Sadly not part of the standart GHC distribution, see above&lt;br /&gt;
import Data.Word&lt;br /&gt;
import Data.List&lt;br /&gt;
import Network&lt;br /&gt;
&lt;br /&gt;
-- Hardcoded login data&lt;br /&gt;
serverHost = &amp;quot;localhost&amp;quot;&lt;br /&gt;
serverPort = 23073&lt;br /&gt;
serverPass = &amp;quot;lol&amp;quot;&lt;br /&gt;
&lt;br /&gt;
-- A team&lt;br /&gt;
data Team = None | Alpha | Bravo | Charlie | Delta | Spectator&lt;br /&gt;
          deriving (Show, Read, Eq, Ord)&lt;br /&gt;
&lt;br /&gt;
-- Gamestyles&lt;br /&gt;
data GameStyle = Deathmatch | Pointmatch | Teammatch | CaptureTheFlag | Rambomatch  | Infiltration | HoldTheFlag&lt;br /&gt;
               deriving (Show, Read, Eq, Ord)&lt;br /&gt;
&lt;br /&gt;
-- A single player&lt;br /&gt;
data Player = Player { nick   :: String,&lt;br /&gt;
                       kills  :: Int,&lt;br /&gt;
                       deaths :: Int,&lt;br /&gt;
                       team   :: Team,&lt;br /&gt;
                       id     :: Word8,&lt;br /&gt;
                       ping   :: Word8,&lt;br /&gt;
                       ip     :: [Word8] }&lt;br /&gt;
            deriving (Show, Read, Eq, Ord)&lt;br /&gt;
&lt;br /&gt;
-- Everything combined into functional awesomeness&lt;br /&gt;
data Server = Server { currentMap  :: String,&lt;br /&gt;
                       gameStyle   :: GameStyle,&lt;br /&gt;
                       players     :: [Player],&lt;br /&gt;
                       teamScores  :: [Int],&lt;br /&gt;
                       killLimit   :: Int,&lt;br /&gt;
                       timeLimit   :: Int,&lt;br /&gt;
                       currentTime :: Int }&lt;br /&gt;
            deriving (Show, Read, Eq, Ord)&lt;br /&gt;
            &lt;br /&gt;
main :: IO ()&lt;br /&gt;
main = withSocketsDo $ do -- withSocketsDo initializes Winsock for Windows but is completly harmless for Unix&lt;br /&gt;
   state &amp;lt;- connect serverHost serverPort serverPass -- Using the Maybe type, did we succeed in connecting?&lt;br /&gt;
   case state of&lt;br /&gt;
      Just handle -&amp;gt; refresh handle &amp;gt;&amp;gt; disconnect handle -- Yes, refresh and disconnect&lt;br /&gt;
      Nothing     -&amp;gt; putStrLn $ &amp;quot;Could not connect to the server. Please check\n&amp;quot; ++ -- Bawww!&lt;br /&gt;
                                &amp;quot;your connection details and the password.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
connect :: String -&amp;gt; Int -&amp;gt; String -&amp;gt; IO (Maybe Handle)&lt;br /&gt;
connect host port pass = do&lt;br /&gt;
   h &amp;lt;- try $ connectTo host (PortNumber $ fromIntegral port) :: IO (Either IOException Handle) -- try connecting&lt;br /&gt;
   case h of&lt;br /&gt;
      Left e       -&amp;gt; return Nothing -- Fail&lt;br /&gt;
      Right handle -&amp;gt; do&lt;br /&gt;
         hSetBuffering handle NoBuffering -- Disable buffering&lt;br /&gt;
         f &amp;lt;- hGetLine handle             -- Server greeting us?&lt;br /&gt;
         if f == &amp;quot;Soldat Admin Connection Established.\r&amp;quot; -- Yep.&lt;br /&gt;
            then do &lt;br /&gt;
               hPutStrLn handle pass -- Send the password&lt;br /&gt;
               result &amp;lt;- hGetLine handle -- check the result&lt;br /&gt;
               if result == &amp;quot;Welcome, you are in command of the server now.\r&amp;quot; &lt;br /&gt;
                  then do replicateM_ 2 (hGetLine handle) -- Yay, we'Re in. Get rid of those 2 lines telling us what to do&lt;br /&gt;
                          return $ Just handle -- return the handle into the IO Monad and stop evaluating&lt;br /&gt;
                  else return Nothing -- Fail again&lt;br /&gt;
            else return Nothing -- Triple Fail&lt;br /&gt;
&lt;br /&gt;
disconnect :: Handle -&amp;gt; IO ()&lt;br /&gt;
disconnect handle = hClose handle -- Cut the wire&lt;br /&gt;
&lt;br /&gt;
refresh :: Handle -&amp;gt; IO ()&lt;br /&gt;
refresh handle = do &lt;br /&gt;
   hPutStrLn handle &amp;quot;REFRESH&amp;quot; -- REFRESH!&lt;br /&gt;
   result &amp;lt;- hGetLine handle  -- Refresh?&lt;br /&gt;
   &lt;br /&gt;
   if result == &amp;quot;REFRESH\r&amp;quot;&lt;br /&gt;
      then do refreshData &amp;lt;- B8.hGet handle 1188 -- REFRESH! Get it!&lt;br /&gt;
              print $ runGet readServerInfo refreshData -- Parse it! Print it!&lt;br /&gt;
      else return () -- Fail :(&lt;br /&gt;
&lt;br /&gt;
readServerInfo :: Get Server&lt;br /&gt;
readServerInfo = do&lt;br /&gt;
   names       &amp;lt;- replicateM 32 $ parseOneString 24 -- list of names&lt;br /&gt;
   teams       &amp;lt;- replicateM 32 getWord8            -- list of teams&lt;br /&gt;
   kills       &amp;lt;- replicateM 32 getWord16le         -- list of kills&lt;br /&gt;
   deaths      &amp;lt;- replicateM 32 getWord16le         -- list of deaths...&lt;br /&gt;
   pings       &amp;lt;- replicateM 32 getWord8            -- pings of lists&lt;br /&gt;
   ids         &amp;lt;- replicateM 32 getWord8            -- of ids list&lt;br /&gt;
   ips         &amp;lt;- replicateM 32 parseOneIP          -- IPS!&lt;br /&gt;
   teamscores  &amp;lt;- replicateM 4 getWord16le          -- team scores..&lt;br /&gt;
   mapname     &amp;lt;- parseOneString 16                 -- Zeh map&lt;br /&gt;
   timelimit   &amp;lt;- getWord32le                       -- time limit&lt;br /&gt;
   currenttime &amp;lt;- getWord32le                       -- time again, just not limit&lt;br /&gt;
   killlimit   &amp;lt;- getWord16le                       -- kills limit&lt;br /&gt;
   gamestyle   &amp;lt;- getWord8                          -- gamestyle!&lt;br /&gt;
   &lt;br /&gt;
   -- Because the name is the only reliable source that can not be 0 or empty for a valid player,&lt;br /&gt;
   -- we're using it to count how many players we have&lt;br /&gt;
   let numPlayers = length $ filter (not . B8.null) names&lt;br /&gt;
   -- Turn it into a list am BAM!&lt;br /&gt;
   let players = take numPlayers $ zipWith7 zipPlayers names teams kills deaths pings ids ips&lt;br /&gt;
   &lt;br /&gt;
   -- Return all that junk&lt;br /&gt;
   return Server { currentMap  = B8.unpack mapname,&lt;br /&gt;
                   gameStyle   = numToGamestyle gamestyle,&lt;br /&gt;
                   players     = players,&lt;br /&gt;
                   teamScores  = map fromIntegral teamscores,&lt;br /&gt;
                   killLimit   = fromIntegral killlimit,&lt;br /&gt;
                   timeLimit   = fromIntegral timelimit,&lt;br /&gt;
                   currentTime = fromIntegral currenttime }&lt;br /&gt;
                   &lt;br /&gt;
   -- I don't feel like commenting more :(&lt;br /&gt;
   -- Straight forward if you know a bit of Haskell.&lt;br /&gt;
 where zipPlayers n t k d p di pi = &lt;br /&gt;
          Player { nick    = B8.unpack n,&lt;br /&gt;
                   kills   = fromIntegral k,&lt;br /&gt;
                   deaths  = fromIntegral d,&lt;br /&gt;
                   team    = numToTeam t,&lt;br /&gt;
                   Main.id = di,&lt;br /&gt;
                   ping    = p,&lt;br /&gt;
                   ip      = pi }&lt;br /&gt;
                   &lt;br /&gt;
       parseOneString n = do &lt;br /&gt;
          len &amp;lt;- fmap fromIntegral getWord8&lt;br /&gt;
          str &amp;lt;- getLazyByteString n&lt;br /&gt;
          return $ B8.take len str&lt;br /&gt;
          &lt;br /&gt;
       parseOneIP = replicateM 4 getWord8&lt;br /&gt;
       &lt;br /&gt;
       numToGamestyle n = case n of&lt;br /&gt;
          0 -&amp;gt; Deathmatch&lt;br /&gt;
          1 -&amp;gt; Pointmatch&lt;br /&gt;
          2 -&amp;gt; Teammatch&lt;br /&gt;
          3 -&amp;gt; CaptureTheFlag&lt;br /&gt;
          4 -&amp;gt; Rambomatch&lt;br /&gt;
          5 -&amp;gt; Infiltration&lt;br /&gt;
          6 -&amp;gt; HoldTheFlag&lt;br /&gt;
          &lt;br /&gt;
       numToTeam n = case n of&lt;br /&gt;
          0 -&amp;gt; None&lt;br /&gt;
          1 -&amp;gt; Alpha&lt;br /&gt;
          2 -&amp;gt; Bravo&lt;br /&gt;
          3 -&amp;gt; Charlie&lt;br /&gt;
          4 -&amp;gt; Delta&lt;br /&gt;
          5 -&amp;gt; Spectator&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Perl===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/perl&lt;br /&gt;
&lt;br /&gt;
# Since it's perl it can most likely be reduced to half its current size, but I'll &lt;br /&gt;
# leave it verbose and heavily commented since I know most of you hate perl and the least I can do is explain how it works. &lt;br /&gt;
# By jrgp - 4/22/2011&lt;br /&gt;
&lt;br /&gt;
use strict;&lt;br /&gt;
use IO::Socket; &lt;br /&gt;
use Socket;&lt;br /&gt;
&lt;br /&gt;
# Kill output buffering for the shell output&lt;br /&gt;
BEGIN { $| = 1 }&lt;br /&gt;
&lt;br /&gt;
# Holders for our stuff&lt;br /&gt;
my @players;&lt;br /&gt;
my $server_info = {};&lt;br /&gt;
my $server_version;&lt;br /&gt;
my $have_version = 0;&lt;br /&gt;
my @team_names = qw(None Alpha Bravo Charlie Delta Spectator);&lt;br /&gt;
my @mode_names = qw(DM PM TM CTF RM INF HTF);&lt;br /&gt;
&lt;br /&gt;
# &amp;quot;Feed me a stray kitten!&amp;quot;&lt;br /&gt;
sub parse_refresh {&lt;br /&gt;
	my $handle = shift;&lt;br /&gt;
	my ($i, $sbuff, $len, $buff);&lt;br /&gt;
&lt;br /&gt;
	# Get player names&lt;br /&gt;
	for ($i = 0; $i &amp;lt; 32; $i++) {&lt;br /&gt;
&lt;br /&gt;
		# Get length of name&lt;br /&gt;
		recv($handle, $sbuff, 1, '');&lt;br /&gt;
		$len = unpack('W', $sbuff);&lt;br /&gt;
&lt;br /&gt;
		# Get name using length&lt;br /&gt;
		recv($handle, $buff, $len, '');&lt;br /&gt;
&lt;br /&gt;
		# Skip filler&lt;br /&gt;
		recv($handle, $sbuff, 24 - $len, '');&lt;br /&gt;
		&lt;br /&gt;
		# Start player reference&lt;br /&gt;
		$players[$i] = {};&lt;br /&gt;
&lt;br /&gt;
		# Save name&lt;br /&gt;
		$players[$i]-&amp;gt;{'name'} = $buff;&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	# Get player teams&lt;br /&gt;
	for ($i = 0; $i &amp;lt; 32; $i++) {&lt;br /&gt;
		recv($handle, $sbuff, 1, '');&lt;br /&gt;
		$players[$i]-&amp;gt;{'team'} = unpack('W', $sbuff);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	# Get player kills&lt;br /&gt;
	for ($i = 0; $i &amp;lt; 32; $i++) {&lt;br /&gt;
		recv($handle, $sbuff, 2, '');&lt;br /&gt;
		$players[$i]-&amp;gt;{'kills'} = unpack('S', $sbuff);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	# Get player deaths&lt;br /&gt;
	for ($i = 0; $i &amp;lt; 32; $i++) {&lt;br /&gt;
		recv($handle, $sbuff, 2, '');&lt;br /&gt;
		$players[$i]-&amp;gt;{'deaths'} = unpack('S', $sbuff);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	# Get player pings&lt;br /&gt;
	for ($i = 0; $i &amp;lt; 32; $i++) {&lt;br /&gt;
		recv($handle, $sbuff, 1, '');&lt;br /&gt;
		$players[$i]-&amp;gt;{'ping'} = unpack('C', $sbuff);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	# Get player IDs&lt;br /&gt;
	for ($i = 0; $i &amp;lt; 32; $i++) {&lt;br /&gt;
		recv($handle, $sbuff, 1, '');&lt;br /&gt;
		$players[$i]-&amp;gt;{'id'} = unpack('C', $sbuff);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	# Get player IPs&lt;br /&gt;
	for ($i = 0; $i &amp;lt; 32; $i++) {&lt;br /&gt;
		recv($handle, $sbuff, 4, '');&lt;br /&gt;
		$players[$i]-&amp;gt;{'ip'} = join('.', unpack('CCCC', $sbuff));&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	# red team score&lt;br /&gt;
	recv($handle, $sbuff, 2, '');&lt;br /&gt;
	$server_info-&amp;gt;{'score_alpha'} = unpack('S', $sbuff);&lt;br /&gt;
&lt;br /&gt;
	# blue team score&lt;br /&gt;
	recv($handle, $sbuff, 2, '');&lt;br /&gt;
	$server_info-&amp;gt;{'score_bravo'} = unpack('S', $sbuff);&lt;br /&gt;
&lt;br /&gt;
	# charlie score&lt;br /&gt;
	recv($handle, $sbuff, 2, '');&lt;br /&gt;
	$server_info-&amp;gt;{'score_charlie'} = unpack('S', $sbuff);&lt;br /&gt;
&lt;br /&gt;
	# delta score&lt;br /&gt;
	recv($handle, $sbuff, 2, '');&lt;br /&gt;
	$server_info-&amp;gt;{'score_delta'} = unpack('S', $sbuff);&lt;br /&gt;
	&lt;br /&gt;
	# map name len&lt;br /&gt;
	recv($handle, $sbuff, 1, '');&lt;br /&gt;
	$len  = unpack('W', $sbuff);&lt;br /&gt;
	recv($handle, $buff, $len, '');&lt;br /&gt;
	$server_info-&amp;gt;{'map'} = $buff;&lt;br /&gt;
	recv($handle, $sbuff, 16 - $len, '');&lt;br /&gt;
&lt;br /&gt;
	# Time limit&lt;br /&gt;
	recv($handle, $sbuff, 4, '');&lt;br /&gt;
	$server_info-&amp;gt;{'time_limit'} = unpack('L', $sbuff);&lt;br /&gt;
	recv($handle, $sbuff, 4, '');&lt;br /&gt;
	$server_info-&amp;gt;{'current_time'} = unpack('L', $sbuff);&lt;br /&gt;
	&lt;br /&gt;
	# Kill limit&lt;br /&gt;
	recv($handle, $sbuff, 2, '');&lt;br /&gt;
	$server_info-&amp;gt;{'kill_limit'} = unpack('S', $sbuff);&lt;br /&gt;
&lt;br /&gt;
	# Mode&lt;br /&gt;
	recv($handle, $sbuff, 1, '');&lt;br /&gt;
	$server_info-&amp;gt;{'game_mode'} = $mode_names[unpack('W', $sbuff)];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
my ($line, $buff);&lt;br /&gt;
&lt;br /&gt;
# Connect&lt;br /&gt;
my $sock = new IO::Socket::INET (&lt;br /&gt;
	PeerAddr =&amp;gt; 'server',&lt;br /&gt;
	PeerPort =&amp;gt; '69',&lt;br /&gt;
	Proto =&amp;gt; 'tcp')&lt;br /&gt;
|| die &amp;quot;Couldn't connect&amp;quot;; &lt;br /&gt;
&lt;br /&gt;
# Login &lt;br /&gt;
print $sock &amp;quot;myPW\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
# Request&lt;br /&gt;
print $sock &amp;quot;REFRESH\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
# One char at a time since perl doesn't have fgets or something&lt;br /&gt;
while (recv($sock, $buff, 1, '') eq '') {&lt;br /&gt;
&lt;br /&gt;
	# Reached the end of a line?&lt;br /&gt;
	if ($buff eq &amp;quot;\n&amp;quot;) {&lt;br /&gt;
&lt;br /&gt;
		# The goods?&lt;br /&gt;
		if ($line eq &amp;quot;REFRESH\r&amp;quot;) {&lt;br /&gt;
			parse_refresh($sock);&lt;br /&gt;
			last;	# Only want it once for now&lt;br /&gt;
		}&lt;br /&gt;
		elsif ($have_version == 0 &amp;amp;&amp;amp; $line =~ m/^Server Version: ([0-9\.]+)/){&lt;br /&gt;
			$have_version = 1;&lt;br /&gt;
			$server_version = $1;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		# Kill line buffer&lt;br /&gt;
		$line = &amp;quot;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	# No; append to current line buffer&lt;br /&gt;
	else {&lt;br /&gt;
		$line .= $buff;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Kill socket handle&lt;br /&gt;
close $sock;&lt;br /&gt;
&lt;br /&gt;
# Debug shiz&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
print &amp;quot;Version: $server_version\n&amp;quot;;&lt;br /&gt;
print &amp;quot;Map: &amp;quot;.$server_info-&amp;gt;{'map'}.&amp;quot;\n\n&amp;quot;;&lt;br /&gt;
print &amp;quot;Mode: &amp;quot;.$server_info-&amp;gt;{'game_mode'}.&amp;quot;\n\n&amp;quot;;&lt;br /&gt;
print &amp;quot;Alpha Score: &amp;quot;.$server_info-&amp;gt;{'score_alpha'}.&amp;quot;\n&amp;quot;;&lt;br /&gt;
print &amp;quot;Bravo Score: &amp;quot;.$server_info-&amp;gt;{'score_bravo'}.&amp;quot;\n\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
print &amp;quot;Players:\n&amp;quot;;&lt;br /&gt;
foreach my $player (@players) {&lt;br /&gt;
&lt;br /&gt;
	# Skip empty player slots&lt;br /&gt;
	next if ($player-&amp;gt;{'name'} eq '');&lt;br /&gt;
&lt;br /&gt;
	print &lt;br /&gt;
		&amp;quot;Player ID &amp;quot;.$player-&amp;gt;{'id'}.&amp;quot; (T: &amp;quot;.&lt;br /&gt;
		$team_names[$player-&amp;gt;{'team'}].&lt;br /&gt;
		&amp;quot; K: &amp;quot;.$player-&amp;gt;{'kills'}.&amp;quot; D: &amp;quot;.&lt;br /&gt;
		$player-&amp;gt;{'deaths'}.&amp;quot; C: &amp;quot;.&lt;br /&gt;
		$player-&amp;gt;{'caps'}.&amp;quot; P:&amp;quot;.$player-&amp;gt;{'ping'}.&amp;quot; &amp;quot;.&lt;br /&gt;
		&amp;quot;IP: &amp;quot;.$player-&amp;gt;{'ip'}.&lt;br /&gt;
		&amp;quot;): &amp;quot;.$player-&amp;gt;{'name'};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	print &amp;quot;\n&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Python===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/python&lt;br /&gt;
&lt;br /&gt;
# jrgp - 9/1/2013&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
import socket&lt;br /&gt;
import re&lt;br /&gt;
from struct import unpack&lt;br /&gt;
&lt;br /&gt;
def refreshParse(sock):&lt;br /&gt;
&lt;br /&gt;
    print 'parsing'&lt;br /&gt;
&lt;br /&gt;
    players = {}&lt;br /&gt;
    info = {}&lt;br /&gt;
    &lt;br /&gt;
    for i in range(0, 32):&lt;br /&gt;
        players[i] = {}&lt;br /&gt;
        nameLength = unpack('B', sock.recv(1))[0]&lt;br /&gt;
        players[i]['name'] = sock.recv(nameLength)&lt;br /&gt;
        sock.recv(24 - nameLength)&lt;br /&gt;
&lt;br /&gt;
    for i in range(0, 32):&lt;br /&gt;
        players[i]['team'] = unpack('B', sock.recv(1))[0]&lt;br /&gt;
&lt;br /&gt;
    for i in range(0, 32):&lt;br /&gt;
        players[i]['kills'] = unpack('H', sock.recv(2))[0]&lt;br /&gt;
&lt;br /&gt;
    for i in range(0, 32):&lt;br /&gt;
        players[i]['deaths'] = unpack('H', sock.recv(2))[0]&lt;br /&gt;
&lt;br /&gt;
    for i in range(0, 32):&lt;br /&gt;
        players[i]['ping'] = unpack('B', sock.recv(1))[0]&lt;br /&gt;
&lt;br /&gt;
    for i in range(0, 32):&lt;br /&gt;
        players[i]['id'] = unpack('B', sock.recv(1))[0]&lt;br /&gt;
&lt;br /&gt;
    for i in range(0, 32):&lt;br /&gt;
        players[i]['ip'] = '.'.join([str(v) for v in unpack('BBBB', sock.recv(4))])&lt;br /&gt;
&lt;br /&gt;
    info['score'] = {&lt;br /&gt;
        'alpha': unpack('H', sock.recv(2))[0],&lt;br /&gt;
        'bravo': unpack('H', sock.recv(2))[0],&lt;br /&gt;
        'charlie': unpack('H', sock.recv(2))[0],&lt;br /&gt;
        'delta': unpack('H', sock.recv(2))[0],&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    mapLength = unpack('B', sock.recv(1))[0]&lt;br /&gt;
    info['map'] = sock.recv(mapLength)&lt;br /&gt;
    sock.recv(16 - mapLength)&lt;br /&gt;
&lt;br /&gt;
    info['timeLimit'] = unpack('i', sock.recv(4))[0]&lt;br /&gt;
    info['currentTime'] = unpack('i', sock.recv(4))[0]&lt;br /&gt;
    info['killLimit'] = unpack('H', sock.recv(2))[0]&lt;br /&gt;
    info['mode'] = unpack('B', sock.recv(1))[0]&lt;br /&gt;
&lt;br /&gt;
    print 'players: %s' % [v for k, v in players.iteritems() if v['name'] != '']&lt;br /&gt;
    print 'info: %s' % info&lt;br /&gt;
&lt;br /&gt;
    info['players'] = players&lt;br /&gt;
    return info&lt;br /&gt;
&lt;br /&gt;
pw = 'niggabit.com'&lt;br /&gt;
ip = 'localhost'&lt;br /&gt;
port = 23073&lt;br /&gt;
&lt;br /&gt;
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)&lt;br /&gt;
s.connect((ip, port))&lt;br /&gt;
&lt;br /&gt;
buf = ''&lt;br /&gt;
&lt;br /&gt;
while True:&lt;br /&gt;
    try:&lt;br /&gt;
        data = s.recv(1)&lt;br /&gt;
    except Exception as e:&lt;br /&gt;
        break&lt;br /&gt;
&lt;br /&gt;
    if not data:&lt;br /&gt;
        break&lt;br /&gt;
&lt;br /&gt;
    buf = buf + data&lt;br /&gt;
&lt;br /&gt;
    if re.search('\r?\n$', buf):&lt;br /&gt;
        if buf == 'Soldat Admin Connection Established.\r\n':&lt;br /&gt;
            print 'connected'&lt;br /&gt;
            s.send('%s\n' % pw)&lt;br /&gt;
        elif buf == 'Welcome, you are in command of the server now.\r\n':&lt;br /&gt;
            print 'authed'&lt;br /&gt;
            s.send('REFRESH\n')&lt;br /&gt;
        elif buf == 'REFRESH\r\n':&lt;br /&gt;
            print 'refresh packet inbound'&lt;br /&gt;
            refreshParse(s)&lt;br /&gt;
        else:&lt;br /&gt;
            print buf&lt;br /&gt;
&lt;br /&gt;
        buf = ''&lt;br /&gt;
&lt;br /&gt;
s.close()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Refreshx|REFRESHX]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Server]]&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
* [http://www.soldatforums.com/index.php?topic=212.0 Soldatforums REFRESH thread]&lt;/div&gt;</summary>
		<author><name>Jrgp</name></author>	</entry>

	</feed>