<?php 
// slapper_stats.php
include("slapper_settings.php");

$sql mysql_connect($dbhost$user$password) or die(mysql_error());
mysql_select_db($database$sql);

function 
process_stats() {
    global 
$sql$visits$today;
    global 
$user_http_referer$use_remote_host;
    global 
$uhosts$visits$statlog$agentlog;
    global 
$hostname_match_tolerance$ban_user_color$known_user_color;
    
    
// how many days of stats do we have to process?
    
$daycount 0;
    
$query "SELECT DISTINCT(day) FROM $visits WHERE day < '$today'";
    
    
$res mysql_query($query$sql) or die("Stats 1: " mysql_error());
    
$numdays mysql_num_rows($res);
    for(
$i=0$i<$numdays$i++) {
        
$row mysql_fetch_row($res);
        
$days[$daycount] = $row[0];
        
$daycount++;
    }
    
    
// how many different pages are we tracking?
    
$pagecount 0;
    
$res mysql_query("SELECT DISTINCT(page) FROM $visits"$sql)
            or die(
"Stats 2: " mysql_error());
    
$numpages mysql_num_rows($res);
    for(
$i=0$i<$numpages$i++) {
        
$row mysql_fetch_row($res);
        
$pages[$pagecount] = $row[0];
        
$pagecount++;
    }
    
    
//
    // check for dates that need to be processed
    //
    
if($numdays 0) {
        
// we have dates to process
        
for($i=0$i<$numdays$i++) {
            
$thisday $days[$i];
            
$pageloads 0;
            
$visitors 0;

            for(
$j=0$j<$numpages$j++) {
                
// for each date each page..
                
$thispage $pages[$j];
                
$query "SELECT * FROM $visits WHERE page='$thispage' AND day='$thisday'";
                
$res mysql_query($query$sql) or die("Stats 3: " mysql_error());
                
                while( (
$obj mysql_fetch_object($res)) != NULL) {
                    
$r mysql_query("SELECT useragent FROM $uhosts WHERE ip='$obj->ip'"$sql)
                            or die(
"Stats 4: " mysql_error());
                    
$row mysql_fetch_row($r);
                    
$agent $row[0];
                    
                    
// make sure agent isn't blank
                    
if(strlen($agent) < 1) {
                        
$agent "Undeclared";
                    }
                    
                    
$r mysql_query("SELECT * FROM $agentlog WHERE agent='$agent'"$sql)
                            or die(
"Stats 5: " mysql_error());
                    if(
mysql_num_rows($r) > 0) {
                        
// agent has visited before, count hits
                        
$query "UPDATE $agentlog SET hits = hits + $obj->hits";
                    } else {
                        
// first time agent visit
                        
$query "INSERT INTO $agentlog VALUES('$agent', '$obj->hits')";
                    }
                    
mysql_query($query$sql) or die("Stats 6: " mysql_error());
                }
                
// get number of unique visitors for this day and page
                
$query "SELECT COUNT(DISTINCT(ip)) FROM $visits WHERE day='$thisday' ";
                
$query .= "AND page='$thispage'";
                
$res mysql_query($query$sql) or die("Stats 6.5: " mysql_error());
                
$row mysql_fetch_row($res);
                
$visitors $row[0];
                
                
// get number of pageloads for this day and page
                
$query "SELECT SUM(hits) FROM $visits WHERE day='$thisday' ";
                
$query .= "AND page='$thispage'";
                
$res mysql_query($query$sql) or die("Stats 6.6: " mysql_error());
                
$row mysql_fetch_row($res);
                
$pageloads $row[0];
                
                
$query "INSERT INTO $statlog VALUES('$thisday', '$thispage', ";
                
$query .= "'$visitors', '$pageloads')";
                
mysql_query($query$sql) or die("Stats 7: " mysql_error());
            } 
// for($j)
            
            // done processing $thisday, delete the stats
            
mysql_query("DELETE FROM $visits WHERE day='$thisday'"$sql)
                    or die(
"Stats 7.1: " mysql_error());
            
        } 
// for($i)
    
// if($numdays)
}

function 
hitlist($range 0) {
    global 
$sql$visits$today;
    global 
$user_http_referer$use_remote_host;
    global 
$uhosts$visits$statlog$agentlog;
    global 
$hostname_match_tolerance$ban_user_color$known_user_color;

    
$res mysql_query("SELECT DISTINCT(page) FROM $statlog"$sql)
            or die(
"hitlist 1: " mysql_error());
    
$allpages 0;
    
    if( (
$numpages mysql_num_rows($res)) > 0) {
        while( (
$row mysql_fetch_row($res)) != NULL) {
            
$pages[$allpages] = $row[0];
            
$allpages++;
        }
        
// output table title
        
print("<table border=\"1\">");
        print(
"<tr><td>Date</td><td>Visitors</td><td>Pageloads</td></tr>\n");
    
        for(
$i=0$i<$numpages$i++) {
            
$thispage $pages[$i];
            print(
"<tr><td colspan=\"3\" align=\"center\"><b>$thispage</b></td></tr>\n");
            
            
// output today's so-far stuff
            
$res mysql_query("SELECT COUNT(DISTINCT(ip)) FROM $visits WHERE day='$today' AND page='$thispage'"$sql)
                    or die(
"hitlist 3: " mysql_error());
            
$row mysql_fetch_row($res);
            
$sofarVisits $row[0];
            
            
$res mysql_query("SELECT SUM(hits) FROM $visits WHERE day='$today' AND page='$thispage'"$sql)
                    or die(
"hitlist 4: " mysql_error());
            
$row mysql_fetch_row($res);
            
$sofarHits $row[0];
            
            print(
"<tr><td>So far today</td><td>$sofarVisits</td><td>$sofarHits</td></tr>\n");
            
            
// get older info from statlog
            
$query "SELECT * FROM $statlog WHERE page='$thispage' ORDER BY day DESC";
            if(
$range 0) {
                
// limit dates to previous $range days
                
$query .= " LIMIT $range";
            }
            
            
$res mysql_query($query$sql) or die("hitlist 2: " mysql_error());
            while( (
$obj mysql_fetch_object($res)) != NULL) {
                print(
"<tr><td>$obj->day</td><td>$obj->visitors</td><td>$obj->pageloads</td></tr>\n");
            }

            print(
"<tr><td colspan=\"3\">&nbsp;</td></tr>");
        }
        
// printer footer row as well
        
print("<tr><td>Date</td><td>Visitors</td><td>Pageloads</td></tr>\n");
        print(
"</table><br/><br/>\n");
    }
}

function 
useragents() {
    global 
$sql$visits$today;
    global 
$user_http_referer$use_remote_host;
    global 
$uhosts$visits$statlog$agentlog;
    global 
$hostname_match_tolerance$ban_user_color$known_user_color;


    
$res mysql_query("SELECT * FROM $agentlog"$sql) or die("Stats 10: " mysql_error());
    if(
mysql_num_rows($res) > 0) {
        print(
"<table border=\"1\"><tr><td><b>User Agents</b></td><td>Hits</td></tr>\n");
        while( (
$obj mysql_fetch_object($res)) != NULL) {
            print(
"<tr><td>$obj->agent</td><td>$obj->hits</td></tr>\n");
        }
        print(
"</table><br/>\n");
    }
}

function 
mostleast() {
    global 
$sql$visits$today;
    global 
$user_http_referer$use_remote_host;
    global 
$uhosts$visits$statlog$agentlog;
    global 
$hostname_match_tolerance$ban_user_color$known_user_color;

    
$res mysql_query("SELECT DISTINCT(page) FROM $statlog"$sql)
            or die(
"mostleast 1: " mysql_error());
    
$allpages 0;
    
    if( (
$numpages mysql_num_rows($res)) > 0) {
        while( (
$row mysql_fetch_row($res)) != NULL) {
            
$pages[$allpages] = $row[0];
            
$allpages++;
        }
    }

    print(
"<table border=\"1\">\n");

    for(
$i=0$i<$numpages$i++) {
        
$thispage $pages[$i];
        
$res mysql_query("SELECT * FROM $statlog WHERE page='$thispage' ORDER BY day"$sql)
                or die(
"mostleast 2: " mysql_error());
        
        print(
"<tr><td colspan=\"3\" align=\"center\"><b>$thispage</b></td></tr>\n");
        
// unique visits
        
$vhighday "";
        
$vlowday "";
        
$vhighest 0;
        
$vlowest 999999// this could fail if(least amount of visitors) > 999,999
        
        // pageloads
        
$phighday "";
        
$plowday "";
        
$phighest 0;
        
$plowest 999999// this could fail if(least amount of pageloads) > 999,999

        
while( ($obj mysql_fetch_object($res)) != NULL) {
            
// test for most visitors
            
if($obj->visitors $vhighest) {
                
$vhighest $obj->visitors;
                
$vhighday $obj->day;
            }
            
            
// test for fewest visitors
            
if($obj->visitors $vlowest) {
                
$vlowest $obj->visitors;
                
$vlowday $obj->day;
            }
            
            
// test for most pageloads
            
if($obj->pageloads $phighest) {
                
$phighest $obj->pageloads;
                
$phighday $obj->day;
            }
            
            
// test for fewest pageloads
            
if($obj->pageloads $plowest) {
                
$plowest $obj->pageloads;
                
$plowday $obj->day;
            }
        }
        
        print(
"<tr><td>Most Unique Hits</td><td>$vhighest</td><td>$vhighday</td></tr>\n");
        print(
"<tr><td>Most Pageloads</td><td>$phighest</td><td>$phighday</td></tr>\n");
        print(
"<tr><td>Fewest Unique Hits</td><td>$vlowest</td><td>$vlowday</td></tr>\n");
        print(
"<tr><td>Fewest Pageloads</td><td>$plowest</td><td>$plowday</td></td></tr>\n");
        print(
"<tr><td colspan=\"3\">&nbsp;</td></tr>\n");
    }
    print(
"</table>\n");
}

function 
visit_today() {
    global 
$sql$visits$today;
    global 
$user_http_referer$use_remote_host;
    global 
$uhosts$visits$statlog$agentlog;
    global 
$hostname_match_tolerance$ban_user_color$known_user_color;

    
$yyyymmdd date("Ymd");
    
$query "SELECT * FROM $uhosts WHERE lastvisit like '$yyyymmdd%'";
    
$res mysql_query($query$sql) or die("visit_today 1: " mysql_error());
    
$numvisitors mysql_num_rows($res);
    
    print(
"<table border=\"1\"><tr><td align=\"center\"><b>Today's Visitors</b> (unique by IP)</td></tr>\n");
    while( (
$obj mysql_fetch_object($res)) != NULL) {
        print(
"<tr><td>");
        if(
$obj->name == "") {
            if(
$obj->hostname == "") {
                
$user $obj->ip;
            } else {
                
$user $obj->hostname;
            }
        } else {
            if(
$obj->ban == "n") {
                
$user "<font color=\"$known_user_color\">";
            } else {
                
$user "<font color=\"$ban_user_color\">";
            }
            
$user .= $obj->name "</font>";
        }        
        print(
"$user</td></tr>\n");
    }
    print(
"</table>\n");
    
// footer
    
print("<font size=\"-1\">\n");
    print(
"If you are unknown, <a href=\"http://bogomip.net/writemessage.html\">message ");
    print(
"me</a> with your name and IP and I'll fix it!</font>\n");
}

function 
welcome($page "") {
    
// provide a page name for a specific check whether client
    //    has been on THIS page today
    
global $sql$visits$today;
    global 
$user_http_referer$use_remote_host;
    global 
$uhosts$visits$statlog$agentlog;
    global 
$hostname_match_tolerance$ban_user_color$known_user_color;

    
$ip $_SERVER['REMOTE_ADDR'];
    
$query "SELECT * FROM $uhosts WHERE ip='$ip'";
    
$res mysql_query($query$sql) or die("welcome 1: " mysql_error());
    
$obj mysql_fetch_object($res);
    
    if(
$obj->name != "") {
        print(
"Welcome back $obj->name!\n");
    } else {
        
// try to find a similar hostname in the database
        
$hnlen strlen($obj->hostname);
        
$try substr($obj->hostname$hnlen $hostname_match_tolerance);
        
$query "SELECT name FROM $uhosts WHERE hostname LIKE '%try'";
        
$res mysql_query($query$sql) or die("welcome 2: " mysql_error());
        if(
mysql_num_rows($res) > 0) {
            
$row mysql_fetch_row($res);
            if(
strlen($row[0]) > 0) {
                
$name $row[0];
                print(
"I'm not sure who you are, but I think you may be $name\n");
            } else {
                
// no names recorded for any similar hostnames
                
print("Sorry, I've seen similar visitors, but don't know who you are\n");
            }
        } else {
            
// no other entries in the database
            
print("Sorry, I have no idea who you are\n");
        }
    }
    
    
$query "SELECT * FROM $visits WHERE ip='$ip'";
    if(
$page != "") {
        
$query .= " AND page='$page'";
    }
    
$res mysql_query($query$sql) or die("welcome 3: " mysql_error());
    if( (
$obj mysql_fetch_object($res)) != NULL) {
        print(
"I saw you ");
        if(
$page != "") {
            print(
"<b>on this page</b> ");
        }
        print(
"earlier today");
    }
}
?>