Current time: 01-09-2009, 04:29 AM Hello There, Guest! (LoginRegister)


Post Reply 
 
Thread Rating:
  • 1 Votes - 5 Average
  • 1
  • 2
  • 3
  • 4
  • 5
How to add a custom location to Who's Online List? - Comprehensive Tutorial
08-30-2008, 11:36 PM (This post was last modified: 10-26-2008 02:35 AM by dvb.)
Post: #1
How to add a custom location to Who's Online List? - Comprehensive Tutorial

How to add a custom location to Who's Online List?

Comprehensive Tutorial



Introduction
When you visit the Who's Online List you can see a list of all the connected users, what was their last action and the time of the last action.

For example you can see this row:
dvb | 18:00 | Reading Thread How to add a custom location to Who's Online List?
(This is the thread that give rise to this tutorial)

But if you've added some custom pages to MyBB, e.g. a chat room or a rules page, (here is the tutorial about how to add custom pages to MyBB), MyBB still don't know what are those pages so you'll see just 'Unknown Location' message instead of the specific activity or page title.

This guide will explain how to add a custom location to your forum (assuming you already have a custom page integrated into MyBB), so you could see a row like the following in case of this community:
dvb | 18:00 | Reading about the MyBB team.

Let's start!
In this tuttorial we'll assume that:
Your MyBB homepage is - http://www.example.com/mybb/
Your custom page url is - http://www.example.com/mybb/customfile.php
Note: The url must contain '.php' as the extension of the page for this to work, if the url doesn't contain '.php' the user will be considered as watching the MyBB homepage.

The file that control the translation of URLs into friendly activities message is inc/functions_online.php. Inside this file you can find the functions fetch_wol_activity($location) and build_friendly_wol_location($user_activity) that take care of this (the third function build_wol_row($user) is the function that generate the formated row using the proper templates).

