<?php
/*	mod_onlineusers: Show which users have been around recently.
	author: Chris Eaton (tridus@hiredgoons.ca)
	version: 2.3.1
	license: You are free to use, modify, or redistribute this code so long as I am given credit for the original development somewhere.
			 This code comes with absolutly no warranty.

			 It would be nice (but not required) of you to email me if you find this module useful. :-)
*/
if(!defined("PHORUM")) return;

// replace the name if it got reset by the phorum
function mod_onlineusers()
{
    include_once("./include/format_functions.php");
	GLOBAL $PHORUM;
    
    // if we're not on one of our pages, then just don't do anything
    if (!@in_array(phorum_page, $PHORUM["mod_onlineusers"]["show_pages"])){
        //print_r(array_values($PHORUM["mod_onlineusers"]["show_pages"]));
        return;
    }

    // if this is a guest, add them into the list
    if ($PHORUM["user"]["user_id"] == 0) {
        $PHORUM["mod_onlineusers"]["data"]["guests"][$_SERVER["REMOTE_ADDR"]] = time();
        $PHORUM["mod_onlineusers"]["data"]["guestcount"] = count($PHORUM["mod_onlineusers"]["data"]["guests"]);
        phorum_db_update_settings(array("mod_onlineusers"=>$PHORUM["mod_onlineusers"])); 
    }

    // if the cache has expired, update the list
    if (time() - $PHORUM["mod_onlineusers"]["data"]["update_time"] > $PHORUM["mod_onlineusers"]["cache_time"]){       
        mod_onlineusers_update();         
    }

    // display the list
    $PHORUM["DATA"]["BLOCK_TITLE"] = $PHORUM["DATA"]["LANG"]["mod_onlineusers"]["OnlineUsers"] . " (<strong><em>" . $PHORUM["DATA"]["LANG"]["mod_onlineusers"]["Administrator"] . "</em></strong>)";
    if ($PHORUM["mod_onlineusers"]["show_idle_time"]){
        $PHORUM["DATA"]["BLOCK_TITLE"] .= " (" . $PHORUM["DATA"]["LANG"]["mod_onlineusers"]["MinutesIdle"] . ")";
    }
    $profileurl = phorum_get_url(PHORUM_PROFILE_URL);
    $PHORUM["DATA"]["BLOCK_CONTENT"] = "<div style='text-align: left;'>";
    $looped = false;
    foreach ($PHORUM["mod_onlineusers"]["data"]["users"] as $user){
     // tack a comma on unless we haven't added anybody yet
        if ($looped){
            $PHORUM["DATA"]["BLOCK_CONTENT"] .= ", ";
        }
        $looped = true;

        if ($user["admin"]){
            $PHORUM["DATA"]["BLOCK_CONTENT"] .= "<em><strong>";
        }

        $PHORUM["DATA"]["BLOCK_CONTENT"] .= "<a href='$profileurl,$user[user_id]'>$user[displayname]";
        if ($PHORUM["mod_onlineusers"]["show_idle_time"]){
            $PHORUM["DATA"]["BLOCK_CONTENT"] .= " (" . round((time() - $user["date_last_active"]) / 60) . ")";
        }

        $PHORUM["DATA"]["BLOCK_CONTENT"] .= "</a>";
        if ($user["admin"]){
            $PHORUM["DATA"]["BLOCK_CONTENT"] .= "</strong></em>";
        }
    }
    // add guest data
    if (!($PHORUM["mod_onlineusers"]["disable_guests"] == 1)) {
        $PHORUM["DATA"]["BLOCK_CONTENT"] .= "<br />" . $PHORUM["DATA"]["LANG"]["mod_onlineusers"]["Guests"] . ": " . $PHORUM["mod_onlineusers"]["data"]["guestcount"];
    }
    // records
    if ($PHORUM["mod_onlineusers"]["keep_records"]) {
        $PHORUM["DATA"]["BLOCK_CONTENT"] .= "<br />" . $PHORUM["DATA"]["LANG"]["mod_onlineusers"]["RecordNumberOfUsers"] . ": " . $PHORUM["mod_onlineusers"]["data"]["record_usercount"] . " " . $PHORUM["DATA"]["LANG"]["on"] . " " . phorum_date($PHORUM["long_date"], $PHORUM["mod_onlineusers"]["data"]["record_usercount_date"]);
        $PHORUM["DATA"]["BLOCK_CONTENT"] .= "<br />" . $PHORUM["DATA"]["LANG"]["mod_onlineusers"]["RecordNumberOfGuests"] . ": " . $PHORUM["mod_onlineusers"]["data"]["record_guestcount"] . " " . $PHORUM["DATA"]["LANG"]["on"] . " " . phorum_date($PHORUM["long_date"], $PHORUM["mod_onlineusers"]["data"]["record_guestcount_date"]);
    }

    $PHORUM["DATA"]["BLOCK_CONTENT"] .= "</div>";

    include phorum_get_template("stdblock");
    return;
}

// handy little function for sorting the names, thanks to acecream in the php manual
function mod_onlineusers_array_sort($array, $key)
{
    foreach ($array as $i => $k) {
       $sort_values[$i] = $array[$i][$key];
   } 
   asort ($sort_values);
   reset ($sort_values);
   while (list ($arr_key, $arr_val) = each ($sort_values)) {
         $sorted_arr[$arr_key] = $array[$arr_key];
   }
   return $sorted_arr;
}

// hook for the forum list
function mod_onlineusers_forumlist($forums) {
    GLOBAL $PHORUM;
    if ($PHORUM["mod_onlineusers"]["display_forum_readers"]) {
        foreach ($forums as $tempid => $forum) {
            $forums[$tempid]["description"] .= "<br />" . $PHORUM["mod_onlineusers"]["data"]["forum_reader_stats"][$forum["forum_id"]] . $PHORUM["DATA"]["LANG"]["mod_onlineusers"]["UsersReadingThisForum"];
        }
    }
    return $forums;
}

