Seditio Source
Root |
./othercms/elxis_5.3_atlas_rev2452/modules/mod_whosonline/mod_whosonline.php
<?php
/**
* @version        $Id$
* @package        Elxis
* @subpackage    Module Who Is Online
* @copyright    Copyright (c) 2006-2019 Elxis CMS (http://www.elxis.org). All rights reserved.
* @license        Elxis Public License ( http://www.elxis.org/elxis-public-license.html )
* @author        Elxis Team ( http://www.elxis.org )
* @description     Elxis CMS is free software. Read the license for copyright notices and details
*/

defined('_ELXIS_') or die ('Direct access to this location is not allowed');


if (!
class_exists('modWhoIsOnline', false)) {
    class
modWhoIsOnline {

        private
$mode = 0;
        private
$ontime = 0;
        private
$ts = 0;


       
/*********************/
        /* MAGIC CONSTRUCTOR */
        /*********************/
       
public function __construct($params) {
           
$this->mode = (int)$params->get('mode', 0);
           
$this->ontime = (int)$params->get('ontime', 0);
           
$cache = (int)$params->get('cache', 0);
           
$this->ts = eFactory::getDate()->getTS();
        }


       
/********************/
        /* MODULE EXECUTION */
        /********************/        
       
public function run() {
           
$eLang = eFactory::getLang();
           
$elxis = eFactory::getElxis();

           
$online = $this->getOnlineUsers($elxis);
            if (
$online['guests'] <> 1) {
                if (
$online['users'] <> 1) {
                   
$txt = sprintf($eLang->get('GUESTS_USERS_ON'), $online['guests'], $online['users']);
                } else {
                   
$txt = sprintf($eLang->get('GUESTS_USER_ON'), $online['guests']);
                }
            } else {
                if (
$online['users'] <> 1) {
                   
$txt = sprintf($eLang->get('GUEST_USERS_ON'), $online['users']);
                } else {
                   
$txt = $eLang->get('GUEST_USER_ON');
                }
            }

            echo
'<div class="elx5_modwhoison">'."\n";
            echo
'<p>'.$txt."</p>\n";
            if (
$this->mode == 1) {
                if (
count($online['data']) > 0) {
                   
$access = $elxis->acl()->check('com_user', 'profile', 'view');
                   
$linkbase = $elxis->makeURL('user:members/');
                    echo
'<div class="elx5_modwhoison_thumbs">'."\n";
                    foreach (
$online['data'] as $user) {
                        if (
$this->ontime == 1) {
                           
$title = $user['name'].' - '.$eLang->get('ONLINE_FOR').' '.$this->humanTime($user['time']);
                        } else {
                           
$title = $user['name'];
                        }
                        if (
$access == 2) {
                            echo
'<a href="'.$linkbase.$user['uid'].'.html" title="'.$title.'"><img src="'.$user['avatar'].'" alt="avatar" /></a>'."\n";
                        } else {
                            echo
'<img src="'.$user['avatar'].'" alt="'.$user['name'].'" title="'.$title.'" />'."\n";
                        }
                    }
                    echo
"</div>\n";
                }
            }
            echo
"</div>\n";
        }


       
/********************/
        /* GET ONLINE USERS */
        /********************/
       
private function getOnlineUsers($elxis) {
           
$db = eFactory::getDB();

           
$online = array('guests' => 0, 'users' => 0, 'data' => array());

           
$startts = $this->ts - $elxis->getConfig('SESSION_LIFETIME');

           
$sql = "SELECT COUNT(".$db->quoteId('uid').") FROM ".$db->quoteId('#__session')
            .
"\n WHERE ".$db->quoteId('last_activity')." > :ts AND ".$db->quoteId('uid').' > 0';
           
$stmt = $db->prepareLimit($sql, 0, 1);
           
$stmt->bindParam(':ts', $startts, PDO::PARAM_INT);
           
$stmt->execute();
           
$online['users'] = (int)$stmt->fetchResult();

           
$sql = "SELECT COUNT(".$db->quoteId('uid').") FROM ".$db->quoteId('#__session')
            .
"\n WHERE ".$db->quoteId('last_activity')." > :ts AND ".$db->quoteId('uid').' = 0';
           
$stmt = $db->prepareLimit($sql, 0, 1);
           
$stmt->bindParam(':ts', $startts, PDO::PARAM_INT);
           
$stmt->execute();
           
$online['guests'] = (int)$stmt->fetchResult();

            if ((
$this->mode == 1) && ($online['users'] > 0)) {
               
$sql = "SELECT s.uid, s.first_activity, u.firstname, u.lastname, u.uname, u.avatar"
               
."\n FROM ".$db->quoteId('#__session')." s"
               
."\n LEFT JOIN ".$db->quoteId('#__users')." u ON u.uid=s.uid"
               
."\n WHERE s.last_activity > :ts AND s.uid > 0"
               
."\n ORDER BY s.last_activity DESC";
               
$stmt = $db->prepareLimit($sql, 0, 30);
               
$stmt->bindParam(':ts', $startts, PDO::PARAM_INT);
               
$stmt->execute();
               
$dbrows = $stmt->fetchAll(PDO::FETCH_ASSOC);
               
                if (
$dbrows) {
                   
$relpath = 'media/images/avatars/';
                    if (
defined('ELXIS_MULTISITE')) {
                        if (
ELXIS_MULTISITE > 1) { $relpath = 'media/images/site'.ELXIS_MULTISITE.'/avatars/'; }
                    }
                    foreach (
$dbrows as $dbrow) {
                       
$time =  $this->ts - $dbrow['first_activity'];
                        if (
$elxis->getConfig('REALNAME') == 1) {
                           
$name = $dbrow['firstname'].' '.$dbrow['lastname'];
                        } else {
                           
$name = $dbrow['uname'];
                        }

                        if ((
trim($dbrow['avatar']) != '') && file_exists(ELXIS_PATH.'/'.$relpath.$dbrow['avatar'])) {
                           
$avatar = $elxis->secureBase().'/'.$relpath.$dbrow['avatar'];
                        } else {
                           
$avatar = $elxis->secureBase().'/components/com_user/images/noavatar.png';
                        }

                       
$online['data'][] = array('uid' => $dbrow['uid'], 'name' => $name, 'avatar' => $avatar, 'time' => $time);
                    }
                }
            }

            return
$online;
        }


       
/**********************************/
        /* HUMAN FRIENDLY TIME DIFERRENCE */
        /**********************************/
       
private function humanTime($dt) {
           
$eLang = eFactory::getLang();

           
$h = floor($dt / 3600);
           
$rest = $dt - ($h * 3600);
           
$m = floor($rest / 60);

            if (
$h == 0) {
                if (
$m > 1) {
                   
$out = $m.' '.$eLang->get('MINUTES');
                } else {
                   
$out = '1 '.$eLang->get('MINUTE');
                }
            } else  if (
$h == 1) {
               
$out = '1 '.$eLang->get('HOUR');
                if (
$m > 1) {
                   
$out .= ' '.$eLang->get('AND').' '.$m.' '.$eLang->get('MINUTES');
                } else if (
$m == 1) {
                   
$out .= ' '.$eLang->get('AND').' 1 '.$eLang->get('MINUTE');
                }
            } else {
               
$out = $h.' '.$eLang->get('HOURS');
                if (
$m > 1) {
                   
$out .= ' '.$eLang->get('AND').' '.$m.' '.$eLang->get('MINUTES');
                } else if (
$m == 1) {
                   
$out .= ' '.$eLang->get('AND').' 1 '.$eLang->get('MINUTE');
                }
            }

            return
$out;
        }

    }

}

$modwho = new modWhoIsOnline($params);
$modwho->run();
unset(
$modwho);

?>