Here is the source of inc/functions_online.php without any modifications from MyBB version 1.4.1 (BTW, you always must update your installation to the latest version of MyBB, it's really important to do it as soon as possible), Ive just split is to 3 parts, one to each of the functions and added the needed '<?php' and '?>'. Just for reference.

Page-level documentation, some default values and
function fetch_wol_activity($location)
PHP Code:
<?php
/**
 * MyBB 1.4
 * Copyright © 2008 MyBB Group, All Rights Reserved
 *
 * Website: http://www.mybboard.net
 * License: http://www.mybboard.net/about/license
 *
 * $Id: functions_online.php 4081 2008-08-08 01:47:02Z Tikitiki $
 */

$uid_list $aid_list $pid_list $tid_list $fid_list $eid_list = array();

/**
 * Fetch a users activity and any corresponding details from their location.
 *
 * @param string The location (URL) of the user.
 * @return array Array of location and activity information
 */
function fetch_wol_activity($location)
{
    global 
$uid_list$aid_list$pid_list$tid_list$fid_list$eid_list$plugins$user$parameters;

    
$user_activity = array();

    
$split_loc explode(".php"$location);
    if(
$split_loc[0] == $user['location'])
    {
        
$filename '';
    }
    else
    {
        
$filename my_substr($split_loc[0], -my_strpos(strrev($split_loc[0]), "/"));
    }
    if(
$split_loc[1])
    {
        
$temp explode("&"my_substr($split_loc[1], 1));
        foreach(
$temp as $param)
        {
            
$temp2 explode("="$param2);
            
$parameters[$temp2[0]] = $temp2[1];
        }
    }

    switch(
$filename)
    {
        case 
"announcements":
            if(
is_numeric($parameters['fid']))
            {
                
$fid_list[] = $parameters['fid'];
            }
            
$user_activity['activity'] = "announcements";
            
$user_activity['fid'] = $parameters['fid'];
            break;
        case 
"attachment":
            if(
is_numeric($parameters['aid']))
            {
                
$aid_list[] = $parameters['aid'];
            }
            
$user_activity['activity'] = "attachment";
            
$user_activity['aid'] = $parameters['aid'];
            break;
        case 
"calendar":
            if(
$parameters['action'] == "event")
            {
                if(
is_numeric($parameters['eid']))
                {
                    
$eid_list[] = $parameters['eid'];
                }
                
$user_activity['activity'] = "calendar_event";
                
$user_activity['eid'] = $parameters['eid'];
            }
            elseif(
$parameters['action'] == "addevent" || $parameters['action'] == "do_addevent")
            {
                
$user_activity['activity'] = "calendar_addevent";
            }
            elseif(
$parameters['action'] == "editevent" || $parameters['action'] == "do_editevent")
            {
                
$user_activity['activity'] = "calendar_editevent";
            }
            else
            {
                
$user_activity['activity'] = "calendar";
            }
            break;
        case 
"editpost":
            
$user_activity['activity'] = "editpost";
            break;
        case 
"forumdisplay":
            if(
is_numeric($parameters['fid']))
            {
                
$fid_list[] = $parameters['fid'];
            }
            
$user_activity['activity'] = "forumdisplay";
            
$user_activity['fid'] = $parameters['fid'];
            break;
        case 
"index":
        case 
'':
            
$user_activity['activity'] = "index";
            break;
        case 
"managegroup":
            
$user_activity['activity'] = "managegroup";
            break;
        case 
"member":
            if(
$parameters['action'] == "activate")
            {
                
$user_activity['activity'] = "member_activate";
            }
            elseif(
$parameters['action'] == "register" || $parameters['action'] == "do_register")
            {
                
$user_activity['activity'] = "member_register";
            }
            elseif(
$parameters['action'] == "login" || $parameters['action'] == "do_login")
            {
                
$user_activity['activity'] = "member_login";
            }
            elseif(
$parameters['action'] == "logout")
            {
                
$user_activity['activity'] = "member_logout";
            }
            elseif(
$parameters['action'] == "profile")
            {
                
$user_activity['activity'] = "member_profile";
                if(
is_numeric($parameters['uid']))
                {
                    
$uid_list[] = $parameters['uid'];
                }
                
$user_activity['uid'] = $parameters['uid'];
            }
            elseif(
$parameters['action'] == "emailuser" || $parameters['action'] == "do_emailuser")
            {
                
$user_activity['activity'] = "member_emailuser";
            }
            elseif(
$parameters['action'] == "rate" || $parameters['action'] == "do_rate")
            {
                
$user_activity['activity'] = "member_rate";
            }
            elseif(
$parameters['action'] == "resendactivation" || $parameters['action'] == "do_resendactivation")
            {
                
$user_activity['activity'] = "member_resendactivation";
            }
            elseif(
$parameters['action'] == "lostpw" || $parameters['action'] == "do_lostpw" || $parameters['action'] == "resetpassword")
            {
                
$user_activity['activity'] = "member_lostpw";
            }
            else
            {
                
$user_activity['activity'] = "member";
            }
            break;
        case 
"memberlist":
            
$user_activity['activity'] = "memberlist";
            break;
        case 
"misc":
            
$accepted_parameters = array("markread""help""buddypopup""smilies""syndication""imcenter""dstswitch");
            if(
$parameters['action'] == "whoposted")
            {
                if(
is_numeric($parameters['tid']))
                {
                    
$tid_list[] = $parameters['tid'];
                }
                
$user_activity['activity'] = "misc_whoposted";
                
$user_activity['tid'] = $parameters['tid'];
            }            
            elseif(
in_array($parameters['action'], $accepted_parameters))
            {
                
$user_activity['activity'] = "misc_".$parameters['action'];
            }
            else
            {
                
$user_activity['activity'] = "misc";
            }
            break;
        case 
"modcp":
            
$accepted_parameters = array("modlogs""announcements""finduser""warninglogs""ipsearch");
            
            foreach(
$accepted_parameters as $action)
            {
                if(
$parameters['action'] == $action)
                {
                    
$user_activity['activity'] = "modcp_".$action;
                    break;
                }
            }
            
            
$accepted_parameters = array();
            
$accepted_parameters['report'] = array("do_reports""reports""allreports");            
            
$accepted_parameters['new_annoucement'] = array("do_new_announcement""new_announcement");
            
$accepted_parameters['delete_announcement'] = array("do_delete_announcement""delete_announcement");
            
$accepted_parameters['edit_announcement'] = array("do_edit_announcement""edit_announcement");
            
$accepted_parameters['mod_queue'] = array("do_modqueue""modqueue");
            
$accepted_parameters['editprofile'] = array("do_editprofile""editprofile");
            
$accepted_parameters['banning'] = array("do_banuser""banning""liftban""banuser");
            
            foreach(
$accepted_parameters as $name => $actions)
            {
                if(
in_array($parameters['action'], $actions))
                {                    
                    
$user_activity['activity'] = "modcp_".$name;
                    break;
                }
            }
            
            if(!
$user_activity['activity'])
            {
                
$user_activity['activity'] = "modcp";
            }
            break;
        case 
"moderation":
            
$user_activity['activity'] = "moderation";
            break;
        case 
"newreply":
            if(
is_numeric($parameters['pid']))
            {
                
$pid_list[] = $parameters['pid'];
                
$user_activity['activity'] = "newreply";
                
$user_activity['pid'] = $parameters['pid'];
            }
            else
            {
                if(
is_numeric($parameters['tid']))
                {
                    
$tid_list[] = $parameters['tid'];
                }
                
$user_activity['activity'] = "newreply";
                
$user_activity['tid'] = $parameters['tid'];
            }
            break;
        case 
"newthread":
            if(
is_numeric($parameters['fid']))
            {
                
$fid_list[] = $parameters['fid'];
            }
            
$user_activity['activity'] = "newthread";
            
$user_activity['fid'] = $parameters['fid'];
            break;
        case 
"online":
            if(
$parameters['action'] == "today")
            {
                
$user_activity['activity'] = "woltoday";
            }
            else
            {
                
$user_activity['activity'] = "wol";
            }
            break;
        case 
"polls":
            
// Make the "do" parts the same as the other one.
            
if($parameters['action'] == "do_newpoll")
            {
                
$user_activity['activity'] = "newpoll";
            }
            elseif(
$parameters['action'] == "do_editpoll")
            {
                
$user_activity['activity'] = "editpoll";
            }
            else
            {
                
$accepted_parameters = array("do_editpoll""editpoll""newpoll""do_newpoll""showresults""vote");
            
                foreach(
$accepted_parameters as $action)
                {
                    if(
$parameters['action'] == $action)
                    {
                        
$user_activity['activity'] = $action;
                        break;
                    }
                }
                
                if(!
$user_activity['activity'])
                {
                    
$user_activity['activity'] = "showresults";
                }
            }
            break;
        case 
"printthread":
            if(
is_numeric($parameters['tid']))
            {
                
$tid_list[] = $parameters['tid'];
            }
            
$user_activity['activity'] = "printthread";
            
$user_activity['tid'] = $parameters['tid'];
            break;
        case 
"private":
            if(
$parameters['action'] == "send" || $parameters['action'] == "do_send")
            {
                
$user_activity['activity'] = "private_send";
            }
            elseif(
$parameters['action'] == "show")
            {
                
$user_activity['activity'] = "private_read";
            }
            elseif(
$parameters['action'] == "folders" || $parameters['action'] == "do_folders")
            {
                
$user_activity['activity'] = "private_folders";
            }
            else
            {
                
$user_activity['activity'] = "private";
            }
            break;
        case 
"ratethread":
            
$user_activity['activity'] = "ratethread";
            break;
        case 
"report":
            
$user_activity['activity'] = "report";
            break;
        case 
"reputation":
            
$user_activity['activity'] = "reputation";
            break;
        case 
"search":
            
$user_activity['activity'] = "search";
            break;
        case 
"sendthread":
            if(
is_numeric($parameters['tid']))
            {
                
$tid_list[] = $parameters['tid'];
            }
            
$user_activity['activity'] = "sendthread";
            
$user_activity['tid'] = $parameters['tid'];
        break;
        case 
"showteam":
            
$user_activity['activity'] = "showteam";
            break;
        case 
"showthread":
            if(
is_numeric($parameters['pid']) && $parameters['action'] == "showpost")
            {
                
$pid_list[] = $parameters['pid'];
                
$user_activity['activity'] = "showpost";
                
$user_activity['pid'] = $parameters['pid'];
            }
            else
            {
                if(
$parameters['page'])
                {
                    
$user_activity['page'] = $parameters['page'];
                }
                if(
is_numeric($parameters['tid']))
                {
                    
$tid_list[] = $parameters['tid'];
                }
                
$user_activity['activity'] = "showthread";
                
$user_activity['tid'] = $parameters['tid'];
            }
            break;
        case 
"stats":
            
$user_activity['activity'] = "stats";
            break;
        case 
"usercp":
            if(
$parameters['action'] == "profile" || $parameters['action'] == "do_profile")
            {
                
$user_activity['activity'] = "usercp_profile";
            }
            elseif(
$parameters['action'] == "options" || $parameters['action'] == "do_options")
            {
                
$user_activity['activity'] = "usercp_options";
            }
            elseif(
$parameters['action'] == "password" || $parameters['action'] == "do_password")
            {
                
$user_activity['activity'] = "usercp_password";
            }
            elseif(
$parameters['action'] == "editsig" || $parameters['action'] == "do_editsig")
            {
                
$user_activity['activity'] = "usercp_editsig";
            }
            elseif(
$parameters['action'] == "avatar" || $parameters['action'] == "do_avatar")
            {
                
$user_activity['activity'] = "usercp_avatar";
            }
            elseif(
$parameters['action'] == "editlists" || $parameters['action'] == "do_editlists")
            {
                
$user_activity['activity'] = "usercp_editlists";
            }
            elseif(
$parameters['action'] == "favorites")
            {
                
$user_activity['activity'] = "usercp_favorites";
            }
            elseif(
$parameters['action'] == "subscriptions")
            {
                
$user_activity['activity'] = "usercp_subscriptions";
            }
            elseif(
$parameters['action'] == "notepad" || $parameters['action'] == "do_notepad")
            {
                
$user_activity['activity'] = "usercp_notepad";
            }
            else
            {
                
$user_activity['activity'] = "usercp";
            }
            break;
        case 
"usercp2":
            if(
$parameters['action'] == "addfavorite" || $parameters['action'] == "removefavorite" || $parameters['action'] == "removefavorites")
            {
                
$user_activity['activity'] = "usercp2_favorites";
            }
            elseif(
$parameters['action'] == "addsubscription" || $parameters['action'] == "removesubscription" || $parameters['action'] == "removesubscription")
            {
                
$user_activity['activity'] = "usercp2_subscriptions";
            }
            break;
        case 
"portal":
            
$user_activity['activity'] = "portal";
            break;
        case 
"warnings":
            if(
$parameters['action'] == "warn" || $parameters['action'] == "do_warn")
            {
                
$user_activity['activity'] = "warnings_warn";
            }
            elseif(
$parameters['action'] == "do_revoke")
            {
                
$user_activity['activity'] = "warnings_revoke";
            }
            elseif(
$parameters['action'] == "view")
            {
                
$user_activity['activity'] == "warnings_view";
            }
            else
            {
                
$user_activity['activity'] = "warnings";
            }
            break;
        case 
"nopermission":
            
$user_activity['activity'] = "nopermission";
            break;
        default:
            
$user_activity['activity'] = "unknown";
            break;
    }
    
    
$user_activity['location'] = htmlspecialchars_uni($location);
    
    
$plugins->run_hooks_by_ref("fetch_wol_activity_end"$user_activity);
    
    return 
$user_activity;
}
?>
function build_friendly_wol_location($user_activity)
PHP Code:
<?php
/**
 * Builds a friendly named Who's Online location from an "activity" and array of user data. Assumes fetch_wol_activity has already been called.
 *
 * @param array Array containing activity and essential IDs.
 * @return string Location name for the activity being performed.
 */
function build_friendly_wol_location($user_activity)
{
    global 
$db$lang$uid_list$aid_list$pid_list$tid_list$fid_list$eid_list$plugins$parser$mybb;
    global 
$threads$forums$forums_linkto$posts$events$usernames$attachments;

    
// Fetch forum permissions for this user
    
$unviewableforums get_unviewable_forums();
    if(
$unviewableforums)
    {
        
$fidnot " AND fid NOT IN ($unviewableforums)";
    }

    
// Fetch any users
    
if(!is_array($usernames) && count($uid_list) > 0)
    {
        
$uid_sql implode(","$uid_list);
        
$query $db->simple_select("users""uid,username""uid IN ($uid_sql)");
        while(
$user $db->fetch_array($query))
        {
            
$usernames[$user['uid']] = $user['username'];
        }
    }
    
    
// Fetch any attachments
    
if(!is_array($attachments) && count($aid_list) > 0)
    {
        
$aid_sql implode(","$aid_list);
        
$query $db->simple_select("attachments""aid,pid""aid IN ($aid_sql)");
        while(
$attachment $db->fetch_array($query))
        {
            
$attachments[$attachment['aid']] = $attachment['pid'];
            
$pid_list[] = $attachment['pid'];
        }
    }

    
// Fetch any posts
    
if(!is_array($posts) && count($pid_list) > 0)
    {
        
$pid_sql implode(","$pid_list);
        
$query $db->simple_select("posts""pid,tid""pid IN ($pid_sql) $fidnot");
        while(
$post $db->fetch_array($query))
        {
            
$posts[$post['pid']] = $post['tid'];
            
$tid_list[] = $post['tid'];
        }
    }

    
// Fetch any threads
    
if(!is_array($threads) && count($tid_list) > 0)
    {
        
$tid_sql implode(","$tid_list);
        
$query $db->simple_select("threads""fid,tid,subject,visible""tid IN($tid_sql) $fidnot $visible");
        while(
$thread $db->fetch_array($query))
        {
            if(
is_moderator($thread['fid']) || $thread['visible'] != '0')
            {
                
$threads[$thread['tid']] = htmlspecialchars_uni($parser->parse_badwords($thread['subject']));
                
$fid_list[] = $thread['fid'];
            }
        }
    }

    
// Fetch any forums
    
if(!is_array($forums) && count($fid_list) >