<?php 
    
/*    Whatpulse Stats to UBB-Code Parser by lucb1e
        Version 3 PRE-ALPHA
        Last modified: See ./
        
        == Credits ==
            - Don Sandros (code, bugreports)
            - ericlegomeer (code, ideas, bugreports)
            - Marcoo (bugreports)
            - djekkoo (ideas)
            - Joszs (ideas)
            - bgm (ideas)
            - Ick In Noot (ideas)
            - @-wout (ideas)
            - Please reply, PM or anything if I forgot to include you! I didn't feel like going trough 150 pages of posts :P I did go trough 50 or something though.
        
        == Licence ==
        Code is completely free* to use for non-commercial** projects as long as credits to lucb1e.com and all the above people are provided.
        Prohibited to use in commercial projects unless otherwise arranged with me via a 3rd-party logged medium such as private messages on GMOT.nl or e-mail (whatpulse@lucb1e.com).
        In the event of a licence change, any copies made before the change will remain under the old licence. You cannot change the licence yourself, even when you make a copy and host it yourself.
        *Free here is meant in the way of: free of charge and free to: modify, use, distribute, et cetera, provided that credits are given as mentioned above.
        **A commercial project is any project that is profited on in the sense of getting money. Wether that is via ads, paid users or another way does not matter.
    */
    
highlight_file(__FILE__);
    exit;
    
header("Content-type: text/html; charset=ISO-8859-1");
    
    if (isset(
$_GET["source"])) {
        
highlight_file(__FILE__);
        exit;
    }
    
    
$starttime = microtime(true);
    
set_time_limit(100);
    
$WPStatsParser = true;
    
$noratios = !isset($_GET["enableratios"]);
    
    function 
formatNumber($number, $decimals = 0) {
        return 
str_replace("9.999.999", "[abbr=Sjongejonge, er kan tegenwoordig geen key meer vanaf hè... De jeugd van tegenwoordig...]9.999.999[/abbr]", 
                    
preg_replace("/^1\\.337$/", "[abbr=1337][b]leet[/b][/abbr]", preg_replace("/^1\\,337$/", "[abbr=1337][b]leet[/b][/abbr]",
                        
str_replace("1.787.569", "[abbr=1.787.569 ofwel 1337²][b]leet^2!!![/b][/abbr]",
                            
number_format($number, $decimals, ",", ".")))));
    }
    function 
generateDatetime($timestamp) {
        
$dagen[1] = "maandag";
        
$dagen[2] = "dinsdag";
        
$dagen[3] = "woensdag";
        
$dagen[4] = "donderdag";
        
$dagen[5] = "vrijdag";
        
$dagen[6] = "zaterdag";
        
$dagen[7] = "zondag";

        
$maanden[1] = "januari";
        
$maanden[2] = "februari";
        
$maanden[3] = "maart";
        
$maanden[4] = "april";
        
$maanden[5] = "mei";
        
$maanden[6] = "juni";
        
$maanden[7] = "juli";
        
$maanden[8] = "augustus";
        
$maanden[9] = "september";
        
$maanden[10] = "oktober";
        
$maanden[11] = "november";
        
$maanden[12] = "december";
        
        return 
$dagen[date("N", $timestamp)] . date(" j ", $timestamp) . $maanden[date("n", $timestamp)] . date(" Y", $timestamp);
    }
    
    require_once(
"sqlconn.php");
    
    
$globaldata = $q("SELECT * FROM globalstats") or die("Error in query 100."); //this file has errorvalues >= 100 because this is the second file to use this kind of errormessages. This way it is clear which file is bugging, and the first file can use up to 99 errormessages.
    
$globaldata = $fetcharray($globaldata);
    
    if (
$globaldata["statstill"] + (3600 * 24) < time()) { //whether the stats have expired; 24 hours have passed since the last statistics update
        
if (!file_exists("database_locked.php"))
            require_once(
"update_stats.php");
        
        
$globaldata = $q("SELECT * FROM globalstats") or die("Error in query 102.");
        
$globaldata = $fetcharray($globaldata);
    }
    
    
$statstill = $globaldata["statstill"];
    
$statsfrom = $globaldata["statsfrom"];
    
$totalkeys = $globaldata["keys"];
    
$totalkeysdiff = $globaldata["keysdiff"];
    
$totalclicks = $globaldata["clicks"];
    
$totalclicksdiff = $globaldata["clicksdiff"];
    
$totalmiles = $globaldata["miles"];
    
