569 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			569 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | ||
| /*
 | ||
| HLstatsX Community Edition - Real-time player and clan rankings and statistics
 | ||
| Copyleft (L) 2008-20XX Nicholas Hastings (nshastings@gmail.com)
 | ||
| http://www.hlxcommunity.com
 | ||
| 
 | ||
| HLstatsX Community Edition is a continuation of 
 | ||
| ELstatsNEO - Real-time player and clan rankings and statistics
 | ||
| Copyleft (L) 2008-20XX Malte Bayer (steam@neo-soft.org)
 | ||
| http://ovrsized.neo-soft.org/
 | ||
| 
 | ||
| ELstatsNEO is an very improved & enhanced - so called Ultra-Humongus Edition of HLstatsX
 | ||
| HLstatsX - Real-time player and clan rankings and statistics for Half-Life 2
 | ||
| http://www.hlstatsx.com/
 | ||
| Copyright (C) 2005-2007 Tobias Oetzel (Tobi@hlstatsx.com)
 | ||
| 
 | ||
| HLstatsX is an enhanced version of HLstats made by Simon Garner
 | ||
| HLstats - Real-time player and clan rankings and statistics for Half-Life
 | ||
| http://sourceforge.net/projects/hlstats/
 | ||
| Copyright (C) 2001  Simon Garner
 | ||
|             
 | ||
| This program is free software; you can redistribute it and/or
 | ||
| modify it under the terms of the GNU General Public License
 | ||
| as published by the Free Software Foundation; either version 2
 | ||
| of the License, or (at your option) any later version.
 | ||
| 
 | ||
| This program is distributed in the hope that it will be useful,
 | ||
| but WITHOUT ANY WARRANTY; without even the implied warranty of
 | ||
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | ||
| GNU General Public License for more details.
 | ||
| 
 | ||
| You should have received a copy of the GNU General Public License
 | ||
| along with this program; if not, write to the Free Software
 | ||
| Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 | ||
| 
 | ||
| For support and installation notes visit http://www.hlxcommunity.com
 | ||
| */
 | ||
| 
 | ||
| if (!defined('IN_HLSTATS'))
 | ||
| {
 | ||
| 	die('Do not access this file directly.');
 | ||
| }
 | ||
| 
 | ||
| /**
 | ||
|  * getOptions()
 | ||
|  * 
 | ||
|  * @return Array All the options from the options/perlconfig table
 | ||
|  */
 | ||
| function getOptions()
 | ||
| {
 | ||
| 	global $db;
 | ||
| 	$result = $db->query("SELECT `keyname`,`value` FROM hlstats_Options WHERE opttype >= 1");
 | ||
| 	while ($rowdata = $db->fetch_row($result))
 | ||
| 	{
 | ||
| 		$options[$rowdata[0]] = $rowdata[1];
 | ||
| 	}
 | ||
| 	if ( !count($options) )
 | ||
| 	{
 | ||
| 		error('Warning: Could not find any options in table <b>hlstats_Options</b>, database <b>' .
 | ||
| 			DB_NAME . '</b>. Check HLstats configuration.');
 | ||
| 	}
 | ||
| 	$options['MinActivity'] = $options['MinActivity'] * 86400;
 | ||
| 	return $options;
 | ||
| }
 | ||
| 
 | ||
| // Test if flags exists
 | ||
| /**
 | ||
|  * getFlag()
 | ||
|  * 
 | ||
|  * @param string $flag
 | ||
|  * @param string $type
 | ||
|  * @return string Either the flag or default flag if none exists
 | ||
|  */
 | ||
| function getFlag($flag, $type='url')
 | ||
| {
 | ||
| 	$image = getImage('/flags/'.strtolower($flag));
 | ||
| 	if ($image)
 | ||
| 		return $image[$type];
 | ||
| 	else
 | ||
| 		return IMAGE_PATH.'/flags/0.gif';
 | ||
| }
 | ||
| 
 | ||
| /**
 | ||
|  * valid_request()
 | ||
|  * 
 | ||
|  * @param string $str
 | ||
|  * @param boolean $numeric
 | ||
|  * @return mixed request
 | ||
|  */
 | ||
