<?php

/**
 * RuneScapeStats class
 * 
 * Haalt de rankings van een runescapespeler uit de
 * hiscore-tabellen op www.runescape.com .
 * let op: de array die deze class geeft ziet er iets
 * anders uit dan die van de vorige versie. Onthoud
 * jezelf er vooral niet van om dit script te tweaken
 * naar je wensen.
 * 
 * @author Rolf de Jong, rolfthajong@gmail.com
 * @copyright Doe ermee wat je wilt, zolang deze header intact blijft! En een verwijzinkje is ook altijd leuk ;)
 *
 * @example 
$RS = new RuneScapeStats('Weed Tiger');
$RS->getSource();
$RS->parseArray();
$stats = $RS->getResult();

echo <<<HTML
<table>
    <tr>
        <td><b>Skill</b></td><td><b>Rank</b></td><td><b>Level</b></td><td><b>XP</b></td>
    </tr>
HTML;
foreach($stats as $values){
	echo "<tr>\n";
	echo '<td>'.$values['skill'].'</td>';
	echo '<td>'.$values['rank'].'</td>';
	echo '<td>'.$values['level'].'</td>';
	echo '<td>'.$values['xp']."</td>\n";
	echo "</tr>\n";
}
echo '</table>';

 */
class RuneScapeStats {
    
    /**
     * Het domein van de runescape server
     * 
     * @access public
     * @var string
     */
    var $server = 'hiscore-web.runescape.com';
    
    /**
     * De relatieve url om bij het juiste bestand 
     * op de server te komen
     * 
     * @access public
     * @var string
     */
    var $relURL = 'lang/en/aff/runescape/hiscorepersonal.ws';
    
    /**
     * Gebruikersnaam van de speler waarvan de stats
     * opgevraagt moeten worden
     * 
     * @access public
     * @var string
     */
     var $user;
    
    /**
     * Dit is de variabele waar de verkregen data uiteindelijk
     * in wordt gezet
     * 
     * @access public
     * @var array
     */
    var $statsArray;
    
    /**
     * De skills waar een waarde bij gezocht moet worden
     *
     * @access public
     * @var array
     */
    var $disciplines = array(
        'Overall', 
        'Attack', 
        'Defence', 
        'Strength', 
        'Hitpoints', 
        'Ranged', 
        'Prayer', 
        'Magic', 
        'Cooking', 
        'Woodcutting', 
        'Fletching', 
        'Fishing', 
        'Firemaking', 
        'Crafting', 
        'Smithing', 
        'Mining', 
        'Herblore', 
        'Agility', 
        'Thieving', 
        'Slayer', 
        'Farming', 
        'Runecraft',
        'Hunter',
        'Construction');
    /**
     * true als je debugmessages wilt weergeven, false zo niet
     *e
     * @var bool
     */
    var $debug = false;
    
    var $_httpBody = "";
    var $_source;
    
    /**
     * Constructor method; url-codeert de spelers naam
     * waarvan de stat opgezocht moeten worden
     *
     * @param string $user
     * @return void
     * @access public
     */
    function RunescapeStats($user){
        $this->user = urlencode($user);
    }
    
    /**
     * Haal de benodigde data van de server in html formaat
     * 
     * @return bool
     * @static false
     * @access public
     */    
    function getSource()
    {
        $this->addParam('user1', $this->user);
        $this->addParam('submit', 'Search');
        
        $fp = fsockopen($this->server, 80, $errno, $errstr, 10);
        if(!$fp){
            return false;
        }
        
        $contentLen = strlen($this->_httpBody);
        $req = <<<REQUEST
POST /{$this->relURL} HTTP/1.1
Host: {$this->server}
Referer: http://{$this->server}/{$this->relURL}
Connection: Keep-Alive
Content-Type: application/x-www-form-urlencoded
Content-Length: {$contentLen}

{$this->_httpBody}
REQUEST;
        fwrite($fp, $req);
        $stop = false;
        while (!$stop && !feof($fp)) {
            $fetch = fgets($fp, 128);
            $this->_source.= $fetch;
            if(strstr($fetch, 'This webpage') !== false){
                fwrite($fp, "Connection: close\r\n\r\n");
                fclose($fp);
                $stop = true;
            }        
        }
        return true;
    }
    
    /**
     * Zet alle stats in een array
     *
     * @static false
     * @access public
     * @return void
     */
    function parseArray()
    {
        if (strstr($this->_source, "does not feature in the hiscores")) {
            $this->statsArray = false;
            return;
        }
        
        $i = 1;
        foreach ($this->disciplines as $type) {
         		//echo str_replace("\n", "", $this->_source);
            if( eregi($type . '</a></td><td align="right">([0-9\,]+)</td><td align="right">([0-9]+)</td><td align="right">([0-9\,]+)</td>', str_replace("\n", "", $this->_source), $regs) ){
                // De structuur van de array wordt hier gemaakt, en kun je hier dus ook aanpassen
                $this->statsArray[$i]['skill']  = $type;
              	$this->statsArray[$i]['rank'] = $regs[1];
              	$this->statsArray[$i]['level'] = $regs[2];
              	$this->statsArray[$i]['xp']    = $regs[3];
            } else {
                $this->statsArray[$i]['skill']  = $type;
                $this->statsArray[$i]['rank'] = 0;
			    $this->statsArray[$i]['level'] = 0;
                $this->statsArray[$i]['xp']    = 0;
			}
            $i++;
        }
    }
    
    /**
     * Voeg een parameter toe aan de body
     *
     * @param string $name
     * @param string $value
     * @return void
     * @static false
     * @access public
     */
    function addParam($name, $value)
    {
        strlen($this->_httpBody)<1 ? $this->_httpBody=$name.'='.$value : $this->_httpBody.='&'.$name.'='.$value ;
    }
    
    /**
     * Spuug de gevormde array uit
     *
     * @return array
     */
    function getResult()
    {
        return $this->statsArray;
    }
    
    function execute()
    {
        if ( $this->getSource() ) {
            $this->parseArray();
        } else {
            $this->debug?trigger_error("Fout bij het ophalen van de source"):null;
            $this->statsArray = false;
        }
    }    
}

// Voorbeeldje, dit is de meest saaie toepassing van het script


echo '<form action="http://' . $_SERVER['SERVER_NAME'] . $_SERVER['SCRIPT_NAME'] . '" method="get">';
echo 'Naam:&nbsp;&nbsp;&nbsp;<input type="text" name="naam" value="'.@$_GET['naam'].'" />';
echo '<br /><input type="submit" value="Zoek hiscores" />';
echo '</form><br />';


if(isset($_GET['naam'])){
    $RS = new RuneScapeStats($_GET['naam']);
    $RS->execute();
    $stats = $RS->getResult();

    if ($stats != false) // Als de naam niet in de hiscores voorkomt zal $stats false zijn, ander is $stats een array
    {
        echo <<<HTML
<table>
	<tr>
		<td><b>Skill</b></td><td><b>Rank</b></td><td><b>Level</b></td><td><b>XP</b></td>
	</tr>
HTML;
	    foreach($stats as $values){
	        echo "<tr>\n";
	        echo '<td>'.$values['skill'].'</td>';
			echo '<td>'.$values['rank'].'</td>';
	        echo '<td>'.$values['level'].'</td>';
	        echo '<td>'.$values['xp']."</td>\n";
	        echo "</tr>\n";
	    }
	    echo '</table>';
	}
	else
	{
		echo "Naam niet gevonden in de hiscores";
	}
	
	// var_dump($stats); unescape om de structuur van de array te zien
}
?> 