in your template where you want the output to display.
If you only want it on the front page you can do it like this:
If you also want a list of the member names, use
For statistics also, use in addition.
You can see a list of users and locations by going to your-forum-url.com/?mini_track_display
*/
// change any option you don't want to false
$mini_track_options['automatic_in_footer'] = true; // set false if you place mini_track(1) or mini_track(2) in your templates
$mini_track_options['show_names_in_footer'] = true; // display member names next to member count (optional)
$mini_track_options['show_only_on_front_page'] = false; // everywhere or just front page
$mini_track_options['last_online_in_profile'] = true; // show automatically in profiles
$mini_track_options['online_status_in_post'] = true; // show automatically in posts
$mini_track_options['track_time']['members'] = 30; // minutes before timeout (logout is immediate timeout, so large is okay)
$mini_track_options['track_time']['guests'] = 30; // minutes (busy sites may want 5-10 minutes)
$mini_track_options['track_time']['bots'] = 15; // minutes (busy sites may want 5 minutes)
$mini_track_options['statistics_in_footer'] = true; // set false if you place mini_track_statistics() manually in your templates
$mini_track_options['statistics_only_on_front_page'] = false; // everywhere or just front page
$mini_track_options['display_refresh_time'] = 30; // seconds for real-time display update
$mini_track_options['fast_index'] = false; // false = accurately tracks NAT/proxy/spoofing users // true = faster but by IP only
$mini_track_options['ban_speed'] = 50; // temporarily ban any user for the track_time if they exceed this many pages per minute
// set to 0 (zero) to disable.
$mini_track_options['ban_pages'] = 100; // temporarily ban any user for the track_time if they exceed this many pages in a single session
// set to 0 (zero) to disable.
// good bots like google are now verified by rdns when they exceed bans and are whitelisted
// you can also temporarily ban (or unban) via the realtime display panel
// note about banning: it still loads the bbPress core, just doesn't serve any content
$mini_track_options['style']="
.mini_track, .mini_track_statistics {font-size:1em; color:black; text-align:center;}
.mini_track_num, .mini_track strong, mini_track a {color: #006400;}
.mini_track_num {font-family: monospaced;}
.mini_track_wrap {white-space: nowrap;}
.mini_track img {margin: 0 3px -2px 1px; border:0;}
.mini_track_online {font-size:90%; color:green;}
.mini_track_offline {font-size:90%; color:#aaa;}
.mini_track_title {border-bottom: 1px dashed #ccc; cursor: help;}
";
/* STOP EDITING HERE */
$mini_track_options['topic_views'] = false; // true = replace bb-topic-views plugin, works better as no sessions needed
$mini_track_options['geoip'] = false; // "ip2c"; // cc lookup -> false | mysql | ip2c
$mini_track_options['flags'] = false; // "/images/flags/"; // images instead of cc - path to flags
$mini_track_options['debug'] = false; // true = shows more info when you hover over IP in display panel - makes saved data very large, don't use regularly
$bb->load_options = true; // better db performance, but probably won't work here, put it into your bb-config.php
// I don't recommend fiddling with this - if you know of other common bots, let me know for addition
$mini_track_options['bots']="msnbot\-Products|msnbot\-media|MS Search|MSNBOT|MSN Stealth|" // Microsoft
."Googlebot\-Image|Googlebot\/Test|AdsBot-Google|Mediapartners|gsa-crawler|Feedfetcher|Froogle|Googlebot|Google Stealth|" // Google
."Ask Jeeves|AskJeeves|teoma_agent|teomaagent|Teoma|Ask Stealth|" // Ask (uses Teoma)
."YahooSeeker|YahooFeedSeeker|YahooVideoSearch|Yahoo-MMCrawler|Yahoo\-MMAudVid|Yahoo\-Blogs|Yahoo\! Mindset|YahooYSMcm|Yahoo Test|Scooter|Yahoo\! Slurp|Slurp\/cat|DE Slurp|Slurp China|Y\!J-BSC|Fast Crawler|slurp\@inktomi|slurp|inktomi|Yahoo stealth|" // Yahoo
."Gigabot|Netcraft|ia_archiver|fast\-webcrawler|turnitinbot|technorati|Findexa|NextLinks|findlinks|Scooter|Lycos|almaden\.ibm|almaden|"
."ZyBorg|InfoSeek|looksmart|MARTINI|SurveyBot|Overture|VerticalCrawler|FastSearch|modspider|NAMEPROTECT|WebFilter|Robozilla|"
."Gais|gaisbo|zyborg|surveybot|Bloglines|BlogSearch|blogpulse|internetseer|sitecheck|MarkWatch|flunky|SlySearch|"
."AideRSS|BlogSearch|PubSub|pubsub|Syndic8|userland|become\.com|Cowbot|Yeti|naver|Sogou|Netcache|Netapp|BlogTick|Baiduspider|"
."Toluu|SimplePie|T\-H\-U\-N\-D\-E\-R\-S\-T\-O\-N\-E|dtSearchSpider|eidetica|fantom|Girafa|grub\.org|IncyWincy|Sqworm|larbin|ScoutAbout|"
."UbiCrawler|Webclipping|Webrank|Websquash|Whizbang|cosmos|Zealbot|semanticdiscovery|Snapbot|thumbshots|"
."Virtual Reach|Wordpress\/2\.|Yandex|linkcheck|idbot|id\-search|Nutch|heritrix|WebAlta|Indy Library|Intelliseek|LNSpiderguy|LinkWalker|"
."Java\/|Wget\/|libcurl|libwww|Python-urllib|urllib|lwp-trivial|GT::WWW|Snoopy|Microsoft URL Control|HTTP::Lite|PHPCrawl|URI::Fetch|PECL::HTTP|Zend_Http_Client|http client|HTTPClient|" // scrapers
."parser|crawler|indexer|archiver|worm|spider|bot"; // generic
$mini_track_options['bots']=explode("|",str_replace("\\","", strtolower($mini_track_options['bots']) )); // prep bot list
// hooks and triggers
add_action('bb_init','mini_track_init',9); // 9 so it runs before most other plugins execute
add_action('bb_foot','mini_track',99);
add_action('bb_admin_footer', 'mini_track',99);
add_action('bb_user_login', 'mini_track_login');
add_action('bb_user_logout', 'mini_track_logout');
if ($mini_track_options['style']) {add_action('bb_head','mini_track_style');}
if ($mini_track_options['last_online_in_profile']) {add_filter( 'get_profile_info_keys','mini_track_profile_key',100);}
if ($mini_track_options['online_status_in_post']) {add_filter( 'post_author_title', 'mini_track_online_filter',100);}
// statistics hooks
if ($mini_track_options['statistics_in_footer']) {add_action('bb_foot','mini_track_statistics',100);}
add_action( 'bb_new_post','mini_track_statistics_update');
add_action( 'bb_delete_post','mini_track_statistics_update');
add_action('register_user','mini_track_statistics_update');
add_action('user_register','mini_track_statistics_update');
// admin hooks
if (defined('BB_IS_ADMIN') && BB_IS_ADMIN && isset($_GET['action']) && $_GET['action']=="activate" && $_GET['plugin'] && strpos($_GET['action'],basename(__FILE__)) ) {
bb_register_activation_hook( __FILE__, 'mini_track_activation');
@require_once("mini-track-admin.php");
}
if (isset($_GET['mini_track_display']) || isset($_GET['mini_track_reset']) || isset($_GET['mini_track_ip']) || isset($_GET['mini_track_ban']) || isset($_GET['mini_track_unban'])) {
if (isset($_GET['mini_track_ip'])) {add_action('bb_init','mini_track_ip',100);}
else {add_action('bb_init','mini_track_display',100);}
@require_once("mini-track-admin.php");
}
function mini_track_init() {
global $mini_track, $mini_track_options, $mini_track_current, $bb_current_user, $bbdb, $topic_id;
$time=time(); // snapshot time for all calculations
$mini_track=bb_get_option('mini_track'); // start with latest data from db
if ($mini_track_options['topic_views']) { // remove bb-topic-views hook as to not duplicate counts or start sessions
remove_filter('bb_head', 'update_view_count');
remove_action('bb_init', 'views_session_check');
}
if (!empty($mini_track)) {
// clean up expired entries (especially if plugin has been inactive)
$cutoff['guests']=$time-$mini_track_options['track_time']['guests']*60; // seconds to consider guests "online"
$cutoff['members']=$time-$mini_track_options['track_time']['members']*60; // seconds to consider members "online"
$cutoff['bots']=$time-$mini_track_options['track_time']['bots']*60; // seconds to consider bots "online"
foreach ($mini_track as $key=>$value) {
if ($value->id) {$type="members";} elseif (isset($value->bot)) {$type="bots";} else {$type="guests";}
if ($value->time<$cutoff[$type]) { // bye-bye
if ($value->id) {mini_track_logout($value->id);} // store last seen date when members leave
unset($mini_track[$key]);
}
}
}
list($index,$debug)=mini_track_index($bb_current_user->ID); // calculate "index" for current user
// store first seen date (and referer when they arrive)
if (empty($mini_track) || !array_key_exists($index,$mini_track)) {
$mini_track[$index]->seen=$time; // we can't store the time before this as it might create a new index and we need to know that
if ($bb_current_user->ID) {@bb_update_usermeta($bb_current_user->ID,'mini_track',date('r'));}
if (isset($_SERVER['HTTP_REFERER'])) {
$referer=mini_track_safe_url($_SERVER['HTTP_REFERER']); $uri=bb_get_option('uri'); $found=strpos($referer,str_replace(array("https://","http://","www."),"",trim($uri,"/ ")));
if (!empty($referer) && (strpos($referer,"http://")===0 || strpos($referer,"https://")===0) && strpos($uri,$referer)===false && ($found===false || $found>20)) {$mini_track[$index]->referer=$referer;}
}
$mini_track[$index]->id=intval($bb_current_user->ID); // save current user id
$mini_track[$index]->ip=mini_track_remote_addr(); // grap ip or proxy/cache/nat ip if valid
if ($mini_track_options['geoip']=="mysql" || $mini_track_options['geoip']===true) { // geoip methods
$mini_track[$index]->cc=$bbdb->get_var("SELECT cc FROM maxmind WHERE start <= inet_aton('".$mini_track[$index]->ip."') ORDER BY `start` DESC LIMIT 1");
} elseif ($mini_track_options['geoip']=="ip2c") { // slow but easy ip2c
require_once(rtrim(dirname(__FILE__),' /\\')."/ip2c/ip2c.php");
$ip2c = new ip2country(rtrim(dirname(__FILE__),' /\\')."/ip2c/ip-to-country.bin");
$res = $ip2c->get_country($mini_track[$index]->ip);
if ($res == false) {$mini_track[$index]->cc="??";} else {$mini_track[$index]->cc=$res['id2'];}
}
// determine bots from agent - moved to first seen to save cpu cycles and re-check unnecessary
if ($bb_current_user->ID) {$mini_track[$index]->name=$bb_current_user->data->user_login;}
else {if ($bot=mini_track_bot_lookup()) {$mini_track[$index]->bot=$bot;}} // detect/save bots
$mini_track[$index]->pages=1;
} // end of first seen checks
else { // repeat user
$mini_track[$index]->pages++; // count how many pages they've viewed
// check for ban-able activity
if (!isset($mini_track[$index]->ban) && !(isset($mini_track[$index]->ok) && $mini_track[$index]->ok)) {
$active=$time - $mini_track[$index]->seen; // seconds active
if ( $mini_track[$index]->pages>30 && $active>30 && !($bb_current_user->ID && bb_current_user_can('administrate'))) {
if ($mini_track_options['ban_speed'] && ($mini_track[$index]->pages/$active)>$mini_track_options['ban_speed']/60) {$mini_track[$index]->ban=1;}
if ($mini_track_options['ban_pages'] && $mini_track[$index]->pages>$mini_track_options['ban_pages']) {$mini_track[$index]->ban=1;}
if ($mini_track[$index]->ban==1 && !isset($mini_track[$index]->ok)) {
$mini_track[$index]->ok=((mini_track_verify($mini_track[$index]->ip)) ? 1 : 0); // check if it's a legit bot
if ($mini_track[$index]->ok) {unset($mini_track[$index]->ban);} // if so, let it through
}
}
}
} // end repeat user
$mini_track[$index]->time=$time;
$mini_track[$index]->url=mini_track_safe_url($_SERVER['REQUEST_URI']); // current page
if ($mini_track_options['debug']) {$mini_track[$index]->debug=$debug;} // save debug info if in debug mode
if ($mini_track_options['topic_views'] && is_topic()) { // for topic view counts, replacing bb-topic-views plugin
bb_repermalink();
if (empty($mini_track[$index]->topic) || $topic_id!=$mini_track[$index]->topic) {mini_track_update_view_count(); $mini_track[$index]->topic=$topic_id;}
}
// tally new tracking data for all users
$bb_uri=bb_get_option('uri'); $profile=$bb_uri."profile.php?id=";
$users=0; $members=0; $bots=0; $onpage=0; $names=""; $cc="";
foreach ($mini_track as $key=>$value) {
++$users;
if ($value->id) {++$members; $names.="$value->name, ";}
if (isset($value->bot)) {++$bots;}
if ($value->url==$mini_track[$index]->url) {$onpage++;}
if (isset($value->ban)) {$ban[$value->ip]=1;} // build list of banned IPs for double-check later
if ($mini_track_options['geoip'] && isset($value->cc)) {@$cc[$value->cc]++;}
} // foreach
mini_track_save(); // store the data
// enforce bans
if ((isset($mini_track[$index]->ban) || isset($ban[$index->ip])) && !($bb_current_user->ID && bb_current_user_can('administrate'))) { // don't let admin ban themselves
@header("HTTP/1.1 503 Service Temporarily Unavailable");
@header("Status: 503 Service Temporarily Unavailable");
@header("Connection: Close");
@exit(); // user has a temporary ban either because of page count or speed (or same IP as ban) no content for them until the timeout clears
}
// remember results for possible use later in page
$mini_track_current['users']=$users; // user count
$mini_track_current['members']=$members; // member count
$mini_track_current['bots']=$bots; // bot count
$mini_track_current['names']=rtrim($names,", ");// member names
$mini_track_current['onpage']=$onpage; // number on same page
if ($mini_track_options['geoip'] && is_array($cc)) { // country code counts
$mini_track_current['cc']=" from "; arsort($cc);
foreach ($cc as $key=>$value) {
if ($mini_track_options['flags']) {$mini_track_current['cc'].="";} else {$mini_track_current['cc'].="$key, ";}}
$mini_track_current['cc']=rtrim($mini_track_current['cc'],", ").(($mini_track_options['flags']) ? ' ' : '.');
}
} // end mini_track_init
function mini_track($display=0) { // displays formatted output
global $mini_track, $mini_track_options, $mini_track_current, $mini_track_done;
if (isset($mini_track_done)) {return;} $mini_track_done=true; // only run once if manually called
if (empty($display)) {
if ($mini_track_options['automatic_in_footer']) {$display=1;}
if ($mini_track_options['show_names_in_footer']) {$display=2;}
if ($display && $mini_track_options['show_only_on_front_page'] && !is_front()) {$display=0;}
}
if ($display) { // to do: internationalize i18n
if (bb_current_user_can('administrate')) {$start=""; $end="";} else {$start=""; $end="";}
$output="