| function valid_request($str, $numeric = false)
 | ||
| {
 | ||
| 	$search_pattern = array("/[^A-Za-z0-9\[\]*.,=()!\"$%&^`´':;߲ł#+~_\-|<>\/\\\\@{}äöüÄÖÜ ]/");
 | ||
| 	$replace_pattern = array('');
 | ||
| 	$str = preg_replace($search_pattern, $replace_pattern, $str);
 | ||
| 	if ( $numeric == false )
 | ||
| 	{
 | ||
| 		if ( get_magic_quotes_gpc() )
 | ||
| 			return $str = htmlspecialchars(stripslashes($str), ENT_QUOTES);
 | ||
| 		else
 | ||
| 			return $str = htmlspecialchars($str, ENT_QUOTES);
 | ||
| 	}
 | ||
| 	else
 | ||
| 	{
 | ||
| 		if ( is_numeric($str) )
 | ||
| 			return intval($str);
 | ||
| 		else
 | ||
| 			return -1;
 | ||
| 	}
 | ||
| }
 | ||
| 
 | ||
| /**
 | ||
|  * timestamp_to_str()
 | ||
|  * 
 | ||
|  * @param integer $timestamp
 | ||
|  * @return string Formatted Timestamp
 | ||
|  */
 | ||
| function timestamp_to_str($timestamp)
 | ||
| {
 | ||
| 	if ($timestamp != '')
 | ||
| 	{
 | ||
| 		return sprintf('%dd %02d:%02d:%02dh', $timestamp / 86400, $timestamp / 3600 % 24, $timestamp /
 | ||
| 			60 % 60, $timestamp % 60);
 | ||
| 	}
 | ||
| 	return '-';
 | ||
| }
 | ||
| 
 | ||
| /**
 | ||
|  * error()
 | ||
|  * Formats and outputs the given error message. Optionally terminates script
 | ||
|  * processing.
 | ||
|  * 
 | ||
|  * @param mixed $message
 | ||
|  * @param bool $exit
 | ||
|  * @return void
 | ||
|  */
 | ||
| function error($message, $exit = true)
 | ||
