Changeset 1273

Show
Ignore:
Timestamp:
08/11/08 17:01:39 (4 months ago)
Author:
_ck_
Message:

0.1.0 statistics, referrer tracking, more bots detected, including spoofing/steath bots that use regular user agents

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • mini-track/trunk/mini-track.php

    r1250 r1273  
    66Author: _ck_ 
    77Author URI: http://bbShowcase.org 
    8 Version: 0.0.9 
     8Version: 0.1.0 
    99 
    1010License: CC-GNU-GPL http://creativecommons.org/licenses/GPL/2.0/ 
     
    1616If you only want it on the front page you can do it like this: <?php if (is_front() ) {mini_track(1);} ?> 
    1717If you also want a list of the member names, use <?php mini_track(2); ?> 
     18For statistics, use <?php mini_track_statistics(); ?> 
    1819You can see a list of users and locations by going to  your-forum-url.com/?mini_track_display 
    1920*/ 
     
    2324$mini_track_options['automatic_in_footer'] = true;              // set false if you place mini_track(1) or mini_track(2) in your templates 
    2425$mini_track_options['show_names_in_footer'] = true;             // display user names (optional) 
    25 $mini_track_options['show_only_on_front_page'] = false;        // everywhere or just front page 
     26$mini_track_options['show_only_on_front_page'] = false;         // everywhere or just front page 
    2627$mini_track_options['last_online_in_profile'] = true;           // automatic in profiles 
    2728$mini_track_options['online_status_in_post'] = true;            // automatic in posts 
    28 $mini_track_options['track_time'] = 30;                                 // minutes 
     29 
     30$mini_track_options['track_time']['members'] = 30;              // minutes before timeout  (logout is immediate timeout) 
     31$mini_track_options['track_time']['guests'] = 30;                       // minutes 
     32$mini_track_options['track_time']['bots'] = 15;                         // minutes 
     33 
     34$mini_track_options['statistics_in_footer'] = true;             // set false if you place mini_track_statistics() manually in your templates 
     35$mini_track_options['statistics_only_on_front_page'] = false;   // everywhere or just front page 
    2936 
    3037$mini_track_options['display_refresh_time'] = 30;               // seconds for real-time display update 
    31 $mini_track_options['fast_index'] = false;                              // false tracks NAT/proxy users better, true = faster IP only 
     38$mini_track_options['fast_index'] = false;                              // false = accurately tracks NAT/proxy/spoof users // true = faster by IP only 
    3239 
    3340$mini_track_options['style']=" 
    34         .mini_track {font-size:1em; color:black; text-align:center;}  
    35         .mini_track strong, mini_track a {color: #006400;} 
     41        .mini_track, .mini_track_statistics {font-size:1em; color:black; text-align:center;}  
     42        .mini_track_num, .mini_track strong, mini_track a {color: #006400;} 
     43        .mini_track_num {font-family: monospaced;} 
     44        .mini_track_wrap {white-space: nowrap;} 
    3645        .mini_track_online {font-size:90%; color:green;}  
    3746        .mini_track_offline {font-size:90%; color:#aaa;} 
     
    3948"; 
    4049 
    41 $mini_track_options['bots']="Googlebot|mediapartners|MSNBOT|YahooSeeker|Overture|VerticalCrawler|FastSearch|modspider|froogle|" 
    42 ."Bloglines|ZyBorg|InfoSeek|looksmart|Scooter|AskJeeves|Teoma|teoma_agent|teomaagent|MARTINI|Gigabot|Netcraft|SurveyBot|ia_archiver|" 
    43 ."lycos|scooter|fast\-webcrawler|inktomi|slurp\@inktomi|Slurp|turnitinbot|technorati|Findexa|NextLinks|findlinks|Gais|gaisbo|zyborg|surveybot|" 
    44 ."Feedfetcher|bloglines|BlogSearch|PubSub|pubsub|Syndic8|userland|gigabot|become\.com|Yeti|naver|Sogou|worm|spider|crawler|bot"; 
     50$mini_track_options['bots']="Googlebot\-Image|Googlebot|mediapartners|MSNBOT|YahooSeeker|froogle|" 
     51."Yahoo\! Slurp|Slurp|YahooSeeker|Yahoo Test|Yahoo (stealth)|Ask Jeeves|AskJeeves|teoma_agent|Teoma|teomaagent|slurp\@inktomi|inktomi|" 
     52."Gigabot|Netcraft|ia_archiver|lycos|fast\-webcrawler|turnitinbot|technorati|Findexa|NextLinks|findlinks|" 
     53."ZyBorg|InfoSeek|looksmart|Scooter|MARTINI|SurveyBot|Overture|VerticalCrawler|FastSearch|modspider|" 
     54."Gais|gaisbo|zyborg|surveybot|Bloglines|BlogSearch|blogpulse|thumbshots|Snapbot|" 
     55."Feedfetcher|BlogSearch|PubSub|pubsub|Syndic8|userland|become\.com|Yeti|naver|Sogou|Netcache|Netapp|BlogTick|Baiduspider|" 
     56."Virtual Reach|Wordpress\/2\.|Yandex|linkcheck|idbot|id\-search|Nutch|larbin|heritrix|WebAlta|Indy Library|"    
     57."Java\/|Wget\/|libcurl|libwww|lwp-trivial|urllib|GT::WWW|Snoopy|HTTP::Lite|PHPCrawl|URI::Fetch|Zend_Http_Client|http client|PECL::HTTP|"       // scrapers 
     58."crawler|indexer|archiver|worm|spider|bot";    // generic 
    4559 
    4660/* STOP EDITING HERE */ 
    4761 
     62$mini_track_options['debug'] = false; 
     63 
     64$bb->load_options = true;       // better db performance, but probably won't work here, put it into your bb-config.php 
     65 
    4866$mini_track_options['bots']=explode("|",str_replace("\\","", strtolower($mini_track_options['bots']) )); 
    49  
    50 $mini_track_options['debug'] = false;  
    51  
    52 $bb->load_options = true;       // better db performance, but probably won't work here, put it into your bb-config.php 
    5367 
    5468// hooks and triggers 
     
    6478if (isset($_GET['mini_track_display']) || isset($_GET['mini_track_reset'])) {add_action('bb_init','mini_track_display',100);} 
    6579if (isset($_GET['mini_track_ip'])) {add_action('bb_init','mini_track_ip',100);} 
     80// statistics hooks 
     81if ($mini_track_options['statistics_in_footer']) {add_action('bb_foot','mini_track_statistics',200);} 
     82add_action( 'bb_new_post','mini_track_statistics_update'); 
     83add_action( 'bb_delete_post','mini_track_statistics_update'); 
     84add_action('register_user','mini_track_statistics_update'); 
     85add_action('user_register','mini_track_statistics_update'); 
    6686 
    6787function mini_track_init() {   
     
    7191list($index,$debug)=mini_track_index($bb_current_user->ID); 
    7292 
    73 // store first seen date when they arrive 
    74 if (!is_array($mini_track) || !array_key_exists($index,$mini_track)) {$mini_track[$index]->seen=time(); if ($bb_current_user->ID) {@bb_update_usermeta($bb_current_user->ID,'mini_track',date('r'));}}  
    75  
    76 $mini_track[$index]->time=time();  
    77 $mini_track[$index]->ip=$_SERVER['REMOTE_ADDR']; 
    78 $mini_track[$index]->url=$_SERVER['REQUEST_URI'];       // this also has some issues with dynamic url cruft but is acceptable 
    79 $mini_track[$index]->id=$bb_current_user->ID; 
     93// store first seen date (and referer when they arrive) 
     94if (!is_array($mini_track) || !array_key_exists($index,$mini_track)) { 
     95$mini_track[$index]->seen=time(); if ($bb_current_user->ID) {@bb_update_usermeta($bb_current_user->ID,'mini_track',date('r'));} 
     96$referer=mini_track_safe_url($_SERVER['HTTP_REFERER']); $uri=bb_get_option('uri'); $found=strpos($referer,str_replace(array("https://","http://","www."),"",trim($uri,"/ "))); 
     97if (!empty($referer) && (strpos($referer,"http://")===0 || strpos($referer,"https://")===0)  && strpos($uri,$referer)===false && ($found===false || $found>20)) {$mini_track[$index]->referer=$referer;} 
     98 
     99$mini_track[$index]->id=intval($bb_current_user->ID);   // save current user id 
     100 
     101// determine bots from agent - moved to first time seen to save cpu cycles and re-check unnecessary 
    80102if ($bb_current_user->ID) {$mini_track[$index]->name=$bb_current_user->data->user_login;} 
    81 else { 
    82 // if (eregi($mini_track_options['bots'],$_SERVER['HTTP_USER_AGENT'])) {$mini_track[$index]->bot=1;} 
    83 $agent=strtolower($_SERVER['HTTP_USER_AGENT']); 
    84 foreach ($mini_track_options['bots'] as $key=>$name) {if (!(strpos($agent,$name)===false)) {$mini_track[$index]->bot=$key+1; break;}} 
    85 }       // detect/save bots 
     103else {if ($bot=mini_track_bot_lookup()) {$mini_track[$index]->bot=$bot;}}       // detect/save bots 
     104 
     105} // end of first seen checks 
     106 
     107if ($mini_track_options['debug']) {$mini_track[$index]->debug=$debug;}  // save debug info if in debug mode 
     108 
     109$mini_track[$index]->time=time();                         
     110$mini_track[$index]->ip=mini_track_remote_addr(); 
    86111++$mini_track[$index]->pages;   // count how many pages they've viewed 
    87  
     112$mini_track[$index]->url=mini_track_safe_url($_SERVER['REQUEST_URI']); // current page 
     113 
     114// caclulate cutoff time for deletion 
    88115$bb_uri=bb_get_option('uri'); $profile=$bb_uri."profile.php?id="; 
    89 $cutoff=time()-$mini_track_options['track_time']*60;    // seconds to consider user "online"  
    90  
    91 if ($mini_track_options['debug']) {$mini_track[$index]->debug=$debug;}  // debug 
     116$time=time();  
     117$cutoff['guests']=$time-$mini_track_options['track_time']['guests']*60;         // seconds to consider user "online"  
     118$cutoff['members']=$time-$mini_track_options['track_time']['members']*60;       // seconds to consider user "online"  
     119$cutoff['bots']=$time-$mini_track_options['track_time']['bots']*60;             // seconds to consider user "online"  
    92120 
    93121foreach ($mini_track as $key=>$value) {  
    94 if ($value->time<$cutoff) { 
     122if ($value->id) {$type="members";} elseif (isset($value->bot)) {$type="bots";} else {$type="guests";} 
     123if ($value->time<$cutoff[$type]) { 
    95124// store last seen date when they leave 
    96125if ($value->id) {mini_track_logout($value->id);}  
     
    104133// @bb_update_option('mini_track',$mini_track); // argh stupid bbPress read before write wastes queries 
    105134// $bbdb->get_var("UPDATE bb_topicmeta SET `meta_value` = '' WHERE topic_id = '0' AND meta_key = 'mini_track' LIMIT 1"); 
    106 $bbdb->update( $bbdb->topicmeta, array( 'meta_value' => bb_maybe_serialize( $mini_track )), array( 'topic_id' => 0, 'meta_key' => 'mini_track' ) ); 
     135// $bbdb->update( $bbdb->topicmeta, array( 'meta_value' => bb_maybe_serialize( $mini_track )), array( 'topic_id' => 0, 'meta_key' => 'mini_track' ) ); 
     136 
     137if (bb_get_option('bb_db_version')>1600) {$table="$bbdb->meta"; $where="WHERE object_type='bb_option'";}                // 1.0 compatibility 
     138else {$table="$bbdb->topicmeta"; $where="WHERE topic_id = 0";}                                                          // 0.9 compatibility 
     139$value=addslashes(bb_maybe_serialize( $mini_track)); 
     140@$bbdb->query("UPDATE $table SET meta_value='$value' $where AND meta_key='mini_track'  LIMIT 1"); 
    107141 
    108142// this serialized string will get nasty for more than a few dozen people online 
     
    125159if ($display) { // to do: internationalize i18n 
    126160if (bb_current_user_can('administrate')) {$start="<a href='?mini_track_display'>"; $end="</a>";} else {$start=""; $end="";} 
    127 echo "<div class='mini_track'>There are <strong>".$mini_track_current['users']."</strong> total $start"."users online".$end."."; 
    128 if ($mini_track_current['onpage']>1 && !$mini_track_options['show_only_on_front_page']) {echo " <strong>".$mini_track_current['onpage']."</strong> of them are on this page.";} 
    129 if ($mini_track_current['members']>0) {echo " <strong>".$mini_track_current['members']."</strong> of them are members";} 
     161echo "<div class='mini_track'>There are <span class='mini_track_num'>".$mini_track_current['users']."</span> total $start"."users online".$end."."; 
     162if ($mini_track_current['onpage']>1 && !$mini_track_options['show_only_on_front_page']) {echo " <span class='mini_track_num'>".$mini_track_current['onpage']."</span> of them are on this page.";} 
     163if ($mini_track_current['members']>0) {echo " <span class='mini_track_num'>".$mini_track_current['members']."</span> of them are members";} 
    130164if ($mini_track_current['members']>0 && ($display==2 || $display=="members")) {echo ": ".$mini_track_current['names'];}  
    131165elseif ($mini_track_current['members']>0 && $display==1) {echo ".";} 
     
    141175echo '<html><head><title>'.count($mini_track).' Users Online &laquo; '.bb_get_option('name').'</title> 
    142176<meta http-equiv="refresh" content="'.$mini_track_options['display_refresh_time'].';url='.$bb_uri.'?mini_track_display" /> 
    143 <style>table {border:1px solid #111;} table td {text-align:center;} table .link {text-align:left;} table th.link {padding-left:5em;} 
    144 table th {background: #aaa;} .alt {background: #eee;} .tiny {font-size:85%;} .bot {color:red; font-size:90%;} .guest {color:green;}  
    145 .link div {padding-left: 5px; width:500px; white-space:nowrap; overflow; hidden;} </style></head><body>'; 
     177<style>table {border:1px solid #111; font-size:14px; font-family: arial, san-serif; line-height:150%;} table td {text-align:center; white-space:nowrap;} table .link {text-align:left;} table th.link {padding-left:5em;} 
     178table th {background: #aaa;} .alt {background: #eee;} .tiny {font-size:12px;} .bot {color:red; font-size:90%;} .guest {color:green;}  
     179.link div {padding-left: 5px; width:500px; white-space:nowrap; overflow; hidden;} </style> 
     180<script>window.onload=titlelink; function titlelink() {blank="_blank"; for (i=0;x=document.links[i];++i){x.target=blank; x.title=x.href;}};</script> 
     181</head><body>'; 
    146182echo "<div style='float:right;'>[<a href='$bb_url?mini_track_reset'><small>reset</small></a>]</div>"; 
    147183mini_track(2);  
    148 echo "<br clear=both /><br /><table width='99%' cellpadding=1 cellspacing=1> 
    149 <tr class=alt><th>#</th><th>user</th><th>ip</th><th>pages</th><th>time online</th><th>last activity</th><th class=link>last URL</th></tr>"; 
     184echo "<br clear=both /><table width='99%' cellpadding=1 cellspacing=1> 
     185<tr class=alt><th>#</th><th>user</th><th>ip</th><th>referer</th><th>pages</th><th>time online</th><th>last activity</th><th class=link>last URL</th></tr>"; 
    150186$mini_track=array_reverse($mini_track,true); 
    151187$counter=0; 
    152188foreach ($mini_track as $key=>$value) { 
    153189$url=urldecode($value->url); 
    154 echo "<tr".(($counter % 2) ? " class=alt" : "")."><td align=right>".(++$counter)."</td><td>"; 
    155 if ($value->id) echo "<a target='_blank' href='$profile$value->id'>$value->name</a>"; 
    156 elseif (isset($value->bot)) {echo "<span class=bot>".$mini_track_options['bots'][$value->bot-1]."</span>";} else {echo "<span class=guest>guest</span>";} 
    157 echo "</td><td class=tiny><a target='_blank' ".(($mini_track_options['debug']) ?" title='$value->debug' " : "")."href='?mini_track_ip=$value->ip'>$value->ip</a></td><td>".intval($value->pages)."</td><td class=tiny>".ceil((($value->time)-$value->seen+1)/60)." minutes</td><td class=tiny>".ceil(((time())-$value->time+1)/60)." minutes ago</td><td class=link><div style='overflow:hidden;'><a href='$url'>$url</a></div></td></tr>"; 
     190echo "<tr".(($counter % 2) ? " class=alt" : "")."><td align=right class=tiny ".(($mini_track_options['debug']) ?" title='$value->debug' " : "")."> ".(++$counter)." </td><td>"; // line number 
     191if ($value->id) echo "<a  href='$profile$value->id'>$value->name</a>";                  // member profile link 
     192elseif (isset($value->bot)) {echo "<span class=bot>".preg_replace("/[^A-Za-z_ ]+?/is","",$mini_track_options['bots'][$value->bot-1])."</span>";} else {echo "<span class=guest>guest</span>";} 
     193echo "</td><td class=tiny><a href='?mini_track_ip=$value->ip'>$value->ip</a></td>"; 
     194if (isset($value->referer)) {$parse_url=parse_url($value->referer);     // referer 
     195                $host=substr(ereg_replace("^(www[0-9]?|search|talk|community|support|foro|mitmachen|board[s]?|forum[s]?)(\.?)","",$parse_url['host']),0,30);  
     196                echo "<td><a href='$value->referer'>".$host."</a></td>";} else {echo "<td>&nbsp;</td>"; 
     197}  
     198echo "<td>".intval($value->pages)."</td>";                                              // page count 
     199echo "<td class=tiny>".ceil((($value->time)-$value->seen+1)/60)." minutes</td>";        // total activity time 
     200echo "<td class=tiny>".ceil(((time())-$value->time+1)/60)." minutes ago</td>";          // last activity time 
     201echo "<td class=link><div style='overflow:hidden;'><a href='$url'>$url</a></div></td></tr>"; // last url 
    158202} 
    159203echo "</table></body></html>"; 
     
    165209$id=intval($id); 
    166210if ($mini_track_options['fast_index']) { 
    167 $index=ip2long($_SERVER['REMOTE_ADDR']);        // this has some limitations 
     211// this way has some limitations due to re-use of ip's by proxies and NATs  
     212$index="$id_".mini_track_remote_addr(); 
    168213} else { 
    169214// more advanced indexing technique on the next two lines - disable for speed at expense of no NAT/proxy detection 
    170 $indexlist=array('REMOTE_ADDR','HTTP_USER_AGENT','HTTP_X_FORWARDED_FOR', 'HTTP_X_FORWARDED', 'HTTP_FORWARDED_FOR','HTTP_FORWARDED','HTTP_VIA', 'HTTP_X_COMING_FROM', 'HTTP_COMING_FROM');  
     215$indexlist=array('REMOTE_ADDR','HTTP_USER_AGENT','HTTP_X_FORWARDED_FOR', 'HTTP_X_FORWARDED', 'HTTP_FORWARDED_FOR','HTTP_FORWARDED','HTTP_VIA', 'HTTP_X_COMING_FROM', 'HTTP_COMING_FROM','HTTP_CLIENT_IP');  
    171216$meta=$id; foreach ($indexlist as $check) {if (isset($_SERVER[$check])) {$meta.=" ".$_SERVER[$check];}} $index=md5($meta); 
    172217} 
    173218// $array['index']=$index; $array['debug']=$meta; return $array; 
    174219return array($index,$meta); 
     220} 
     221 
     222function mini_track_remote_addr() {     // detects true IP of known proxies and NATs 
     223// 67\.195\.|74\.6\. == inktomi/yahoo slurp, sometimes masqurades as regular browser too! 
     224if (ereg("^(67\.195\.|74\.6\.)",$_SERVER['REMOTE_ADDR']) && isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { 
     225return $_SERVER['HTTP_X_FORWARDED_FOR']; 
     226} else {return $_SERVER['REMOTE_ADDR'];}  
     227} 
     228 
     229function mini_track_bot_lookup() {  
     230global $mini_track_options; $bot=0; 
     231$agent=strtolower($_SERVER['HTTP_USER_AGENT']); 
     232foreach ($mini_track_options['bots'] as $key=>$name) {if (!(strpos($agent,$name)===false)) {$bot=$key+1; break;}} 
     233if ($bot==0)  {if (ereg("^(67\.195\.|74\.6\.)",$_SERVER['REMOTE_ADDR'])) {$bot=1+array_search("yahoo stealth",$mini_track_options['bots']);}} // yahoo fakes it 
     234return $bot; 
    175235} 
    176236 
     
    206266function mini_track_style() {global $mini_track_options; echo "<style type='text/css'>".$mini_track_options['style']."</style>"; } 
    207267 
    208 function mini_track_activation() {global $mini_track,$mini_track_done; unset($mini_track_done);  $mini_track=array(); @bb_update_option('mini_track',$mini_track);} 
     268function mini_track_safe_url($url) {return substr(strip_tags(stripslashes(trim(urldecode($url),"?& "))),0,128);} 
     269 
     270function mini_track_activation() { 
     271global $mini_track, $mini_track_statistics, $mini_track_done; unset($mini_track_done);  
     272$mini_track=array(); @bb_update_option('mini_track',$mini_track); 
     273$mini_track_statistics=bb_get_option('mini_track_statistics');  
     274if (empty($mini_track_statistics)) {$mini_track_statistics=array(); @bb_update_option('mini_track_statistics',$mini_track_statistics);} 
     275
    209276 
    210277function mini_track_logout($id=0) { 
     
    251318return $data; 
    252319} 
     320 
     321function mini_track_statistics() { 
     322global $mini_track, $mini_track_options, $mini_track_statistics_done;  
     323if (isset($mini_track_statistics_done)) {return;} $mini_track_statistics_done=true;     // only run once if manually called 
     324if ($mini_track_options['statistics_only_on_front_page'] && !is_front()) {return;} 
     325$results=bb_get_option('mini_track_statistics'); if (!$results) {$results=mini_track_statistics_update();} 
     326$months=ceil((time()-strtotime($results->days)) / (3600 * 24 * 30)); 
     327$output="<div class='mini_track_statistics'>"; 
     328$output.="<span class='mini_track_wrap'>"; 
     329$output.=" <span class='mini_track_num'>".$results->posts."</span> ".__('posts in');  
     330$output.=" <span class='mini_track_num'>".$results->topics."</span> ".__('topics over');  
     331$output.=" <span class='mini_track_num'>$months</span> ".__('months by');  
     332$output.=" <span class='mini_track_num'>".$results->active."</span> ".__('of')." <span class='mini_track_num'>".$results->members."</span> ".__('members.');  
     333$output.=" </span> <span class='mini_track_wrap'> "; 
     334if (!empty($results->latest)) {$output.=__('Latest:'); $uri=bb_get_option('uri')."profile.php?id="; foreach ($results->latest as $key=>$value) {$output.=" <a href='$uri$key'>$value</a>, ";}} 
     335$output=trim($output,", ")."</span></div> "; 
     336echo $output; 
     337} 
     338 
     339function mini_track_statistics_update($x="") { 
     340global $bbdb, $mini_track;      // this is kind of insane overkill to do each new post / new user - might want to calculate incrementally somehow 
     341$query="SELECT count(*) as posts, count(distinct topic_id) as topics, count(distinct poster_id) as active, min(post_time) as days FROM bb_posts WHERE post_status=0"; 
     342$results=$bbdb->get_results($query); 
     343$usertable=$bbdb->users; $usermeta=$bbdb->usermeta; 
     344$base="FROM $usertable as t1 LEFT JOIN $usermeta as t2 on t1.ID=t2.user_id WHERE user_status=0 AND (meta_key='bb_capabilities' AND NOT (meta_value LIKE '%inactive%' OR meta_value LIKE '%blocked%'))"; 
     345$query="SELECT user_login,ID $base ORDER BY user_registered DESC LIMIT 3"; 
     346$results2=$bbdb->get_results($query); 
     347$results2=array_reverse($results2); 
     348foreach ($results2 as $key=>$value) {$results[0]->latest[$value->ID]=$value->user_login;} 
     349$query="SELECT count(*) as members $base"; 
     350$results2=$bbdb->get_results($query); 
     351$results[0]->members=$results2[0]->members; 
     352bb_update_option('mini_track_statistics',$results[0]); 
     353return $results[0]; 
     354} 
    253355?> 
  • mini-track/trunk/readme.txt

    r1250 r1273  
    1919If you upgrade from an old version you need to use the RESET link in the tracking display. 
    2020 
     21This plugin is now bbPress 1.0 compatible. 
     22 
    2123== Installation == 
    2224 
     
    3032        <div id="footer"> 
    3133                <?php mini_track(1); ?> 
     34                <?php mini_track_statistics(); ?> 
    3235                <p><?php printf(__('%1$s is proudly powered by <a href="%2$s">bbPress</a>.'), bb_option('name'), "http://bbpress.org") ?></p> 
    3336        </div> 
     
    3639* With non-automatic placement, if you also want a list of the member names, use `<?php mini_track(2); ?>` 
    3740or if you only want it on the front page you can do it like this: `<?php if (is_front() ) {mini_track(1);} ?>` or you can put it anywhere in `front-page.php` that you'd like. 
     41 
     42* Mini-Track can now show some basic statistics in your footer, or with manual placement anywhere on the page via `<?php mini_track_statistics(); ?>` 
     43 
     44* it is highly recommend you put this line in your `bb-config.php`  which will help with database performance on active forums by loading all  bbPress options at once instead of piecemeal 
     45` 
     46$bb->load_options = true; 
     47` 
    3848 
    3949== Frequently Asked Questions == 
     
    90100* bug fixes for last online, IP tracked/displayed + IP lookup, bots recorded/displayed by agent 
    91101 
     102= Version 0.1.0 (2008-08-11) = 
     103 
     104* more bots detected, including spoofing/steath bots that use regular user agents 
     105 
     106* remote IP lookup at RIPE (click IP in tracking display) 
     107 
     108* referer from remote site tracked upon entry 
     109 
     110* statistics of topics/posts and members 
     111 
    92112== To Do == 
     113 
     114* total online today 
     115 
     116* online today by name 
    93117 
    94118* store time online per member in profile ++(first seen - last seen)