Applied fixes from StyleCI

This commit is contained in:
shavit 2016-06-03 10:56:19 -04:00 committed by StyleCI Bot
parent 1943c57205
commit 472d8f2da2
4 changed files with 651 additions and 624 deletions

View File

@ -1,46 +1,46 @@
<?php
// ip address to the mysql server
define("DB_HOST", "localhost");
define('DB_HOST', 'localhost');
// mysql username
define("DB_USER", "root");
define('DB_USER', 'root');
// mysql password
define("DB_PASSWORD", "");
define('DB_PASSWORD', '');
// mysql database (schema) name
define("DB_SCHEMA", "shavit");
define('DB_SCHEMA', 'shavit');
// amount of records that can be displayed
define("RECORD_LIMIT", "100");
define('RECORD_LIMIT', '100');
// the page's title as seen in the homepage
define("HOMEPAGE_TITLE", "shavit's bhoptimer");
define('HOMEPAGE_TITLE', "shavit's bhoptimer");
// title for the top left side of the screen
define("TOPLEFT_TITLE", "bhoptimer");
define('TOPLEFT_TITLE', 'bhoptimer');
// mysql table prefix, leave empty unless changed in the server
define("MYSQL_PREFIX", "");
define('MYSQL_PREFIX', '');
// header title
define("HEADER_TITLE", "Welcome!");
define('HEADER_TITLE', 'Welcome!');
// page styling
define("PAGE_STYLE", "0"); // 0 - Default | 1 - Red/Black
define('PAGE_STYLE', '0'); // 0 - Default | 1 - Red/Black
// setup multi styles here
$styles = array(
"Forwards", // 0
"Sideways", // 1
"W-Only", // 2
"Scroll", // 3
"400 Velocity", // 4
"Half-Sideways" // 5
);
$styles = [
'Forwards', // 0
'Sideways', // 1
'W-Only', // 2
'Scroll', // 3
'400 Velocity', // 4
'Half-Sideways', // 5
];
define("DEFAULT_STYLE", 0); // 0 - forwards
define('DEFAULT_STYLE', 0); // 0 - forwards
// amount of records that can be displayed in 'latest records'
define("RECORD_LIMIT_LATEST", "10");
?>
define('RECORD_LIMIT_LATEST', '10');

View File

@ -1,89 +1,67 @@
<?php
function formattoseconds($time)
{
$iTemp = floor($time);
$iTemp = floor($time);
$iHours = 0;
$iHours = 0;
if($iTemp > 3600)
{
$iHours = floor($iTemp / 3600.0);
$iTemp %= 3600;
}
if ($iTemp > 3600) {
$iHours = floor($iTemp / 3600.0);
$iTemp %= 3600;
}
$sHours = "";
$sHours = '';
if($iHours < 10)
{
$sHours = "0" . $iHours;
}
if ($iHours < 10) {
$sHours = '0'.$iHours;
} else {
$sHours = $iHours;
}
else
{
$sHours = $iHours;
}
$iMinutes = 0;
$iMinutes = 0;
if ($iTemp >= 60) {
$iMinutes = floor($iTemp / 60.0);
$iTemp %= 60;
}
if($iTemp >= 60)
{
$iMinutes = floor($iTemp / 60.0);
$iTemp %= 60;
}
$sMinutes = '';
$sMinutes = "";
if ($iMinutes < 10) {
$sMinutes = '0'.$iMinutes;
} else {
$sMinutes = $iMinutes;
}
if($iMinutes < 10)
{
$sMinutes = "0" . $iMinutes;
}
$fSeconds = (($iTemp) + $time - floor($time));
else
{
$sMinutes = $iMinutes;
}
$sSeconds = '';
$fSeconds = (($iTemp) + $time - floor($time));
if ($fSeconds < 10) {
$sSeconds = '0'.number_format($fSeconds, 3);
} else {
$sSeconds = number_format($fSeconds, 3);
}
$sSeconds = "";
if ($iHours > 0) {
$newtime = $sHours.':'.$sMinutes.':'.$sSeconds.'s';
} elseif ($iMinutes > 0) {
$newtime = $sMinutes.':'.$sSeconds.'s';
} else {
$newtime = number_format($fSeconds, 3).'s';
}
if($fSeconds < 10)
{
$sSeconds = "0" . number_format($fSeconds, 3);
}
else
{
$sSeconds = number_format($fSeconds, 3);
}
if($iHours > 0)
{
$newtime = $sHours . ":" . $sMinutes . ":" . $sSeconds . "s";
}
else if($iMinutes > 0)
{
$newtime = $sMinutes . ":" . $sSeconds . "s";
}
else
{
$newtime = number_format($fSeconds, 3) . "s";
}
return $newtime;
return $newtime;
}
function removeworkshop($mapname)
{
if(strpos($mapname, "workshop/") !== false)
{
$pieces = explode("/", $mapname);
if (strpos($mapname, 'workshop/') !== false) {
$pieces = explode('/', $mapname);
return $pieces[2];
}
return $pieces[2];
}
return $mapname;
return $mapname;
}
?>

View File