| {
 | ||
| 	global $g_options;
 | ||
| ?>
 | ||
| <table border="1" cellspacing="0" cellpadding="5">
 | ||
| <tr>
 | ||
| <td class="errorhead">ERROR</td>
 | ||
| </tr>
 | ||
| <tr>
 | ||
| <td class="errortext"><?php echo $message; ?></td>
 | ||
| </tr>
 | ||
| </table>
 | ||
| <?php if ($exit)
 | ||
| 		exit;
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| //
 | ||
| // string makeQueryString (string key, string value, [array notkeys])
 | ||
| //
 | ||
| // Generates an HTTP GET query string from the current HTTP GET variables,
 | ||
| // plus the given 'key' and 'value' pair. Any current HTTP GET variables
 | ||
| // whose keys appear in the 'notkeys' array, or are the same as 'key', will
 | ||
| // be excluded from the returned query string.
 | ||
| //
 | ||
| 
 | ||
| /**
 | ||
|  * makeQueryString()
 | ||
|  * 
 | ||
|  * @param mixed $key
 | ||
|  * @param mixed $value
 | ||
|  * @param mixed $notkeys
 | ||
|  * @return
 | ||
|  */
 | ||
| function makeQueryString($key, $value, $notkeys = array())
 | ||
| {
 | ||
| 	if (!is_array($notkeys))
 | ||
| 		$notkeys = array();
 | ||
| 	
 | ||
| 	$querystring = '';
 | ||
| 	foreach ($_GET as $k => $v)
 | ||
| 	{
 | ||
| 		$v = valid_request($v, 0);
 | ||
| 		if ($k && $k != $key && !in_array($k, $notkeys))
 | ||
| 		{
 | ||
| 			$querystring .= urlencode($k) . '=' . rawurlencode($v) . '&';
 | ||
| 		}
 | ||
| 	}
 | ||
| 
 | ||
| 	$querystring .= urlencode($key) . '=' . urlencode($value);
 | ||
| 
 | ||
| 	return $querystring;
 | ||
| }
 | ||
| 
 | ||
| //
 | ||
| // void pageHeader (array title, array location)
 | ||
| //
 | ||
| // Prints the page heading.
 | ||
| //
 | ||
| 
 | ||
| /**
 | ||
|  * pageHeader()
 | ||
|  * 
 | ||
|  * @param mixed $title
 | ||
|  * @param mixed $location
 | ||
|  * @return
 | ||
|  */
 | ||
| function pageHeader($title = '', $location = '')
 | ||
| {
 | ||
| 	global $db, $g_options;
 | ||
| 	if ( defined('PAGE') && PAGE == 'HLSTATS' )
 | ||
| 		include (PAGE_PATH . '/header.php');
 | ||
| 	elseif ( defined('PAGE') && PAGE == 'INGAME' )
 | ||
| 		include (PAGE_PATH . '/ingame/header.php');
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| //
 | ||
| // void pageFooter (void)
 | ||
| //
 | ||
| // Prints the page footer.
 | ||
| //
 | ||
| 
 | ||
| /**
 | ||
|  * pageFooter()
 | ||
|  * 
 | ||
|  * @return
 | ||
|  */
 | ||
| function pageFooter()
 | ||
| {
 | ||
| 	global $g_options;
 | ||
| 	if ( defined('PAGE') && PAGE == 'HLSTATS' )
 | ||
| 		include (PAGE_PATH . '/footer.php');
 | ||
| 	elseif ( defined('PAGE') && PAGE == 'INGAME' )
 | ||
| 		include (PAGE_PATH . '/ingame/footer.php');
 | ||
| }
 | ||
| 
 | ||
| /**
 | ||
|  * getSortArrow()
 | ||
|  * 
 | ||
|  * @param mixed $sort
 | ||
|  * @param mixed $sortorder
 | ||
|  * @param mixed $name
 | ||
|  * @param mixed $longname
 | ||
|  * @param string $var_sort
 | ||
|  * @param string $var_sortorder
 | ||
|  * @param string $sorthash
 | ||
|  * @return string Returns the code for a sort arrow <IMG> tag.
 | ||
|  */
 | ||
| function getSortArrow($sort, $sortorder, $name, $longname, $var_sort = 'sort', $var_sortorder =
 | ||
| 	'sortorder', $sorthash = '', $ajax = false)
 | ||
| {
 | ||
| 	global $g_options;
 | ||
| 
 | ||
| 	if ($sortorder == 'asc')
 | ||
| 	{
 | ||
| 		$sortimg = 'sort-ascending.gif';
 | ||
| 		$othersortorder = 'desc';
 | ||
| 	}
 | ||
| 	else
 | ||
| 	{
 | ||
| 		$sortimg = 'sort-descending.gif';
 | ||
| 		$othersortorder = 'asc';
 | ||
| 	}
 | ||
| 	
 | ||
| 	$arrowstring = '<a href="' . $g_options['scripturl'] . '?' . makeQueryString($var_sort, $name,
 | ||
| 		array($var_sortorder));
 | ||
| 
 | ||
| 	if ($sort == $name)
 | ||
| 	{
 | ||
| 		$arrowstring .= "&$var_sortorder=$othersortorder";
 | ||
| 		$jsarrow = "'" . $var_sortorder . "': '" . $othersortorder . "'";
 | ||
| 	}
 | ||
| 	else
 | ||
| 	{
 | ||
| 		$arrowstring .= "&$var_sortorder=$sortorder";
 | ||
| 		$jsarrow = "'" . $var_sortorder . "': '" . $sortorder . "'";
 | ||
| 	}
 | ||
| 
 | ||
| 	if ($sorthash)
 | ||
| 	{
 | ||
| 		$arrowstring .= "#$sorthash";
 | ||
| 	}
 | ||
| 
 | ||
| 	$arrowstring .= '" class="head"';
 | ||
| 	
 | ||
| 	if ( $ajax )
 | ||
| 	{
 | ||
| 		$arrowstring .= " onclick=\"Tabs.refreshTab({'$var_sort': '$name', $jsarrow}); return false;\"";
 | ||
| 	}
 | ||
| 	
 | ||
| 	$arrowstring .= ' title="Change sorting order">' . "$longname</a>";
 | ||
| 
 | ||
| 	if ($sort == $name)
 | ||
| 	{
 | ||
| 		$arrowstring .= ' <img src="' . IMAGE_PATH . "/$sortimg\"" .
 | ||
| 			" style=\"padding-left:4px;padding-right:4px;\" alt=\"$sortimg\" />";
 | ||
| 	}
 | ||
| 
 | ||
| 
 | ||
| 	return $arrowstring;
 | ||
| }
 | ||
| 
 | ||
| /**
 | ||
|  * getSelect()
 | ||
|  * Returns the HTML for a SELECT box, generated using the 'values' array.
 | ||
|  * Each key in the array should be a OPTION VALUE, while each value in the
 | ||
|  * array should be a corresponding descriptive name for the OPTION.
 | ||
|  * 
 | ||
|  * @param mixed $name
 | ||
|  * @param mixed $values
 | ||
|  * @param string $currentvalue
 | ||
|  * @return The 'currentvalue' will be given the SELECTED attribute.
 | ||
|  */
 | ||
| function getSelect($name, $values, $currentvalue = '')
 | ||
| {
 | ||
| 	$select = "<select name=\"$name\" style=\"width:300px;\">\n";
 | ||
| 
 | ||
| 	$gotcval = false;
 | ||
| 
 | ||
| 	foreach ($values as $k => $v)
 | ||
| 	{
 | ||
| 		$select .= "\t<option value=\"$k\"";
 | ||
| 
 | ||
| 		if ($k == $currentvalue)
 | ||
| 		{
 | ||
| 			$select .= ' selected="selected"';
 | ||
| 			$gotcval = true;
 | ||
| 		}
 | ||
| 
 | ||
| 		$select .= ">$v</option>\n";
 | ||
| 	}
 | ||
| 
 | ||
| 	if ($currentvalue && !$gotcval)
 | ||
| 	{
 | ||
| 		$select .= "\t<option value=\"$currentvalue\" selected=\"selected\">$currentvalue</option>\n";
 | ||
| 	}
 | ||
| 
 | ||
| 	$select .= '</select>';
 | ||
| 
 | ||
| 	return $select;
 | ||
| }
 | ||
| 
 | ||
| /**
 | ||
|  * getLink()
 | ||
|  * 
 | ||
|  * @param mixed $url
 | ||
|  * @param integer $maxlength
 | ||
|  * @param string $type
 | ||
|  * @param string $target
 | ||
|  * @return
 | ||
|  */
 | ||
|  
 | ||
| function getLink($url, $type = 'http://', $target = '_blank')
 | ||
| {
 | ||
| 	$urld=parse_url($url);
 | ||
| 
 | ||
| 	if(!isset($urld['scheme']) && (!isset($urld['host']) && isset($urld['path'])))
 | ||
| 	{
 | ||
| 			$urld['scheme']=str_replace('://', '', $type);
 | ||
| 			$urld['host']=$urld['path'];
 | ||
| 			unset($urld['path']);
 | ||
| 	}
 | ||
| 
 | ||
| 	if($urld['scheme']!='http' && $urld['scheme']!='https')
 | ||
| 	{
 | ||
| 			return 'Invalid Url :(';
 | ||
| 	}
 | ||
| 
 | ||
| 	if(!isset($urld['path']))
 | ||
| 	{
 | ||
| 			$urld['path']='';
 | ||
| 	}
 | ||
| 
 | ||
| 	if(!isset($urld['query']))
 | ||
| 	{
 | ||
| 			$urld['query']='';
 | ||
| 	}
 | ||
| 	else
 | ||
| 	{
 | ||
| 			$urld['query']='?' . urlencode($urld['query']);
 | ||
| 	}
 | ||
| 
 | ||
| 	if(!isset($urld['fragment']))
 | ||
| 	{
 | ||
| 			$urld['fragment']='';
 | ||
| 	}
 | ||
| 	else
 | ||
| 	{
 | ||
| 			$urld['fragment']='#' . urlencode($urld['fragment']);
 | ||
| 	}
 | ||
| 
 | ||
| 	$uri=sprintf("%s%s%s", $urld['path'], $urld['query'], $urld['fragment']);
 | ||
| 	$host_uri=$urld['host'] . $uri;
 | ||
| 	return sprintf('<a href="%s://%s%s" target="%s">%s</a>',$urld['scheme'], $urld['host'], $uri, $target, htmlspecialchars($host_uri, ENT_COMPAT));
 | ||
| }
 | ||
| 
 | ||
| /**
 | ||
|  * getEmailLink()
 | ||
|  * 
 | ||
|  * @param string $email
 | ||
|  * @param integer $maxlength
 | ||
|  * @return string Formatted email tag
 | ||
|  */
 | ||
| function getEmailLink($email, $maxlength = 40)
 | ||
| {
 | ||
| 	if (preg_match('/(.+)@(.+)/', $email, $regs))
 | ||
| 	{
 | ||
| 		if (strlen($email) > $maxlength)
 | ||
| 		{
 | ||
| 			$email_title = substr($email, 0, $maxlength - 3) . '...';
 | ||
| 		}
 | ||
| 		else
 | ||
| 		{
 | ||
| 			$email_title = $email;
 | ||
| 		}
 | ||
| 
 | ||
| 		$email = str_replace('"', urlencode('"'), $email);
 | ||
| 		$email = str_replace('<', urlencode('<'), $email);
 | ||
| 		$email = str_replace('>', urlencode('>'), $email);
 | ||
| 
 | ||
| 		return "<a href=\"mailto:$email\">" . htmlspecialchars($email_title, ENT_COMPAT) . '</a>';
 | ||
| 	}
 | ||
| 
 | ||
| 	else
 | ||
| 	{
 | ||
| 		return '';
 | ||
| 	}
 | ||
| }
 | ||
| 
 | ||
| /**
 | ||
|  * getImage()
 | ||
|  * 
 | ||
|  * @param string $filename
 | ||
|  * @return mixed Either the image if exists, or false otherwise
 | ||
|  */
 | ||
| function getImage($filename)
 | ||
| {
 | ||
| 	preg_match('/^(.*\/)(.+)$/', $filename, $matches);
 | ||
| 	$relpath = $matches[1];
 | ||
| 	$realfilename = $matches[2];
 | ||
| 	
 | ||
| 	$path = IMAGE_PATH . $filename;
 | ||
| 	$url = IMAGE_PATH . $relpath . rawurlencode($realfilename);
 | ||
| 
 | ||
| 	// check if image exists
 | ||
| 	if (file_exists($path . '.png'))
 | ||
| 	{
 | ||
| 		$ext = 'png';
 | ||
| 	} elseif (file_exists($path . '.gif'))
 | ||
| 	{
 | ||
| 		$ext = 'gif';
 | ||
| 	} elseif (file_exists($path . '.jpg'))
 | ||
| 	{
 | ||
| 		$ext = 'jpg';
 | ||
| 	}
 | ||
| 	else
 | ||
| 	{
 | ||
| 		$ext = '';
 | ||
| 	}
 | ||
| 
 | ||
| 	if ($ext)
 | ||
| 	{
 | ||
| 		$size = getImageSize("$path.$ext");
 | ||
| 
 | ||
| 		return array('url' => "$url.$ext", 'path' => "$path.$ext", 'width' => $size[0], 'height' => $size[1],
 | ||
| 			'size' => $size[3]);
 | ||
| 	}
 | ||
| 	else
 | ||
| 	{
 | ||
| 		return false;
 | ||
| 	}
 | ||
| }
 | ||
| 
 | ||
| function mystripslashes($text)
 | ||
| {
 | ||
| 	return get_magic_quotes_gpc() ? stripslashes($text) : $text;
 | ||
| }
 | ||
| 
 | ||
| function getRealGame($game)
 | ||
| {
 | ||
| 	global $db;
 | ||
| 	$result = $db->query("SELECT realgame from hlstats_Games WHERE code='$game'");
 | ||
| 	list($realgame) = $db->fetch_row($result);
 | ||
| 	return $realgame;
 | ||
| }
 | ||
| 
 | ||
| function printSectionTitle($title)
 | ||
| {
 | ||
| 	echo '<span class="fHeading"> <img src="'.IMAGE_PATH."/downarrow.gif\" alt=\"\" /> $title</span><br /><br />\n";
 | ||
| }
 | ||
| 
 | ||
| function getStyleText($style)
 | ||
| {
 | ||
| 	return "\t<link rel=\"stylesheet\" type=\"text/css\" href=\"./css/$style.css\" />\n";
 | ||
| }
 | ||
| 
 | ||
| function getJSText($js)
 | ||
| {
 | ||
| 	return "\t<script type=\"text/javascript\" src=\"".INCLUDE_PATH."/js/$js.js\"></script> \n";
 | ||
| }
 | ||
| 
 | ||
| function get_player_rank($playerdata) {
 | ||
| 	global $db, $g_options;
 | ||
| 	
 | ||
| 	$rank = 0;
 | ||
| 	$tempdeaths = $playerdata['deaths'];
 | ||
| 	if ($tempdeaths == 0)
 | ||
| 		$tempdeaths = 1;
 | ||
| 
 | ||
| 	$query = "
 | ||
| 		SELECT
 | ||
| 			COUNT(*)
 | ||
| 		FROM
 | ||
| 			hlstats_Players
 | ||
| 		WHERE
 | ||
| 			game='".$playerdata['game']."'
 | ||
| 			AND hideranking = 0
 | ||
| 			AND (
 | ||
| 					(".$g_options['rankingtype']." > '".$playerdata[$g_options['rankingtype']]."') OR (
 | ||
| 						(".$g_options['rankingtype']." = '".$playerdata[$g_options['rankingtype']]."') AND (kills/IF(deaths=0,1,deaths) > ".($playerdata['kills']/$tempdeaths).")
 | ||
| 					)
 | ||
| 			)
 | ||
| 	";
 | ||
| 	$db->query($query);
 | ||
| 	list($rank) = $db->fetch_row();
 | ||
| 	$rank++;
 | ||
| 
 | ||
| 	return $rank;
 | ||
| }
 | ||
| 
 | ||
| if (!function_exists('file_get_contents')) {
 | ||
|       function file_get_contents($filename, $incpath = false, $resource_context = null)
 | ||
|       {
 | ||
|           if (false === $fh = fopen($filename, 'rb', $incpath)) {
 | ||
|               trigger_error('file_get_contents() failed to open stream: No such file or directory', E_USER_WARNING);
 | ||
|               return false;
 | ||
|           }
 | ||
|   
 | ||
|           clearstatcache();
 | ||
|           if ($fsize = @filesize($filename)) {
 | ||
|               $data = fread($fh, $fsize);
 | ||
|           } else {
 | ||
|               $data = '';
 | ||
|               while (!feof($fh)) {
 | ||
|                   $data .= fread($fh, 8192);
 | ||
|               }
 | ||
|           }
 | ||
|   
 | ||
|           fclose($fh);
 | ||
|           return $data;
 | ||
|       }
 | ||
| }
 | ||
| 
 | ||
| /**
 | ||
|  * Convert colors Usage:  color::hex2rgb("FFFFFF")
 | ||
|  * 
 | ||
|  * @author      Tim Johannessen <root@it.dk>
 | ||
|  * @version    1.0.1
 | ||
|  */
 | ||
| function hex2rgb($hexVal = '')
 | ||
| {
 | ||
| 	$hexVal = preg_replace('[^a-fA-F0-9]', '', $hexVal);
 | ||
| 	if (strlen($hexVal) != 6)
 | ||
| 	{
 | ||
| 		return 'ERR: Incorrect colorcode, expecting 6 chars (a-f, 0-9)';
 | ||
| 	}
 | ||
| 	$arrTmp = explode(' ', chunk_split($hexVal, 2, ' '));
 | ||
| 	$arrTmp = array_map('hexdec', $arrTmp);
 | ||
| 	return array('red' => $arrTmp[0], 'green' => $arrTmp[1], 'blue' => $arrTmp[2]);
 | ||
| }
 | ||
| 
 | ||
| ?>
 |