Location: PHPKode > projects > DantoBB > DantoBB_1-0/online.php
<?php

/*
	Copyright (C) 2009 DantoBB Team
	http://www.dantobb.com
*/

/**
 * Online users
 *
 * Gives a list of online users (guests and members), what they are doing and when.
 *
 * @author	DantoBB Team
 * @link	http://www.dantobb.com
 * @license	GPL-2
 * @version	$Revision: 1.0 $
 * @copyright	Copyright (C) 2009 DantoBB Team
 * @package	DantoBB
 */

define('INCLUDED', true);
define('ROOT_PATH', './');

//
// Include dantobb engine
//
require(ROOT_PATH.'sources/common.php');

$session->update('onlinelist');

//
// Include the page header
//
require(ROOT_PATH.'sources/page_head.php');

if ( !$functions->get_config('enable_detailed_online_list') ) {
	
	$functions->redirect('index.php');
	
} elseif ( $functions->get_user_level() < $functions->get_config('view_detailed_online_list_min_level') ) {
	
	$functions->redir_to_login();
	
} else {
	
	$min_updated = time() - ( $functions->get_config('online_min_updated') * 60 );
	
	$result = $db->query("SELECT s.user_id, s.ip_addr, s.updated, s.location, u.displayed_name, u.level, u.hide_from_online_list FROM ".TABLE_PREFIX."sessions s LEFT JOIN ".TABLE_PREFIX."members u ON u.id = s.user_id WHERE s.updated > ".$min_updated." ORDER BY s.updated DESC");
	
	$ids = $names = array(
		'forums' => array(),
		'topics' => array(),
		'posts' => array(),
		'users' => array()
	);
	
	$sessions = $seen_members = $seen_ips = array();
	
	while ( $sessiondata = $db->fetch_result($result) ) {
		
		if ( $sessiondata['hide_from_online_list'] && $functions->get_user_level() < LEVEL_ADMIN )
			continue;
		
		if ( $sessiondata['user_id'] && in_array($sessiondata['user_id'], $seen_members) )
			continue;
		
		if ( !$sessiondata['user_id'] && in_array($sessiondata['ip_addr'], $seen_ips) )
			continue;
		
		$sessions[] = $sessiondata;
		
		if ( $sessiondata['user_id'] )
			$seen_members[] = $sessiondata['user_id'];
		else
			$seen_ips[] = $sessiondata['ip_addr'];
		
	}
	
	//
	// Get page number
	//
	$numpages = ceil(intval(count($sessions)) / $functions->get_config('members_per_page'));
	$page = ( !empty($_GET['page']) && valid_int($_GET['page']) && intval($_GET['page']) > 0 && intval($_GET['page']) <= $numpages ) ? intval($_GET['page']) : 1;
	$limit_start = ( $page - 1 ) * $functions->get_config('members_per_page');
	$limit_end = $functions->get_config('members_per_page');
	$page_links = $functions->make_page_links($numpages, $page, count($sessions), $functions->get_config('members_per_page'), 'online.php');
	
	$i = 0;
	foreach ( $sessions as $key => $sessiondata ) {
		
		$i++;
		
		if ( $i <= $limit_start || $i > ( $limit_start+$limit_end ) ) {
			
			unset($sessions[$key]);
			continue;
			
		}
		
		$element = '';
		
		if ( preg_match('#^(?:forum|posttopic):([0-9]+)$#', $sessiondata['location'], $matches) )
			$element = 'forums';
		elseif ( preg_match('#^(?:topic|reply|movetopic|deletetopic):([0-9]+)$#', $sessiondata['location'], $matches) )
			$element = 'topics';
		elseif ( preg_match('#^(?:editpost|deletepost):([0-9]+)$#', $sessiondata['location'], $matches) )
			$element = 'posts';
		elseif ( preg_match('#^(?:profile|sendemail):([0-9]+)$#', $sessiondata['location'], $matches) )
			$element = 'users';
		
		if ( !empty($element) )
			$ids[$element][] = $matches[1];
		
	}
	
	if ( count($ids['forums']) ) {
		
		$result = $db->query("SELECT id, name, auth FROM ".TABLE_PREFIX."forums WHERE id IN(".join(', ', $ids['forums']).")");
		while ( $forumdata = $db->fetch_result($result) ) {
			
			if ( $functions->auth($forumdata['auth'], 'view', $forumdata['id']) )
				$names['forums'][$forumdata['id']] = $forumdata['name'];
			
		}
		
	}
	
	if ( count($ids['topics']) ) {
		
		$result = $db->query("SELECT t.id, t.topic_title, t.forum_id, f.auth FROM ".TABLE_PREFIX."topics t, ".TABLE_PREFIX."forums f WHERE t.id IN(".join(', ', $ids['topics']).") AND f.id = t.forum_id");
		while ( $topicdata = $db->fetch_result($result) ) {
			
			if ( $functions->auth($topicdata['auth'], 'view', $topicdata['forum_id']) )
				$names['topics'][$topicdata['id']] = $topicdata['topic_title'];
			
		}
		
	}
		
	if ( count($ids['posts']) ) {
		
		$result = $db->query("SELECT p.id, t.topic_title, t.forum_id, f.auth FROM ".TABLE_PREFIX."topics t, ".TABLE_PREFIX."posts p, ".TABLE_PREFIX."forums f WHERE p.id IN(".join(', ', $ids['posts']).") AND t.id = p.topic_id AND f.id = t.forum_id");
		while ( $topicdata = $db->fetch_result($result) ) {
			
			if ( $functions->auth($topicdata['auth'], 'view', $topicdata['forum_id']) )
				$names['posts'][$topicdata['id']] = $topicdata['topic_title'];
			
		}
		
	}
	
	if ( count($ids['users']) ) {
		
		$result = $db->query("SELECT id, displayed_name FROM ".TABLE_PREFIX."members WHERE id IN(".join(', ', $ids['users']).")");
		while ( $userdata = $db->fetch_result($result) )
			$names['users'][$userdata['id']] = $userdata['displayed_name'];
		
	}
	
	$template->set_page_title($lang['DetailedOnlineList']);
	
	$template->parse('header', 'onlinelist', array(
		'page_links' => $page_links
	));
	
	foreach ( $sessions as $sessiondata ) {
		
		if ( $sessiondata['user_id'] ) {
			
			if ( !$sessiondata['hide_from_online_list'] ) {
				
				$username = $functions->make_profile_link($sessiondata['user_id'], $sessiondata['displayed_name'], $sessiondata['level']);
				
			} else {
				
				$username = '<em>'.$functions->make_profile_link($sessiondata['user_id'], $sessiondata['displayed_name'], $sessiondata['level']).'</em>';
				
			}
			
		} else {
			
			$username = $lang['Guest'];
			
		}
		
		if ( $functions->get_user_level() == LEVEL_ADMIN )
			$username .= ' (<a href="'.$functions->make_url('admin.php', array('act' => 'iplookup', 'ip' => $sessiondata['ip_addr'])).'"><em>'.$sessiondata['ip_addr'].'</em></a>)';
		
		switch ( $sessiondata['location'] ) {
			
			case 'index':
				$location = '<a href="'.$functions->make_url('index.php').'">'.$lang['ForumIndex'].'</a>';
				break;
			case 'panel_home':
				$location = $lang['PanelHome'];
				break;
			case 'editprofile':
				$location = $lang['EditProfile'];
				break;
			case 'editoptions':
				$location = $lang['EditOptions'];
				break;
			case 'editpwd':
				$location = $lang['EditPasswd'];
				break;
			case 'subscriptions':
				$location = $lang['Subscriptions'];
				break;
			case 'faq':
				$location = '<a href="'.$functions->make_url('faq.php').'">'.$lang['FAQ'].'</a>';
				break;
			case 'search':
				$location = '<a href="'.$functions->make_url('search.php').'">'.$lang['Search'].'</a>';
				break;
			case 'activetopics':
				$location = '<a href="'.$functions->make_url('active.php').'">'.$lang['ActiveTopics'].'</a>';
				break;
			case 'login':
				$location = $lang['LogIn'];
				break;
			case 'logout':
				$location = sprintf($lang['LogOut'], '');
				break;
			case 'register':
				$location = $lang['Register'];
				break;
			case 'activate':
				$location = $lang['Activate'];
				break;
			case 'sendpwd':
				$location = $lang['SendPassword'];
				break;
			case 'onlinelist':
				$location = $lang['DetailedOnlineList'];
				break;
			case 'memberlist':
				$location = '<a href="'.$functions->make_url('members.php').'">'.$lang['MemberList'].'</a>';
				break;
			case 'stafflist':
				$location = '<a href="'.$functions->make_url('members.php', array('act' => 'staff')).'">'.$lang['StaffList'].'</a>';
				break;
			case 'rss':
				$location = '<a href="'.$functions->make_url('rss.php').'">'.$lang['RSSFeed'].'</a>';
				break;
			case 'stats':
				$location = '<a href="'.$functions->make_url('stats.php').'">'.$lang['Statistics'].'</a>';
				break;
			
		}
		
		if ( empty($location) ) {
			
			if ( preg_match('#^forum:([0-9]+)$#', $sessiondata['location'], $matches) && array_key_exists($matches[1], $names['forums']) )
				$location = sprintf($lang['ViewingForum'], '<a href="'.$functions->make_url('forum.php', array('id' => $matches[1])).'">'.unhtml(stripslashes($names['forums'][$matches[1]])).'</a>');
			elseif ( preg_match('#^posttopic:([0-9]+)$#', $sessiondata['location'], $matches) && array_key_exists($matches[1], $names['forums']) )
				$location = sprintf($lang['PostingTopic'], '<a href="'.$functions->make_url('forum.php', array('id' => $matches[1])).'">'.unhtml(stripslashes($names['forums'][$matches[1]])).'</a>');
			elseif ( preg_match('#^topic:([0-9]+)$#', $sessiondata['location'], $matches) && array_key_exists($matches[1], $names['topics']) )
				$location = sprintf($lang['ViewingTopic'], '<a href="'.$functions->make_url('topic.php', array('id' => $matches[1])).'">'.unhtml($functions->replace_badwords(stripslashes($names['topics'][$matches[1]]))).'</a>');
			elseif ( preg_match('#^reply:([0-9]+)$#', $sessiondata['location'], $matches) && array_key_exists($matches[1], $names['topics']) )
				$location = sprintf($lang['PostingReply'], '<a href="'.$functions->make_url('topic.php', array('id' => $matches[1])).'">'.unhtml($functions->replace_badwords(stripslashes($names['topics'][$matches[1]]))).'</a>');
			elseif ( preg_match('#^movetopic:([0-9]+)$#', $sessiondata['location'], $matches) && array_key_exists($matches[1], $names['topics']) )
				$location = sprintf($lang['MovingTopic'], '<a href="'.$functions->make_url('topic.php', array('id' => $matches[1])).'">'.unhtml($functions->replace_badwords(stripslashes($names['topics'][$matches[1]]))).'</a>');
			elseif ( preg_match('#^deletetopic:([0-9]+)$#', $sessiondata['location'], $matches) && array_key_exists($matches[1], $names['topics']) )
				$location = sprintf($lang['DeletingTopic'], '<a href="'.$functions->make_url('topic.php', array('id' => $matches[1])).'">'.unhtml($functions->replace_badwords(stripslashes($names['topics'][$matches[1]]))).'</a>');
			elseif ( preg_match('#^editpost:([0-9]+)$#', $sessiondata['location'], $matches) && array_key_exists($matches[1], $names['posts']) )
				$location = sprintf($lang['EditingPost'], '<a href="'.$functions->make_url('topic.php', array('post' => $matches[1])).'#post'.$matches[1].'">'.unhtml($functions->replace_badwords(stripslashes($names['posts'][$matches[1]]))).'</a>');
			elseif ( preg_match('#^deletepost:([0-9]+)$#', $sessiondata['location'], $matches) && array_key_exists($matches[1], $names['posts']) )
				$location = sprintf($lang['DeletingPost'], '<a href="'.$functions->make_url('topic.php', array('post' => $matches[1])).'#post'.$matches[1].'">'.unhtml($functions->replace_badwords(stripslashes($names['posts'][$matches[1]]))).'</a>');
			elseif ( preg_match('#^profile:([0-9]+)$#', $sessiondata['location'], $matches) && array_key_exists($matches[1], $names['users']) )
				$location = sprintf($lang['Profile'], '<a href="'.$functions->make_url('profile.php', array('id' => $matches[1])).'">'.unhtml(stripslashes($names['users'][$matches[1]])).'</a>');
			elseif ( preg_match('#^sendemail:([0-9]+)$#', $sessiondata['location'], $matches) && array_key_exists($matches[1], $names['users']) )
				$location = sprintf($lang['SendEmail'], '<a href="'.$functions->make_url('profile.php', array('id' => $matches[1])).'">'.unhtml(stripslashes($names['users'][$matches[1]])).'</a>');
			else
				$location = $lang['Unknown'];
			
		}
		
		$template->parse('user', 'onlinelist', array(
			'username' => $username,
			'current_page' => $location,
			'latest_update' => $functions->make_date($sessiondata['updated'], 'h:i:s a'),
		));
		
		unset($location);
		
	}
	
	$template->parse('footer', 'onlinelist', array(
		'page_links' => $page_links
	));
	
}

//
// Include the page footer
//
require(ROOT_PATH.'sources/page_foot.php');

?>
Return current item: DantoBB