2009-11-04 12:07:35 +00:00
< ? php
/**
* This Class is used to
* Send and recieve
* private or personal messages
* within the CLIPBUCKET system
*
* @ Author : Arslan Hassan ( = D )
* @ Software : ClipBucket v2
2010-03-16 18:56:41 +00:00
* @ License : Attribution Assurance License -- http :// www . opensource . org / licenses / attribution . php
2009-11-04 12:07:35 +00:00
*
* Pleae check CBLA for more details
* For code reference , please check docs . clip - bucket . com
* This Code is property of PHPBucket - ClipBucket - Arslan Hassan
*
* NOTE : MAINTAIN THIS SECTION
*
*
* Attachment Pattern : { v : videoidid }{ p : pictureid }{ g : groupid }{ c : channelid }
* For Multi Users : uid can be uid1 | uid2 | uid3 |....
*/
2012-12-31 11:25:11 +00:00
define ( 'CB_PM' , 'ON' );
define ( 'CB_PM_MAX_INBOX' , 500 ); // 0 - OFF , U - Unlimited
/**
* Function used to to attach video to pm
* @ param array => 'attachment_video'
*/
function attach_video ( $array )
{
global $cbvid ;
if ( $cbvid -> video_exists ( $array [ 'attach_video' ]))
return '{v:' . $array [ 'attach_video' ] . '}' ;
}
/**
* Function used to pars video from attachemtn
*/
function parse_and_attach_video ( $att )
{
global $cbvid ;
preg_match ( '/{v:(.*)}/' , $att , $matches );
$vkey = $matches [ 1 ];
if ( ! empty ( $vkey ))
{
assign ( 'video' , $cbvid -> get_video_details ( $vkey ));
assign ( 'only_once' , true );
echo '<h3>Attached Video</h3>' ;
template ( 'blocks/video.html' );
}
}
/**
* Function used to add custom video attachment form field
*/
function video_attachment_form ()
{
global $cbvid ;
$vid_array = array ( 'user' => userid (), 'order' => 'date_added DESC' , 'limit' => 15 );
$videos = $cbvid -> get_videos ( $vid_array );
$vids_array = array ( '' => lang ( " No Video " ));
if ( $videos )
foreach ( $videos as $video )
{
$vids_array [ $video [ 'videokey' ]] = $video [ 'title' ];
}
$field = array (
'video_form' => array
( 'title' => 'Attach video' ,
'type' => 'dropdown' ,
'name' => 'attach_video' ,
'id' => 'attach_video' ,
'value' => $vids_array ,
'checked' => post ( 'attach_video' ),
'anchor_before' => 'before_video_attach_box' ,
)
);
return $field ;
}
2009-11-04 12:07:35 +00:00
class cb_pm
{
2012-12-31 11:25:11 +00:00
/**
* Private messages table
*/
var $tbl = 'messages' ;
/**
* Allow multi users
*/
var $multi = true ;
/**
* Default Template
*/
var $email_template = 'pm_email_message' ;
/**
* Send Email on pm
*/
var $send_email = true ;
/**
* Allow inline attachments
* these attachements are linked in the messages instead of attached like emails
*/
var $allow_attachments = true ;
//Attachment functionss
var $pm_attachments = array ( 'attach_video' );
var $pm_attachments_parse = array ( 'parse_and_attach_video' );
var $pm_custom_field = array ();
/**
* Calling Constructor
*/
function init ()
{
//$array = video_attachment_form();
$this -> add_custom_field ( $array );
}
/**
* Sending PM
*/
function send_pm ( $array )
{
global $userquery , $db ;
$to = $this -> check_users ( $array [ 'to' ], $array [ 'from' ]);
//checking from user
if ( ! $userquery -> user_exists ( $array [ 'from' ]))
{
e ( lang ( 'unknown_sender' ));
//checking to user
}
elseif ( ! $to )
return false ;
//Checking if subject is empty
elseif ( empty ( $array [ 'subj' ]))
e ( lang ( 'class_subj_err' ));
elseif ( empty ( $array [ 'content' ]))
e ( lang ( 'please_enter_message' ));
else
{
$from = $this -> get_the_user ( $array [ 'from' ]);
$attachments = $this -> get_attachments ( $array );
$type = $array [ 'type' ] ? $array [ 'type' ] : 'pm' ;
$reply_to = $this -> is_reply ( $array [ 'reply_to' ], $from );
$fields = array ( 'message_from' , 'message_to' , 'message_content' ,
'message_subject' , 'date_added' , 'message_attachments' , 'message_box' , 'reply_to' );
$values = array ( $from , $to , $array [ 'content' ],
$array [ 'subj' ], now (), $attachments );
//PM INBOX FIELDS
$fields_in = $fields ;
//PM INBOX
$values_in = $values ;
$values_in [] = 'in' ;
$values_in [] = $reply_to ;
$db -> insert ( tbl ( $this -> tbl ), $fields_in , $values_in );
$array [ 'msg_id' ] = $db -> insert_id ();
if ( $array [ 'is_pm' ])
{
//PM SENTBOX FIELDS
$fields_out = $fields ;
$fields_out [] = 'message_status' ;
//PM SENTBOX
$values_out = $values ;
$values_out [] = 'out' ;
$values_out [] = $reply_to ;
$values_out [] = 'read' ;
$db -> insert ( tbl ( $this -> tbl ), $fields_out , $values_out );
}
//Sending Email
//$this->send_pm_email($array);
e ( lang ( " pm_sent_success " ), " m " );
}
}
/**
* Function used to check input users
* are valid or not
*/
function check_users ( $input , $sender )
{
global $userquery ;
if ( empty ( $input ))
{
e ( lang ( " unknown_reciever " ));
}
else
{
//check if usernames are sperated by colon ';'
$input = preg_replace ( '/;/' , ',' , $input );
//Now Exploding Input and converting it to and array
$usernames = explode ( ',' , $input );
//Now Checkinf for valid usernames
$valid_users = array ();
foreach ( $usernames as $username )
{
$user_id = $this -> get_the_user ( $username );
if ( $userquery -> is_user_banned ( $username , userid ()))
{
e ( sprintf ( lang ( " cant_pm_banned_user " ), $username ));
}
elseif ( $userquery -> is_user_banned ( username (), $username ))
{
e ( sprintf ( lang ( " cant_pm_user_banned_you " ), $username ));
}
elseif ( ! $userquery -> user_exists ( $username ))
{
e ( lang ( " unknown_reciever " ));
}
elseif ( $user_id == $sender )
{
e ( lang ( " you_cant_send_pm_yourself " ));
}
else
{
$valid_users [] = $user_id ;
}
}
$valid_users = array_unique ( $valid_users );
if ( count ( $valid_users ) > 0 )
{
$vusers = '' ;
foreach ( $valid_users as $vu )
{
$vusers .= " # " . $vu . " # " ;
}
return $vusers ;
}
else
return false ;
}
}
/**
* Function used to get user
*/
function get_the_user ( $user )
{
global $userquery ;
if ( ! is_numeric ( $user ))
return $userquery -> get_user_field_only ( $user , 'userid' );
else
return $user ;
}
/**
* Function used to make attachment valid
* and embed it in the message
*/
function get_attachments ( $array )
{
$funcs = $this -> pm_attachments ;
$attachments = '' ;
if ( is_array ( $funcs ))
foreach ( $funcs as $func )
{
if ( function_exists ( $func ))
{
$attachments .= $func ( $array );
}
}
return $attachments ;
}
/**
* function used to check weather message is reply or not
*/
function is_reply ( $id , $uid )
{
global $db ;
$results = $db -> select ( tbl ( $this -> tbl ), 'message_to' , " message_id = ' $id ' AND message_to LIKE '%# $uid #%' " );
if ( $db -> num_rows > 0 )
return true ;
else
return false ;
}
/**
* Get Message from cb_messages table
*
* @ param INT message_id
* @ return ARRAY message
*/
function get_message ( $id )
{
$id = mysql_clean ( $id );
$query = " SELECT message_id,thread_id,userid,message,subject " ;
$query .= " FROM " . tbl ( 'messages' );
$query .= " WHERE message_id=' $id ' " ;
$query .= " LIMIT 1 " ;
echo $query ;
$results = db_select ( $query );
if ( $results )
return $results [ 0 ];
else
return false ;
}
/**
* Function used to get user INBOX Message
* @ param MESSAGE ID
* @ param USER ID
*/
function get_inbox_message ( $mid , $uid = NULL )
{
global $db ;
if ( ! $uid )
$uid = userid ();
$result = $db -> select ( tbl ( $this -> tbl . ',users' ), tbl ( $this -> tbl . '.*,users.userid,users.username' ), " message_id=' $mid ' AND message_to LIKE '%# $uid #%' AND userid= " . tbl ( $this -> tbl ) . " .message_from " , NULL , " date_added DESC " );
if ( $db -> num_rows > 0 )
{
return $result [ 0 ];
}
else
{
e ( lang ( 'no_pm_exist' ));
return false ;
}
}
/**
* Function used to get user OUTBOX Message
* @ param MESSAGE ID
* @ param USER ID
*/
function get_outbox_message ( $mid , $uid = NULL )
{
global $db ;
if ( ! $uid )
$uid = userid ();
$result = $db -> select ( tbl ( $this -> tbl . ',users' ), tbl ( $this -> tbl . '.*,users.userid,users.username' ), " message_id=' $mid ' AND message_from=' $uid ' AND userid= " . tbl ( $this -> tbl . " .message_from " ));
if ( $db -> num_rows > 0 )
{
return $result [ 0 ];
}
else
{
e ( lang ( 'no_pm_exist' ));
return false ;
}
}
/**
* Get Total PM
*/
function pm_count ()
{
global $db ;
return $db -> count ( tbl ( $this -> tbl ), 'message_id' );
}
/**
* Function used to get user inbox messages
*/
function get_user_messages ( $uid , $box = 'in' , $count_only = false )
{
global $db ;
if ( ! $uid )
$uid = userid ();
switch ( $box )
{
case 'in' :
{
if ( $count_only )
{
$result = $db -> count ( tbl ( $this -> tbl ), 'message_id' , " message_to LIKE '%# $uid #%' AND message_box ='in' AND message_type='pm' " );
}
else
{
$result = $db -> select ( tbl ( $this -> tbl . ',users' ), tbl ( $this -> tbl . '.*,users.username AS message_from_user ' ), tbl ( $this -> tbl ) . " .message_to LIKE '%# $uid #%' AND " . tbl ( " users " ) . " .userid = " . tbl ( $this -> tbl ) . " .message_from
AND " . tbl( $this->tbl ) . " . message_box = 'in' AND message_type = 'pm' " , NULL, " date_added DESC " );
}
}
break ;
case 'out' :
{
if ( $count_only )
{
$result = $db -> count ( tbl ( $this -> tbl ), 'message_id' , " message_from = ' $uid ' AND message_box ='out' " );
}
else
{
$result = $db -> select ( tbl ( $this -> tbl . ',users' ), tbl ( $this -> tbl . '.*,users.username AS message_from_user ' ), tbl ( $this -> tbl ) . " .message_from = ' $uid ' AND " . tbl ( " users " ) . " .userid = " . tbl ( $this -> tbl ) . " .message_from
AND " . tbl( $this->tbl ) . " . message_box = 'out' " , NULL, " date_added DESC " );
//echo $db->db_query;
//One More Query Need To be executed to get username of recievers
$count = 0 ;
$cond = " " ;
if ( is_array ( $result ))
foreach ( $result as $re )
{
$cond = '' ;
preg_match_all ( " /#(.*)#/Ui " , $re [ 'message_to' ], $receivers );
//pr($receivers);
foreach ( $receivers [ 1 ] as $to_user )
{
if ( ! empty ( $to_user ))
{
if ( ! empty ( $cond ))
$cond .= " OR " ;
$cond .= " userid = ' $to_user ' " ;
}
}
$to_names = $db -> select ( tbl ( 'users' ), 'username' , $cond );
$t_names = '' ;
if ( is_array ( $to_names ))
foreach ( $to_names as $tn )
{
$t_names [] = $tn [ 0 ];
}
if ( is_array ( $t_names ))
$to_user_names = implode ( ', ' , $t_names );
else
$to_user_names = $t_names ;
$result [ $count ][ 'to_usernames' ] = $to_user_names ;
$count ++ ;
}
}
}
break ;
case 'notification' :
{
if ( $count_only )
{
$result = $db -> count ( tbl ( $this -> tbl ), 'message_id' , " message_to LIKE '%# $uid #%' AND message_box ='in' AND message_type='pm' " );
}
else
{
$result = $db -> select ( tbl ( $this -> tbl . ',users' ), tbl ( $this -> tbl . '.*,users.username AS message_from_user ' ), tbl ( $this -> tbl ) . " .message_to LIKE '%# $uid #' AND " . tbl ( " users.userid " ) . " = " . tbl ( $this -> tbl ) . " .message_from
AND " . tbl( $this->tbl ) . " . message_box = 'in' AND message_type = 'notification' " , NULL, " date_added DESC " );
}
}
}
if ( $result )
return $result ;
else
return false ;
}
function get_user_inbox_messages ( $uid , $count_only = false )
{
return $this -> get_user_messages ( $uid , 'in' , $count_only );
}
function get_user_outbox_messages ( $uid , $count_only = false )
{
return $this -> get_user_messages ( $uid , 'out' , $count_only );
}
function get_user_notification_messages ( $uid , $count_only = false )
{
return $this -> get_user_messages ( $uid , 'notification' , $count_only );
}
/**
* Function used parse attachments
*/
function parse_attachments ( $attachment )
{
$funcs = $this -> pm_attachments_parse ;
if ( is_array ( $funcs ))
foreach ( $funcs as $func )
{
if ( function_exists ( $func ))
{
$attachments .= $func ( $attachment );
}
}
}
/**
* Function used to create PM FORM
*/
function load_compose_form ()
{
$to = post ( 'to' );
$to = $to ? $to : get ( 'to' );
$array = array
(
'to' => array (
'title' => 'to' ,
'type' => 'textfield' ,
'name' => 'to' ,
'id' => 'to' ,
'value' => $to ,
//'hint_2'=> "seperate usernames by comma ','",
'required' => 'yes'
),
'subj' => array (
'title' => 'Subject' ,
'type' => 'textfield' ,
'name' => 'subj' ,
'id' => 'subj' ,
'value' => post ( 'subj' ),
'required' => 'yes'
),
'content' => array (
'title' => 'content' ,
'type' => 'textarea' ,
'name' => 'content' ,
'id' => 'pm_content' ,
'value' => post ( 'content' ),
'required' => 'yes' ,
'anchor_before' => 'before_pm_compose_box' ,
),
);
return array_merge ( $array , $this -> pm_custom_field );
}
/**
* Function used to add custom pm field
*/
function add_custom_field ( $array )
{
$this -> pm_custom_field = array_merge ( $array , $this -> pm_custom_field );
}
/**
* Function used to send PM EMAIL
*/
function send_pm_email ( $array )
{
global $cbemail , $userquery ;
$sender = $userquery -> get_user_field_only ( $array [ 'from' ], 'username' );
$content = clean ( $array [ 'content' ]);
$subject = clean ( $array [ 'subj' ]);
$msgid = $array [ 'msg_id' ];
//Get To(Emails)
$emails = $this -> get_users_emails ( $array [ 'to' ]);
$vars = array
(
'{sender}' => $sender ,
'{content}' => $content ,
'{subject}' => $subject ,
'{msg_id}' => $msgid
);
$tpl = $cbemail -> get_template ( $this -> email_template );
$subj = $cbemail -> replace ( $tpl [ 'email_template_subject' ], $vars );
$msg = $cbemail -> replace ( $tpl [ 'email_template' ], $vars );
cbmail ( array ( 'to' => $emails , 'from' => WEBSITE_EMAIL , 'subject' => $subj , 'content' => $msg , 'nl2br' => true ));
}
/**
* Function used to get emails of users from input
*/
function get_users_emails ( $input )
{
global $userquery , $db ;
//check if usernames are sperated by colon ';'
$input = preg_replace ( '/;/' , ',' , $input );
//Now Exploding Input and converting it to and array
$usernames = explode ( ',' , $input );
$cond = '' ;
foreach ( $usernames as $user )
{
if ( ! empty ( $user ))
{
if ( ! empty ( $cond ))
$cond .= " OR " ;
$cond .= " username =' " . $user . " ' " ;
}
}
$emails = array ();
$results = $db -> select ( tbl ( $userquery -> dbtbl [ 'users' ]), 'email' , $cond );
foreach ( $results as $result )
{
$emails [] = $result [ 0 ];
}
return implode ( ',' , $emails );
}
/**
* Function used to set private message status as read
*/
function set_message_status ( $mid , $status = 'read' )
{
global $db ;
if ( $mid )
$db -> update ( tbl ( $this -> tbl ), array ( 'message_status' ), array ( $status ), " message_id=' $mid ' " );
}
/**
* Function used to delete message from user messages box
*/
function delete_msg ( $mid , $uid , $box = 'in' )
{
global $db ;
if ( $box == 'in' )
{
$inbox = $this -> get_inbox_message ( $mid , $uid );
if ( $inbox )
{
$inbox_user = $inbox [ 'message_to' ];
$inbox_user = preg_replace ( " /# " . $uid . " #/Ui " , " " , $inbox_user );
if ( empty ( $inbox_user ))
$db -> delete ( tbl ( $this -> tbl ), array ( " message_id " ), array ( $mid ));
else
$db -> update ( tbl ( $this -> tbl ), array ( " message_to " ), array ( $inbox_user ), " message_id=' " . $inbox [ 'message_id' ] . " ' " );
e ( lang ( 'msg_delete_inbox' ), 'm' );
}
} else
{
$outbox = $this -> get_outbox_message ( $mid , $uid );
if ( $outbox )
{
$db -> delete ( tbl ( $this -> tbl ), array ( " message_id " ), array ( $mid ));
e ( lang ( 'msg_delete_outbox' ), 'm' );
}
}
}
/**
* Function used to get new messages
*/
function get_new_messages ( $uid = NULL , $type = 'pm' )
{
if ( ! $uid )
$uid = userid ();
global $db ;
switch ( $type )
{
case 'pm' :
default :
{
$count = $db -> count ( tbl ( $this -> tbl ), " message_id " , " message_to LIKE '%# $uid #%' AND message_box='in' AND message_type='pm' AND message_status='unread' " );
}
break ;
case 'notification' :
default :
{
$count = $db -> count ( tbl ( $this -> tbl ), " message_id " , " message_to LIKE '%# $uid #%' AND message_box='in' AND message_type='notification' AND message_status='unread' " );
}
break ;
}
if ( $count > 0 )
return $count ;
else
return " 0 " ;
}
/**
* Create the thread
*/
function create_thread ( $params )
{
$default_values = array (
'userid' => userid (),
'thread_type' => 'private' ,
'recipients' => array ()
);
$data = array_merge ( $default_values , $params );
$the_data = array (); //Keep only specific indexes
foreach ( $default_values as $key => $value )
{
$the_data [ $key ] = $data [ $key ];
}
//Turn Keys to variables...
extract ( $the_data );
if ( ! $recipients )
{
e ( lang ( 'No recipients with the thread' ));
return false ;
}
$recipients [] = $userid ;
$recipients = array_unique ( $recipients );
if ( ! $userid )
{
e ( lang ( 'Please login / Invalid user' ));
return false ;
}
arsort ( $recipients );
$total_recipients = count ( $recipients );
$recipients_imploded = implode ( '|' , $recipients );
$recipient_md5 = md5 ( $recipients_imploded );
$thread_id = $this -> get_thread_from_md5 ( $recipient_md5 );
if ( ! $thread_id )
{
$insert_array = array (
'thread_type' => $thread_type ,
'userid' => $userid ,
'recipient_md5' => $recipient_md5 ,
'total_recipients' => $total_recipients ,
'date_added' => now (),
'time_added' => time ()
);
$thread_id = db_insert ( tbl ( 'threads' ), $insert_array );
//Add recipients
$this -> add_recipients ( $recipients , $thread_id );
}
if ( $thread_id )
return $thread_id ;
else
return false ;
}
/**
* get thread from md5 hash
* @ param STRING $md5
* @ return INT $thread_id
*/
function get_thread_from_md5 ( $md5 )
{
$md5 = mysql_clean ( $md5 );
$query = " SELECT thread_id " ;
$query .= " FROM " . tbl ( 'threads' );
$query .= " WHERE recipient_md5=' $md5 ' " ;
$query .= " LIMIT 1 " ;
$results = db_select ( $query );
global $db ;
if ( $db -> num_rows > 0 )
{
return $results [ 0 ][ 'thread_id' ];
}
else
{
return false ;
}
}
/**
* Send a private message ...
*
* @ param ARRAY
* @ param INT $message_id
*/
function send_message ( $params )
{
$default_value =
array (
'userid' => userid (),
'recipients' => array (),
'subject' => " " ,
'message' => " " ,
'thread_id' => NULL
);
$data = array_merge ( $default_value , $params );
extract ( $data );
if ( ! $this -> thread_exists ( $thread_id ))
{
$thread_id = $this -> create_thread ( $data );
}
if ( ! $thread_id )
{
e ( lang ( " Invalid thread id " ));
return false ;
}
//Add message and send emnail...
$fields = array (
'subject' => $subject ,
'message' => $message ,
'userid' => $userid ,
'thread_id' => $thread_id ,
'date_added' => now (),
'time_added' => time (),
);
$message_id = db_insert ( tbl ( 'messages' ), $fields );
//Update thread
$fields = array (
'last_userid' => $userid ,
'last_message_id' => $message_id ,
'last_message_date' => now (),
'total_messages' => '{{total_messages+1}}'
);
//Exlude sender
$exclude_notifiers = array ( $userid );
$this -> add_message_notifications ( $thread_id , $exclude_notifiers );
db_update ( tbl ( 'threads' ), $fields , " thread_id=' $thread_id ' " );
global $userquery ;
//if($message_id)
return $message_id ;
}
/**
* check if thread exists using threadid
*
* @ param INT $thread_id
* @ return BOOLEAN
*/
function thread_exists ( $tid )
{
$tid = mysql_clean ( $tid );
$query = " SELECT thread_id FROM " . tbl ( 'threads' );
$query .= " WHERE thread_id=' $tid ' " ;
$query .= " LIMIT 1 " ;
$result = db_select ( $query );
global $db ;
if ( $db -> num_rows > 0 )
return true ;
else
return false ;
}
/**
* add recipient
*
* @ param INT userid
* @ param INT thread_id
*
*/
function add_recipient ( $uid , $thread_id , $check_thread = true )
{
if ( $check_thread )
{
if ( ! $this -> thread_exists ( $thread_id ))
{
e ( lang ( 'Invalid thread while adding recipient' ));
return false ;
}
}
$fields = array (
'userid' => $uid ,
'thread_id' => $thread_id ,
'date_added' => now (),
'time_added' => time (),
);
db_insert ( tbl ( 'recipients' ), $fields );
}
/**
* Adding multiple recipients ;
*
* @ param ARRAY recipients
* @ param INT thread
* @ param BOOLEAN check_thread
*/
function add_recipients ( $users , $thread_id , $check_thread = true )
{
if ( $check_thread )
{
if ( ! $this -> thread_exists ( $thread_id ))
{
e ( lang ( 'Invalid thread while adding recipient' ));
return false ;
}
}
$users = array_unique ( $users );
foreach ( $users as $uid )
$fields [] = array (
'userid' => $uid ,
'thread_id' => $thread_id ,
'date_added' => now (),
'time_added' => time (),
);
db_multi_insert ( tbl ( 'recipients' ), $fields );
}
/**
* Get threads
*
* THreads are always returned for a USER .. against UID
*
* @ param ARRAY $options
* @ return ARRAY $messages
*
*/
function get_threads ( $options = NULL )
{
$o = $options ;
$fields_array = array (
't' => array (
'thread_id' , 'total_recipients' , 'total_messages' ,
'date_added' , 'time_added' , 'last_message_date'
),
'u' => array (
'username' , 'email' , 'first_name' , 'last_name' , 'userid' ,
'avatar' , 'avatar_url'
),
'r' => array (
'recipient_id' ,
),
'm' => array (
'message_id' , 'thread_id' , 'message' , 'subject' , 'seen_by' ,
'time_added'
),
);
$the_fields = '' ;
foreach ( $fields_array as $table => $fields )
{
if ( $fields )
{
foreach ( $fields as $field )
{
if ( $the_fields )
$the_fields .= " , " ;
$the_fields .= ( $table . '.' . $field );
}
}
}
$users_fields = '' ;
foreach ( $fields_array [ 'u' ] as $field )
{
if ( $users_fields )
$users_fields .= " , " ;
$users_fields .= ( 'u.' . $field );
}
/**
* How this query works ..
*
* 1 st it will get all thread_ids from recipients table against userid ()
* 2 nd once all thread_ids are here , we will INNER JOIN them
* ON recipients . thread_id = threads . thread_id
* now we have our own threads .. in order to get more recipients
* ( here we have 3 as a limit ) we will INNER JOIN our query again
* with the recipients as you can see its name is tr
* ON threads . thread_id = tr . thread_id
*
*/
$query = " SELECT $the_fields FROM " . tbl ( 'recipients' ) . " as r " ;
$query .= " INNER JOIN " . tbl ( 'threads' ) . ' as t ON ' ;
$query .= ' t.thread_id=r.thread_id ' ;
$query .= " INNER JOIN " . tbl ( 'messages' ) . ' as m ON ' ;
$query .= ' t.last_message_id=m.message_id ' ;
$query .= " INNER JOIN " . tbl ( 'recipients' ) . " as tr ON " ;
$query .= " t.thread_id = tr.thread_id " ;
$query .= " INNER JOIN (SELECT * FROM " . tbl ( 'users' ) . " LIMIT 3 ) AS u on " ;
$query .= " u.userid = tr.userid " ;
start_where ();
if ( $o [ 'userid' ])
{
add_where ( " r.userid=' " . $o [ 'userid' ] . " ' " );
} elseif ( userid ())
{
add_where ( " r.userid=' " . userid () . " ' " );
} else
{
return false ;
}
if ( get_where ())
$query .= " WHERE " . get_where ();
end_where ();
if ( ! $o [ 'order' ])
$query .= " ORDER BY last_message_date DESC " ;
else
$query .= " ORDER BY " . $o [ 'order' ];
if ( $o [ 'limit' ])
$query .= " LIMIT " . $o [ 'limit' ];
$results = db_select ( $query );
$the_results = array ();
2013-01-01 12:25:27 +00:00
if ( $results )
2012-12-31 11:25:11 +00:00
foreach ( $results as $result )
{
$the_results [ $result [ 'thread_id' ]][ 'thread' ] = $result ;
$the_results [ $result [ 'thread_id' ]][ 'recipients' ][] = $result ;
}
return $the_results ;
}
/**
* get messages
*
* @ param ARRAY $options
*/
function get_messages ( $array = NULL )
{
$fields_array = array (
'messages' => array (
'message_id' , 'thread_id' , 'message' , 'subject' , 'seen_by' ,
'time_added'
),
'users' => array (
'username' , 'email' , 'first_name' , 'last_name' , 'userid' ,
'avatar' , 'avatar_url'
)
);
$the_fields = " " ;
$thread_id = $array [ 'thread_id' ];
foreach ( $fields_array as $table => $fields )
{
if ( $fields )
{
foreach ( $fields as $field )
{
if ( $the_fields )
$the_fields .= " , " ;
$the_fields .= tbl ( $table . '.' . $field );
}
}
}
$query = " SELECT " . $the_fields . " FROM " . tbl ( 'messages' );
$query .= " LEFT JOIN " . tbl ( 'users' ) . ' ON ' ;
$query .= tbl ( 'messages.userid' ) . ' = ' . tbl ( 'users.userid' );
$query .= " WHERE thread_id=' $thread_id ' " ;
$query .= " ORDER BY time_added ASC " ;
$results = db_select ( $query );
return $results ;
}
/**
* Get thread along with all the details ..
*
* @ param INT $thread_id
* @ param ARRAY $thread
*/
function get_thread ( $tid )
{
$fields_array = array (
't' => array (
'thread_id' , 'total_recipients' , 'total_messages' ,
'date_added' , 'time_added' , 'last_message_date'
),
'u' => array (
'username' , 'email' , 'first_name' , 'last_name' , 'userid' ,
'avatar' , 'avatar_url'
),
'r' => array (
'recipient_id' ,
),
'm' => array (
'message_id' , 'thread_id' , 'message' , 'subject' , 'seen_by' ,
'time_added'
),
);
$the_fields = '' ;
foreach ( $fields_array as $table => $fields )
{
if ( $fields )
{
foreach ( $fields as $field )
{
if ( $the_fields )
$the_fields .= " , " ;
$the_fields .= ( $table . '.' . $field );
}
}
}
$users_fields = '' ;
foreach ( $fields_array [ 'u' ] as $field )
{
if ( $users_fields )
$users_fields .= " , " ;
$users_fields .= ( 'u.' . $field );
}
$thread_id = $tid ;
$query = " SELECT $the_fields FROM " . tbl ( 'recipients' ) . " as r " ;
2013-01-02 13:59:05 +00:00
$query .= " INNER JOIN ( SELECT * FROM " . tbl ( 'threads' ) . " WHERE thread_id=' $tid ' LIMIT 1) as t ON " ;
2012-12-31 11:25:11 +00:00
$query .= ' t.thread_id=r.thread_id ' ;
2013-01-02 13:59:05 +00:00
$query .= " INNER JOIN ( SELECT * FROM " . tbl ( 'messages' ) . " WHERE thread_id=' $tid ' " ;
$query .= ' ORDER BY date_added ASC LIMIT 1)' ;
2012-12-31 11:25:11 +00:00
$query .= ' as m ON t.thread_id=m.thread_id ' ;
$query .= " INNER JOIN " . tbl ( 'recipients' ) . " as tr ON " ;
$query .= " t.thread_id = tr.thread_id " ;
$query .= " INNER JOIN (SELECT * FROM " . tbl ( 'users' ) . " LIMIT 3 ) AS u on " ;
$query .= " u.userid = tr.userid " ;
start_where ();
if ( $o [ 'userid' ])
{
add_where ( " r.userid=' " . $o [ 'userid' ] . " ' " );
} elseif ( userid ())
{
add_where ( " r.userid=' " . userid () . " ' " );
} else
{
return false ;
}
2013-01-02 13:59:05 +00:00
2012-12-31 11:25:11 +00:00
if ( get_where ())
$query .= " WHERE " . get_where ();
end_where ();
$results = db_select ( $query );
2013-01-02 13:59:05 +00:00
2012-12-31 11:25:11 +00:00
$the_results = array ();
foreach ( $results as $result )
{
$the_results [ $result [ 'thread_id' ]][ 'thread' ] = $result ;
$the_results [ $result [ 'thread_id' ]][ 'recipients' ][] = $result ;
}
return $the_results ;
}
/**
* Add message notification
*/
function add_message_notifications ( $thread_id , $exclude = NULL )
{
global $userquery ;
$query = " SELECT userid FROM " . tbl ( 'recipients' );
$query .= " WHERE thread_id=' $thread_id ' " ;
$results = db_select ( $query );
if ( ! is_array ( $exclude ))
$exclude = array ();
if ( $results )
{
foreach ( $results as $user )
{ if ( ! in_array ( $user [ 'userid' ], $exclude ))
$userquery -> new_notify ( $user [ 'userid' ], 'new_msgs' );
}
}
}
2012-05-18 13:47:20 +00:00
2009-11-04 12:07:35 +00:00
}
?>