2016-05-23 03:54:52 +00:00
< ? php
namespace Zotlabs\Lib ;
2018-06-05 01:40:11 +00:00
use Zotlabs\Lib\Libsync ;
2018-06-01 04:05:09 +00:00
2016-05-23 03:54:52 +00:00
/**
2017-09-04 22:23:42 +00:00
* @ brief A class with chatroom related static methods .
2016-05-23 03:54:52 +00:00
*/
class Chatroom {
/**
* @ brief Creates a chatroom .
*
* @ param array $channel
* @ param array $arr
2017-09-04 22:23:42 +00:00
* @ return array An associative array containing :
* * \e boolean \b success - A boolean success status
* * \e string \b message - ( optional ) A string
2016-05-23 03:54:52 +00:00
*/
static public function 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 [ '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 ;
}
static public function 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 ;
}
2018-06-05 01:40:11 +00:00
Libsync :: build_sync_packet ( $channel [ 'channel_id' ], array ( 'chatroom' => $r ));
2016-05-23 03:54:52 +00:00
q ( " delete from chatroom where cr_id = %d " ,
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 ;
}
static public function 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 ) {
$y = q ( " select count(*) as total from chatpresence where cp_room = %d " ,
intval ( $room_id )
);
if ( $y && $y [ 0 ][ 'total' ] > $limit ) {
notice ( t ( 'Room is full' ) . EOL );
return false ;
}
}
if ( intval ( $x [ 0 ][ 'cr_expire' ])) {
2017-09-04 22:23:42 +00:00
$r = q ( " delete from chat where created < %s - INTERVAL %s and chat_room = %d " ,
db_utcnow (),
2016-05-23 03:54:52 +00:00
db_quoteinterval ( intval ( $x [ 0 ][ 'cr_expire' ]) . ' MINUTE' ),
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' " ,
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 )
);
return $r ;
}
function 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 " ,
intval ( $r [ 0 ][ 'cp_id' ])
);
}
return true ;
}
static public function roomlist ( $uid ) {
require_once ( 'include/security.php' );
$sql_extra = permissions_sql ( $uid );
$r = q ( " select allow_cid, allow_gid, deny_cid, deny_gid, cr_name, cr_expire, 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, cr_id order by cr_name " ,
intval ( $uid )
);
return $r ;
}
static public function list_count ( $uid ) {
require_once ( 'include/security.php' );
$sql_extra = permissions_sql ( $uid );
$r = q ( " select count(*) as total from chatroom where cr_uid = %d $sql_extra " ,
intval ( $uid )
);
return $r [ 0 ][ 'total' ];
}
/**
2017-09-04 22:23:42 +00:00
* @ brief Create a chat message via API .
*
2016-05-23 03:54:52 +00:00
* It is the caller ' s responsibility to enter the room .
2017-09-04 22:23:42 +00:00
*
* @ param int $uid
* @ param int $room_id
* @ param string $xchan
* @ param string $text
* @ return array
*/
2016-05-23 03:54:52 +00:00
static public function 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 ;
2017-09-04 22:23:42 +00:00
$arr = [
2016-05-23 03:54:52 +00:00
'chat_room' => $room_id ,
'chat_xchan' => $xchan ,
'chat_text' => $text
2017-09-04 22:23:42 +00:00
];
/**
* @ hooks chat_message
* Called to create a chat message .
* * \e int \b chat_room
* * \e string \b chat_xchan
* * \e string \b chat_text
*/
2016-05-23 03:54:52 +00:00
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 ()),
2018-04-01 23:53:10 +00:00
dbesc ( str_rot47 ( base64url_encode ( $arr [ 'chat_text' ])))
2016-05-23 03:54:52 +00:00
);
$ret [ 'success' ] = true ;
return $ret ;
}
}