public function now(){ $request = $this->getPageRequest(); $view = $this->getView(); if(!$request->isJSON()) return View::ERROR_BADREQUEST; $view->contenttype = View::CTYPE_JSON; $view->mode = View::MODE_AJAX; $view->record = false; $limit = $this->_getQueryLimit(); $duration = 60; // Use FindRaw because it's faster than using full Models for everything, especially when dealing with 20k + records. $listings = UserActivityModel::FindRaw('datetime >= ' . (Time::GetCurrent() - $duration), $limit, 'datetime DESC'); $data = array(); // Performance reports $data['information'] = array( 'duration' => $duration, ); $data['performance'] = array('get' => 0, 'post' => 0); $data['requests'] = array('get' => 0, 'post' => 0); $users = array(); $bots = array(); $guestname = \ConfigHandler::Get('/user/displayname/anonymous'); foreach($listings as $log){ if($log['type'] == 'GET'){ $data['performance']['get'] += $log['processing_time']; $data['requests']['get']++; } elseif($log['type'] == 'POST'){ $data['performance']['post'] += $log['processing_time']; $data['requests']['post']++; } $ua = new \Core\UserAgent($log['useragent']); if(class_exists('\\geocode\\IPLookup')){ // If the geo library is available, use that to resolve the IP to something more meaningful than just a number. $lookup = new \geocode\IPLookup($log['ip_addr']); $file = \Core\Filestore\Factory::File('assets/images/iso-country-flags/' . strtolower($lookup->country) . '.png'); if($lookup->province && $lookup->city){ $title = $lookup->city . ', ' . $lookup->province . ', ' . $lookup->getCountryName(); } elseif($lookup->province){ $title = $lookup->province . ', ' . $lookup->getCountryName(); } elseif($lookup->city){ $title = $lookup->city . ' ' . $lookup->getCountryName(); } else{ $title = $lookup->getCountryName(); } $ip = '<span title="' . $title . '">'; if($file->exists()){ $ip .= '<img src="' . $file->getPreviewURL('20x20') . '" alt="' . $lookup->country . '"/> '; } $ip .= $log['ip_addr']; $ip .= '</span>'; } else{ $ip = $log['ip_addr']; } // Bots have their own data, because, well... they're bots. // Damn bots! if($ua->isBot()){ if(!isset($bots[ $log['ip_addr'] ])){ $bots[ $log['ip_addr'] ] = array( 'ip' => $ip, 'useragent' => $log['useragent'], 'lastpage' => $log['request'], 'status' => $log['status'], //'type' => $ua->, 'browser' => $ua->getAsHTML(), 'count' => 1, ); } else{ $bots[$log['ip_addr']]['count']++; } } // The user agent information I want to know on a per-user basis, not a per-click basis. else{ if(!isset($users[ $log['session_id'] ])){ $thisuser = UserModel::Construct($log['user_id']); $users[ $log['session_id'] ] = array( 'session' => $log['session_id'], 'ip' => $ip, 'user_id' => $log['user_id'], 'username' => ($thisuser ? $thisuser->getDisplayName() : $guestname), 'useragent' => $log['useragent'], 'lastpage' => $log['request'], //'type' => $ua->type, 'browser' => $ua->getAsHTML(), 'os' => '', 'count' => 1, ); } else{ $users[$log['session_id']]['count'] ++; } } } //UserAgent::Test(); die(); if($data['requests']['get'] > 0) $data['performance']['get'] = round($data['performance']['get'] / $data['requests']['get'], 2); if($data['requests']['post'] > 0) $data['performance']['post'] = $data['performance']['post'] / $data['requests']['post']; $data['users'] = array_values($users); $data['bots'] = array_values($bots); //var_dump($data, $users, $listings); die(); $view->jsondata = $data; }
/** * Convert a raw user agent string to something more readable for most humans. * * Type: modifier<br> * Name: user_agent<br> * * @param string $string input string * * @return string HTML text */ function smarty_modifier_user_agent($string) { $ua = new \Core\UserAgent($string); return $ua->getAsHTML(); }