@ -1,26 +1,24 @@
<?php
require("config.php");
require("functions.php");
require("steamid.php");
require 'config.php';
require 'functions.php';
require 'steamid.php';
$connection = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_SCHEMA);
$connection->set_charset("utf8");
$connection->set_charset('utf8');
$style = 0;
if(isset($_REQUEST["style"]))
{
$style = $_REQUEST["style"];
if (isset($_REQUEST['style'])) {
$style = $_REQUEST['style'];
}
$map = "";
$map = '';
if(isset($_REQUEST["map"]))
{
$map = $_REQUEST["map"];
if (isset($_REQUEST['map'])) {
$map = $_REQUEST['map'];
}
$rr = isset($_REQUEST["rr"]);
$rr = isset($_REQUEST['rr']);
?>
<!DOCTYPE html>
@ -35,15 +33,11 @@ $rr = isset($_REQUEST["rr"]);
<link href="assets/icons/favicon.ico" rel="icon" type="image/x-icon" />
<?php
if(!$map)
{
echo("<title>" . HOMEPAGE_TITLE . "</title>");
}
else
{
echo("<title>".removeworkshop($_GET["map"])."</title>");
} ?>
if (!$map) {
echo '<title>'.HOMEPAGE_TITLE.'</title>';
} else {
echo '<title>'.removeworkshop($_GET['map']).'</title>';
} ?>
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
<!--[if lt IE 9]>
@ -89,7 +83,7 @@ $rr = isset($_REQUEST["rr"]);
<nav class="navbar navbar-inverse navbar-fixed-top">
<div class="container">
<div class="navbar-header">
<a class="navbar-brand" href="index.php"><?php echo("<i class=\"fa fa-clock-o\"></i> ".TOPLEFT_TITLE); ?></a>
<a class="navbar-brand" href="index.php"><?php echo '<i class="fa fa-clock-o"></i> '.TOPLEFT_TITLE; ?></a>
<a class="navbar-brand" href="index.php?rr=1">Recent Records</a>
</div>
<div id="navbar" class="navbar-collapse collapse">
@ -97,9 +91,14 @@ $rr = isset($_REQUEST["rr"]);
<div class="form-group">
<select name="style" class="form-control">
<?php
for($i = 0; $i < count($styles); $i++)
{
?> <option value="<?php echo($i); ?>" <?php if($i == DEFAULT_STYLE || $style == $i) echo("selected=\"selected\""); ?>><?php echo($styles[$i]); ?></option> <?php
for ($i = 0; $i < count($styles); $i++) {
?> <option value="<?php echo $i;
?>" <?php if ($i == DEFAULT_STYLE || $style == $i) {
echo 'selected="selected"';
}
?>><?php echo $styles[$i];
?></option> <?php
}
?>
</select>
@ -108,16 +107,20 @@ $rr = isset($_REQUEST["rr"]);
<select name="map" class="form-control" required>
<option value="" selected="selected">None</option>
<?php
$result = mysqli_query($connection, "SELECT DISTINCT ".MYSQL_PREFIX."map FROM mapzones ORDER BY map ASC;");
$result = mysqli_query($connection, 'SELECT DISTINCT '.MYSQL_PREFIX.'map FROM mapzones ORDER BY map ASC;');
if($result->num_rows > 0)
{
while($row = $result->fetch_assoc())
{
if ($result->num_rows > 0) {
while ($row = $result->fetch_assoc()) {
// $row["map"] - including workshop
// removeworkshop($row["map"]) - no workshop
?> <option value="<?php echo($row["map"]); ?>" <?php if($row["map"] == $map) echo("selected=\"selected\""); ?>><?php echo(removeworkshop($row["map"])); ?></option> <?php
}
?> <option value="<?php echo $row['map'];
?>" <?php if ($row['map'] == $map) {
echo 'selected="selected"';
}
?>><?php echo removeworkshop($row['map']);
?></option> <?php
}
}
?>
</select>
@ -134,51 +137,46 @@ $rr = isset($_REQUEST["rr"]);
<div class="col-md-10 col-md-offset-1">
<div class="panel panel-default">
<div class="panel-heading cam-heading center">
<?php echo(HOMEPAGE_TITLE);?> <strong>-</strong> Record Database
<?php echo HOMEPAGE_TITLE; ?> <strong>-</strong> Record Database
</div>
<div class="panel-body table-responsive">
<?php
if(!isset($_REQUEST["map"]) && !$rr)
{
if (!isset($_REQUEST['map']) && !$rr) {
?>
<h1><?php echo(HEADER_TITLE); ?></h1>
<h1><?php echo HEADER_TITLE;
?></h1>
<p>
To show the records of any map, please select it using the menu at the top right of this page.<br/>
Don't forget to select a style if you wish, and then tap 'Submit'!</p>
<p>
Alternatively, you may click <a href="index.php?rr=1">Recent Records</a> to view the latest <?php echo(RECORD_LIMIT_LATEST); ?> records.
Alternatively, you may click <a href="index.php?rr=1">Recent Records</a> to view the latest <?php echo RECORD_LIMIT_LATEST;
?> records.
</p>
<?php
}
else
{
} else {
$results = false;
$stmt = FALSE;
$stmt = false;
if($rr && $stmt = $connection->prepare("SELECT p.map, u.name, p.style, p.time, p.jumps, u.auth, p.date FROM ".MYSQL_PREFIX."playertimes p JOIN (SELECT style, MIN(time) time FROM ".MYSQL_PREFIX."playertimes GROUP BY style, map) s ON p.style = s.style AND p.time = s.time JOIN ".MYSQL_PREFIX."users u ON p.auth = u.auth GROUP BY style, map ORDER BY date DESC;"))
{
if ($rr && $stmt = $connection->prepare('SELECT p.map, u.name, p.style, p.time, p.jumps, u.auth, p.date FROM '.MYSQL_PREFIX.'playertimes p JOIN (SELECT style, MIN(time) time FROM '.MYSQL_PREFIX.'playertimes GROUP BY style, map) s ON p.style = s.style AND p.time = s.time JOIN '.MYSQL_PREFIX.'users u ON p.auth = u.auth GROUP BY style, map ORDER BY date DESC;')) {
echo $connection->error;
$stmt->execute();
$stmt->store_result();
$stmt->store_result();
$results = ($rows = $stmt->num_rows) > 0;
$results = ($rows = $stmt->num_rows) > 0;
$stmt->bind_result($map, $name, $style, $time, $jumps, $auth, $date);
$stmt->bind_result($map, $name, $style, $time, $jumps, $auth, $date);
if($rows > 0)
{
if ($rows > 0) {
$records = 0;
$first = true;
while($row = $stmt->fetch())
{
if($first)
{
while ($row = $stmt->fetch()) {
if ($first) {
?>
<table class="table table-striped table-hover">
<thead id="ignore">
@ -198,52 +196,54 @@ $rr = isset($_REQUEST["rr"]);
?>
<tr>
<td><?php echo(removeworkshop($map)); ?></td>
<td><?php echo($name); ?></td>
<td><?php echo($styles[$style]); ?></td>
<td><?php echo(formattoseconds($time)); ?></td>
<td><?php echo(number_format($jumps)); ?></td>
<td><?php echo removeworkshop($map);
?></td>
<td><?php echo $name;
?></td>
<td><?php echo $styles[$style];
?></td>
<td><?php echo formattoseconds($time);
?></td>
<td><?php echo number_format($jumps);
?></td>
<td><?php
$steamid = SteamID::Parse($auth, SteamID::FORMAT_STEAMID3);
echo("<a href=\"http://steamcommunity.com/profiles/" . $steamid->Format(SteamID::FORMAT_STEAMID64) . "/\" target=\"_blank\">" . $auth . "</a>");
?></td>
echo '<a href="http://steamcommunity.com/profiles/'.$steamid->Format(SteamID::FORMAT_STEAMID64).'/" target="_blank">'.$auth.'</a>';
?></td>
<td><?php echo($date); ?></td>
<td><?php echo $date;
?></td>
</tr>
<?php
if(++$records > RECORD_LIMIT_LATEST)
{
if (++$records > RECORD_LIMIT_LATEST) {
break;
}
}
}
}
} elseif ($stmt = $connection->prepare('SELECT p.id, u.auth, u.name, p.time, p.jumps, p.date FROM '.MYSQL_PREFIX.'playertimes p JOIN '.MYSQL_PREFIX.'users u ON p.auth = u.auth WHERE map = ? AND style = ? ORDER BY time ASC;')) {
$stmt->bind_param('ss', $map, $style);
$stmt->execute();
else if($stmt = $connection->prepare("SELECT p.id, u.auth, u.name, p.time, p.jumps, p.date FROM ".MYSQL_PREFIX."playertimes p JOIN ".MYSQL_PREFIX."users u ON p.auth = u.auth WHERE map = ? AND style = ? ORDER BY time ASC;"))
{
$stmt->bind_param("ss", $map, $style);
$stmt->execute();
$stmt->store_result();
$stmt->store_result();
$results = ($rows = $stmt->num_rows) > 0;
$results = ($rows = $stmt->num_rows) > 0;
$stmt->bind_result($id, $auth, $name, $time, $jumps, $date);
$stmt->bind_result($id, $auth, $name, $time, $jumps, $date);
if($rows > 0)
{
if ($rows > 0) {
$first = true;
$rank = 1;
$rank = 1;
while($row = $stmt->fetch())
{
if($first)
{
?>
<p><span class="mark"><?php echo($styles[$style]); ?></span> Records (<?php echo(number_format($rows)); ?>) for <i><?php echo(removeworkshop($map)); ?></i>:</p>
while ($row = $stmt->fetch()) {
if ($first) {
?>
<p><span class="mark"><?php echo $styles[$style];
?></span> Records (<?php echo number_format($rows);
?>) for <i><?php echo removeworkshop($map);
?></i>:</p>
<table class="table table-striped table-hover">
<thead id="ignore"><th>Rank</th>
@ -257,85 +257,86 @@ $rr = isset($_REQUEST["rr"]);
<?php
$first = false;
}
?>
}
?>
<?php if($rank == 1)
{
<?php if ($rank == 1) {
?>
<tr class="warning">
<?php
}
else
{
} else {
?>
<tr class="default">
<?php
}
?>
<td>
<?php switch($rank)
{
<?php switch ($rank) {
case 1:
{
echo("<i class=\"fa fa-trophy\" style=\"color:#C98910\"></i>");
echo '<i class="fa fa-trophy" style="color:#C98910"></i>';
break;
}
case 2:
{
echo("<i class=\"fa fa-trophy\" style=\"color:#A8A8A8\"></i>");
echo '<i class="fa fa-trophy" style="color:#A8A8A8"></i>';
break;
}
case 3:
{
echo("<i class=\"fa fa-trophy\" style=\"color:#965A38\"></i>");
echo '<i class="fa fa-trophy" style="color:#965A38"></i>';
break;
}
default:
{
echo("#".$rank);
echo '#'.$rank;
break;
}
}
?></td>
<td><?php echo($id); ?></td>
<td><?php echo $id;
?></td>
<td><?php
$steamid = SteamID::Parse($auth, SteamID::FORMAT_STEAMID3);
echo("<a href=\"http://steamcommunity.com/profiles/" . $steamid->Format(SteamID::FORMAT_STEAMID64) . "/\" target=\"_blank\">" . $auth . "</a>"); ?></td>
<td><?php echo($name); ?></td>
$steamid = SteamID::Parse($auth, SteamID::FORMAT_STEAMID3);
echo '<a href="http://steamcommunity.com/profiles/'.$steamid->Format(SteamID::FORMAT_STEAMID64).'/" target="_blank">'.$auth.'</a>';
?></td>
<td><?php echo $name;
?></td>
<td>
<?php
echo(formattoseconds($time));
?></td>
<td><?php echo(number_format($jumps)); ?></td>
<td><?php echo($date); ?></td></tr>
echo formattoseconds($time);
?></td>
<td><?php echo number_format($jumps);
?></td>
<td><?php echo $date;
?></td></tr>
<?php
if(++$rank > RECORD_LIMIT)
{
if (++$rank > RECORD_LIMIT) {
break;
}
}
}
?> </table> <?php
}
}
?> </table> <?php
if($stmt != FALSE)
{
$stmt->close();
}
}
}
if(!$results)
{
if ($stmt != false) {
$stmt->close();
}
if (!$results) {
?> <h1>No results!</h1>
<p>Try another map, there may be some records!</p> <?php
}
}
?>
@ -354,13 +355,10 @@ $rr = isset($_REQUEST["rr"]);
<!-- Custom styles for this template, if we'll ever use it -->
<?php
if(PAGE_STYLE =='0')
{
echo('<link rel="stylesheet" href="timer.css">');
}
else
{
echo('<link rel="stylesheet" href="timer-red.css">');
if (PAGE_STYLE == '0') {
echo '<link rel="stylesheet" href="timer.css">';
} else {
echo '<link rel="stylesheet" href="timer-red.css">';
}
?>

View File

@ -1,4 +1,5 @@
<?php
// https://github.com/mukunda-/steamidparser/blob/master/lib/steamid.php
/*!
* SteamID Parser
@ -26,432 +27,482 @@
/**
* Exception thrown on resolution failure
* (only used when resolving vanity URLs.)
* (only used when resolving vanity URLs.).
*/
class SteamIDResolutionException extends Exception {
const UNKNOWN = 0; // Unknown error.
const CURL_FAILURE = 1; // cURL/network related error.
const VANITYURL_NOTFOUND = 2; // The vanity URL given was invalid.
const VANITYURL_FAILED = 3; // Steam failure when trying to resolve vanity URL.
class SteamIDResolutionException extends Exception
{
const UNKNOWN = 0; // Unknown error.
const CURL_FAILURE = 1; // cURL/network related error.
const VANITYURL_NOTFOUND = 2; // The vanity URL given was invalid.
const VANITYURL_FAILED = 3; // Steam failure when trying to resolve vanity URL.
public $reason;
public $reason;
function __construct( $reason, $text ) {
$this->reason = $reason;
parent::__construct( $text );
}
public function __construct($reason, $text)
{
$this->reason = $reason;
parent::__construct($text);
}
}
/** ---------------------------------------------------------------------------
* SteamID
* SteamID.
*
* Contains a User Steam ID.
*
* @author Mukunda Johnson
*/
class SteamID {
// RAW Steam ID value as a string. (a plain number.)
public $value;
// Array of converted values. Indexed by FORMAT_xxx
// this is a cache of formatted values, filled in
// by Format or Parse.
public $formatted;
const FORMAT_AUTO = 0; // Auto-detect format --- this also supports
// other unlisted formats such as
// full profile URLs.
const FORMAT_STEAMID32 = 1; // Classic STEAM_x:y:zzzzzz | x = 0/1
const FORMAT_STEAMID64 = 2; // SteamID64: 7656119xxxxxxxxxx
const FORMAT_STEAMID3 = 3; // SteamID3 format: [U:1:xxxxxx]
const FORMAT_S32 = 4; // Raw 32-bit SIGNED format.
// this is a raw steamid index that overflows
// into negative bitspace.
// This is the format that SourceMod returns
// with GetSteamAccountID, and will always
// fit into a 32-bit signed variable. (e.g.
// a 32-bit PHP integer).
const FORMAT_RAW = 5; // Raw index. like 64-bit minus the base value.
const FORMAT_VANITY = 6; // Vanity URL name. Forward conversion only.
const STEAMID64_BASE = '76561197960265728';
// max allowed value. (sanity check)
// 2^36; update this in approx 2,400,000 years
const MAX_VALUE = '68719476736';
private static $steam_api_key = FALSE;
private static $default_detect_raw = FALSE;
private static $default_resolve_vanity = FALSE;
/** -----------------------------------------------------------------------
* Set an API key to use for resolving Custom URLs. If this isn't set
* custom URL resolution will be done by parsing the profile XML.
*
* @param string $key API Key
* @see http://steamcommunity.com/dev/apikey
*/
public static function SetSteamAPIKey( $key ) {
if( empty($key) ) self::$steam_api_key = FALSE;
self::$steam_api_key = $key;
}
/** -----------------------------------------------------------------------
* Set the default setting for $detect_raw for Parse()
*
* @param bool $parseraw Default $detect_raw value, see Parse function.
*/
public static function SetParseRawDefault( $parseraw ) {
self::$default_detect_raw = $parseraw;
}
/** -----------------------------------------------------------------------
* Set the default setting for $resolve_vanity for Parse()
*
* @param bool $resolve_vanity Default $resolve_vanity value,
* see Parse function.
*/
public static function SetResolveVanityDefault( $resolve_vanity ) {
self::$default_resolve_vanity = $resolve_vanity;
}
/** -----------------------------------------------------------------------
* Construct an instance.
*
* @param string $raw Raw value of Steam ID.
*/
private function __construct( $raw ) {
$this->value = $raw;
$this->formatted[ self::FORMAT_RAW ] = $raw;
}
/** -----------------------------------------------------------------------
* Make a cURL request and return the contents.
*
* @param string $url URL to request.
* @return string|false Contents of result or FALSE if the request failed.
*/
private static function Curl( $url ) {
$ch = curl_init();
curl_setopt( $ch, CURLOPT_URL, $url );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1 );
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
/** -----------------------------------------------------------------------
* Parse a Steam ID.
*
* @param string $input Input to parse.
* @param int $format Input formatting, see FORMAT_ constants.
* Defaults to FORMAT_AUTO which detects the format.
* @param bool $resolve_vanity Detect and resolve vanity URLs. (only used
* with FORMAT_AUTO. Default option set with
* SetResolveVanityDefault.
* @param bool $detect_raw Detect and parse RAW values. (only used with
* FORMAT_AUTO. e.g "123" will resolve to the
* SteamID with the raw value 123, and not a
* vanity-url named "123". Default option set with
* SetParseRawDefault.
*
* @return SteamID|false SteamID instance or FALSE if the input is invalid
* or unsupported.
*/
public static function Parse( $input,
$format = self::FORMAT_AUTO,
$resolve_vanity = null,
$detect_raw = null ) {
if( $detect_raw === null )
$detect_raw = self::$default_detect_raw;
if( $resolve_vanity === null )
$resolve_vanity = self::$default_resolve_vanity;
switch( $format ) {
case self::FORMAT_STEAMID32:
// validate STEAM_0/1:y:zzzzzz
if( !preg_match(
'/^STEAM_[0-1]:([0-1]):([0-9]+)$/',
$input, $matches ) ) {
return FALSE;
}
// convert to raw.
$a = bcmul( $matches[2], '2', 0 );
$a = bcadd( $a, $matches[1], 0 );
$result = new self( $a );
$result->formatted[ self::FORMAT_STEAMID32 ] = $input;
return $result;
case self::FORMAT_STEAMID64:
// allow digits only
if( !preg_match( '/^[0-9]+$/', $input ) ) return FALSE;
// convert to raw (subtract base)
$a = bcsub( $input, self::STEAMID64_BASE, 0 );
// sanity range check.
if( bccomp( $a, '0', 0 ) < 0 ) return FALSE;
if( bccomp( $a, self::MAX_VALUE, 0 ) > 0 ) return FALSE;
$result = new self( $a );
$result->formatted[ self::FORMAT_STEAMID64 ] = $input;
return $result;
case self::FORMAT_STEAMID3:
// validate [U:1:xxxxxx]
if( !preg_match( '/^\[U:1:([0-9]+)\]$/', $input, $matches ) ) {
return FALSE;
}
$a = $matches[1];
// sanity range check.
if( bccomp( $a, self::MAX_VALUE, 0 ) > 0 ) return FALSE;
$result = new self( $a );
$result->formatted[ self::FORMAT_STEAMID3 ] = $input;
return $result;
case self::FORMAT_S32:
// validate signed 32-bit format
if( !preg_match( '/^(-?[0-9]+)$/', $input ) ) {
return FALSE;
}
$a = $input;
// 32-bit range check
if( bccomp( $a, '2147483647', 0 ) > 0 ) return FALSE;
if( bccomp( $a, '-2147483648', 0 ) < 0 ) return FALSE;
if( bccomp( $a, '0', 0 ) < 0 ) {
$a = bcadd( $a, '4294967296', 0 );
}
$result = new self( $a );
$result->formatted[ self::FORMAT_S32 ] = $input;
return $result;
case self::FORMAT_RAW:
// validate digits only
if( !preg_match( '/^[0-9]+$/', $input ) ) {
return FALSE;
}
// sanity range check
if( bccomp( $input, self::MAX_VALUE, 0 ) > 0 ) return FALSE;
return new self( $input );
case self::FORMAT_VANITY:
// validate characters.
if( !preg_match( '/^[a-zA-Z0-9_-]{2,}$/', $input ) ) return FALSE;
$result = self::ConvertVanityURL( $input );
if( $result !== FALSE ) {
$result->formatted[ self::FORMAT_VANITY ] = $input;
return $result;
}
}
// Auto detect format:
$input = trim( $input );
$result = self::Parse( $input, self::FORMAT_STEAMID32 );
if( $result !== FALSE ) return $result;
$result = self::Parse( $input, self::FORMAT_STEAMID64 );
if( $result !== FALSE ) return $result;
$result = self::Parse( $input, self::FORMAT_STEAMID3 );
if( $result !== FALSE ) return $result;
if( preg_match(
'/^(?:https?:\/\/)?(?:www.)?steamcommunity.com\/profiles\/([0-9]+)\/*$/',
$input, $matches ) ) {
$result = self::Parse( $matches[1], self::FORMAT_STEAMID64 );
if( $result !== FALSE ) return $result;
}
if( $resolve_vanity ) {
// try the name directly
$result = self::Parse( $input, self::FORMAT_VANITY );
if( $result !== FALSE ) return $result;
// try a full URL.
if( preg_match(
'/^(?:https?:\/\/)?(?:www.)?steamcommunity.com\/id\/([a-zA-Z0-9_-]{2,})\/*$/',
$input, $matches ) ) {
$result = self::ConvertVanityURL( $matches[1] );
if( $result !== FALSE ) return $result;
}
}
if( $detect_raw ) {
$result = self::Parse( $input, self::FORMAT_S32 );
if( $result !== FALSE ) return $result;
$result = self::Parse( $input, self::FORMAT_RAW );
if( $result !== FALSE ) return $result;
}
// unknown stem
return FALSE;
}
/** -----------------------------------------------------------------------
* Convert a vanity URL into a SteamID instance.
*
* @param string $vanity_url_name The text part of the person's vanity URL.
* e.g http://steamcommunity.com/id/gabelogannewell
* would use "gabelogannewell"
* @return SteamID|false SteamID instance or FALSE on failure.
*/
public static function ConvertVanityURL( $vanity_url_name ) {
if( empty($vanity_url_name) ) return FALSE;
if( self::$steam_api_key !== FALSE ) {
$response = self::Curl(
"http://api.steampowered.com/ISteamUser/ResolveVanityURL/v0001/?key="
.self::$steam_api_key
."&vanityurl=$vanity_url_name" );
if( $response === FALSE ) {
throw new SteamIDResolutionException(
SteamIDResolutionException::CURL_FAILURE,
'CURL Request Failed.' );
}
if( $response == "" ) {
throw new SteamIDResolutionException(
SteamIDResolutionException::VANITYURL_FAILED,
'Steam failure.' );
}
$response = json_decode( $response );
if( $response === FALSE ) {
throw new SteamIDResolutionException(
SteamIDResolutionException::VANITYURL_FAILED,
'Steam failure.' );
}
$response = $response->response;
if( $response->success == 42 ) {
throw new SteamIDResolutionException(
SteamIDResolutionException::VANITYURL_NOTFOUND,
'Vanity URL doesn\'t exist.' );
}
if( $response->success != 1 ) {
throw new SteamIDResolutionException(
SteamIDResolutionException::VANITYURL_FAILED,
'Steam failure.' );
}
$steamid = $response->steamid;
} else {
// fallback to xml parsing method.
$result = self::Curl( "http://steamcommunity.com/id/$vanity_url_name?xml=1" );
if( $result === FALSE ) {
throw new SteamIDResolutionException(
SteamIDResolutionException::CURL_FAILURE,
'CURL Request Failed.' );
}
$parser = xml_parser_create('');
$values = array();
$indexes = array();
xml_parse_into_struct( $parser, $result, $values, $indexes );
xml_parser_free($parser);
if( !isset( $indexes['STEAMID64'] ) || is_null( $indexes['STEAMID64'] ) ) {
if( isset( $indexes['ERROR'] ) &&
trim($values[ $indexes['ERROR'][0] ]['value']) ==
'The specified profile could not be found.' ) {
throw new SteamIDResolutionException(
SteamIDResolutionException::VANITYURL_NOTFOUND,
'Vanity URL doesn\'t exist.' );
}
throw new SteamIDResolutionException(
SteamIDResolutionException::VANITYURL_FAILED,
'Invalid Vanity URL or Steam failure.' );
}
$steamid = $indexes['STEAMID64'];
$steamid = $values[ $steamid[0] ]['value'];
}
return self::Parse( $steamid, self::FORMAT_STEAMID64 );
}
/** -----------------------------------------------------------------------
* Format this SteamID to a string.
*
* @param int $format Output format. See FORMAT_xxx constants.
* @return string|false Formatted Steam ID. FALSE if an invalid format is
* given or the desired format cannot contain the
* SteamID.
*/
public function Format( $format ) {
if( isset( $this->formatted[$format] ) ) {
return $this->formatted[$format];
}
switch( $format ) {
case self::FORMAT_STEAMID32:
$z = bcdiv( $this->value, '2', 0 );
$y = bcmul( $z, '2', 0 );
$y = bcsub( $this->value, $y, 0 );
$formatted = "STEAM_1:$y:$z";
$this->formatted[$format] = $formatted;
return $formatted;
case self::FORMAT_STEAMID64:
$formatted = bcadd( $this->value, self::STEAMID64_BASE, 0 );
$this->formatted[$format] = $formatted;
return $formatted;
case self::FORMAT_STEAMID3:
$formatted = "[U:1:$this->value]";
$this->formatted[$format] = $formatted;
return $formatted;
case self::FORMAT_S32:
if( bccomp( $this->value, '4294967296', 0 ) >= 0 ) {
return FALSE; // too large for s32.
}
if( bccomp( $this->value, '2147483648', 0 ) >= 0 ) {
$formatted = bcsub( $this->value, '4294967296', 0 );
} else {
$formatted = $this->value;
}
$this->formatted[$format] = $formatted;
return $formatted;
// (raw is always cached)
}
return FALSE;
}
class SteamID
{
// RAW Steam ID value as a string. (a plain number.)
public $value;
// Array of converted values. Indexed by FORMAT_xxx
// this is a cache of formatted values, filled in
// by Format or Parse.
public $formatted;
const FORMAT_AUTO = 0; // Auto-detect format --- this also supports
// other unlisted formats such as
// full profile URLs.
const FORMAT_STEAMID32 = 1; // Classic STEAM_x:y:zzzzzz | x = 0/1
const FORMAT_STEAMID64 = 2; // SteamID64: 7656119xxxxxxxxxx
const FORMAT_STEAMID3 = 3; // SteamID3 format: [U:1:xxxxxx]
const FORMAT_S32 = 4; // Raw 32-bit SIGNED format.
// this is a raw steamid index that overflows
// into negative bitspace.
// This is the format that SourceMod returns
// with GetSteamAccountID, and will always
// fit into a 32-bit signed variable. (e.g.
// a 32-bit PHP integer).
const FORMAT_RAW = 5; // Raw index. like 64-bit minus the base value.
const FORMAT_VANITY = 6; // Vanity URL name. Forward conversion only.
const STEAMID64_BASE = '76561197960265728';
// max allowed value. (sanity check)
// 2^36; update this in approx 2,400,000 years
const MAX_VALUE = '68719476736';
private static $steam_api_key = false;
private static $default_detect_raw = false;
private static $default_resolve_vanity = false;
/** -----------------------------------------------------------------------
* Set an API key to use for resolving Custom URLs. If this isn't set
* custom URL resolution will be done by parsing the profile XML.
*
* @param string $key API Key
*
* @see http://steamcommunity.com/dev/apikey
*/
public static function SetSteamAPIKey($key)
{
if (empty($key)) {
self::$steam_api_key = false;
}
self::$steam_api_key = $key;
}
/** -----------------------------------------------------------------------
* Set the default setting for $detect_raw for Parse().
*
* @param bool $parseraw Default $detect_raw value, see Parse function.
*/
public static function SetParseRawDefault($parseraw)
{
self::$default_detect_raw = $parseraw;
}
/** -----------------------------------------------------------------------
* Set the default setting for $resolve_vanity for Parse().
*
* @param bool $resolve_vanity Default $resolve_vanity value,
* see Parse function.
*/
public static function SetResolveVanityDefault($resolve_vanity)
{
self::$default_resolve_vanity = $resolve_vanity;
}
/** -----------------------------------------------------------------------
* Construct an instance.
*
* @param string $raw Raw value of Steam ID.
*/
private function __construct($raw)
{
$this->value = $raw;
$this->formatted[self::FORMAT_RAW] = $raw;
}
/** -----------------------------------------------------------------------
* Make a cURL request and return the contents.
*
* @param string $url URL to request.
*
* @return string|false Contents of result or FALSE if the request failed.
*/
private static function Curl($url)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
/** -----------------------------------------------------------------------
* Parse a Steam ID.
*
* @param string $input Input to parse.
* @param int $format Input formatting, see FORMAT_ constants.
* Defaults to FORMAT_AUTO which detects the format.
* @param bool $resolve_vanity Detect and resolve vanity URLs. (only used
* with FORMAT_AUTO. Default option set with
* SetResolveVanityDefault.
* @param bool $detect_raw Detect and parse RAW values. (only used with
* FORMAT_AUTO. e.g "123" will resolve to the
* SteamID with the raw value 123, and not a
* vanity-url named "123". Default option set with
* SetParseRawDefault.
*
* @return SteamID|false SteamID instance or FALSE if the input is invalid
* or unsupported.
*/
public static function Parse($input,
$format = self::FORMAT_AUTO,
$resolve_vanity = null,
$detect_raw = null)
{
if ($detect_raw === null) {
$detect_raw = self::$default_detect_raw;
}
if ($resolve_vanity === null) {
$resolve_vanity = self::$default_resolve_vanity;
}
switch ($format) {
case self::FORMAT_STEAMID32:
// validate STEAM_0/1:y:zzzzzz
if (!preg_match(
'/^STEAM_[0-1]:([0-1]):([0-9]+)$/',
$input, $matches)) {
return false;
}
// convert to raw.
$a = bcmul($matches[2], '2', 0);
$a = bcadd($a, $matches[1], 0);
$result = new self($a);
$result->formatted[self::FORMAT_STEAMID32] = $input;
return $result;
case self::FORMAT_STEAMID64:
// allow digits only
if (!preg_match('/^[0-9]+$/', $input)) {
return false;
}
// convert to raw (subtract base)
$a = bcsub($input, self::STEAMID64_BASE, 0);
// sanity range check.
if (bccomp($a, '0', 0) < 0) {
return false;
}
if (bccomp($a, self::MAX_VALUE, 0) > 0) {
return false;
}
$result = new self($a);
$result->formatted[self::FORMAT_STEAMID64] = $input;
return $result;
case self::FORMAT_STEAMID3:
// validate [U:1:xxxxxx]
if (!preg_match('/^\[U:1:([0-9]+)\]$/', $input, $matches)) {
return false;
}
$a = $matches[1];
// sanity range check.
if (bccomp($a, self::MAX_VALUE, 0) > 0) {
return false;
}
$result = new self($a);
$result->formatted[self::FORMAT_STEAMID3] = $input;
return $result;
case self::FORMAT_S32:
// validate signed 32-bit format
if (!preg_match('/^(-?[0-9]+)$/', $input)) {
return false;
}
$a = $input;
// 32-bit range check
if (bccomp($a, '2147483647', 0) > 0) {
return false;
}
if (bccomp($a, '-2147483648', 0) < 0) {
return false;
}
if (bccomp($a, '0', 0) < 0) {
$a = bcadd($a, '4294967296', 0);
}
$result = new self($a);
$result->formatted[self::FORMAT_S32] = $input;
return $result;
case self::FORMAT_RAW:
// validate digits only
if (!preg_match('/^[0-9]+$/', $input)) {
return false;
}
// sanity range check
if (bccomp($input, self::MAX_VALUE, 0) > 0) {
return false;
}
return new self($input);
case self::FORMAT_VANITY:
// validate characters.
if (!preg_match('/^[a-zA-Z0-9_-]{2,}$/', $input)) {
return false;
}
$result = self::ConvertVanityURL($input);
if ($result !== false) {
$result->formatted[self::FORMAT_VANITY] = $input;
return $result;
}
}
// Auto detect format:
$input = trim($input);
$result = self::Parse($input, self::FORMAT_STEAMID32);
if ($result !== false) {
return $result;
}
$result = self::Parse($input, self::FORMAT_STEAMID64);
if ($result !== false) {
return $result;
}
$result = self::Parse($input, self::FORMAT_STEAMID3);
if ($result !== false) {
return $result;
}
if (preg_match(
'/^(?:https?:\/\/)?(?:www.)?steamcommunity.com\/profiles\/([0-9]+)\/*$/',
$input, $matches)) {
$result = self::Parse($matches[1], self::FORMAT_STEAMID64);
if ($result !== false) {
return $result;
}
}
if ($resolve_vanity) {
// try the name directly
$result = self::Parse($input, self::FORMAT_VANITY);
if ($result !== false) {
return $result;
}
// try a full URL.
if (preg_match(
'/^(?:https?:\/\/)?(?:www.)?steamcommunity.com\/id\/([a-zA-Z0-9_-]{2,})\/*$/',
$input, $matches)) {
$result = self::ConvertVanityURL($matches[1]);
if ($result !== false) {
return $result;
}
}
}
if ($detect_raw) {
$result = self::Parse($input, self::FORMAT_S32);
if ($result !== false) {
return $result;
}
$result = self::Parse($input, self::FORMAT_RAW);
if ($result !== false) {
return $result;
}
}
// unknown stem
return false;
}
/** -----------------------------------------------------------------------
* Convert a vanity URL into a SteamID instance.
*
* @param string $vanity_url_name The text part of the person's vanity URL.
* e.g http://steamcommunity.com/id/gabelogannewell
* would use "gabelogannewell"
*
* @return SteamID|false SteamID instance or FALSE on failure.
*/
public static function ConvertVanityURL($vanity_url_name)
{
if (empty($vanity_url_name)) {
return false;
}
if (self::$steam_api_key !== false) {
$response = self::Curl(
'http://api.steampowered.com/ISteamUser/ResolveVanityURL/v0001/?key='
.self::$steam_api_key
."&vanityurl=$vanity_url_name");
if ($response === false) {
throw new SteamIDResolutionException(
SteamIDResolutionException::CURL_FAILURE,
'CURL Request Failed.');
}
if ($response == '') {
throw new SteamIDResolutionException(
SteamIDResolutionException::VANITYURL_FAILED,
'Steam failure.');
}
$response = json_decode($response);
if ($response === false) {
throw new SteamIDResolutionException(
SteamIDResolutionException::VANITYURL_FAILED,
'Steam failure.');
}
$response = $response->response;
if ($response->success == 42) {
throw new SteamIDResolutionException(
SteamIDResolutionException::VANITYURL_NOTFOUND,
'Vanity URL doesn\'t exist.');
}
if ($response->success != 1) {
throw new SteamIDResolutionException(
SteamIDResolutionException::VANITYURL_FAILED,
'Steam failure.');
}
$steamid = $response->steamid;
} else {
// fallback to xml parsing method.
$result = self::Curl("http://steamcommunity.com/id/$vanity_url_name?xml=1");
if ($result === false) {
throw new SteamIDResolutionException(
SteamIDResolutionException::CURL_FAILURE,
'CURL Request Failed.');
}
$parser = xml_parser_create('');
$values = [];
$indexes = [];
xml_parse_into_struct($parser, $result, $values, $indexes);
xml_parser_free($parser);
if (!isset($indexes['STEAMID64']) || is_null($indexes['STEAMID64'])) {
if (isset($indexes['ERROR']) &&
trim($values[$indexes['ERROR'][0]]['value']) ==
'The specified profile could not be found.') {
throw new SteamIDResolutionException(
SteamIDResolutionException::VANITYURL_NOTFOUND,
'Vanity URL doesn\'t exist.');
}
throw new SteamIDResolutionException(
SteamIDResolutionException::VANITYURL_FAILED,
'Invalid Vanity URL or Steam failure.');
}
$steamid = $indexes['STEAMID64'];
$steamid = $values[$steamid[0]]['value'];
}
return self::Parse($steamid, self::FORMAT_STEAMID64);
}
/** -----------------------------------------------------------------------
* Format this SteamID to a string.
*
* @param int $format Output format. See FORMAT_xxx constants.
*
* @return string|false Formatted Steam ID. FALSE if an invalid format is
* given or the desired format cannot contain the
* SteamID.
*/
public function Format($format)
{
if (isset($this->formatted[$format])) {
return $this->formatted[$format];
}
switch ($format) {
case self::FORMAT_STEAMID32:
$z = bcdiv($this->value, '2', 0);
$y = bcmul($z, '2', 0);
$y = bcsub($this->value, $y, 0);
$formatted = "STEAM_1:$y:$z";
$this->formatted[$format] = $formatted;
return $formatted;
case self::FORMAT_STEAMID64:
$formatted = bcadd($this->value, self::STEAMID64_BASE, 0);
$this->formatted[$format] = $formatted;
return $formatted;
case self::FORMAT_STEAMID3:
$formatted = "[U:1:$this->value]";
$this->formatted[$format] = $formatted;
return $formatted;
case self::FORMAT_S32:
if (bccomp($this->value, '4294967296', 0) >= 0) {
return false; // too large for s32.
}
if (bccomp($this->value, '2147483648', 0) >= 0) {
$formatted = bcsub($this->value, '4294967296', 0);
} else {
$formatted = $this->value;
}
$this->formatted[$format] = $formatted;
return $formatted;
// (raw is always cached)
}
return false;
}
}
?>