$totalmilesdiff = $globaldata["milesdiff"];
    
$totalmembers = $globaldata["members"];
    
$totalmembersdiff = $globaldata["members"] - $globaldata["prevmembers"];
    
    
$usernum = 0;
    
$userdata = $q("SELECT id, latestrank, prevrank, username, lastpulse, prevpulse, latestkeys, latestkeysdiff, latestclicks, latestclicksdiff, latestmiles, latestmilesdiff, status FROM users WHERE status!=4 ORDER BY latestkeys DESC") or die("Error in query 101.");
    while (
$user = $fetcharray($userdata)) {
        
$result[$usernum]["id"]        = $user["id"];
        
$result[$usernum]["rank"]      = $user["latestrank"];
        
$result[$usernum]["rankdiff"]  = $user["latestrank"] - $user["prevrank"];
        
$result[$usernum]["name"]      = $user["username"];
        
$result[$usernum]["prevpulse"] = $user["prevpulse"];
        
$result[$usernum]["lastpulse"] = $user["lastpulse"];
        
$result[$usernum]["keys"]      = $user["latestkeys"];
        
$result[$usernum]["keysdiff"]  = $user["latestkeysdiff"];
        
$result[$usernum]["clicks"]    = $user["latestclicks"];
        
$result[$usernum]["clicksdiff"]= $user["latestclicksdiff"];
        
$result[$usernum]["miles"]     = $user["latestmiles"] / 1000;
        
$result[$usernum]["milesdiff"] = $user["latestmilesdiff"] / 1000;
        
$result[$usernum]["status"]    = $user["status"];
        
$usernum++;
    }
    
    
$milestone = array(
        array(
'name' => 'Newb',       'keyvalue' =>        10),
        array(
'name' => 'Hout',       'keyvalue' =>    100000),
        array(
'name' => 'Kool',       'keyvalue' =>    250000),
        array(
'name' => 'Klei',       'keyvalue' =>    500000),
        array(
'name' => 'Steen',      'keyvalue' =>   1000000),
        array(
'name' => 'Metaal',     'keyvalue' =>   2500000),
        array(
'name' => 'Brons',      'keyvalue' =>   5000000),
        array(
'name' => 'Zilver',     'keyvalue' =>   7500000),
        array(
'name' => 'Goud',       'keyvalue' =>  10000000),
        array(
'name' => 'Titanium',   'keyvalue' =>  25000000),
        array(
'name' => 'Diamant',    'keyvalue' =>  50000000),
        array(
'name' => 'Platina',    'keyvalue' =>  75000000),
        array(
'name' => 'Kryptonite', 'keyvalue' => 100000000)
    );
    
$currentmilestone = count($milestone) - 1;
    
    
$miles2km = "1.609344";
    
    
//header, table start, and tableheader
    
echo "[b][size=14pt]Statistieken gegenereerd op " . generateDatetime($statstill) . " [/size](" . date("H:i:s", $statstill) . ")<br>Er is geteld vanaf " . generateDatetime($statsfrom) . " " . date("H:i:s", $statsfrom) . ".<br><br>";
    echo 
"[table][tr][td][b]#       [/td][td][b]Gebruikersnaam[/td][td][b]Keys                              [/td][td][b]Kliks                          [/td][td][b]Kilometers[/td]" . (!$noratios ? "[td][b]Keys:Kliks[/td][td][b]Kliks:KM[/td]" : "") . "[/tr]";
    
    
//skip milestones till someone is in the $currentmilestone, then echo it
    
while ($result[0]["keys"] < $milestone[$currentmilestone]["keyvalue"]) {
        
$currentmilestone--;
    }
    echo 
"[tr][td][/td][td][b]" . $milestone[$currentmilestone]["name"] . " (" . number_format($milestone[$currentmilestone]["keyvalue"], 0, ",", ".") . ")[/td][td][/td][td][/td][td][/td]" . (!$noratios ? "[td][/td][td][/td]" : "") . "[/tr]";
    
    
//find the highest pulse
    
$highestkeys   = 0;
    
$highestclicks = 0;
    
