aboutsummaryrefslogblamecommitdiffstats
path: root/include/chat.php
blob: 2a978ed7cf046f440e8f54bbffd1fd2677cd1e0c (plain) (tree)





















                                                                                         










                                                                              

                                                               
 

                                      

                                                                                                                                            
                                                       



                                               
                                       




                                         
 

































                                                                                                       


                                                          





                               
                                                                   
 
                                           
                       



                                                                 



                                                    


                                                      

                                                                                            



                                                       
                             

         










                                                                                       


                                                                                                                                                                          




                                                                                           
                                                                                                         
                                                  

                                               



                            

                                                                                             


                                          

                               
          

                                        



                  
                                                           
                                           
                       
 
                                                                                                                
                                       

                                 





                                                                      
 
                    



                              

                                             
 
                                                                                                                                                                                         

                            
 
                  
 






































                                                                                    
                                        

                    











                                                                                                
<?php /** @file */


function chatroom_create($channel,$arr) {

	$ret = array('success' => false);

	$name = trim($arr['name']);
	if(! $name) {
		$ret['message'] = t('Missing room name');
		return $ret;
	}

	$r = q("select cr_id from chatroom where cr_uid = %d and cr_name = '%s' limit 1",
		intval($channel['channel_id']),
		dbesc($name)
	);
	if($r) {
		$ret['message'] = t('Duplicate room name');
		return $ret;
	}

	$r = q("select count(cr_id) as total from chatroom where cr_aid = %d",
		intval($channel['channel_account_id'])
	);
	if($r)
		 $limit = service_class_fetch($channel_id,'chatrooms');

    if(($r) && ($limit !== false) && ($r[0]['total'] >= $limit)) {
        $ret['message'] = upgrade_message();
        return $ret;
    }

	if(! array_key_exists('expire',$arr))
		$arr['expire'] = 120;  // minutes, e.g. 2 hours

	$created = datetime_convert();

	$x = q("insert into chatroom ( cr_aid, cr_uid, cr_name, cr_created, cr_edited, cr_expire, allow_cid, allow_gid, deny_cid, deny_gid )
		values ( %d, %d , '%s', '%s', '%s', %d, '%s', '%s', '%s', '%s' ) ",
		intval($channel['channel_account_id']),
		intval($channel['channel_id']),
		dbesc($name),
		dbesc($created),
		dbesc($created),
		intval($arr['expire']),
		dbesc($arr['allow_cid']),
		dbesc($arr['allow_gid']),
		dbesc($arr['deny_cid']),
		dbesc($arr['deny_gid'])
	);

	if($x)
		$ret['success'] = true;

	return $ret;
}


function chatroom_destroy($channel,$arr) {

	$ret = array('success' => false);
	if(intval($arr['cr_id']))
		$sql_extra = " and cr_id = " . intval($arr['cr_id']) . " ";
	elseif(trim($arr['cr_name']))
		$sql_extra = " and cr_name = '" . protect_sprintf(dbesc(trim($arr['cr_name']))) . "' ";
	else {
		$ret['message'] = t('Invalid room specifier.');
		return $ret;
	}

	$r = q("select * from chatroom where cr_uid = %d $sql_extra limit 1",
		intval($channel['channel_id'])
	);
	if(! $r) {		
		$ret['message'] = t('Invalid room specifier.');
		return $ret;
	}

	q("delete from chatroom where cr_id = %d limit 1",
		intval($r[0]['cr_id'])
	);
	if($r[0]['cr_id']) {
		q("delete from chatpresence where cp_room = %d",
			intval($r[0]['cr_id'])
		);
		q("delete from chat where chat_room = %d",
			intval($r[0]['cr_id'])
		);
	}
	$ret['success'] = true;
	return $ret;
}


