PX : code

Monthly bandwidth limiter and download counter v by Ben Squibb
Download this code


<?php 

// Monthly bandwidth limiter and download counter script by StatMat - v1.2 - 08/07/2003 
// This version has a few bug fixes and now prevents referred downloads. 
// PHP version required : 4 
// Download link href usage : <a href="http://www.mametrix.com/download.php?file=rom.zip">Click me</a> 
// Admin usage : http://www.mametrix.com/download.php?admin=1 
// Note : the script tries to create any of the counter.* files below if they do not exist. 
// However some servers may not allow the use of the "w" flag with fopen unless the file already exists. 
// If this is the case on your server, you must upload the empty versions included in the script zipfile. 

function MessageBox($msg$exit) { 
    echo 
"<script language=\"JavaScript\">\n<!--\nalert(\"$msg\");\n//-->\n</script>\n"
    if(
$exit) exit; 


function 
TruncateFile($fpfile) { 
    
ftruncate($fpfile0); 
    
fseek($fpfile0); 
}

function 
MySort(&$array) {
    while(!
$noswap) {
        
$noswap true;
        for(
$i $i < (count($array) - 1) ; $i++) {
            
$a strtok($array[$i], "|");
            
$b strtok($array[$i 1], "|");
            if(
$b $a) {
                
$tmp $array[$i];
                
$array[$i] = $array[$i 1];
                
$array[$i 1] = $tmp;
                
$noswap false;
            }
        }
    }
}

$datfile "counter.dat";        // File used to store current month and its bandwidth (in megabytes) 
$textfile "counter.txt";        // Text file used to store the file download counts and stats 
$downloadpath "dloads";        // The path of the file to download (without trailing slash) 
$maxbandwidth 512;            // The maximum download bandwidth allowed per month (in megabytes) 

// The message strings 
$fileopenmsg "Could not open file! -"
$filemsg "File not found! - $file"
$exceedmsg "The monthly download limit has been exceeded. Please try again later."
$refermsg "Referred downloads are not allowed!"

// HTML output stuff 
$headingcolour "#FF0000"
$column1colour "#3399FF"
$column2colour "#00CC00"
$column3colour "#FF00FF"
$column4colour "#EEEE00"
$bgcolour "#000000"

$date date("F Y"); 
$htmlheader 
<html>\n<head>\n<title>Download Statistics</title>\n</head>\n<body bgcolor=\"$bgcolour\"> 
<br><h1 align=center><font color=\"$headingcolour\">Download Statistics for - $HTTP_HOST - $date</font></h1><br><br> 
<table width=\"100%\" border=\"1\"> 
<tr> 
<th width=\"10%\"><font color=\"$headingcolour\">Downloads</font></td> 
<th width=\"54%\"><font color=\"$headingcolour\">File</font></td> 
<th width=\"17%\"><font color=\"$headingcolour\">Bandwidth used (mb)</font></td> 
<th width=\"19%\"><font color=\"$headingcolour\">Last download</font></td> 
</tr> 
"


$htmlfooter 
</table><br><br> 
<table width=\"100%\" border=\"1\"> 
<tr> 
<th width=\"25%\"><font color=\"$headingcolour\">Total downloads</font></td> 
<th width=\"25%\"><font color=\"$headingcolour\">Total bandwith (mb)</font></td> 
<th width=\"25%\"><font color=\"$headingcolour\">Max bandwidth (mb)</font></td> 
<th width=\"25%\"><font color=\"$headingcolour\">Percent used</font></td> 
</tr> 
"


if(!
$admin) { 
    
$from getenv("HTTP_REFERER"); 
    
$len strlen("http://$HTTP_HOST"); 
    if(
$len strlen($from) || strncmp($from"http://$HTTP_HOST"$len)) MessageBox($refermsgtrue); 

    if(!
is_file("$downloadpath/$file")) MessageBox($filemsgtrue); 


$month date("m"); 
$fpdat fopen($datfile"r+"); 
if(
$fpdat$filemonth fread($fpdat2); 
else 
fopen($datfile"w+"); 
if(!
$fpdatMessageBox("$fileopenmsg $datfile"true); 
if(
$filemonth != $month$reset true
else 
$bandwidth fread($fpdat128); 

if(
$admin) { 
    
fclose($fpdat); 
    
$fptext fopen($textfile"r"); 
    if(!
$fptextMessageBox("$fileopenmsg $textfile"false); 
    else { 
        while(!
feof($fptext)) { 
            
$line fgets($fptext4096);         
            if(
$line$recordlist[] = $line
        } 
        
fclose($fptext);

        
MySort($recordlist);
        echo 
$htmlheader;
        for(
$i $i count($recordlist) ; $i++) { 
            
$record explode("|"$recordlist[$i]); 
            
$tmp sprintf("%.2f"$record[2]); 
            if(
$bandwidth$percent sprintf("%.2f%%", ($record[2] / $bandwidth) * 100); 
            echo 
"<tr align=\"center\">\n" 
                
"<td><font color=\"$column1colour\">$record[0]</font></td>\n" 
                
"<td><font color=\"$column2colour\">$record[1]</font></td>\n" 
                
"<td><font color=\"$column3colour\">$tmp ($percent)</font></td>\n" 
                
"<td><font color=\"$column4colour\">$record[3]</font></td>\n",  
                
"</tr>\n"
            
$totalcount += $record[0]; 
        } 
        echo 
$htmlfooter;             
        if(
$bandwidth$percentused sprintf("%.2f%%", ($bandwidth $maxbandwidth) * 100); 
        
$tmp sprintf("%.2f"$bandwidth); 
        echo 
"<tr align=\"center\">\n" 
            
"<td><font color=\"$column1colour\">$totalcount</font></td>\n" 
            
"<td><font color=\"$column2colour\">$tmp</font></td>\n" 
            
"<td><font color=\"$column3colour\">$maxbandwidth</font></td>\n" 
            
"<td><font color=\"$column4colour\">$percentused</font></td>\n" 
            
"</tr></table>\n" ,
                
"</body>\n</html>\n"
    } 
    exit; 


$size filesize("$downloadpath/$file") / 1048576

if((
$size $bandwidth) > $maxbandwidthMessageBox($exceedmsgfalse); 
else { 
    
header("Location: $downloadpath/$file");     
    
$date date("jS M Y - H:i.s"); 
    
$bandwidth += $size
    
TruncateFile($fpdat); 
    
fwrite($fpdat"$month$bandwidth"); 
     
    
$fptext fopen($textfile"r+"); 
    if(
$fptext) { 
        if(
$resetTruncateFile($fptext); 
        else 
            while(!
feof($fptext)) { 
                
$line fgets($fptext4096);         
                if(
$line$recordlist[] = $line
            } 
    } 
    else 
$fptext fopen($textfile"w"); 
    if(!
$fptextMessageBox("$fileopenmsg $textfile"false); 
    else { 
        for(
$i $i count($recordlist) ; $i++) { 
            if(
strpos($recordlist[$i], "|$downloadpath/$file|")) { 
                
$found true
                
$record explode("|"$recordlist[$i]); 
                
$recordlist[$i] = sprintf("%d%s%f%s"$record[0] + 1"|$record[1]|"$record[2] + $size"|$date\n"); 
                break; 
            } 
        } 
     
        if(!
$found$recordlist[] = "1|$downloadpath/$file|$size|$date\n"
        
TruncateFile($fptext); 
        for(
$i = (count($recordlist) - 1) ; $i > -$i--) fwrite($fptext$recordlist[$i]); 
        
fclose($fptext); 
    } 


fclose($fpdat); 

?> 

Comments or questions?
PX is running PHP 5.2.17
Thanks to Miranda Productions for hosting and bandwidth.
Use of any code from PX is at your own risk.