$highestmiles  = 0;
    foreach (
$result as $key=>$user) {
        if (
$user["status"] != 2) {
            
            
//Fix the keycount of people who left only temporarily
            
$can_get_highest = true;
            if (
$user["status"] == 5) {
                
$prevkeys = mysql_query("SELECT updatedvalue FROM keyupdates WHERE userid=$user[id] ORDER BY timestamp DESC LIMIT 1,1") or die("Error in query 110");
                if (
mysql_num_rows($prevkeys) == 1) {
                    
$prevkeys = mysql_fetch_row($prevkeys);
                    
$result[$key]['keysdiff'] = $user["keys"] - $prevkeys[0];
                    
$user["keysdiff"] = $result[$key]["keysdiff"];
                }
                else {
                    
$can_get_highest = false;
                }
            }
            
            if (
$can_get_highest) {
                
$highestkeys   = max($highestkeys,   $user["keysdiff"]);
                
$highestclicks = max($highestclicks, $user["clicksdiff"]);
                
$highestmiles  = max($highestmiles,  $user["milesdiff"]);
            }
        }
    }
    
    
$leftusers  = array(); // Who left the subteam
    
$rankoffset = 0; // For fixing the ranks when someone joins or leaves
    
$spaarders = 0; // Number of people who haven't pulsed yesterday or longer
    
    //for all users...
    