// get the list of users

function phorum_db_user_check_field($field, $value, $operator="=", $return_array=false){
    $PHORUM = $GLOBALS["PHORUM"];

    $ret = 0;

    $conn = phorum_db_mysql_connect();

    if(!is_array($field)){
        $field=array($field);
    }

    if(!is_array($value)){
        $value=array($value);
    }

    if(!is_array($operator)){
        $operator=array($operator);
    }

    if(count($field)!=count($value) || count($field)!=count($operator) || count($operator)!=count($value)){
        return $ret;
    }

    $valid_operators = array("=", "<>", "!=", ">", "<", ">=", "<=");

    foreach($field as $key=>$name){
        if(in_array($operator[$key], $valid_operators) && phorum_db_validate_field($name)){
            $clauses[]="$name $operator[$key] '$value[$key]'";
        }
    }

    $sql = "select user_id from {$PHORUM['user_table']} where ".implode(" and ", $clauses);

    $res = phorum_db_interact( DB_RETURN_RES, $sql,
        NULL,
        DB_GLOBALQUERY | DB_MASTERQUERY);

    if ($res && mysql_num_rows($res)){
        if($return_array){
            $ret=array();
            while($row=mysql_fetch_assoc($res)){
                $ret[$row["user_id"]]=$row["user_id"];
            }
        } else {
            $tmp_row=mysql_fetch_row($res);
            $ret = $tmp_row[0];
        }
    }

    return $ret;
}


function mod_onlineusers_get_user_list(){
    $PHORUM = $GLOBALS["PHORUM"];
    $list = phorum_db_user_check_field("date_last_active", time() - ($PHORUM["mod_onlineusers"]["idle_time"] * 60), ">=", true);
    $activeusers = array();
    if ($list){
        $users = phorum_db_user_get($list, false);
        foreach($users as $user){
            if (!$user["hide_activity"]){
                $activeusers[$user["user_id"]] = array("user_id" => $user["user_id"],
                    "username" => $user["username"],
                    "displayname" => $user["username"],
                    "admin" => $user["admin"],
                    "date_last_active" => $user["date_last_active"],
                    "last_active_forum" => $user["last_active_forum"]);
            }
        }
    }
    if (count($activeusers) >= 1){
        $activeusers = mod_onlineusers_array_sort($activeusers, "username");
    }

    $activeusers = phorum_hook("user_list", $activeusers);
    return $activeusers;
}

// get the list of guests
function mod_onlineusers_get_guest_list()
{
    $PHORUM=$GLOBALS["PHORUM"];

    // if we're not tracking guests, just return
    if ($PHORUM["mod_onlineusers"]["disable_guests"]) {
        return array();
    }
    
    // if there are no guests to cull, we can just do nothing too
    if (count($PHORUM["mod_onlineusers"]["data"]["guests"]) == 0) {
        return array();
    }

    $guests = $PHORUM["mod_onlineusers"]["data"]["guests"];

    // cull the list by removing anybody who is past the idle time
    foreach ($guests as $ip => $lastactive) {
        if (time() - $lastactive > $PHORUM["mod_onlineusers"]["idle_time"] * 60) {
            unset($guests[$ip]);
        }
    }

    return $guests;

}

// update data
function mod_onlineusers_update()
{
    GLOBAL $PHORUM;
    $PHORUM["mod_onlineusers"]["data"]["users"] = mod_onlineusers_get_user_list();
    $PHORUM["mod_onlineusers"]["data"]["guests"] = mod_onlineusers_get_guest_list();
    $PHORUM["mod_onlineusers"]["data"]["guestcount"] = count($PHORUM["mod_onlineusers"]["data"]["guests"]);
    $PHORUM["mod_onlineusers"]["data"]["update_time"] = time();

    if ($PHORUM["mod_onlineusers"]["keep_records"]) {
    // update the records
        if ($PHORUM["mod_onlineusers"]["data"]["guestcount"] > $PHORUM["mod_onlineusers"]["data"]["record_guestcount"]) {
            $PHORUM["mod_onlineusers"]["data"]["record_guestcount"] = $PHORUM["mod_onlineusers"]["data"]["guestcount"];
            $PHORUM["mod_onlineusers"]["data"]["record_guestcount_date"] = time();
        }

        if (count($PHORUM["mod_onlineusers"]["data"]["users"]) > $PHORUM["mod_onlineusers"]["data"]["record_usercount"]) {
            $PHORUM["mod_onlineusers"]["data"]["record_usercount"] = count($PHORUM["mod_onlineusers"]["data"]["users"]);
            $PHORUM["mod_onlineusers"]["data"]["record_usercount_date"] = time();
        }    
    }

    // update the list of people reading forums
    if ($PHORUM["mod_onlineusers"]["display_forum_readers"]) {
        $forumlist = array();
        $forumlist[0] = 0;
        // set it to 0 for every forum/folder
        $temp = phorum_db_get_forums(false);
        foreach ($temp as $forum) {
            $forumlist[$forum["forum_id"]] = 0;
        }

        // now for all the users, increment whatever forum they were reading
        foreach ($PHORUM["mod_onlineusers"]["data"]["users"] as $user) {
            $forumlist[$user["last_active_forum"]]++;
        }
        $PHORUM["mod_onlineusers"]["data"]["forum_reader_stats"] = $forumlist;
    }

    phorum_db_update_settings(array("mod_onlineusers"=>$PHORUM["mod_onlineusers"]));  
}

?>
