toGlyph('fa-paperclip'));
}
else
{
define('ATTACHMENT_ICON', "
");
}
}
if(deftrue('BOOTSTRAP') && deftrue('FONTAWESOME'))
{
define('PM_DELETE_ICON', $tp->toGlyph('fa-trash', 'fw=1'));
}
else
{
define("PM_DELETE_ICON", "
");
}
$qs = explode('.', e_QUERY);
$action = varset($qs[0], 'inbox');
if(!$action)
{
$action = 'inbox';
}
if(!empty($_GET['mode']))
{
$action = $tp->filter($_GET['mode']);
}
/*
if($action == 'textarea' || $action == 'input')
{
if($qs[1] == 'pm_to') {
require_once(e_HANDLER.'user_select_class.php');
$us = new user_select;
$us->popup();
exit;
}
}*/
$pm_proc_id = intval(varset($qs[1], 0));
//$pm_prefs = $sysprefs->getArray('pm_prefs');
$pm_prefs = e107::getPlugPref('pm');
$pm_prefs['perpage'] = (int) varset($pm_prefs['perpage'], 10);
if(!isset($pm_prefs['pm_class']) || !check_class($pm_prefs['pm_class']))
{
require_once(HEADERF);
$ns->tablerender(LAN_PM, LAN_PM_12);
require_once(FOOTERF);
exit;
}
//setScVar('pm_handler_shortcodes','pmPrefs', $pm_prefs);
$pmManager = new pmbox_manager($pm_prefs);
//setScVar('pm_handler_shortcodes','pmManager', &$pmManager);
class pm_extended extends private_message
{
protected $pmManager = null;
/**
* Constructor
*
* @param array $prefs - pref settings for PM plugin
* @return none
*/
public function __construct($prefs, $manager)
{
$this->pmManager = $manager;
parent::__construct($prefs);
}
/**
* Show the 'Send to' form
* @param array|int $to_uid - a PM block of message to reply to, or UID of user to send to
*
* @return string text for display
*/
function show_send($to_uid)
{
// trigger_error('Method ' . __METHOD__ . ' is deprecated. Use e107::serialize() instead.', E_USER_DEPRECATED);
$pm_info = array();
$pm_outbox = $this->pmManager->pm_getInfo('outbox');
if(is_array($to_uid))
{
$pm_info = $to_uid; // We've been passed a 'reply to' PM
$to_uid = $pm_info['pm_from'];
}
if(!empty($to_uid))
{
if($this->canSendTo($to_uid) == false)
{
return "
" . LAN_PM_114 . "
";// sending to this user is not permitted.
}
$sql2 = e107::getDb('sql2');
if($sql2->select('user', 'user_name', 'user_id = ' . intval($to_uid))) //TODO add a check for userclass.
{
$row = $sql2->fetch();
$pm_info['from_name'] = $row['user_name'];
$pm_info['pm_from'] = intval($to_uid);
}
else
{
return "" . LAN_PM_115 . "
";
}
}
//echo "Show_send: {$to_uid} from {$pm_info['from_name']} is happening
";
if($pm_outbox['outbox']['filled'] >= 100)
{
return str_replace('{PERCENT}', $pm_outbox['outbox']['filled'], LAN_PM_13);
}
// $tpl_file = THEME.'pm_template.php';
// include_once(is_readable($tpl_file) ? $tpl_file : e_PLUGIN.'pm/pm_template.php');
if(THEME_LEGACY === true)
{
include_once(THEME . 'pm_template.php');
$PM_SEND_PM = $this->updateTemplate($PM_SEND_PM);
}
if(empty($PM_SEND_PM))
{
$PM_SEND_PM = e107::getTemplate('pm', 'pm', 'send');
}
$enc = (check_class($this->pmPrefs['attach_class']) ? "enctype='multipart/form-data'" : '');
// setScVar('pm_handler_shortcodes','pmInfo', $pm_info);
$sc = e107::getScBatch('pm', true, 'pm');
$sc->setVars($pm_info);
$sc->wrapper('pm');
// $PM_SEND_PM = $this->updateTemplate($PM_SEND_PM);
$text = "';
return $text;
}
/**
* Show inbox
* @param int $start - offset into list
*
* @return string text for display
*/
function show_inbox($start = 0)
{
$tp = e107::getParser();
// $tpl_file = THEME.'pm_template.php';
// include(is_readable($tpl_file) ? $tpl_file : e_PLUGIN.'pm/pm_template.php');
if(THEME_LEGACY === true)
{
include_once(THEME . 'pm_template.php');
// Is updateTemplate really necessary for v2.x templates?
$PM_INBOX = array();
$PM_INBOX['start'] = $this->updateTemplate($PM_INBOX_HEADER);
$PM_INBOX['item'] = $this->updateTemplate($PM_INBOX_TABLE);
$PM_INBOX['empty'] = $this->updateTemplate($PM_INBOX_EMPTY);
$PM_INBOX['end'] = $this->updateTemplate($PM_INBOX_FOOTER);
}
if(empty($PM_INBOX['item']))
{
$PM_INBOX = e107::getTemplate('pm', 'pm', 'inbox');
}
$pm_blocks = $this->block_get();
$pmlist = $this->pm_get_inbox(USERID, $start, $this->pmPrefs['perpage']);
// setScVar('pm_handler_shortcodes', 'pmNextPrev', array('start' => $start, 'total' => $pmlist['total_messages']));
$sc = e107::getScBatch('pm', true, 'pm');
$sc->pmNextPrev = array('start' => $start, 'total' => $pmlist['total_messages']);
$sc->wrapper('pm');
// Is updateTemplate really necessary for v2.x templates?
/*
$PM_INBOX_HEADER = $this->updateTemplate($PM_INBOX['start']);
$PM_INBOX_TABLE = $this->updateTemplate($PM_INBOX['item']);
$PM_INBOX_EMPTY = $this->updateTemplate($PM_INBOX['empty']);
$PM_INBOX_FOOTER = $this->updateTemplate($PM_INBOX['end']);
*/
$txt = "";
return $txt;
}
/**
* Show outbox
* @param int $start - offset into list
*
* @return string text for display
*/
function show_outbox($start = 0)
{
$tp = e107::getParser();
// $tpl_file = THEME.'pm_template.php';
// include(is_readable($tpl_file) ? $tpl_file : e_PLUGIN.'pm/pm_template.php');
if(THEME_LEGACY === true)
{
include_once(THEME . 'pm_template.php');
// Is updateTemplate really necessary for v2.x templates?
$PM_OUTBOX = array();
$PM_OUTBOX['start'] = $this->updateTemplate($PM_OUTBOX_HEADER);
$PM_OUTBOX['item'] = $this->updateTemplate($PM_OUTBOX_TABLE);
$PM_OUTBOX['empty'] = $this->updateTemplate($PM_OUTBOX_EMPTY);
$PM_OUTBOX['end'] = $this->updateTemplate($PM_OUTBOX_FOOTER);
}
if(empty($PM_OUTBOX['item']))
{
$PM_OUTBOX = e107::getTemplate('pm', 'pm', 'outbox');
}
$pmlist = $this->pm_get_outbox(USERID, $start, $this->pmPrefs['perpage']);
// setScVar('pm_handler_shortcodes', 'pmNextPrev', array('start' => $start, 'total' => $pmlist['total_messages']));
$sc = e107::getScBatch('pm', true, 'pm');
$sc->pmNextPrev = array('start' => $start, 'total' => $pmlist['total_messages']);
$sc->wrapper('pm');
// Is updateTemplate really necessary for v2.x templates?
/*
$PM_OUTBOX_HEADER = $this->updateTemplate($PM_OUTBOX['start']);
$PM_OUTBOX_TABLE = $this->updateTemplate($PM_OUTBOX['item']);
$PM_OUTBOX_EMPTY = $this->updateTemplate($PM_OUTBOX['empty']);
$PM_OUTBOX_FOOTER = $this->updateTemplate($PM_OUTBOX['end']);
*/
$txt = "';
return $txt;
}
/**
* Show details of a pm
* @param int $pmid - DB ID for PM
* @param string $comeFrom - inbox|outbox - determines whether inbox or outbox is shown after PM
*
* @return string text for display
*/
function show_pm($pmid, $comeFrom = '')
{
$ns = e107::getRender();
// $tpl_file = THEME.'pm_template.php';
// include_once(is_readable($tpl_file) ? $tpl_file : e_PLUGIN.'pm/pm_template.php');
if(THEME_LEGACY === true)
{
$PM_SHOW = null;
include_once(THEME . 'pm_template.php');
$PM_SHOW = $this->updateTemplate($PM_SHOW);
}
if(empty($PM_SHOW))
{
$PM_SHOW = e107::getTemplate('pm', 'pm', 'show');
}
$pm_info = $this->pm_get($pmid);
$sc = e107::getScBatch('pm', true, 'pm');
$sc->setVars($pm_info);
$sc->wrapper('pm');
if($pm_info['pm_to'] != USERID && $pm_info['pm_from'] != USERID)
{
$ns->tablerender(LAN_PM, LAN_PM_60);
return null;
}
if($pm_info['pm_read'] == 0 && $pm_info['pm_to'] == USERID)
{ // Inbox
$now = time();
$pm_info['pm_read'] = $now;
$this->pm_mark_read($pmid, $pm_info);
}
$sc->pmMode = $comeFrom;
// $PM_SHOW = $this->updateTemplate($PM_SHOW);
$txt = e107::getParser()->parseTemplate($PM_SHOW, true, $sc);
if($comeFrom == 'outbox')
{
$bread = array('text' => LAN_PLUGIN_PM_OUTBOX, 'url' => e107::url('pm', 'index') . '?mode=outbox');
}
else
{
$bread = array('text' => LAN_PLUGIN_PM_INBOX, 'url' => e107::url('pm', 'index') . '?mode=inbox');
}
$ns->tablerender(LAN_PM, $this->breadcrumb($bread, '#' . $pmid) . $txt);
if(!$comeFrom)
{
if($pm_info['pm_from'] == USERID)
{
$comeFrom = 'outbox';
}
}
// Need to show inbox or outbox from start
if($comeFrom == 'outbox')
{ // Show Outbox
$caption = '';
if(!deftrue('BOOTSTRAP'))
{
$caption .= LAN_PM . " - " . LAN_PLUGIN_PM_OUTBOX;
}
$ns->tablerender($caption, $this->show_outbox(), 'PM');
}
else
{ // Show Inbox
$caption = '';
if(!deftrue('BOOTSTRAP'))
{
$caption .= LAN_PM . " - " . LAN_PLUGIN_PM_INBOX;
}
$ns->tablerender($caption, $this->show_inbox(), 'PM');
}
}
/**
* Show list of blocked users
* @param int $start - not used at present; offset into list
*
* @return string text for display
*/
public function showBlocked($start = 0)
{
$tp = e107::getParser();
// $tpl_file = THEME.'pm_template.php';
// include(is_readable($tpl_file) ? $tpl_file : e_PLUGIN.'pm/pm_template.php');
if(THEME_LEGACY === true)
{
include_once(THEME . 'pm_template.php');
// Is updateTemplate really necessary for v2.x templates?
$PM_BLOCKED = array();
$PM_BLOCKED['start'] = $this->updateTemplate($PM_BLOCKED_HEADER);
$PM_BLOCKED['item'] = $this->updateTemplate($PM_BLOCKED_TABLE);
$PM_BLOCKED['empty'] = $this->updateTemplate($PM_BLOCKED_EMPTY);
$PM_BLOCKED['end'] = $this->updateTemplate($PM_BLOCKED_FOOTER);
}
if(empty($PM_BLOCKED))
{
$PM_BLOCKED = e107::getTemplate('pm', 'pm', 'blocked');
}
$pmBlocks = $this->block_get_user(); // TODO - handle pagination, maybe (is it likely to be necessary?)
$sc = e107::getScBatch('pm', true, 'pm');
$sc->pmBlocks = $pmBlocks;
$sc->wrapper('pm');
// Is updateTemplate really necessary for v2.x templates?
/*
$PM_BLOCKED_HEADER = $this->updateTemplate($PM_BLOCKED['start']);
$PM_BLOCKED_TABLE = $this->updateTemplate($PM_BLOCKED['item']);
$PM_BLOCKED_EMPTY = $this->updateTemplate($PM_BLOCKED['empty']);
$PM_BLOCKED_FOOTER = $this->updateTemplate($PM_BLOCKED['end']);
*/
$txt = "';
return $txt;
}
/**
* Send a PM based on $_POST parameters
*
* @return string text for display
*/
function post_pm()
{
// print_a($_POST);
if(!check_class($this->pmPrefs['pm_class']))
{
return LAN_PM_12;
}
$pm_info = $this->pmManager->pm_getInfo('outbox');
if($pm_info['outbox']['total'] != $_POST['numsent'])
{
return LAN_PM_14;
}
if(isset($_POST['pm_userclass']) && ($_POST['pm_userclass'] == e_UC_NOBODY))
{
$_POST['pm_userclass'] = false;
}
if(isset($_POST['user']))
{
$_POST['pm_to'] = $_POST['user'];
}
if(isset($_POST['pm_to']))
{
$msg = '';
if(!empty($_POST['pm_userclass']))
{
if(!check_class($this->pmPrefs['opt_userclass']))
{
return LAN_PM_15;
}
elseif((!check_class($_POST['pm_userclass']) || !check_class($this->pmPrefs['multi_class'])) && !ADMIN)
{
return LAN_PM_16;
}
}
else
{
$to_array = explode(",", str_replace(" ", "", $_POST['pm_to']));
$to_array = array_unique($to_array);
if(count($to_array) == 1)
{
$_POST['pm_to'] = $to_array[0];
}
if(check_class($this->pmPrefs['multi_class']) && count($to_array) > 1)
{
foreach($to_array as $to)
{
if($to_info = $this->pm_getuid($to))
{ // Check whether sender is blocked - if so, add one to count
if(!e107::getDb()->update('private_msg_block', "pm_block_count=pm_block_count+1 WHERE pm_block_from = '" . USERID . "' AND pm_block_to = '" . e107::getParser()->toDB($to) . "'"))
{
$_POST['to_array'][] = $to_info;
}
}
}
}
else
{
if($to_info = $this->pm_getuid($_POST['pm_to']))
{
$_POST['to_info'] = $to_info;
}
else
{
return LAN_PM_17;
}
if(e107::getDb()->update('private_msg_block', "pm_block_count=pm_block_count+1 WHERE pm_block_from = '" . USERID . "' AND pm_block_to = '{$to_info['user_id']}'"))
{
return LAN_PM_18 . $to_info['user_name'];
}
}
}
if(isset($_POST['receipt']))
{
if(!check_class($this->pmPrefs['receipt_class']))
{
unset($_POST['receipt']);
}
}
$totalsize = strlen($_POST['pm_message']);
$maxsize = intval($this->pmPrefs['attach_size']) * 1024;
foreach(array_keys($_FILES['file_userfile']['size']) as $fid)
{
if($maxsize > 0 && $_FILES['file_userfile']['size'][$fid] > $maxsize)
{
$msg .= str_replace("{FILENAME}", $_FILES['file_userfile']['name'][$fid], LAN_PM_62) . "
";
$_FILES['file_userfile']['size'][$fid] = 0;
}
$totalsize += $_FILES['file_userfile']['size'][$fid];
}
if(intval($this->pmPrefs['pm_limits']) > 0)
{
if($this->pmPrefs['pm_limits'] == '1')
{
if($pm_info['outbox']['total'] == $pm_info['outbox']['limit'])
{
return LAN_PM_19;
}
}
else
{
if($pm_info['outbox']['size'] + $totalsize > $pm_info['outbox']['limit'])
{
return LAN_PM_21;
}
}
}
if(!empty($_POST['uploaded']))
{
if(check_class($this->pmPrefs['attach_class']))
{
$_POST['uploaded'] = $this->processAttachments();
foreach($_POST['uploaded'] as $var)
{
if(!empty($var['message']))
{
$msg .= $var['message'] . "
";
}
}
}
else
{
$msg .= LAN_PM_23 . '
';
unset($_POST['uploaded']);
}
}
$_POST['from_id'] = USERID;
return $msg . $this->add($_POST);
}
}
function processAttachments()
{
$randnum = rand(1000, 9999);
$type = 'attachment+' . $randnum . '_';
return e107::getFile()->getUploaded("attachments", $type, array('max_file_count' => 3));
}
function breadcrumb($type = '', $other='')
{
if(!deftrue('BOOTSTRAP'))
{
return null;
}
$array = array();
$array[0] = array('text' => LAN_PM, 'url' => e107::url('pm', 'index'));
if(is_string($type))
{
$array[1] = array('text' => $type, 'url' => null);
}
elseif(is_array($type))
{
$array[1] = $type;
}
if(!empty($other))
{
$array[2] = array('text' => $other, 'url' => null);
}
e107::breadcrumb($array);
return e107::getForm()->breadcrumb($array);
}
}
/**
* Look up users matching a keyword, output a list of those found
* Direct echo
*/
function pm_user_lookup()
{
$sql = e107::getDb();
$tp = e107::getParser();
$query = "SELECT * FROM #user WHERE user_name REGEXP '^" . $tp->filter($_POST['keyword'], 'w') . "' ";
if($sql->gen($query))
{
echo '[';
while($row = $sql->fetch())
{
$u[] = "{\"caption\":\"" . $row['user_name'] . "\",\"value\":" . $row['user_id'] . "}";
}
echo implode(",", $u);
echo ']';
}
exit;
}
//$pm =& new private_message;
$pm = new pm_extended($pm_prefs, $pmManager);
$message = '';
$pmSource = '';
if(isset($_POST['pm_come_from']))
{
$pmSource = $tp->toDB($_POST['pm_come_from']);
}
elseif(isset($qs[2]))
{
$pmSource = $tp->toDB($qs[2]);
}
//Auto-delete message, if timeout set in admin
$del_qry = array();
$read_timeout = intval($pm_prefs['read_timeout']);
$unread_timeout = intval($pm_prefs['unread_timeout']);
if($read_timeout > 0)
{
$timeout = time() - ($read_timeout * 86400);
$del_qry[] = "(pm_sent < {$timeout} AND pm_read > 0)";
}
if($unread_timeout > 0)
{
$timeout = time() - ($unread_timeout * 86400);
$del_qry[] = "(pm_sent < {$timeout} AND pm_read = 0)";
}
if(count($del_qry) > 0)
{
$qry = implode(' OR ', $del_qry) . ' AND (pm_from = ' . USERID . ' OR pm_to = ' . USERID . ')';
if($sql->select('private_msg', 'pm_id', $qry))
{
$delList = $sql->db_getList();
foreach($delList as $p)
{
$pm->del($p['pm_id'], true);
}
}
}
if('del' == $action || isset($_POST['pm_delete_selected']))
{
if(isset($_POST['pm_delete_selected']))
{
foreach(array_keys($_POST['selected_pm']) as $id)
{
$message .= LAN_PM_24 . ": {$id}
";
$message .= $pm->del($id);
}
}
if('del' == $action)
{
$message = $pm->del($pm_proc_id);
}
if($pmSource)
{
$action = $pmSource;
}
else
{
if(substr($_SERVER['HTTP_REFERER'], -5) == 'inbox')
{
$action = 'inbox';
}
elseif(substr($_SERVER['HTTP_REFERER'], -6) == 'outbox')
{
$action = 'outbox';
}
}
$pm_proc_id = 0;
unset($qs);
}
if('delblocked' == $action || isset($_POST['pm_delete_blocked_selected']))
{
if(isset($_POST['pm_delete_blocked_selected']))
{
foreach(array_keys($_POST['selected_pm']) as $id)
{
$message .= LAN_PM_70 . ": {$id}
";
$message .= $pm->block_del($id) . '
';
}
}
elseif('delblocked' == $action)
{
$message = $pm->block_del($pm_proc_id);
}
$action = 'blocked';
$pm_proc_id = 0;
unset($qs);
}
if('block' == $action)
{
$message = $pm->block_add($pm_proc_id);
$action = 'inbox';
$pm_proc_id = 0;
}
if('unblock' == $action)
{
$message = $pm->block_del($pm_proc_id);
$action = 'inbox';
$pm_proc_id = 0;
}
if('get' == $action)
{
$pm->send_file($pm_proc_id, intval($qs[2]));
exit;
}
require_once(HEADERF);
if(isset($_POST['postpm']))
{
$message = $pm->post_pm();
$action = 'outbox';
}
$mes = e107::getMessage();
if($message != '')
{
$mes->add($message);
// $ns->tablerender('', "". $message."
");
}
//-----------------------------------------
// DISPLAY TASKS
//-----------------------------------------
switch($action)
{
case 'send' :
$ns->tablerender(LAN_PM, $pm->breadcrumb(LAN_PLUGIN_PM_NEW) . $mes->render() . $pm->show_send($pm_proc_id));
break;
case 'reply' :
$pmid = $pm_proc_id;
if($pm_info = $pm->pm_get($pmid))
{
if($pm_info['pm_to'] != USERID)
{
$ns->tablerender(LAN_PM, $pm->breadcrumb(LAN_PM_55) . $mes->render() . LAN_PM_56);
}
else
{
$ns->tablerender(LAN_PM, $pm->breadcrumb(LAN_PM_55) . $mes->render() . $pm->show_send($pm_info));
}
}
else
{
$ns->tablerender(LAN_PM, $pm->breadcrumb(LAN_PM_55) . $mes->render() . LAN_PM_57);
}
break;
case 'inbox' :
$caption = LAN_PM;
if(THEME_LEGACY === true)
{
$caption .= ' - ' . LAN_PLUGIN_PM_INBOX;
}
$ns->tablerender($caption, $pm->breadcrumb(LAN_PLUGIN_PM_INBOX) . $mes->render() . $pm->show_inbox($pm_proc_id), 'PM');
break;
case 'outbox' :
$caption = LAN_PM;
if(THEME_LEGACY === true)
{
$caption .= ' - ' . LAN_PLUGIN_PM_OUTBOX;
}
$ns->tablerender($caption, $pm->breadcrumb(LAN_PLUGIN_PM_OUTBOX) . $mes->render() . $pm->show_outbox($pm_proc_id), 'PM');
break;
case 'show' :
$pm->show_pm($pm_proc_id, $pmSource);
break;
case 'blocked' :
$caption = LAN_PM;
if(THEME_LEGACY === true)
{
$caption .= ' - ' . LAN_PM_66;
}
$ns->tablerender($caption, $pm->breadcrumb('blocked') . $mes->render() . $pm->showBlocked($pm_proc_id), 'PM');
break;
}
require_once(FOOTERF);