mirror of
https://github.com/shavitush/bhoptimer.git
synced 2025-12-06 18:08:26 +00:00
Applied fixes from StyleCI
This commit is contained in:
parent
1943c57205
commit
472d8f2da2
@ -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');
|
||||
|
||||
@ -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;
|
||||
}
|
||||
?>
|
||||
|
||||
@ -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">';
|
||||
}
|
||||
?>
|
||||
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
|
||||
Loading…
Reference in New Issue
Block a user