foreach($result as $index=>$user) {
        
// Check if the user left, if yes put him/her in the $leftusers array and skip the rest of the code
        
if ($user["status"] == 2) {
            
$leftusers[] = $user;
            
$rankoffset++;
            continue;
        }
        if (
$user["status"] == 1 && $user["keys"] > 151000) {
            
$rankoffset--;
        }
        
$user["rankdiff"] += $rankoffset;
        
        
// If the stats need to be compact, only include people who pulsed fairly recently
        
if (isset($_GET["compact"]))
            if (
$user["prevpulse"] < strtotime("5 weeks ago"))
                continue;
        
        
// If they got the hightest keys/click/miles, change the color
        
$keyscolor   = ($highestkeys   == $user["keysdiff"]   ? "blue" : "green");
        
$clickscolor = ($highestclicks == $user["clicksdiff"] ? "blue" : "green");
        
$milescolor =  ($highestmiles  == $user["milesdiff"]  ? "blue" : "green");
        
        
// Check if they got enough keys to be in the list at all (enough for the lowest rank)
        
if ($user["keys"] >= $milestone[0]["keyvalue"]) {
            
            
// Check if the user isn't in the next (lower) milestone class
            
if ($user["keys"] < $milestone[$currentmilestone]["keyvalue"]) {
                
$currentmilestone--;
                echo 
"[tr][td][/td][td][b]" . $milestone[$currentmilestone]["name"] . " (" . number_format($milestone[$currentmilestone]["keyvalue"], 0, ",", ".") . ")[/td][td][/td][td][/td][td][/td]" . (!$noratios ? "[td][/td][td][/td]" : "") . "[/tr]";
            }
            
            
// Create the rankvalue (+x, -x or just x, where x is the rank)
            
if ($user["rankdiff"] != 0) {
                if (
$user["rankdiff"] > 0) {
                    
$rankdiffstr = "[red][b][abbr=-" . $user["rankdiff"] . "]" . $user["rank"];
                }
                else {
                    
$rankdiffstr = "[green][b][abbr=+" . abs($user["rankdiff"]) . "]" . $user["rank"];
                    if (
$user["rank"] >= 100 && $user["rankdiff"] < -5) {
                        
$rankdiffstr .= "!";
                    }
                    else if (
$user["rank"] >= 60 && $user["rank"] < 100 && $user["rankdiff"] < -3) {
                        
$rankdiffstr .= "!";
                    }
                    else if (
$user["rank"] >= 30 && $user["rank"] < 60 && $user["rankdiff"] < -2) {
                        
$rankdiffstr .= "!";
                    }
                    else if (
$user["rank"] >= 10 && $user["rank"] < 30 && $user["rankdiff"] < -1) {
                        
$rankdiffstr .= "!";
                    }
                    else if (
$user["rank"] < 10 && $user["rankdiff"] < 0) {
                        
$rankdiffstr .= "!";
                    }
                }
            }
            else {
                
// The user may not have changed rank, but would he have if the person above him hadn't pulsed?
                // Ex: 25 User1 15.000 +10.000  If this pulse hadn't occured,
                //     26 User2 14.000 +11.000  the 11.000 pulse would have been enough for a +1 rank
                
if ($index > 0 && $result[$index - 1]["keys"] - $result[$index - 1]["keysdiff"] < $user["keys"] && $user["keysdiff"] > 0) {
                    
$rankdiffstr = "[color=#F70][abbr=Denied!]" . $user["rank"];
                }
                else {
                    
$rankdiffstr = $user["rank"];
                }
            }
            
            
// Set the variable for the keypulse of this user
            // Also handles saved pulses
            
if ($user["keysdiff"] > 0) { // They pulsed keys
                
$keysdiffstr = " [$keyscolor]+" . formatNumber($user["keysdiff"]);
                if (
$user["prevpulse"] < $statsfrom - 3600 * 24) { // They haven't pulsed within the past 24 hours
                    
$spaarders++;
                    
$days = round(($user["lastpulse"] - $user["prevpulse"]) / 3600 / 24);
                    
$keysdiffstr = " [abbr=Verdeeld over " . round($days) . " dagen, gemiddeld " . number_format(round($user["keysdiff"] / $days), 0, ",", ".") . "keys/dag]" . $keysdiffstr . "[color=#aaa]*";
                }
            }
            else {
                
$keysdiffstr = ""; // Empty it to be sure not to use the value from the previous user.
            
}
            
            
// Set the $clicksdiff and $milesdiff variables (milesdiff in in kilometers)
            
$clicksdiffstr = $user["clicksdiff"] > 0 ? " [$clickscolor]+" . formatNumber($user["clicksdiff"], 0, ",", ".") : "";
            
$milesdiffstr = $user["milesdiff"] > 0 ? " [$milescolor]+" . formatNumber($user["milesdiff"] * $miles2km, 3, ",", ".") : "";
            
            
// Check if the user has changed milestone by their last keypulse
            
$milestoneup = $milestone[$currentmilestone]["keyvalue"] + $user["keysdiff"] > $user["keys"] && $currentmilestone > 0
                                
? "[abbr=Mijlpaal bereikt: " . $milestone[$currentmilestone]["name"] . "!][img]http://is.gd/6aftPs[/img] "
                                
: "";
            
            if (!
$noratios) {
                
// Calculate the key:click and click:km ratio's
                
$keysperclick = round(10 / ($user["clicks"] / $user["keys"])) . ":10";
                
$clicksperkm  = round(1 / ($user["miles"] * $miles2km / $user["clicks"])) . ":1";
            }
            
            
// Check if this is a new user
            
$nameprefix = $user["status"] == 1 ? "[abbr=Nieuw lid, welkom!][i]" : "";
            
            
// Finally, echo the user.
            
echo "[tr]";
                echo 
"[td]" . $rankdiffstr . "[/td]";
                echo 
"[td]" . $milestoneup . $nameprefix . str_replace(":D", ":[b][/b]D", str_replace("[", "[[b][/b]", $user["name"])) . "[/td]";
                echo 
"[td]" . formatNumber($user["keys"], 0) . $keysdiffstr . "[/td]";
                echo 
"[td]" . formatNumber($user["clicks"], 0) . $clicksdiffstr . "[/td]";
                echo 
"[td]" . formatNumber($user["miles"] * $miles2km, 3) . $milesdiffstr . "[/td]";
                echo (!
$noratios ? "[td]" . $keysperclick . "[/td][td]" . $clicksperkm . "[/td]" : "");
            echo 
"[/tr]";
            
            
// He hasn't pulsed either keys or clicks? Let's count him as "hasn't pulsed".
            
if ($user["clicksdiff"] + $user["keysdiff"] == 0) {
                
$notpulsed++;
            }
        }
        else { 
// They got a lower keycount than the minimum required to be displayed in the list (which is the number of keys required to obtain the Newb rank)
            
$nullmembers++;
        }
        
        if (
$user["status"] == "5") {
            
$returnedusers[] = $user;
            
$rankoffset--;
        }
    }
    echo 
"[/table]";
    
    
//Set the total-difference variables for...
    //members
    
if ($totalmembersdiff != 0) {
        if (
$totalmembersdiff > 0) {
            
$memberdiff = " [green]+" . $totalmembersdiff . "[/green]";
        }
        else {
            
$memberdiff = " [red]" . $totalmembersdiff . "[/red]";
        }
    }
    
    
//keys
    
if ($totalkeysdiff > 0) {
        
$totalkeysdiffstr = "[green]+" . formatNumber($totalkeysdiff);
    }
    else {
        if (
$totalkeysdiff < 0) {
            
$totalkeysdiffstr = "[red]" . formatNumber($totalkeysdiff);
        }
    }
    
    
//clicks
    