function chatroom_enter($observer_xchan,$room_id,$status,$client) {

	if(! $room_id || ! $observer_xchan)
		return;

	$r = q("select * from chatroom where cr_id = %d limit 1",
		intval($room_id)
	);
	if(! $r) {
		notice( t('Room not found.') . EOL);
		return false;
	}
	require_once('include/security.php');
	$sql_extra = permissions_sql($r[0]['cr_uid']);

	$x = q("select * from chatroom where cr_id = %d and cr_uid = %d $sql_extra limit 1",
			intval($room_id),
			intval($r[0]['cr_uid'])
	);
	if(! $x) {
		notice( t('Permission denied.') . EOL);
		return false;
	}

	$limit = service_class_fetch($r[0]['cr_uid'],'chatters_inroom');
	if($limit !== false) {
		$x = q("select count(*) as total from chatpresence where cp_room = %d",
				intval($room_id)
		);
		if($x && $x[0]['total'] > $limit) {
			notice( t('Room is full') . EOL);
			return false;
		}
	}

	if(intval($x[0]['cr_expire']))
		$r = q("delete from chat where created < UTC_TIMESTAMP() - INTERVAL " . intval($x[0]['cr_expire']) . " MINUTE and chat_room = " . intval($x[0]['cr_id']));

	$r = q("select * from chatpresence where cp_xchan = '%s' and cp_room = %d limit 1",
		dbesc($observer_xchan),
		intval($room_id)
	);
	if($r) {
		q("update chatpresence set cp_last = '%s' where cp_id = %d and cp_client = '%s' limit 1",
			dbesc(datetime_convert()),
			intval($r[0]['cp_id']),
			dbesc($client)
		);
		return true;
	}

	$r = q("insert into chatpresence ( cp_room, cp_xchan, cp_last, cp_status, cp_client )
		values ( %d, '%s', '%s', '%s', '%s' )",
		intval($room_id),
		dbesc($observer_xchan),
		dbesc(datetime_convert()),
		dbesc($status),
		dbesc($client)
	);
	
	chatroom_flush($room_id,$xchan);
	return $r;
}


function chatroom_leave($observer_xchan,$room_id,$client) {
	if(! $room_id || ! $observer_xchan)
		return;

	$r = q("select * from chatpresence where cp_xchan = '%s' and cp_room = %d and cp_client = '%s' limit 1",
		dbesc($observer_xchan),
		intval($room_id),
		dbesc($client)
	);
	if($r) {
		q("delete from chatpresence where cp_id = %d limit 1",
			intval($r[0]['cp_id'])
		);
	}

	return true;
}


function chatroom_list($uid) {
	require_once('include/security.php');
	$sql_extra = permissions_sql($uid);

	$r = q("select cr_name, cr_id, count(cp_id) as cr_inroom from chatroom left join chatpresence on cr_id = cp_room where cr_uid = %d $sql_extra group by cr_name order by cr_name",
		intval($uid)
	);

	return $r;
}

/**
 * create a chat message via API.
 * It is the caller's responsibility to enter the room.
 */

function chat_message($uid,$room_id,$xchan,$text) {

	$ret = array('success' => false);

	if(! $text)
		return;

	$sql_extra = permissions_sql($uid);

	$r = q("select * from chatroom where cr_uid = %d and cr_id = %d $sql_extra",
		intval($uid),
		intval($room_id)
	);
	if(! $r)
		return $ret;

	$arr = array(
		'chat_room' => $room_id,
		'chat_xchan' => $xchan,
		'chat_text' => $text
	);

	call_hooks('chat_message',$arr);

	$x = q("insert into chat ( chat_room, chat_xchan, created, chat_text )
		values( %d, '%s', '%s', '%s' )",
		intval($room_id),
		dbesc($xchan),
		dbesc(datetime_convert()),
		dbesc($arr['chat_text'])		
	);

	$ret['success'] = true;
	chatroom_flush($room_id,$xchan);
	return $ret;
}

/**
 * Reduces the number of lines shown in chat by removing those older than MAX_CHATROOM_HOURS
 */

function chatroom_flush($room_id,$xchan) {
	$d = q("delete from chat where chat_room = %d and chat_xchan = '%s' and created < '%s'",
		intval($room_id),
		dbesc($xchan),
		datetime_convert('','', $date_limit));
	return true;
}