1619 lines
51 KiB
PHP
1619 lines
51 KiB
PHP
<?php
|
|
|
|
/*
|
|
+--------------------------------------------------------------------------
|
|
| Invision Power Board
|
|
| =============================================
|
|
| by Matthew Mecham
|
|
| (c) 2001 - 2006 Invision Power Services, Inc.
|
|
| http://www.invisionpower.com
|
|
| =============================================
|
|
| Web: http://www.invisionboard.com
|
|
| Licence Info: http://www.invisionboard.com/?license
|
|
+---------------------------------------------------------------------------
|
|
| > $Date: 2008-03-28 18:08:02 -0400 (Fri, 28 Mar 2008) $
|
|
| > $Revision: 1232 $
|
|
| > $Author: bfarber $
|
|
+---------------------------------------------------------------------------
|
|
|
|
|
| > Msg Func module
|
|
| > Module written by Matt Mecham
|
|
| > Date started: 14th February 2002
|
|
|
|
|
| > Module Version 1.0.0
|
|
| > DBA Checked: Fri 21 May 2004
|
|
+--------------------------------------------------------------------------
|
|
*/
|
|
|
|
|
|
if ( ! defined( 'IN_IPB' ) )
|
|
{
|
|
print "<h1>Incorrect access</h1>You cannot access this file directly. If you have recently upgraded, make sure you upgraded all the relevant files.";
|
|
exit();
|
|
}
|
|
|
|
class func_msg
|
|
{
|
|
# Classes
|
|
var $ipsclass;
|
|
|
|
# Others
|
|
var $postlib = "";
|
|
var $class = "";
|
|
var $output = "";
|
|
var $can_upload = 0;
|
|
var $form_extra = "";
|
|
var $hidden_field = "";
|
|
var $redirect_url = "";
|
|
var $redirect_lang= "";
|
|
|
|
var $jump_html = "";
|
|
var $vid = "";
|
|
|
|
var $force_pm = 0;
|
|
|
|
var $member = array();
|
|
|
|
function register_class( &$class )
|
|
{
|
|
$this->class = &$class;
|
|
}
|
|
|
|
/*-------------------------------------------------------------------------*/
|
|
// Initiate
|
|
/*-------------------------------------------------------------------------*/
|
|
|
|
function init()
|
|
{
|
|
//-----------------------------------------
|
|
// Get post stuff
|
|
//-----------------------------------------
|
|
|
|
require_once( ROOT_PATH.'sources/classes/post/class_post.php' );
|
|
$this->postlib = new class_post();
|
|
$this->postlib->ipsclass =& $this->ipsclass;
|
|
|
|
$this->postlib->load_classes();
|
|
|
|
if ( $this->ipsclass->member['g_attach_max'] != -1 and $this->ipsclass->member['g_can_msg_attach'] )
|
|
{
|
|
$this->can_upload = 1;
|
|
$this->form_extra = " enctype='multipart/form-data'";
|
|
$this->hidden_field = "<input type='hidden' name='MAX_FILE_SIZE' value='".($this->ipsclass->member['g_attach_max']*1024)."' />";
|
|
}
|
|
|
|
$this->postlib->can_upload = $this->can_upload;
|
|
}
|
|
|
|
|
|
/*-------------------------------------------------------------------------*/
|
|
// Generate the UserCP menu
|
|
/*-------------------------------------------------------------------------*/
|
|
|
|
function ucp_generate_menu()
|
|
{
|
|
//-----------------------------------------
|
|
// INIT
|
|
//-----------------------------------------
|
|
|
|
$menu_html = "";
|
|
$component_html = "";
|
|
$folder_links = "";
|
|
|
|
//-----------------------------------------
|
|
// Get all member info..
|
|
//-----------------------------------------
|
|
|
|
$this->ipsclass->DB->cache_add_query( 'generic_get_all_member', array( 'mid' => $this->ipsclass->member['id'] ) );
|
|
$this->ipsclass->DB->cache_exec_query();
|
|
|
|
if ( ! $member = $this->ipsclass->DB->fetch_row() )
|
|
{
|
|
$this->ipsclass->DB->do_insert( 'member_extra', array( 'id' => $this->ipsclass->member['id'] ) );
|
|
}
|
|
else
|
|
{
|
|
$this->ipsclass->member = array_merge( $member, $this->ipsclass->member );
|
|
}
|
|
|
|
//-----------------------------------------
|
|
// Get enabled components
|
|
//-----------------------------------------
|
|
|
|
if ( is_array( $this->ipsclass->cache['components'] ) and count( $this->ipsclass->cache['components'] ) )
|
|
{
|
|
foreach( $this->ipsclass->cache['components'] as $data )
|
|
{
|
|
$file = ROOT_PATH.'sources/components_ucp/'.$data['com_filename'].'.php';
|
|
|
|
if ( file_exists( $file ) )
|
|
{
|
|
require_once( $file );
|
|
$name = 'components_ucp_'.$data['com_filename'];
|
|
$tmp = new $name();
|
|
$tmp->ipsclass =& $this->ipsclass;
|
|
|
|
$component_html .= $tmp->ucp_build_menu();
|
|
|
|
unset($tmp);
|
|
}
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------
|
|
// Print the top button menu
|
|
//-----------------------------------------
|
|
|
|
$menu_html = $this->ipsclass->compiled_templates['skin_msg']->Menu_bar( $component_html );
|
|
|
|
//-----------------------------------------
|
|
// Messenger
|
|
//-----------------------------------------
|
|
|
|
if ( $this->ipsclass->member['g_use_pm'] )
|
|
{
|
|
//-----------------------------------------
|
|
// Do a little set up, do a litle dance, get
|
|
// down tonight! *boogie*
|
|
//-----------------------------------------
|
|
|
|
$this->jump_html = "<select name='VID' class='forminput'>\n";
|
|
|
|
$this->ipsclass->member['dir_data'] = array();
|
|
|
|
//-----------------------------------------
|
|
// Do we have VID?
|
|
// No, it's just the way we walk! Haha, etc.
|
|
//-----------------------------------------
|
|
|
|
if ( isset($this->ipsclass->input['VID']) AND $this->ipsclass->input['VID'] )
|
|
{
|
|
$this->vid = $this->ipsclass->input['VID'];
|
|
}
|
|
else
|
|
{
|
|
$this->vid = 'in';
|
|
}
|
|
|
|
//-----------------------------------------
|
|
// Print folder links
|
|
//-----------------------------------------
|
|
|
|
if ( ! $this->ipsclass->member['vdirs'] )
|
|
{
|
|
$this->ipsclass->member['vdirs'] = "in:{$this->ipsclass->lang['account_inbox']}|sent:{$this->ipsclass->lang['account_sent']}";
|
|
}
|
|
|
|
foreach( explode( "|", $this->ipsclass->member['vdirs'] ) as $dir )
|
|
{
|
|
list ($id , $data) = explode( ":", $dir );
|
|
list ($real, $count) = explode( ";", $data );
|
|
|
|
if ( ! $id )
|
|
{
|
|
continue;
|
|
}
|
|
|
|
$this->ipsclass->member['dir_data'][$id] = array( 'id' => $id, 'real' => $real, 'count' => $count );
|
|
|
|
if ($this->vid == $id)
|
|
{
|
|
$this->ipsclass->member['current_dir'] = $real;
|
|
$this->ipsclass->member['current_id'] = $id;
|
|
$this->jump_html .= "<option value='$id' selected='selected'>$real</option>\n";
|
|
}
|
|
else
|
|
{
|
|
$this->jump_html .= "<option value='$id'>$real</option>\n";
|
|
}
|
|
|
|
if ( $count )
|
|
{
|
|
$real .= " ({$count})";
|
|
}
|
|
|
|
$folder_links .= $this->ipsclass->compiled_templates['skin_msg']->menu_bar_msg_folder_link($id, $real);
|
|
}
|
|
|
|
if ( $folder_links != "" )
|
|
{
|
|
$menu_html = str_replace( "<!--IBF.FOLDER_LINKS-->", $folder_links, $menu_html );
|
|
}
|
|
}
|
|
|
|
$this->jump_html .= "<!--EXTRA--></select>\n\n";
|
|
|
|
return $menu_html;
|
|
}
|
|
|
|
/*-------------------------------------------------------------------------*/
|
|
// Send form stuff
|
|
/*-------------------------------------------------------------------------*/
|
|
|
|
function send_form($preview=0, $errors="")
|
|
{
|
|
//-----------------------------------------
|
|
// INIT
|
|
//-----------------------------------------
|
|
|
|
$_msg_id = 0;
|
|
|
|
$this->form_mid = intval($this->ipsclass->input['MID']);
|
|
$this->form_orig_id = intval($this->ipsclass->input['MSID']);
|
|
|
|
$_POST['Post-NS'] = isset($_POST['Post']) ? $_POST['Post'] : '';
|
|
$_POST['Post'] = $this->ipsclass->remove_tags( $this->ipsclass->txt_raw2form( isset($_POST['Post']) ? $_POST['Post'] : '' ) );
|
|
|
|
//-----------------------------------------
|
|
// Fix up errors
|
|
//-----------------------------------------
|
|
|
|
$errors = preg_replace( "/^<br>/", "", $errors );
|
|
|
|
//-----------------------------------------
|
|
// Preview post?
|
|
//-----------------------------------------
|
|
|
|
if ( $preview )
|
|
{
|
|
$this->postlib->parser->parse_html = $this->ipsclass->vars['msg_allow_html'];
|
|
$this->postlib->parser->parse_nl2br = 1;
|
|
$this->postlib->parser->parse_smilies = 1;
|
|
$this->postlib->parser->parse_bbcode = $this->ipsclass->vars['msg_allow_code'];
|
|
|
|
$this->ipsclass->vars['max_emos'] = 0;
|
|
|
|
$old_msg = $this->postlib->han_editor->process_raw_post( 'Post-NS' );
|
|
$old_msg = $this->postlib->parser->pre_display_parse( $this->postlib->parser->pre_db_parse( $old_msg ) );
|
|
|
|
$this->output .= $this->ipsclass->compiled_templates['skin_msg']->preview($old_msg);
|
|
}
|
|
|
|
if ( $errors != "" OR $this->postlib->parser->error != "" )
|
|
{
|
|
$errors = $errors ? $errors : $this->ipsclass->lang[$this->postlib->parser->error];
|
|
|
|
$this->output .= $this->ipsclass->compiled_templates['skin_msg']->pm_errors($errors);
|
|
$preview = 1;
|
|
}
|
|
|
|
//-----------------------------------------
|
|
// Load the contacts
|
|
//-----------------------------------------
|
|
|
|
$contacts = $this->build_contact_list();
|
|
|
|
$name_to_enter = "";
|
|
$old_message = "";
|
|
$old_title = "";
|
|
|
|
//-----------------------------------------
|
|
// Did we come from a button with a user ID?
|
|
//-----------------------------------------
|
|
|
|
if ( $this->form_mid )
|
|
{
|
|
$this->ipsclass->DB->simple_construct( array( 'select' => 'members_display_name, name, id', 'from' => 'members', 'where' => "id=".$this->form_mid ) );
|
|
$this->ipsclass->DB->simple_exec();
|
|
|
|
$name = $this->ipsclass->DB->fetch_row();
|
|
|
|
if ( $name['id'] && !( isset($this->ipsclass->input['fwd']) AND $this->ipsclass->input['fwd'] == 1 ) )
|
|
{
|
|
$name_to_enter = $name['members_display_name'];
|
|
}
|
|
}
|
|
else
|
|
{
|
|
$name_to_enter = isset($this->ipsclass->input['entered_name']) ? $this->ipsclass->input['entered_name'] : '';
|
|
}
|
|
|
|
//-----------------------------------------
|
|
// Are we quoting an old message?
|
|
//-----------------------------------------
|
|
|
|
$footer_defaults = array( 'add_sent' => '', 'add_tracking' => '' );
|
|
|
|
if ( $preview or $this->class->show_form )
|
|
{
|
|
$old_message = $_POST['Post-NS'];
|
|
$old_title = str_replace( "'", "'", str_replace( '"', '"', $this->ipsclass->txt_stripslashes($_POST['msg_title']) ) );
|
|
|
|
// If we preview and check these boxes, they should default to checked
|
|
$footer_defaults = array(
|
|
'add_sent' => ( isset($this->ipsclass->input['add_sent']) AND $this->ipsclass->input['add_sent'] == 'yes' ) ? "checked='checked' " : "",
|
|
'add_tracking' => ( isset($this->ipsclass->input['add_tracking']) AND $this->ipsclass->input['add_tracking'] == '1' ) ? "checked='checked' " : "",
|
|
);
|
|
}
|
|
else if ( $this->form_orig_id )
|
|
{
|
|
$this->ipsclass->DB->cache_add_query( 'msg_get_saved_msg', array( 'msgid' => $this->form_orig_id, 'mid' => $this->ipsclass->member['id'] ) );
|
|
$this->ipsclass->DB->simple_exec();
|
|
|
|
$old_msg = $this->ipsclass->DB->fetch_row();
|
|
|
|
if( $old_msg['from_id'] && !( isset($this->ipsclass->input['fwd']) AND $this->ipsclass->input['fwd'] == 1 ) )
|
|
{
|
|
$name_to_enter = $old_msg['from_name'];
|
|
}
|
|
|
|
if ( $old_msg['mt_title'] )
|
|
{
|
|
if ( $this->class->edit_saved )
|
|
{
|
|
$name_to_enter = $old_msg['members_display_name'];
|
|
$cc_text = $old_msg['msg_cc_users'];
|
|
$cc_hide = $old_msg['mt_hide_cc'];
|
|
$old_track = $old_msg['mt_tracking'];
|
|
$old_addsent = $old_msg['mt_addtosent'];
|
|
$old_title = $old_msg['mt_title'];
|
|
$old_message = $old_msg['msg_post'];//$this->postlib->parser->bad_words( $this->ipsclass->my_br2nl( $old_msg['msg_post'] ) );
|
|
$_msg_id = $old_msg['mt_msg_id'];
|
|
|
|
$this->class->post_key = $old_msg['msg_post_key'];
|
|
$this->ipsclass->input['OID'] = $old_msg['mt_id'];
|
|
}
|
|
else if ( isset($this->ipsclass->input['fwd']) AND $this->ipsclass->input['fwd'] == 1 )
|
|
{
|
|
$old_title = "Fwd:".$old_msg['mt_title'];
|
|
$old_title = preg_replace( "/^(?:Fwd\:){1,}/i", "Fwd:", $old_title );
|
|
$old_message = '[QUOTE]'.sprintf($this->ipsclass->lang['vm_forward_text'], $name['members_display_name'])."\n\n".$old_msg['msg_post'].'[/QUOTE]'."\n";
|
|
//$old_message = $this->postlib->parser->bad_words( $this->ipsclass->my_br2nl( $old_message ) );
|
|
}
|
|
else
|
|
{
|
|
$old_title = "Re:".$old_msg['mt_title'];
|
|
$old_title = preg_replace( "/^(?:Re\:){1,}/i", "Re:", $old_title );
|
|
$old_message = '[QUOTE]'.$old_msg['msg_post'].'[/QUOTE]'."\n";
|
|
//$old_message = $this->postlib->parser->bad_words( $this->ipsclass->my_br2nl( $old_message ) );
|
|
}
|
|
}
|
|
|
|
$footer_defaults = array(
|
|
'add_sent' => ( isset($old_addsent) AND $old_addsent == '1' ) ? "checked='checked' " : "",
|
|
'add_tracking' => ( isset($old_track) AND $old_track == '1' ) ? "checked='checked' " : "",
|
|
);
|
|
}
|
|
|
|
//-----------------------------------------
|
|
// PM returns
|
|
//-----------------------------------------
|
|
|
|
if ( $this->postlib->han_editor->method == 'rte' AND $old_message AND $this->form_orig_id )
|
|
{
|
|
$old_message = $this->postlib->parser->convert_ipb_html_to_html( $this->ipsclass->my_nl2br( $old_message ) );
|
|
}
|
|
else if( $this->postlib->han_editor->method == 'std' AND $old_message AND $this->form_orig_id )
|
|
{
|
|
$old_message = $this->postlib->parser->pre_edit_parse( $old_message );
|
|
}
|
|
|
|
//-----------------------------------------
|
|
// Build up the HTML for the send form
|
|
//-----------------------------------------
|
|
|
|
$this->output .= $this->ipsclass->compiled_templates['skin_msg']->Send_form( array (
|
|
'CONTACTS' => $contacts,
|
|
'MEMBER' => $this->member,
|
|
'N_ENTER' => $name_to_enter,
|
|
'O_TITLE' => $old_title,
|
|
'OID' => isset($this->ipsclass->input['OID']) ? $this->ipsclass->input['OID'] : 0, // Old unsent msg id for restoring saved msg - used to delete saved when sent
|
|
'attach_post_key' => $this->class->post_key,
|
|
'form_extra' => $this->form_extra,
|
|
'upload' => $this->hidden_field,
|
|
|
|
) );
|
|
|
|
$this->ipsclass->lang['the_max_length'] = $this->ipsclass->vars['max_post_length'] * 1024;
|
|
|
|
//-----------------------------------------
|
|
// Remove side panel
|
|
//-----------------------------------------
|
|
|
|
$this->postlib->han_editor->remove_side_panel = 1;
|
|
|
|
//-----------------------------------------
|
|
// Is this RTE? If so, convert BBCode
|
|
//-----------------------------------------
|
|
|
|
if ( $this->postlib->han_editor->method == 'rte' AND $old_message )
|
|
{
|
|
if ( $errors or $preview )
|
|
{
|
|
$old_message = stripslashes( $old_message );
|
|
}
|
|
|
|
$old_message = $this->postlib->parser->convert_ipb_html_to_html( $old_message );
|
|
}
|
|
else if ( $old_message )
|
|
{
|
|
$old_message = $this->ipsclass->txt_stripslashes( $old_message );
|
|
}
|
|
|
|
$this->output .= $this->ipsclass->compiled_templates['skin_msg']->postbox_wrap( $this->postlib->han_editor->show_editor( $old_message, 'Post' ) );
|
|
|
|
//-----------------------------------------
|
|
// Show upload stuff?
|
|
//-----------------------------------------
|
|
|
|
if ( $this->can_upload )
|
|
{
|
|
$upload_field = $this->ipsclass->compiled_templates['skin_post']->Upload_field( $this->class->post_key, 'msg', $_msg_id );
|
|
|
|
$this->output = str_replace( '<!--UPLOAD FIELD-->', $upload_field, $this->output );
|
|
}
|
|
|
|
$this->output .= $this->ipsclass->compiled_templates['skin_msg']->send_form_footer( $footer_defaults );
|
|
|
|
$this->class->page_title = $this->ipsclass->lang['t_welcome'];
|
|
$this->class->nav = array( "<a href='".$this->ipsclass->base_url."act=UserCP&CODE=00'>".$this->ipsclass->lang['t_title']."</a>" );
|
|
|
|
//-----------------------------------------
|
|
// Do we have permission to mass PM peeps?
|
|
//-----------------------------------------
|
|
|
|
$cc_box = "";
|
|
$cc_formbox = "";
|
|
|
|
if ($this->ipsclass->member['g_max_mass_pm'] > 0)
|
|
{
|
|
$this->ipsclass->lang['carbon_copy_desc'] = sprintf( $this->ipsclass->lang['carbon_copy_desc'], $this->ipsclass->member['g_max_mass_pm'] );
|
|
|
|
if ( isset($_POST['carbon_copy']) or isset($cc_text) )
|
|
{
|
|
$cc_text = isset($cc_text) ? $cc_text : $this->ipsclass->txt_htmlspecialchars($_POST['carbon_copy']);
|
|
|
|
$cc_box = str_replace( "</textarea>", "", $this->ipsclass->txt_stripslashes($cc_text) );
|
|
}
|
|
|
|
if ( ( isset($this->ipsclass->input['mt_hide_cc']) AND intval($this->ipsclass->input['mt_hide_cc']) == 1 ) or ( isset($cc_hide) AND $cc_hide == 1 ) )
|
|
{
|
|
$cc_formbox = $cc_hide ? $cc_hide : intval($this->ipsclass->input['mt_hide_cc']);
|
|
|
|
$cc_formbox = $cc_formbox == 1 ? "checked='checked' " : "";
|
|
}
|
|
|
|
$this->output = str_replace( "<!--IBF.MASS_PM_BOX-->", $this->ipsclass->compiled_templates['skin_msg']->mass_pm_box($cc_box, $cc_formbox), $this->output );
|
|
}
|
|
}
|
|
|
|
/*-------------------------------------------------------------------------*/
|
|
// Build contact listy poos
|
|
/*-------------------------------------------------------------------------*/
|
|
|
|
function build_contact_list()
|
|
{
|
|
//-----------------------------------------
|
|
// INIT
|
|
//-----------------------------------------
|
|
|
|
$contacts = "";
|
|
$from_contact = $this->ipsclass->input['from_contact'] ? intval($this->ipsclass->input['from_contact']) : intval($this->ipsclass->input['MID']);
|
|
$member_id = intval( $this->ipsclass->member['id'] );
|
|
|
|
//-----------------------------------------
|
|
// Clear out from_contact for fwd
|
|
//-----------------------------------------
|
|
|
|
if( $this->ipsclass->input['fwd'] )
|
|
{
|
|
$from_contact = 0;
|
|
}
|
|
|
|
//-----------------------------------------
|
|
// Get 'em.
|
|
//-----------------------------------------
|
|
|
|
$this->ipsclass->DB->build_query( array( 'select' => 'pf.friends_friend_id, pf.friends_approved',
|
|
'from' => array( 'profile_friends' => 'pf' ),
|
|
'where' => 'pf.friends_member_id='.$member_id. ' AND pf.friends_approved=1',
|
|
'order' => 'm.members_display_name ASC',
|
|
'add_join' => array( 0 => array( 'select' => 'm.members_display_name',
|
|
'from' => array( 'members' => 'm' ),
|
|
'where' => 'm.id=pf.friends_friend_id',
|
|
'type' => 'left' ),
|
|
)
|
|
) );
|
|
|
|
$this->ipsclass->DB->exec_query();
|
|
|
|
if ( $this->ipsclass->DB->get_num_rows() )
|
|
{
|
|
$contacts = "<select name='from_contact' class='forminput'><option value='-'>".$this->ipsclass->lang['other']."</option>\n<option value='-'>--------------------</option>\n";
|
|
|
|
while( $row = $this->ipsclass->DB->fetch_row() )
|
|
{
|
|
$selected = ( $from_contact == $row['friends_friend_id'] ) ? ' selected="selected"' : '';
|
|
$contacts .= "<option value='".$row['friends_friend_id']."'{$selected}>".$row['members_display_name']."</option>\n";
|
|
}
|
|
|
|
$contacts .= "</select>\n";
|
|
}
|
|
else
|
|
{
|
|
$contacts = $this->ipsclass->lang['address_list_empty'];
|
|
}
|
|
|
|
return $contacts;
|
|
}
|
|
|
|
|
|
//-----------------------------------------
|
|
// API for deleting messages
|
|
//-----------------------------------------
|
|
|
|
function delete_messages($ids, $owner_id, $extra="")
|
|
{
|
|
//-----------------------------------------
|
|
// Basic WHERE
|
|
//-----------------------------------------
|
|
|
|
if ( ! $extra )
|
|
{
|
|
$extra = "mt_owner_id=$owner_id";
|
|
}
|
|
|
|
$id_string = "";
|
|
|
|
if ( is_array( $ids ) )
|
|
{
|
|
if ( ! count($ids) )
|
|
{
|
|
return;
|
|
}
|
|
|
|
$id_string = 'IN ('.implode( ",", $ids ).')';
|
|
}
|
|
else
|
|
{
|
|
if ( ! $ids )
|
|
{
|
|
return;
|
|
}
|
|
|
|
$id_string = '='.$ids;
|
|
}
|
|
|
|
//-----------------------------------------
|
|
// Are these our messages?
|
|
//-----------------------------------------
|
|
|
|
$this->ipsclass->DB->simple_construct( array( 'select' => 'mt_id, mt_msg_id, mt_read, mt_owner_id', 'from' => 'message_topics', 'where' => "$extra AND mt_id $id_string" ) );
|
|
$this->ipsclass->DB->simple_exec();
|
|
|
|
$final_ids = array();
|
|
$final_mts = array();
|
|
$unread = array();
|
|
|
|
while ( $i = $this->ipsclass->DB->fetch_row() )
|
|
{
|
|
$final_ids[ $i['mt_id'] ] = $i['mt_msg_id'];
|
|
$final_mts[ $i['mt_id'] ] = $i['mt_id'];
|
|
|
|
if( $i['mt_read'] == 0 AND $i['mt_owner_id'] > 0 )
|
|
{
|
|
$unread[ $i['mt_owner_id'] ] = intval($unread[ $i['mt_owner_id'] ]) + 1;
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------
|
|
// Delete MT topics
|
|
//-----------------------------------------
|
|
|
|
if ( count($final_mts) )
|
|
{
|
|
$this->ipsclass->DB->simple_construct( array( 'delete' => 'message_topics', 'where' => "mt_id IN (".implode( ',',$final_mts ).")" ) );
|
|
$this->ipsclass->DB->simple_exec();
|
|
}
|
|
|
|
//-----------------------------------------
|
|
// Update delete count
|
|
//-----------------------------------------
|
|
|
|
if ( count($final_ids) )
|
|
{
|
|
$this->ipsclass->DB->simple_construct( array( 'update' => 'message_text', 'set' => "msg_deleted_count=msg_deleted_count+1", 'where' => "msg_id IN (".implode( ',',$final_ids ).")" ) );
|
|
$this->ipsclass->DB->simple_exec();
|
|
}
|
|
|
|
//-----------------------------------------
|
|
// Update new PM notifications
|
|
//-----------------------------------------
|
|
|
|
if ( count($unread) )
|
|
{
|
|
$members = array();
|
|
|
|
$this->ipsclass->DB->build_query( array( 'select' => 'new_msg,id', 'from' => 'members', 'where' => "id IN(" . implode( ',', array_keys($unread) ) .")" ) );
|
|
$this->ipsclass->DB->exec_query();
|
|
|
|
while( $mem_pm_cnts = $this->ipsclass->DB->fetch_row() )
|
|
{
|
|
$members[ $mem_pm_cnts['id'] ] = $mem_pm_cnts['new_msg'];
|
|
}
|
|
|
|
foreach( $unread as $mid => $cnt )
|
|
{
|
|
$cur = $members[ $mid ];
|
|
|
|
if( $cur < $cnt )
|
|
{
|
|
$cnt = $cur;
|
|
}
|
|
|
|
$cnt = intval($cnt);
|
|
|
|
$this->ipsclass->DB->simple_construct( array( 'update' => 'members', 'set' => "new_msg=new_msg-{$cnt}, show_popup=0", 'where' => "id={$mid}" ) );
|
|
$this->ipsclass->DB->simple_exec();
|
|
}
|
|
|
|
unset($members);
|
|
}
|
|
|
|
//-----------------------------------------
|
|
// Run through and delete dead msgs
|
|
//-----------------------------------------
|
|
|
|
$deleted_ids = array();
|
|
$attach_ids = array();
|
|
|
|
$this->ipsclass->DB->simple_construct( array( 'select' => 'msg_id', 'from' => 'message_text', 'where' => 'msg_deleted_count >= msg_sent_to_count' ) );
|
|
$this->ipsclass->DB->simple_exec();
|
|
|
|
while ( $r = $this->ipsclass->DB->fetch_row() )
|
|
{
|
|
$deleted_ids[] = $r['msg_id'];
|
|
}
|
|
|
|
if ( count($deleted_ids) )
|
|
{
|
|
$this->ipsclass->DB->simple_construct( array( 'delete' => 'message_text', 'where' => "msg_id IN (".implode( ',',$deleted_ids ).")") );
|
|
$this->ipsclass->DB->simple_exec();
|
|
|
|
$this->ipsclass->DB->simple_construct( array( 'select' => '*',
|
|
'from' => 'attachments',
|
|
'where' => "attach_rel_module='msg' AND attach_rel_id IN (".implode( ',',$deleted_ids ).")") );
|
|
$this->ipsclass->DB->simple_exec();
|
|
|
|
while ( $a = $this->ipsclass->DB->fetch_row() )
|
|
{
|
|
$attach_ids[] = $a['attach_id'];
|
|
|
|
if ( $a['attach_location'] )
|
|
{
|
|
@unlink( $this->ipsclass->vars['upload_dir']."/".$a['attach_location'] );
|
|
}
|
|
if ( $a['attach_thumb_location'] )
|
|
{
|
|
@unlink( $this->ipsclass->vars['upload_dir']."/".$a['attach_thumb_location'] );
|
|
}
|
|
}
|
|
|
|
if ( count($attach_ids) )
|
|
{
|
|
$this->ipsclass->DB->simple_construct( array( 'delete' => 'attachments', 'where' => "attach_id IN (".implode( ',',$attach_ids ).")") );
|
|
$this->ipsclass->DB->simple_exec();
|
|
}
|
|
}
|
|
}
|
|
|
|
/*-------------------------------------------------------------------------*/
|
|
// Send form stuff
|
|
/*-------------------------------------------------------------------------*/
|
|
|
|
function send_pm( $opts=array() )
|
|
{
|
|
//-----------------------------------------
|
|
// INIT some vars
|
|
//-----------------------------------------
|
|
|
|
if ( ! $this->to and $this->to_by_id )
|
|
{
|
|
//-----------------------------------------
|
|
// Just an id...
|
|
//-----------------------------------------
|
|
|
|
$tmp = $this->ipsclass->DB->simple_exec_query( array( 'select' => 'name, members_display_name', 'from' => 'members', 'where' => 'id='.$this->to_by_id ) );
|
|
|
|
$this->to = $tmp['members_display_name'];
|
|
}
|
|
|
|
$this->to = strtolower(str_replace( '|', '|', $this->to) );
|
|
|
|
$this->ipsclass->DB->cache_add_query( 'msg_get_cc_users', array( 'name_array' => array( 0 => "'".$this->to."'" ) ) );
|
|
$this->ipsclass->DB->simple_exec();
|
|
|
|
if ( ! $this->send_to_member = $this->ipsclass->DB->fetch_row() )
|
|
{
|
|
$this->error = $this->ipsclass->lang['err_no_such_member'];
|
|
return;
|
|
}
|
|
|
|
$this->error = "";
|
|
$this->save_only = $opts['save_only'];
|
|
$this->orig_id = $opts['orig_id'];
|
|
$this->preview = $opts['preview'];
|
|
$this->add_tracking = $opts['track'];
|
|
$this->add_sent = $opts['add_sent'];
|
|
$this->hide_cc = $opts['hide_cc'];
|
|
|
|
//-----------------------------------------
|
|
// Are we simply saving this for later?
|
|
//-----------------------------------------
|
|
|
|
$this->_process_save_only();
|
|
|
|
if ( $this->redirect_url )
|
|
{
|
|
return;
|
|
}
|
|
|
|
if ( $this->force_pm != 1 )
|
|
{
|
|
//-----------------------------------------
|
|
// Can the reciepient use the PM system?
|
|
//-----------------------------------------
|
|
|
|
$this->ipsclass->DB->cache_add_query( 'msg_get_msg_poster', array( 'mid' => $this->send_to_member['id'] ) );
|
|
$this->ipsclass->DB->simple_exec();
|
|
|
|
$to_msg_stats = $this->ipsclass->DB->fetch_row();
|
|
|
|
// Are they in a secondary group that can use pm?
|
|
|
|
if ( $to_msg_stats['mgroup_others'] && ! $to_msg_stats['g_use_pm'] )
|
|
{
|
|
$groups_id = explode( ',', $to_msg_stats['mgroup_others'] );
|
|
|
|
if ( count( $groups_id ) )
|
|
{
|
|
foreach( $groups_id as $pid )
|
|
{
|
|
if ( ! $this->ipsclass->cache['group_cache'][ $pid ]['g_id'] )
|
|
{
|
|
continue;
|
|
}
|
|
|
|
if ( $this->ipsclass->cache['group_cache'][ $pid ]['g_use_pm'] )
|
|
{
|
|
$to_msg_stats['g_use_pm'] = 1;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( $to_msg_stats['g_use_pm'] != 1 OR $to_msg_stats['members_disable_pm'] )
|
|
{
|
|
$this->ipsclass->input['MID'] = $this->send_to_member['id'];
|
|
$this->error = $this->ipsclass->lang['no_usepm_member'];
|
|
return;
|
|
}
|
|
|
|
//-----------------------------------------
|
|
// Does the target member have enough room
|
|
// in their inbox for a new message?
|
|
//-----------------------------------------
|
|
|
|
$to_msg_stats = $this->_get_real_allowance( $to_msg_stats );
|
|
|
|
if ( (($to_msg_stats['msg_total']) >= $to_msg_stats['g_max_messages']) and ($to_msg_stats['g_max_messages'] > 0) )
|
|
{
|
|
if ( $this->ipsclass->vars['override_inbox_full'] )
|
|
{
|
|
$override = array();
|
|
$override = explode( ",", $this->ipsclass->vars['override_inbox_full'] );
|
|
|
|
$do_override = 0;
|
|
|
|
$my_groups = array( $this->ipsclass->member['mgroup'] );
|
|
|
|
if( $this->ipsclass->member['mgroup_others'] )
|
|
{
|
|
$my_other_groups = explode( ",", $this->ipsclass->member['mgroup_others'] );
|
|
$my_groups = array_merge( $my_groups, $my_other_groups );
|
|
}
|
|
|
|
foreach( $my_groups as $member_group )
|
|
{
|
|
if( in_array( $member_group, $override ) )
|
|
{
|
|
$do_override = 1;
|
|
}
|
|
}
|
|
|
|
if ( $do_override == 0 )
|
|
{
|
|
$this->error = $this->ipsclass->lang['no_usepm_member_full'];
|
|
return;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
$this->error = $this->ipsclass->lang['no_usepm_member_full'];
|
|
return;
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------
|
|
// Has the reciepient blocked us?
|
|
//-----------------------------------------
|
|
|
|
$this->ipsclass->DB->simple_construct( array( 'select' => 'contact_id, allow_msg', 'from' => 'contacts', 'where' => "contact_id=".$this->from_member['id']." AND member_id=".$this->send_to_member['id'] ) );
|
|
$this->ipsclass->DB->simple_exec();
|
|
|
|
$can_msg = $this->ipsclass->DB->fetch_row();
|
|
|
|
if ( (isset($can_msg['contact_id'])) and ($can_msg['allow_msg'] != 1) )
|
|
{
|
|
if( $this->ipsclass->vars['unblockable_pm_groups'] )
|
|
{
|
|
$unblockable = array();
|
|
$unblockable = explode( ",", $this->ipsclass->vars['unblockable_pm_groups'] );
|
|
|
|
$do_override = 0;
|
|
|
|
$my_groups = array( $this->ipsclass->member['mgroup'] );
|
|
|
|
if( $this->ipsclass->member['mgroup_others'] )
|
|
{
|
|
$my_other_groups = explode( ",", $this->ipsclass->member['mgroup_others'] );
|
|
$my_groups = array_merge( $my_groups, $my_other_groups );
|
|
}
|
|
|
|
foreach( $my_groups as $member_group )
|
|
{
|
|
if( in_array( $member_group, $unblockable ) )
|
|
{
|
|
$do_override = 1;
|
|
}
|
|
}
|
|
|
|
if ( $do_override == 0 )
|
|
{
|
|
$this->ipsclass->input['MID'] = $this->send_to_member['id'];
|
|
$this->error = $this->ipsclass->lang['msg_blocked'];
|
|
return;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
$this->ipsclass->input['MID'] = $this->send_to_member['id'];
|
|
$this->error = $this->ipsclass->lang['msg_blocked'];
|
|
return;
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------
|
|
// Do we have enough room to store a
|
|
// saved copy?
|
|
//-----------------------------------------
|
|
|
|
if (isset($this->ipsclass->input['add_sent']) AND $this->ipsclass->input['add_sent'] AND ($this->ipsclass->member['g_max_messages'] > 0) )
|
|
{
|
|
if ( ($this->ipsclass->member['msg_total'] + 1) >= $this->ipsclass->member['g_max_messages'] )
|
|
{
|
|
$this->error = $this->ipsclass->lang['max_message_from'];
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------
|
|
// CC PM stuff
|
|
//-----------------------------------------
|
|
|
|
$this->can_mass_pm = 0;
|
|
|
|
if ( $this->ipsclass->member['g_max_mass_pm'] > 0 or $this->force_pm )
|
|
{
|
|
$cc_array = $this->_process_cc();
|
|
}
|
|
|
|
if ( $this->error != "" )
|
|
{
|
|
return;
|
|
}
|
|
|
|
//-----------------------------------------
|
|
// Add our original ID
|
|
//-----------------------------------------
|
|
|
|
$cc_array[ $this->send_to_member['id'] ] = $this->send_to_member;
|
|
|
|
unset($to_member);
|
|
|
|
//-----------------------------------------
|
|
// Insert the message body
|
|
//-----------------------------------------
|
|
|
|
$count = count( $cc_array );
|
|
|
|
if ( $this->add_sent )
|
|
{
|
|
// we're storing a copy locally, so
|
|
// add 1 to the "sent_to_count"
|
|
|
|
$count++;
|
|
}
|
|
|
|
$this->ipsclass->DB->do_insert( 'message_text', array(
|
|
'msg_date' => time(),
|
|
'msg_post' => $this->ipsclass->remove_tags($this->msg_post),
|
|
'msg_cc_users' => $this->cc_users,
|
|
'msg_sent_to_count' => $count,
|
|
'msg_post_key' => $this->class->post_key,
|
|
'msg_author_id' => $this->from_member['id'],
|
|
'msg_ip_address' => $this->ipsclass->ip_address
|
|
) );
|
|
|
|
|
|
$msg_id = $this->ipsclass->DB->get_insert_id();
|
|
|
|
//-----------------------------------------
|
|
// Make attachments permanent
|
|
//-----------------------------------------
|
|
|
|
$no_attachments = $this->postlib->pf_make_attachments_permanent( $this->class->post_key, $msg_id, 'msg' );
|
|
|
|
//-----------------------------------------
|
|
// If we have an original ID - delete it and 'move'
|
|
// attachments
|
|
//-----------------------------------------
|
|
|
|
if ( $this->orig_id )
|
|
{
|
|
$this->ipsclass->DB->cache_add_query( 'msg_get_saved_msg', array( 'mid' => $this->from_member['id'], 'msgid' => $this->orig_id ) );
|
|
$this->ipsclass->DB->simple_exec();
|
|
|
|
if( $old = $this->ipsclass->DB->fetch_row() )
|
|
{
|
|
//-----------------------------------------
|
|
// Update attachments
|
|
//-----------------------------------------
|
|
|
|
$this->ipsclass->DB->simple_construct( array( 'update' => 'attachments', 'set' => "attach_post_key='{$this->class->post_key}', attach_rel_id=$msg_id", 'where' => "attach_rel_id={$old['msg_id']} AND attach_rel_module='msg'" ) );
|
|
$this->ipsclass->DB->simple_exec();
|
|
|
|
$this->ipsclass->DB->simple_construct( array( 'delete' => 'message_topics', 'where' => "mt_id={$old['mt_id']}" ) );
|
|
$this->ipsclass->DB->simple_exec();
|
|
|
|
$this->ipsclass->DB->simple_construct( array ( 'update' => 'message_text', 'set' => 'msg_deleted_count=msg_deleted_count-1', 'where' => "msg_id={$old['msg_id']}" ) );
|
|
$this->ipsclass->DB->simple_exec();
|
|
|
|
$no_attachments = $old['mt_hasattach'];
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------
|
|
// loop....
|
|
//-----------------------------------------
|
|
|
|
foreach ($cc_array as $to_member)
|
|
{
|
|
//-----------------------------------------
|
|
// Sort out tracking and pop us status
|
|
//-----------------------------------------
|
|
|
|
$show_popup = $to_member['view_pop'];
|
|
|
|
//-----------------------------------------
|
|
// Enter the info into the DB
|
|
// Target user side.
|
|
//-----------------------------------------
|
|
|
|
$this->ipsclass->DB->force_data_type = array( 'mt_title' => 'string' );
|
|
|
|
$this->ipsclass->DB->do_insert( 'message_topics', array(
|
|
'mt_msg_id' => $msg_id,
|
|
'mt_date' => time(),
|
|
'mt_title' => $this->msg_title,
|
|
'mt_from_id' => $this->from_member['id'],
|
|
'mt_to_id' => $to_member['id'],
|
|
'mt_vid_folder' => 'in',
|
|
'mt_tracking' => intval( $this->add_tracking ),
|
|
'mt_addtosent' => intval( $this->add_sent ),
|
|
'mt_hasattach' => intval($no_attachments),
|
|
'mt_owner_id' => $to_member['id'],
|
|
'mt_hide_cc' => intval( $this->hide_cc ),
|
|
) );
|
|
|
|
|
|
$mt_id = $this->ipsclass->DB->get_insert_id();
|
|
|
|
//-----------------------------------------
|
|
// Update profile
|
|
//-----------------------------------------
|
|
|
|
$inbox_count = $this->_get_dir_count( $to_member['vdirs'], 'in' );
|
|
|
|
$new_vdir = $this->rebuild_dir_count( $to_member['id'],
|
|
"",
|
|
'in',
|
|
$inbox_count + 1,
|
|
'save',
|
|
"msg_total=msg_total+1,new_msg=new_msg+1,show_popup={$show_popup}"
|
|
);
|
|
|
|
//-----------------------------------------
|
|
// Has this member requested a PM email nofity?
|
|
//-----------------------------------------
|
|
|
|
if ($to_member['email_pm'] == 1)
|
|
{
|
|
$to_member['language'] = $to_member['language'] == "" ? $this->ipsclass->vars['default_language'] : $to_member['language'];
|
|
|
|
$this->postlib->email->get_template("pm_notify", $to_member['language']);
|
|
|
|
$this->postlib->email->build_message( array(
|
|
'NAME' => $to_member['members_display_name'],
|
|
'POSTER' => $this->from_member['members_display_name'],
|
|
'TITLE' => $this->msg_title,
|
|
'LINK' => "?act=Msg&CODE=03&VID=in&MSID=$mt_id",
|
|
) );
|
|
|
|
$this->ipsclass->DB->do_insert( 'mail_queue', array( 'mail_to' => $to_member['email'], 'mail_date' => time(), 'mail_subject' => $this->postlib->email->lang_subject, 'mail_content' => $this->postlib->email->message ) );
|
|
|
|
$this->ipsclass->cache['systemvars']['mail_queue'] += $count;
|
|
$this->ipsclass->update_cache( array( 'array' => 1, 'name' => 'systemvars', 'donow' => 1, 'deletefirst' => 0 ) );
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------
|
|
// Add the data to the current members DB if we are
|
|
// adding it to our "sent items" folder
|
|
//-----------------------------------------
|
|
|
|
if ( $this->add_sent )
|
|
{
|
|
$sent_count = $this->_get_dir_count( $this->from_member['vdirs'], 'sent' );
|
|
|
|
$this->rebuild_dir_count( $this->from_member['id'],
|
|
"",
|
|
'sent',
|
|
$sent_count + 1,
|
|
'save',
|
|
"msg_total=msg_total+1"
|
|
);
|
|
|
|
$this->ipsclass->DB->do_insert( 'message_topics', array(
|
|
'mt_msg_id' => $msg_id,
|
|
'mt_date' => time(),
|
|
'mt_title' => $this->msg_title,
|
|
'mt_from_id' => $this->from_member['id'],
|
|
'mt_to_id' => $this->send_to_member['id'],
|
|
'mt_vid_folder' => 'sent',
|
|
'mt_tracking' => 0,
|
|
'mt_addtosent' => 0,
|
|
'mt_hasattach' => intval($no_attachments),
|
|
'mt_owner_id' => $this->from_member['id'],
|
|
'mt_hide_cc' => $this->hide_cc,
|
|
) );
|
|
|
|
}
|
|
|
|
$this->to_by_id = "";
|
|
$this->to = "";
|
|
|
|
#unset($this->postlib);
|
|
}
|
|
|
|
|
|
/*-------------------------------------------------------------------------*/
|
|
// Rebuild DIR count
|
|
/*-------------------------------------------------------------------------*/
|
|
|
|
function rebuild_dir_count($mid, $vdir, $cur_dir, $new_count, $nosave='save', $extra="")
|
|
{
|
|
$rebuild = array();
|
|
|
|
if ( ! $vdir )
|
|
{
|
|
$this->ipsclass->DB->simple_construct( array( "select" => 'vdirs', 'from' => 'member_extra', 'where' => 'id='.$mid ) );
|
|
$this->ipsclass->DB->simple_exec();
|
|
|
|
$mem = $this->ipsclass->DB->fetch_row();
|
|
|
|
$vdir = $mem['vdirs'] ? $mem['vdirs'] : 'in:Inbox;0|sent:Sent Items;0';
|
|
}
|
|
|
|
foreach( explode( "|", $vdir ) as $dir )
|
|
{
|
|
list ($id , $data) = explode( ":", $dir );
|
|
list ($real, $count) = explode( ";", $data );
|
|
|
|
if ( ! $id )
|
|
{
|
|
continue;
|
|
}
|
|
|
|
if ( $id == $cur_dir )
|
|
{
|
|
$count = $new_count;
|
|
$count = $count < 1 ? 0 : $count;
|
|
}
|
|
|
|
$rebuild[$id] = $id.':'.$real.';'.intval($count);
|
|
}
|
|
|
|
$final = implode( '|', $rebuild );
|
|
|
|
if ( $nosave != 'nosave' )
|
|
{
|
|
$this->ipsclass->DB->simple_construct( array( 'update' => 'member_extra', 'set' => "vdirs='".$final."'", 'where' => 'id='.$mid ) );
|
|
$this->ipsclass->DB->simple_exec();
|
|
|
|
if ( $extra )
|
|
{
|
|
$this->ipsclass->DB->simple_construct( array( 'update' => 'members', 'set' => $extra, 'where' => 'id='.$mid ) );
|
|
$this->ipsclass->DB->simple_exec();
|
|
}
|
|
}
|
|
|
|
return $final;
|
|
}
|
|
|
|
|
|
/*-------------------------------------------------------------------------*/
|
|
// POST PROCESS CC
|
|
/*-------------------------------------------------------------------------*/
|
|
|
|
function format_cc_string($cc_users, $mid )
|
|
{
|
|
$cc_array = array();
|
|
$final = array();
|
|
|
|
$cc_array = $this->get_cc_array( $cc_users );
|
|
|
|
foreach( $cc_array as $id => $data )
|
|
{
|
|
if ( $id == $mid )
|
|
{
|
|
continue;
|
|
}
|
|
|
|
$final[] = $this->ipsclass->make_profile_link( $data['members_display_name'], $data['id'] );
|
|
}
|
|
|
|
return implode( ", ", $final );
|
|
|
|
}
|
|
|
|
/*-------------------------------------------------------------------------*/
|
|
// PROCESS CC
|
|
/*-------------------------------------------------------------------------*/
|
|
|
|
function get_cc_array($cc_users)
|
|
{
|
|
$cc_array = array();
|
|
|
|
$cc_users = strtolower(str_replace( '|', '|', $cc_users) );
|
|
|
|
if ( $cc_users )
|
|
{
|
|
//-----------------------------------------
|
|
// Sort out the array
|
|
//-----------------------------------------
|
|
|
|
$cc_users = str_replace( "<br />", "<br>", $cc_users );
|
|
$cc_users = str_replace( "<br><br>", "<br>" , trim($cc_users) );
|
|
$cc_users = preg_replace( "/^(<br>){1}/", "" , $cc_users );
|
|
$cc_users = preg_replace( "/(<br>){1}$/", "" , $cc_users );
|
|
$cc_users = preg_replace( "/<br>\s+/", "," , $cc_users );
|
|
|
|
$temp_array = explode( "<br>", $cc_users );
|
|
|
|
//-----------------------------------------
|
|
// Make SQL'able
|
|
//-----------------------------------------
|
|
|
|
if ( is_array($temp_array) and count($temp_array) > 0 )
|
|
{
|
|
$new_array = array();
|
|
|
|
foreach( $temp_array as $name )
|
|
{
|
|
$name = "'".trim(strtolower($name))."'";
|
|
|
|
if (in_array( $name, $new_array ) )
|
|
{
|
|
continue;
|
|
}
|
|
|
|
$new_array[] = $name;
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------
|
|
// SQL it
|
|
//-----------------------------------------
|
|
|
|
if ( is_array($new_array) and count($new_array) > 0 )
|
|
{
|
|
$array_count = count($new_array);
|
|
|
|
$this->ipsclass->DB->cache_add_query( 'msg_get_cc_users', array( 'name_array' => $new_array ) );
|
|
$this->ipsclass->DB->simple_exec();
|
|
|
|
while( $r = $this->ipsclass->DB->fetch_row() )
|
|
{
|
|
$cc_array[$r['id']] = $r;
|
|
}
|
|
}
|
|
}
|
|
|
|
return $cc_array;
|
|
}
|
|
|
|
|
|
/*-------------------------------------------------------------------------*/
|
|
// PROCESS CC
|
|
/*-------------------------------------------------------------------------*/
|
|
|
|
function _process_cc()
|
|
{
|
|
$this->can_mass_pm = 1;
|
|
$cc_array = array();
|
|
|
|
$this->cc_users = strtolower(str_replace( '|', '|', $this->cc_users) );
|
|
|
|
if (isset($this->cc_users) and $this->cc_users != "")
|
|
{
|
|
//-----------------------------------------
|
|
// Sort out the array
|
|
//-----------------------------------------
|
|
|
|
$this->cc_users = str_replace( "<br>", "<br />" , trim($this->cc_users) );
|
|
$this->cc_users = str_replace( "<br /><br />", "<br />" , trim($this->cc_users) );
|
|
$this->cc_users = preg_replace( "#^(<br />){1}#", "" , $this->cc_users );
|
|
$this->cc_users = preg_replace( "#(<br />){1}$#", "" , $this->cc_users );
|
|
$this->cc_users = preg_replace( "#<br />\s+#", "," , $this->cc_users );
|
|
|
|
$temp_array = explode( "<br />", $this->cc_users );
|
|
|
|
//-----------------------------------------
|
|
// Make SQL'able
|
|
//-----------------------------------------
|
|
|
|
if ( is_array($temp_array) and count($temp_array) > 0 )
|
|
{
|
|
$new_array = array();
|
|
|
|
foreach( $temp_array as $name )
|
|
{
|
|
$name = "'".trim(strtolower($name))."'";
|
|
|
|
if (in_array( $name, $new_array ) )
|
|
{
|
|
continue;
|
|
}
|
|
|
|
$new_array[] = $name;
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------
|
|
// SQL it
|
|
//-----------------------------------------
|
|
|
|
if ( is_array($new_array) and count($new_array) > 0 )
|
|
{
|
|
$array_count = count($new_array);
|
|
|
|
$this->ipsclass->DB->cache_add_query( 'msg_get_cc_users', array( 'name_array' => $new_array ) );
|
|
$this->ipsclass->DB->simple_exec();
|
|
|
|
if ( ! $this->ipsclass->DB->get_num_rows() )
|
|
{
|
|
$this->error = $this->ipsclass->lang['pme_no_cc_user'];
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
while( $r = $this->ipsclass->DB->fetch_row() )
|
|
{
|
|
$cc_array[$r['id']] = $r;
|
|
}
|
|
|
|
//-----------------------------------------
|
|
|
|
if ( $this->force_pm != 1 )
|
|
{
|
|
if ( count($cc_array) > $this->ipsclass->member['g_max_mass_pm'])
|
|
{
|
|
$this->ipsclass->input['MID'] = $this->send_to_member['id'];
|
|
$this->error = $this->ipsclass->lang['pme_too_many'];
|
|
return;
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------
|
|
// Names exist?
|
|
//-----------------------------------------
|
|
|
|
$cc_error = "";
|
|
|
|
if ( count($cc_array) != $array_count )
|
|
{
|
|
foreach( $new_array as $n )
|
|
{
|
|
$seen = 0;
|
|
|
|
foreach( $cc_array as $cc_user )
|
|
{
|
|
$tmp = "'".strtolower($cc_user['members_display_name'])."'";
|
|
|
|
if ($tmp == $n)
|
|
{
|
|
$seen = 1;
|
|
}
|
|
}
|
|
|
|
if ($seen != 1)
|
|
{
|
|
$cc_error .= "<br>".sprintf( $this->ipsclass->lang['pme_failed_nomem'], $n, $n );
|
|
}
|
|
}
|
|
}
|
|
|
|
if ($cc_error != "")
|
|
{
|
|
$this->ipsclass->input['MID'] = $this->send_to_member['id'];
|
|
$this->error = $cc_error;
|
|
return;
|
|
}
|
|
|
|
//-----------------------------------------
|
|
// Can use PM system?
|
|
//-----------------------------------------
|
|
|
|
$cc_error = "";
|
|
$cc_id_array = array();
|
|
|
|
foreach($cc_array as $cc_user)
|
|
{
|
|
if ( $cc_user['g_use_pm'] != 1 OR $cc_user['members_disable_pm'] )
|
|
{
|
|
$cc_error .= "<br>".sprintf( $this->ipsclass->lang['pme_failed_nopm'], $cc_user['members_display_name'], $cc_user['members_display_name'] );
|
|
}
|
|
|
|
$cc_user = $this->_get_real_allowance($cc_user);
|
|
|
|
if ($cc_user['g_max_messages'] > 0 and ($cc_user['msg_total'] + 1 > $cc_user['g_max_messages']) )
|
|
{
|
|
if ( $this->ipsclass->vars['override_inbox_full'] )
|
|
{
|
|
$override = array();
|
|
$override = explode( ",", $this->ipsclass->vars['override_inbox_full'] );
|
|
|
|
$do_override = 0;
|
|
|
|
$my_groups = array( $this->ipsclass->member['mgroup'] );
|
|
|
|
if( $this->ipsclass->member['mgroup_others'] )
|
|
{
|
|
$my_other_groups = explode( ",", $this->ipsclass->member['mgroup_others'] );
|
|
$my_groups = array_merge( $my_groups, $my_other_groups );
|
|
}
|
|
|
|
foreach( $my_groups as $member_group )
|
|
{
|
|
if( in_array( $member_group, $override ) )
|
|
{
|
|
$do_override = 1;
|
|
}
|
|
}
|
|
|
|
if ( $do_override == 0 )
|
|
{
|
|
$cc_error .= "<br>".sprintf( $this->ipsclass->lang['pme_failed_maxed'], $cc_user['members_display_name'], $cc_user['members_display_name'] );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
$cc_error .= "<br>".sprintf( $this->ipsclass->lang['pme_failed_maxed'], $cc_user['members_display_name'], $cc_user['members_display_name'] );
|
|
}
|
|
}
|
|
|
|
$cc_id_array[] = $cc_user['id'];
|
|
}
|
|
|
|
if ( $this->force_pm != 1 )
|
|
{
|
|
if ($cc_error != "")
|
|
{
|
|
$this->ipsclass->input['MID'] = $this->send_to_member['id'];
|
|
$this->error = $cc_error;
|
|
return;
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------
|
|
// Check the block list..
|
|
//-----------------------------------------
|
|
|
|
$this->ipsclass->DB->cache_add_query( 'msg_get_cc_blocked', array( 'mid' => $this->from_member['id'], 'cc_array' => $cc_id_array ) );
|
|
$this->ipsclass->DB->simple_exec();
|
|
|
|
while ( $c = $this->ipsclass->DB->fetch_row() )
|
|
{
|
|
if ($c['allow_msg'] != 1)
|
|
{
|
|
if( $this->ipsclass->vars['unblockable_pm_groups'] )
|
|
{
|
|
$unblockable = array();
|
|
$unblockable = explode( ",", $this->ipsclass->vars['unblockable_pm_groups'] );
|
|
|
|
$do_override = 0;
|
|
|
|
$my_groups = array( $this->ipsclass->member['mgroup'] );
|
|
|
|
if( $this->ipsclass->member['mgroup_others'] )
|
|
{
|
|
$my_other_groups = explode( ",", $this->ipsclass->member['mgroup_others'] );
|
|
$my_groups = array_merge( $my_groups, $my_other_groups );
|
|
}
|
|
|
|
foreach( $my_groups as $member_group )
|
|
{
|
|
if( in_array( $member_group, $unblockable ) )
|
|
{
|
|
$do_override = 1;
|
|
}
|
|
}
|
|
|
|
if ( $do_override == 0 )
|
|
{
|
|
$cc_error .= "<br>".sprintf( $this->ipsclass->lang['pme_failed_block'], $c['name'], $c['name'] );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
$cc_error .= "<br>".sprintf( $this->ipsclass->lang['pme_failed_block'], $c['name'], $c['name'] );
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( $this->force_pm != 1 )
|
|
{
|
|
if ($cc_error != "")
|
|
{
|
|
$this->ipsclass->input['MID'] = $this->send_to_member['id'];
|
|
$this->error = $cc_error;
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return $cc_array;
|
|
}
|
|
|
|
/*-------------------------------------------------------------------------*/
|
|
// SAVE stuff
|
|
/*-------------------------------------------------------------------------*/
|
|
|
|
function _process_save_only()
|
|
{
|
|
if ( $this->save_only )
|
|
{
|
|
|
|
$raw = array(
|
|
'msg_date' => time(),
|
|
'msg_post' => $this->ipsclass->remove_tags($this->msg_post),
|
|
'msg_cc_users' => $this->cc_users,
|
|
'msg_sent_to_count' => 1,
|
|
'msg_post_key' => $this->class->post_key,
|
|
'msg_author_id' => $this->from_member['id']
|
|
);
|
|
|
|
$saved = 0;
|
|
|
|
if ( $this->orig_id )
|
|
{
|
|
//-----------------------------------------
|
|
// We have an OID which means that this message
|
|
// is already from the unsent folder, lets check that
|
|
// and if true, update rather than create a new unsent
|
|
// row
|
|
//-----------------------------------------
|
|
|
|
$this->ipsclass->DB->simple_construct( array( 'select' => 'mt_id, mt_msg_id', 'from' => 'message_topics', 'where' => "mt_id=".$this->orig_id." AND mt_owner_id=".$this->from_member['id']." AND mt_vid_folder='unsent'" ) );
|
|
$this->ipsclass->DB->simple_exec();
|
|
|
|
if ( $omsg = $this->ipsclass->DB->fetch_row() )
|
|
{
|
|
$saved = 1;
|
|
|
|
$this->ipsclass->DB->do_update( 'message_text', $raw, "msg_id=".$omsg['mt_msg_id'] );
|
|
|
|
//-----------------------------------------
|
|
// Make attachments permanent
|
|
//-----------------------------------------
|
|
|
|
$no_attachments = $this->postlib->pf_make_attachments_permanent( $this->class->post_key, "", "", $omsg['mt_msg_id'] );
|
|
|
|
$this->ipsclass->DB->simple_construct( array( 'update' => 'message_topics', 'set' => "mt_hasattach=$no_attachments, mt_date=".time(), 'where' => 'mt_owner_id='.$this->ipsclass->member['id'].' AND mt_id='.$omsg['mt_id'] ) );
|
|
$this->ipsclass->DB->simple_exec();
|
|
}
|
|
}
|
|
|
|
if ($saved == 0)
|
|
{
|
|
$this->ipsclass->DB->do_insert( 'message_text', $raw);
|
|
|
|
$msg_id = $this->ipsclass->DB->get_insert_id();
|
|
|
|
//-----------------------------------------
|
|
// Make attachments permanent
|
|
//-----------------------------------------
|
|
|
|
$no_attachments = $this->postlib->pf_make_attachments_permanent( $this->class->post_key, "", "", $msg_id );
|
|
|
|
$this->ipsclass->DB->do_insert( 'message_topics', array(
|
|
'mt_msg_id' => $msg_id,
|
|
'mt_date' => time(),
|
|
'mt_title' => $this->msg_title,
|
|
'mt_from_id' => $this->from_member['id'],
|
|
'mt_to_id' => $this->send_to_member['id'],
|
|
'mt_vid_folder' => 'unsent',
|
|
'mt_hide_cc' => intval($this->ipsclass->input['mt_hide_cc']),
|
|
'mt_tracking' => intval($this->ipsclass->input['add_tracking']),
|
|
'mt_addtosent' => $this->ipsclass->input['add_sent'] == 'yes' ? 1 : 0,
|
|
'mt_hasattach' => intval($no_attachments),
|
|
'mt_owner_id' => $this->from_member['id'],
|
|
) );
|
|
}
|
|
|
|
$this->redirect_url = "&act=Msg&CODE=01";
|
|
$this->redirect_lang = $this->ipsclass->lang['pms_redirect'];
|
|
}
|
|
}
|
|
|
|
/*-------------------------------------------------------------------------*/
|
|
// Return count of current VDIR (quickly)
|
|
/*-------------------------------------------------------------------------*/
|
|
|
|
function _get_dir_count( $vdir, $vid )
|
|
{
|
|
preg_match( "#(?:^|\|)$vid:.+?;(\d+)(?:\||$)#i", $vdir, $match );
|
|
|
|
return intval($match[1]);
|
|
}
|
|
|
|
/*-------------------------------------------------------------------------*/
|
|
// Get real allowance based on multi-groups
|
|
/*-------------------------------------------------------------------------*/
|
|
|
|
function _get_real_allowance( $member )
|
|
{
|
|
$groups_id = explode( ',', $member['mgroup_others'] );
|
|
|
|
if ( count( $groups_id ) )
|
|
{
|
|
foreach( $groups_id as $pid )
|
|
{
|
|
if ( !isset($this->ipsclass->cache['group_cache'][ $pid ]['g_id']) OR !$this->ipsclass->cache['group_cache'][ $pid ]['g_id'] )
|
|
{
|
|
continue;
|
|
}
|
|
|
|
if ( $member['g_max_messages'] > 0 AND $this->ipsclass->cache['group_cache'][ $pid ]['g_max_messages'] > $member['g_max_messages'] )
|
|
{
|
|
$member['g_max_messages'] = $this->ipsclass->cache['group_cache'][ $pid ]['g_max_messages'];
|
|
}
|
|
else if ( $this->ipsclass->cache['group_cache'][ $pid ]['g_max_messages'] == 0 )
|
|
{
|
|
$member['g_max_messages'] = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
return $member;
|
|
}
|
|
|
|
|
|
}
|
|
|
|
?>
|