if ($totalclicksdiff > 0) {
        
$totalclicksdiffstr = "[green]+" . formatNumber($totalclicksdiff);
    }
    else {
        if (
$totalclicksdiff < 0) {
            
$totalclicksdiffstr = "[red]" . formatNumber($totalclicksdiff);
        }
    }
    
    
//and miles
    
if ($totalmilesdiff > 0) {
        
$totalmilesdiffstr = "[green]+" . number_format($totalmilesdiff / 1000 * $miles2km, 3, ",", ".");
    }
    else {
        if (
$totalmilesdiff < 0) {
            
$totalmilesdiffstr = "[red]" . number_format($totalmilesdiff / 1000 * $miles2km, 3, ",", ".");
        }
    }
    
    
//echo the footer with members who left and totals and such
    
if (count($leftusers) > 0) {
        echo 
"<br><br>[i]";
        foreach (
$leftusers as $leftuser) {
            echo 
"#" . $leftuser["rank"] . ": " . $leftuser["name"] . " heeft besloten ons te verlaten :(.<br>";
        }
        echo 
"[/i]";
    }
    if (
count($returnedusers) > 0) {
        echo 
"<br><br>[i]";
        foreach (
$returnedusers as $returneduser) {
            echo 
"#$returneduser[rank]: $returneduser[name] weet niet wat hij wil. Eerst gaat hij weg, vervolgens komt hij er weer bij...<br>";
        }
    }
    
    
$pulsedtoday = $totalmembers - $notpulsed - $nullmembers;
    
    echo 
"<br><br>[b]Totalen:[/b][table]";
    echo 
"[tr][td]Keys:[/td][td]" . formatNumber($totalkeys) . " " . $totalkeysdiffstr . "[/td][/tr]";
    echo 
"[tr][td]Kliks:[/td][td]" . formatNumber($totalclicks) . " " . $totalclicksdiffstr . "[/td][/tr]";
    echo 
"[tr][td]Kilometers:  [/td][td]" . number_format($totalmiles * $miles2km, 3, ",", ".") . " " . $totalmilesdiffstr . "[/td][/tr][/table]";
    echo 
"[table]Aantal leden: [abbr=Hiervan hebben er $nullmembers nooit gepulsed, en staan dus niet in de lijst]" . $totalmembers . "[/abbr]" . $memberdiff . "<br>";
    echo 
"Aantal leden die vandaag pulsten: $pulsedtoday (" . (round($pulsedtoday / ($totalmembers / 1000)) / 10) . "%)<br />";
    echo 
"Aantal [abbr=Mensen die hun pulse meerdere dagen hebben opgespaard]spaarders[/abbr]: $spaarders (" . round($spaarders / $pulsedtoday * 100) . "%)";
    
    if (isset(
$_GET["extrastats"])) {
        
//get topics on gmot to use in the clicks-through-gmot-topics statistic
        
$topics = file_get_contents("http://www.gmot.nl/index.php?action=stats");
        
$topics = explode("Totaal aantal topics:", $topics);
        
$topics = explode("</td>", $topics[1]);
        
$topics = trim($topics[1], "\x00..\x2F \x3A..\xFF");
        
        echo 
"<br><br>";
        echo 
"Aantal keer de aarde rond: " . formatNumber($totalmiles * $miles2km / 40075) . "x<br>";
        echo 
"Aantal keer naar de maan en terug: " . formatNumber($totalmiles * $miles2km / 768900) . "x<br>";
        echo 
"Aantal keer het complete werk van Shakespeare getypt: " . formatNumber($totalkeys / 4510588) . "x<br>";
        echo 
"Aantal keer door alle topics van GMOT heen geklikt: " . formatNumber($totalclicks / intval($topics)) . "x";
    }
    
    
$scriptlocation = "http://lucb1e.com/rp/whatpulse/stats.php";
    
    
//footer met links en generatietijd/grootte
    
echo "<br><br>[url=http://lucb1e.com/rp/whatpulse/gotoprofile.php]Gebruiker opzoeken[/url] - "
       
. "[url=$scriptlocation]Deze statistieken[/url] ([url=$scriptlocation?compact]compact[/url] | [url=$scriptlocation?source]broncode[/url]) - "
       
. "[url=http://dpcpulse.nl/subteam/32]Stats op dpcpulse.nl[/url]";
    
    
//echo " [size=7pt][color=#aaa]- Generatietijd: " . (round((microtime(true) - $starttime) * 100000) / 100) . "ms - Grootte van post: ~" . (strlen($output) + 300) . "bytes";
     //erin laten? Eigenlijk niet echt interessant genoeg