Hmmm....
I re-wrote the query, actually, and everything SEEMS to be going fine, so far.
Other people can use this, of they want. Word of warning, though--if you have any plugins that make use of the hook query fields or hook query joins for the converse page, you're shit outta luck.
Below is the modified script, if anyone wants to test it out. Once I have my troublesome users test it out a bit more, I'll post any corrections I need to make.
PHP Code:
<?php /*======================================================================*\ || #################################################################### || || # vBulletin 3.8.0 Beta 2 English - Licence Number (Deleted License Number) || # ---------------------------------------------------------------- # || || # Copyright �2000-2008 Jelsoft Enterprises Ltd. All Rights Reserved. || || # This file may not be redistributed in whole or significant part. # || || # ---------------- VBULLETIN IS NOT FREE SOFTWARE ---------------- # || || # http://www.vbulletin.com | http://www.vbulletin.com/license.html # || || #################################################################### || \*======================================================================*/
// ####################### SET PHP ENVIRONMENT ########################### error_reporting(E_ALL & ~E_NOTICE);
// #################### DEFINE IMPORTANT CONSTANTS ####################### define('THIS_SCRIPT', 'converse2'); define('CSRF_PROTECTION', true); define('BYPASS_STYLE_OVERRIDE', 1);
// ################### PRE-CACHE TEMPLATES AND DATA ###################### // get special phrase groups $phrasegroups = array( 'user', 'posting', );
// get special data templates from the datastore $specialtemplates = array( 'smiliecache', 'bbcodecache', );
// pre-cache templates used by all actions $globaltemplates = array( 'editor_css', 'editor_clientscript', 'editor_jsoptions_font', 'editor_jsoptions_size', 'memberinfo_block_visitormessaging', 'memberinfo_css', 'memberinfo_usercss', 'memberinfo_visitormessage', 'memberinfo_visitormessage_deleted', 'memberinfo_visitormessage_ignored', 'showthread_quickreply', 'converse', );
// pre-cache templates used by specific actions $actiontemplates = array();
// ######################### REQUIRE BACK-END ############################ require_once('./global.php'); require_once(DIR . '/includes/class_bbcode.php'); require_once(DIR . '/includes/class_visitormessage.php'); require_once(DIR . '/includes/functions_visitormessage.php');
// ####################################################################### // ######################## START MAIN SCRIPT ############################ // #######################################################################
if (!($vbulletin->userinfo['permissions']['forumpermissions'] & $vbulletin->bf_ugp_forumpermissions['canview']) OR !($vbulletin->userinfo['permissions']['genericpermissions'] & $vbulletin->bf_ugp_genericpermissions['canviewmembers'])) { print_no_permission(); } if (!($vbulletin->options['socnet'] & $vbulletin->bf_misc_socnet['enable_visitor_messaging'])) { print_no_permission(); }
$vbulletin->input->clean_array_gpc('r', array( 'u' => TYPE_UINT, 'u2' => TYPE_UINT, 'perpage' => TYPE_UINT, 'pagenumber' => TYPE_UINT, 'showignored' => TYPE_BOOL, 'vmid' => TYPE_UINT ));
($hook = vBulletinHook::fetch_hook('converse_start')) ? eval($hook) : false;
if ($vbulletin->GPC['vmid']) { $vminfo = verify_visitormessage($vbulletin->GPC['vmid']);
if ( ( $vminfo['postuserid'] != $vbulletin->GPC['u'] OR $vminfo['userid'] != $vbulletin->GPC['u2'] ) AND ( $vminfo['userid'] != $vbulletin->GPC['u'] OR $vminfo['postuserid'] != $vbulletin->GPC['u2'] ) ) { standard_error(fetch_error('invalidid', $vbphrase['visitor_message'], $vbulletin->options['contactuslink'])); } }
$userinfo = verify_id('user', $vbulletin->GPC['u'], true, true, FETCH_USERINFO_USERCSS | FETCH_USERINFO_ISFRIEND); $userinfo2 = verify_id('user', $vbulletin->GPC['u2'], true, true, FETCH_USERINFO_USERCSS | FETCH_USERINFO_ISFRIEND);
// $userinfo will never be vbulletin->userinfo // $userinfo2 may be vbulletin->userinfo if ($userinfo2['userid'] == $vbulletin->userinfo['userid']) { $viewself = true; } cache_permissions($userinfo, false);
if ( ( !$userinfo['vm_enable'] AND !can_moderate(0,'canmoderatevisitormessages') ) OR ( $userinfo['vm_contactonly'] AND !$userinfo['bbuser_iscontact_of_user'] AND !can_moderate(0,'canmoderatevisitormessages') ) ) { print_no_permission(); }
if ( ( !$userinfo2['vm_enable'] AND ( !can_moderate(0,'canmoderatevisitormessages') OR $viewself ) ) OR ( $userinfo2['vm_contactonly'] AND !$userinfo2['bbuser_iscontact_of_user'] AND !can_moderate(0,'canmoderatevisitormessages') AND !$viewself ) ) { print_no_permission(); }
// state1/sql1 refers to messages left to u's profile by u2 (which may be bbuserinfo) // state2/sql2 refers to messages left to u2's profile (which may be bbuserinfo) by u
$sql1 = $sql2 = array();
$state2 = array('visible'); if (fetch_visitor_message_perm('canmoderatevisitormessages', $userinfo2)) { $state2[] = 'moderation'; } if (can_moderate(0,'canmoderatevisitormessages') OR ($viewself AND $vbulletin->userinfo['permissions']['visitormessagepermissions'] & $vbulletin->bf_ugp_visitormessagepermissions['canmanageownprofile'])) { $state2[] = 'deleted'; $deljoinsql2 = "LEFT JOIN " . TABLE_PREFIX . "deletionlog AS deletionlog ON (visitormessage.vmid = deletionlog.primaryid AND deletionlog.type = 'visitormessage')"; } else { $deljoinsql2 = ''; }
$sql2[] = "visitormessage.userid = $userinfo2[userid]"; $sql2[] = "visitormessage.postuserid = $userinfo[userid]"; $sql2[] = "visitormessage.state IN ('" . implode("','", $state2) . "')";
$state1 = array('visible'); if ($viewself OR fetch_visitor_message_perm('canmoderatevisitormessages', $userinfo)) { $state1[] = 'moderation'; } if (can_moderate(0,'canmoderatevisitormessages')) { $state1[] = 'deleted'; $delsql1 = ",deletionlog.userid AS del_userid, deletionlog.username AS del_username, deletionlog.reason AS del_reason"; $deljoinsql1 = "LEFT JOIN " . TABLE_PREFIX . "deletionlog AS deletionlog ON (visitormessage.vmid = deletionlog.primaryid AND deletionlog.type = 'visitormessage')"; } else if ($deljoinsql2) { $delsql1 = ",0 AS del_userid, '' AS del_username, '' AS del_reason"; }
$sql1[] = "visitormessage.userid = $userinfo[userid]"; $sql1[] = "visitormessage.postuserid = $userinfo2[userid]"; $sql1[] = "visitormessage.state IN ('" . implode("','", $state1) . "')";
if (!$vbulletin->GPC['perpage']) { $perpage = $vbulletin->options['vm_perpage']; } else if ($vbulletin->GPC['perpage'] > $vbulletin->options['vm_maxperpage']) { $perpage = $vbulletin->options['vm_maxperpage']; } else { $perpage = $vbulletin->GPC['perpage']; }
$hook_query_fields1 = $hook_query_fields2 = $hook_query_joins1 = $hook_query_joins2 = $hook_query_where1 = $hook_query_where2 = ''; ($hook = vBulletinHook::fetch_hook('converse_query')) ? eval($hook) : false;
if ($vminfo['vmid']) { $getpagenum = $vbulletin->db->query_first(" SELECT COUNT(*) As comments FROM " . TABLE_PREFIX . "visitormessage AS visitormessage WHERE ( (" . implode(" AND ", $sql1) . ") OR (" . implode(" AND ", $sql2) . ") ) AND dateline >= " . $vminfo[dateline] ); $vbulletin->GPC['pagenumber'] = ceil($getpagenum['comments'] / $perpage); }
$pagenumber = $vbulletin->GPC['pagenumber'];
do { if (!$pagenumber) { $pagenumber = 1; }
$start = ($pagenumber - 1) * $perpage;
$deletes = false; $state1 = $state2 = array('visible'); if ($viewself OR fetch_visitor_message_perm('canmoderatevisitormessages', $userinfo)) {$state1[] = 'moderation'; $deletes = true;} if (fetch_visitor_message_perm('canmoderatevisitormessages', $userinfo2)) {$state2[] = 'moderation'; $deletes = true;} if (can_moderate(0,'canmoderatevisitormessages')) { $state1[] = 'deleted'; $state2[] = 'deleted'; $deletes = true; } $is_self = (can_moderate(0,'canmoderatevisitormessages') OR ($vbulletin->userinfo['permissions']['visitormessagepermissions'] & $vbulletin->bf_ugp_visitormessagepermissions['canmanageownprofile'])) ? "visitormessage.userid = " . $vbulletin->userinfo['userid'] : '0';
if ($deletes) { $delsql = ", IF($is_self, deletionlog.userid, 0) AS del_userid, IF($is_self, deletionlog.username, 0) AS del_username, IF($is_self, deletionlog.reason, 0) AS del_reason"; $deljoin = "LEFT JOIN " . TABLE_PREFIX . "deletionlog AS deletionlog ON (visitormessage.vmid = deletionlog.primaryid AND deletionlog.type = 'visitormessage')"; } $wheresql1 = "(visitormessage.userid = $userinfo[userid] AND visitormessage.postuserid = $userinfo2[userid] AND visitormessage.state IN ('" . implode("','", $state1) . "'))"; $wheresql2 = "(visitormessage.userid = $userinfo2[userid] AND visitormessage.postuserid = $userinfo[userid] AND visitormessage.state IN ('" . implode("','", $state2) . "'))";
$messagecount = $db->query_first("SELECT COUNT(*) AS vms FROM " . TABLE_PREFIX . "visitormessage AS visitormessage WHERE $wheresql1 OR $wheresql2"); if ($start >= $messagecount['vms']) {$pagenumber = ceil($messagecount['vms'] / $perpage);}
$messages_query = "SELECT visitormessage.*, visitormessage.dateline AS pmdateline, user.*, visitormessage.ipaddress AS messageipaddress, visitormessage.userid AS profileuserid $delsql " . ($vbulletin->options['avatarenabled'] ? ",avatar.avatarpath, NOT ISNULL(customavatar.userid) AS hascustomavatar, customavatar.dateline AS avatardateline,customavatar.width AS avwidth,customavatar.height AS avheight" : "") . " FROM " . TABLE_PREFIX . "visitormessage AS visitormessage LEFT JOIN " . TABLE_PREFIX . "user AS user ON (visitormessage.postuserid = user.userid) " . ($vbulletin->options['avatarenabled'] ? "LEFT JOIN " . TABLE_PREFIX . "avatar AS avatar ON(avatar.avatarid = user.avatarid) LEFT JOIN " . TABLE_PREFIX . "customavatar AS customavatar ON(customavatar.userid = user.userid)" : "") . " $deljoin WHERE $wheresql1 OR $wheresql2 ORDER BY pmdateline DESC LIMIT $start, $perpage";
$messages = $db->query_read_slave($messages_query);
} while ($start >= $messagetotal AND $messagetotal);
$block_data = array( 'messagestart' => $start + 1, 'messageend' => min($start + $perpage, $messagetotal), 'fromconverse' => 1, ); $prepared = array('vm_total' => $messagetotal);
$bbcode =& new vB_BbCodeParser($vbulletin, fetch_tag_list()); $factory =& new vB_Visitor_MessageFactory($vbulletin, $bbcode, $userinfo2);
$show['conversepage'] = true;
$block_data['messagebits'] = ''; $have_inlinemod = false; while ($message = $db->fetch_array($messages)) { if (in_coventry($message['postuserid']) AND !$vbulletin->GPC['showignored']) { $message['ignored'] = true; } if ($message['profileuserid'] == $vbulletin->userinfo['userid'] AND $message['state'] == 'visible' AND !$message['messageread']) { $read_ids[] = $message['vmid']; } $response_handler =& $factory->create($message); $response_handler->converse = false; $response_handler->cachable = false; $block_data['messagebits'] .= $response_handler->construct();
if ($show['inlinemod']) { $have_inlinemod = true; }
$block_data['lastcomment'] = !$block_data['lastcomment'] ? $message['dateline'] : $block_data['lastcomment']; }
// our profile and ids that need read if (!empty($read_ids)) { $db->query_write("UPDATE " . TABLE_PREFIX . "visitormessage SET messageread = 1 WHERE vmid IN (" . implode(',', $read_ids) . ")");
build_visitor_message_counters($vbulletin->userinfo['userid']); }
$dummydata = array(); $show['delete'] = ($have_inlinemod AND fetch_visitor_message_perm('candeletevisitormessages', $userinfo2)); $show['undelete'] = ($have_inlinemod AND fetch_visitor_message_perm('canundeletevisitormessages', $userinfo2)); $show['approve'] = ($have_inlinemod AND fetch_visitor_message_perm('canmoderatevisitormessages', $userinfo2)); $show['inlinemod'] = ($show['delete'] OR $show['undelete'] OR $show['approve']);
// Only allow AJAX QC on the first page $show['quickcomment'] = ( $userinfo['permissions']['genericpermissions'] & $vbulletin->bf_ugp_genericpermissions['canviewmembers'] AND $vbulletin->options['socnet'] & $vbulletin->bf_misc_socnet['enable_visitor_messaging'] AND $viewself AND $vbulletin->userinfo['permissions']['visitormessagepermissions'] & $vbulletin->bf_ugp_visitormessagepermissions['canmessageothersprofile'] ); $show['post_visitor_message'] = $show['quickcomment'];
$show['allow_ajax_qc'] = ($pagenumber == 1 AND $messagetotal) ? 1 : 0; $pagenavbits = array( "u=$userinfo[userid]", "u2=$userinfo2[userid]", ); if ($perpage != $vbulletin->options['vm_perpage']) { $pagenavbits[] = "pp=$perpage"; }
if ($vbulletin->GPC['showignored']) { $pagenavbits[] = 'showignored=1'; }
$pagenavurl = 'converse.php?' . $vbulletin->session->vars['sessionurl'] . implode('&', $pagenavbits); $block_data['pagenav'] = construct_page_nav($pagenumber, $perpage, $messagetotal, $pagenavurl, '');
if ($show['quickcomment']) { require_once(DIR . '/includes/functions_editor.php');
$stylevar['messagewidth'] = $stylevar['messagewidth_usercp']; $block_data['editorid'] = construct_edit_toolbar( '', false, 'visitormessage', $vbulletin->options['allowsmilies'], true, false, 'qr_small' ); $block_data['messagearea'] =& $messagearea; $block_data['clientscript'] = $vBeditTemplate['clientscript']; }
$navbits = construct_navbits(array( 'member.php?' . $vbulletin->session->vars['sessionurl'] . "u=$userinfo[userid]" => $userinfo['username'], '' => construct_phrase($vbphrase['conversation_between_x_and_y'], $userinfo['username'], $userinfo2['username']), )); eval('$navbar = "' . fetch_template('navbar') . '";');
$usercss = construct_usercss($userinfo, $show['usercss_switch']); $show['usercss_switch'] = ($show['usercss_switch'] AND $vbulletin->userinfo['userid'] != $userinfo['userid']); construct_usercss_switch($show['usercss_switch'], $usercss_switch_phrase);
($hook = vBulletinHook::fetch_hook('converse_complete')) ? eval($hook) : false;
eval('$memberinfo_css = "' . fetch_template('memberinfo_css') . '";'); eval('$html = "' . fetch_template('memberinfo_block_visitormessaging') . '";'); eval('print_output("' . fetch_template('converse') . '");');
/*======================================================================*\ || #################################################################### || # Downloaded: 08:39, Tue Nov 4th 2008 || # CVS: $RCSfile$ - $Revision: 16016 $ || #################################################################### \*======================================================================*/ ?>
|