ILIAS  release_5-0 Revision 5.0.0-1144-gc4397b1f870
class.ilChatroom.php
Go to the documentation of this file.
1<?php
2/* Copyright (c) 1998-2009 ILIAS open source, Extended GPL, see docs/LICENSE */
3
4
14{
15
16 private $settings = array();
17 private static $settingsTable = 'chatroom_settings';
18 private static $historyTable = 'chatroom_history';
19 private static $userTable = 'chatroom_users';
20 private static $sessionTable = 'chatroom_sessions';
21 private static $banTable = 'chatroom_bans';
22 private static $privateRoomsTable = 'chatroom_prooms';
23 private static $privateSessionsTable = 'chatroom_psessions';
24 private static $uploadTable = 'chatroom_uploads';
25 private static $privateRoomsAccessTable = 'chatroom_proomaccess';
26
34 private $availableSettings = array(
35 'object_id' => 'integer',
36 'allow_anonymous' => 'boolean',
37 'allow_custom_usernames' => 'boolean',
38 'enable_history' => 'boolean',
39 'restrict_history' => 'boolean',
40 'autogen_usernames' => 'string',
41 'room_type' => 'string',
42 'allow_private_rooms' => 'integer',
43 'display_past_msgs' => 'integer',
44 'private_rooms_enabled' => 'boolean'
45 );
46 private $roomId;
47
48 private $object;
49
50 public function getTitle()
51 {
52 if( !$this->object )
53 {
54 $this->object = ilObjectFactory::getInstanceByObjId($this->getSetting('object_id'));
55 }
56
57 return $this->object->getTitle();
58 }
59
67 public static function checkUserPermissions($permissions, $ref_id, $send_info = true)
68 {
69 global $rbacsystem, $lng;
70
71 if( !is_array($permissions) )
72 {
73 $permissions = array( $permissions );
74 }
75
76 foreach( $permissions as $permission )
77 {
78 if( !$rbacsystem->checkAccess( $permission, $ref_id ) )
79 {
80 if ($send_info) {
81 ilUtil::sendFailure( $lng->txt("permission_denied"), true );
82 }
83 return false;
84 }
85 }
86
87 return true;
88 }
89
101 public static function checkPermissionsOfUser($usr_id, $permissions, $ref_id)
102 {
103 global $rbacsystem, $lng;
104
105 if( !is_array($permissions) )
106 {
107 $permissions = array( $permissions );
108 }
109
110 foreach( $permissions as $permission )
111 {
112 if( !$rbacsystem->checkAccessOfUser($usr_id, $permission, $ref_id ) )
113 {
114 return false;
115 }
116 }
117
118 return true;
119 }
120
121 public function getDescription()
122 {
123 if (!$this->object)
124 {
125 $this->object = ilObjectFactory::getInstanceByObjId($this->getSetting('object_id'));
126 }
127
128 return $this->object->getDescription();
129 }
130
137 public function getSetting($name)
138 {
139 return $this->settings[$name];
140 }
141
148 public function setSetting($name, $value)
149 {
150 $this->settings[$name] = $value;
151 }
152
156 public function save()
157 {
158 $this->saveSettings( $this->settings );
159 }
160
171 public function addHistoryEntry($message, $recipient = null, $publicMessage = true)
172 {
173 global $ilDB;
174
175 $subRoom = 0;
176 if (is_array($message)) {
177 $subRoom = (int) $message['sub'];
178 }
179 else if (is_object($message)) {
180 $subRoom = (int) $message->sub;
181 }
182
183 $ilDB->insert(
184 self::$historyTable,
185 array(
186 'room_id' => array('integer', $this->roomId),
187 'sub_room' => array('integer', $subRoom),
188 'message' => array('text', json_encode($message)),
189 'timestamp' => array('integer', time()),
190 )
191 );
192 }
193
206 public function connectUser(ilChatroomUser $user)
207 {
211 global $ilDB;
212
213 $userdata = array(
214 'login' => $user->getUsername(),
215 'id' => $user->getUserId()
216 );
217
218 $query = 'SELECT user_id FROM ' . self::$userTable . ' WHERE room_id = %s AND user_id = %s';
219 $types = array('integer', 'integer');
220 $values = array($this->roomId, $user->getUserId());
221
222 if(!$ilDB->fetchAssoc($ilDB->queryF($query, $types, $values)))
223 {
224 // Notice: Using replace instead of insert looks strange, because we actually know whether the selected data exists or not
225 // But we occasionally found some duplicate key errors although the data set should not exist when the following code is reached
226 $ilDB->replace(
227 self::$userTable,
228 array(
229 'room_id' => array('integer', $this->roomId),
230 'user_id' => array('integer', $user->getUserId())
231 ),
232 array(
233 'userdata' => array('text', json_encode($userdata)),
234 'connected' => array('integer', time()),
235 )
236 );
237
238 return true;
239 }
240
241 return false;
242 }
243
253 public function getConnectedUsers()
254 {
255 global $ilDB;
256
257 $query = 'SELECT userdata FROM ' . self::$userTable . ' WHERE room_id = %s';
258 $types = array('integer');
259 $values = array($this->roomId);
260 $rset = $ilDB->queryF( $query, $types, $values );
261 $users = array();
262
263 while( $row = $ilDB->fetchAssoc( $rset ) )
264 {
265 $users[] = json_decode( $row['userdata'] );
266 }
267
268 return $users;
269 }
270
277 public function disconnectUser($user_id)
278 {
279 $this->disconnectUsers( array($user_id) );
280 }
281
291 public function disconnectUsers(array $userIds)
292 {
293 global $ilDB;
294
295 $query = 'SELECT * FROM ' . self::$userTable . ' WHERE room_id = %s AND ' .
296 $ilDB->in( 'user_id', $userIds, false, 'integer' );
297
298 $types = array('integer');
299 $values = array($this->roomId);
300 $rset = $ilDB->queryF( $query, $types, $values );
301
302 if( $row = $ilDB->fetchAssoc( $rset ) )
303 {
304 $query = 'SELECT proom_id FROM ' . self::$privateRoomsTable . ' WHERE parent_id = %s';
305 $rset_prooms = $ilDB->queryF($query, array('integer'), array($this->roomId));
306
307 $prooms = array();
308
309 while($row_prooms = $ilDB->fetchAssoc($rset_prooms)) {
310 $prooms[] = $row_prooms['proom_id'];
311 }
312
313 if (true || $this->getSetting( 'enable_history' )) {
314 $query = 'UPDATE ' . self::$privateSessionsTable . ' SET disconnected = %s WHERE ' . $ilDB->in('user_id', $userIds, false, 'integer') . ' AND ' . $ilDB->in('proom_id', $prooms, false, 'integer');
315 $ilDB->manipulateF($query, array('integer'), array(time()));
316 }
317 else {
318 $query = 'DELETE FROM ' . self::$privateSessionsTable . ' WHERE ' . $ilDB->in('user_id', $userIds, false, 'integer') . ' AND ' . $ilDB->in('proom_id', $prooms, false, 'integer');
319 $ilDB->manipulate($query);
320 }
321
322 $query = 'DELETE FROM ' . self::$userTable . ' WHERE room_id = %s AND ' .
323 $ilDB->in( 'user_id', $userIds, false, 'integer' );
324
325 $types = array('integer');
326 $values = array($this->roomId);
327 $ilDB->manipulateF( $query, $types, $values );
328
329 do
330 {
331 if ($this->getSetting( 'enable_history' )) {
332 $ilDB->insert(
333 self::$sessionTable,
334 array(
335 'room_id' => array('integer', $this->roomId),
336 'user_id' => array('integer', $row['user_id']),
337 'userdata' => array('text', $row['userdata']),
338 'connected' => array('integer', $row['connected']),
339 'disconnected' => array('integer', time()),
340 )
341 );
342 }
343 }
344 while( $row = $ilDB->fetchAssoc( $rset ) );
345 }
346
347 }
348
349 private function phpTypeToMDBType($type) {
350 switch($type) {
351 case 'string':
352 return 'text';
353 default:
354 return $type;
355 }
356
357 }
358
365 public function saveSettings(array $settings)
366 {
367 global $ilDB;
368
369 $localSettings = array();
370
371 foreach( $this->availableSettings as $setting => $type )
372 {
373 if( isset( $settings[$setting] ) ) {
374 if ($type == 'boolean') {
375 $settings[$setting] = (boolean)$settings[$setting];
376 }
377 $localSettings[$setting] = array($this->phpTypeToMDBType($type), $settings[$setting]);
378 }
379 }
380
381 if (!$localSettings['room_type'][1]) {
382 $localSettings['room_type'][1] = 'repository';
383 }
384
385 if( $this->roomId )
386 {
387 $ilDB->update(
388 self::$settingsTable,
389 $localSettings,
390 array( 'room_id' => array('integer', $this->roomId) )
391 );
392 }
393 else
394 {
395 $this->roomId = $ilDB->nextId( self::$settingsTable );
396
397 $localSettings['room_id'] = array(
398 $this->availableSettings['room_id'], $this->roomId
399 );
400
401 $ilDB->insert( self::$settingsTable, $localSettings );
402 }
403 }
404
410 public function getSettings()
411 {
412 return $this->settings;
413 }
414
422 public static function byObjectId($object_id)
423 {
424 global $ilDB;
425 $query = 'SELECT * FROM ' . self::$settingsTable . ' WHERE object_id = %s';
426 $types = array('integer');
427 $values = array($object_id);
428 $rset = $ilDB->queryF( $query, $types, $values );
429
430 if( $row = $ilDB->fetchAssoc( $rset ) )
431 {
432 $room = new self();
433 $room->initialize( $row );
434 return $room;
435 }
436 }
437
445 public static function byRoomId($room_id, $initObject = false)
446 {
447 global $ilDB;
448
449 $query = 'SELECT * FROM ' . self::$settingsTable . ' WHERE room_id = %s';
450
451 $types = array('integer');
452 $values = array($room_id);
453
454 $rset = $ilDB->queryF( $query, $types, $values );
455
456 if( $row = $ilDB->fetchAssoc( $rset ) )
457 {
458 $room = new self();
459 $room->initialize( $row );
460
461 if ($initObject) {
462 $room->object = ilObjectFactory::getInstanceByObjId($row['object_id']);
463 }
464
465 return $room;
466 }
467 }
468
475 public function initialize(array $rowdata)
476 {
477 $this->roomId = $rowdata['room_id'];
478
479 foreach( $this->availableSettings as $setting => $type )
480 {
481 if( isset($rowdata[$setting]) )
482 {
483 settype($rowdata[$setting], $this->availableSettings[$setting]);
484 $this->setSetting( $setting, $rowdata[$setting] );
485 }
486 }
487 }
488
494 public function getRoomId()
495 {
496 return $this->roomId;
497 }
498
507 public function isSubscribed($chat_userid)
508 {
509 global $ilDB;
510
511 $query = 'SELECT count(user_id) as cnt FROM ' . self::$userTable .
512 ' WHERE room_id = %s AND user_id = %s';
513
514 $types = array('integer', 'integer');
515 $values = array($this->roomId, $chat_userid);
516 $rset = $ilDB->queryF( $query, $types, $values );
517
518 if( $rset && ($row = $ilDB->fetchAssoc( $rset )) && $row['cnt'] == 1 )
519 return true;
520
521 return false;
522 }
523
524 public function isAllowedToEnterPrivateRoom($chat_userid, $proom_id) {
525 //echo call_user_func_array('sprintf', array_merge(array($query), $values));
526 global $ilDB;
527
528 $query = 'SELECT count(user_id) cnt FROM ' . self::$privateRoomsAccessTable .
529 ' WHERE proom_id = %s AND user_id = %s';
530
531 $types = array('integer', 'integer');
532 $values = array($proom_id, $chat_userid);
533 $rset = $ilDB->queryF( $query, $types, $values );
534
535 if( $rset && ($row = $ilDB->fetchAssoc( $rset )) && $row['cnt'] == 1 )
536 return true;
537
538 $query = 'SELECT count(*) cnt FROM ' . self::$privateRoomsTable .
539 ' WHERE proom_id = %s AND owner = %s';
540
541 $types = array('integer', 'integer');
542 $values = array($proom_id, $chat_userid);
543 $rset = $ilDB->queryF( $query, $types, $values );
544
545 if( $rset && ($row = $ilDB->fetchAssoc( $rset )) && $row['cnt'] == 1 )
546 return true;
547
548 return false;
549 }
550
557 {
558 global $ilDB;
559
560 $ilDB->manipulate( 'DELETE FROM ' . self::$userTable );
561 $ilDB->manipulate( 'UPDATE ' . self::$privateRoomsTable . ' SET closed = ' . $ilDB->quote( time() ,'integer') . ' WHERE closed = 0 OR closed IS NULL');
562 $ilDB->manipulate( 'UPDATE ' . self::$privateSessionsTable . ' SET disconnected = ' . $ilDB->quote( time() ,'integer') . ' WHERE disconnected = 0 OR disconnected IS NULL');
566 }
567
578 public function getHistory(ilDateTime $from = null, ilDateTime $to = null, $restricted_session_userid = null, $proom_id = 0)
579 {
580 global $ilDB, $ilUser;
581
582 $join = '';
583
584 if ($proom_id) {
585 $join .= ' INNER JOIN ' . self::$privateSessionsTable .
586 ' pSessionTable ON pSessionTable.user_id = ' .
587 $ilDB->quote( $restricted_session_userid, 'integer' ) .
588 ' AND historyTable.sub_room = pSessionTable.proom_id AND timestamp >= pSessionTable.connected AND timestamp <= pSessionTable.disconnected ';
589 }
590
591 $query = 'SELECT historyTable.* FROM ' . self::$historyTable . ' historyTable ' .
592 $join . ' WHERE historyTable.room_id = ' . $this->getRoomId();
593
594 $filter = array();
595
596 if( $from != null )
597 {
598 $filter[] = 'timestamp >= ' . $ilDB->quote( $from->getUnixTime(), 'integer' );
599 }
600
601 if( $to != null )
602 {
603 $filter[] = 'timestamp <= ' . $ilDB->quote( $to->getUnixTime(), 'integer' );
604 }
605
606 if( $filter )
607 $query .= ' AND ' . join( ' AND ', $filter );
608 $query .= ' ORDER BY timestamp ASC';
609
610 $rset = $ilDB->query( $query );
611 $result = array();
612
613 while( $row = $ilDB->fetchAssoc( $rset ) )
614 {
615 $row['message'] = json_decode( $row['message'] );
616 $row['message']->timestamp = $row['timestamp'];
617 if ($row['message']->public !== null && !$row['message']->public && !in_array($ilUser->getId(), explode(',', $row['recipients']))) {
618 continue;
619 }
620
621 $result[] = $row;
622 }
623 return $result;
624 }
625
626 public function getPrivateRoomSessions(ilDateTime $from = null, ilDateTime $to = null, $user_id = 0, $room_id=0 ) {
627 global $ilDB;
628
629 $query = 'SELECT proom_id, title FROM ' . self::$privateRoomsTable . ' WHERE proom_id IN (
630 SELECT proom_id FROM '.self::$privateSessionsTable.' WHERE connected >= %s AND disconnected <= %s AND user_id = %s
631
632 ) AND parent_id = %s';
633
634 $rset = $ilDB->queryF($query, array('integer','integer','integer','integer'), array($from->getUnixTime(), $to->getUnixTime(), $user_id, $room_id));
635 $result = array();
636 while( $row = $ilDB->fetchAssoc( $rset ) )
637 {
638 $result[] = $row;
639 }
640 return $result;
641 }
642
651 public function saveFileUploadToDb($user_id, $filename, $type)
652 {
653 global $ilDB;
654
655 $upload_id = $ilDB->nextId( self::$uploadTable );
656
657 $ilDB->insert(
658 self::$uploadTable,
659 array(
660 'upload_id' => array('integer', $upload_id),
661 'room_id' => array('integer', $this->roomId),
662 'user_id' => array('integer', $user_id),
663 'filename' => array('text', $filename),
664 'filetype' => array('text', $type),
665 'timestamp' => array('integer', time())
666 )
667 );
668 }
669
677 public function banUser($user_id, $comment = '')
678 {
679 global $ilDB;
680
681 $ilDB->insert(
682 self::$banTable,
683 array(
684 'room_id' => array('integer', $this->roomId),
685 'user_id' => array('integer', $user_id),
686 'timestamp' => array('integer', time()),
687 'remark' => array('text', $comment),
688 )
689 );
690 }
691
700 public function unbanUser($user_id)
701 {
702 global $ilDB;
703
704 if( !is_array( $user_id ) )
705 $user_id = array($user_id);
706
707 $query = 'DELETE FROM ' . self::$banTable . ' WHERE room_id = %s AND ' .
708 $ilDB->in( 'user_id', $user_id, false, 'integer' );
709
710 $types = array('integer');
711 $values = array($this->getRoomId());
712
713 return $ilDB->manipulateF( $query, $types, $values );
714 }
715
724 public function isUserBanned($user_id)
725 {
726 global $ilDB;
727
728 $query = 'SELECT count(user_id) cnt FROM ' . self::$banTable .
729 ' WHERE user_id = %s AND room_id = %s';
730
731 $types = array('integer', 'integer');
732 $values = array($user_id, $this->getRoomId());
733
734 $rset = $ilDB->queryF( $query, $types, $values );
735
736 if( $rset && ($row = $ilDB->fetchAssoc( $rset )) && $row['cnt'] )
737 return true;
738
739 return false;
740 }
741
749 public function getBannedUsers()
750 {
751 global $ilDB;
752
753 $query = 'SELECT * FROM ' . self::$banTable . ' WHERE room_id = %s ';
754 $types = array('integer');
755 $values = array($this->getRoomId());
756 $rset = $ilDB->queryF( $query, $types, $values );
757 $result = array();
758
759 if( $rset )
760 {
761 while( $row = $ilDB->fetchAssoc( $rset ) )
762 {
763 if( $row['user_id'] > 0 )
764 {
765 $user = new ilObjUser( $row['user_id'] );
766 $userdata = array(
767 'user_id' => $user->getId(),
768 'firstname' => $user->getFirstname(),
769 'lastname' => $user->getLastname(),
770 'login' => $user->getLogin(),
771 'remark' => $row['remark']
772 );
773
774 $result[] = $userdata;
775 }
776 else
777 {
778 //@todo anonymous user
779 }
780 }
781 }
782
783 return $result;
784 }
785
796 public function getLastSession(ilChatroomUser $user)
797 {
798 global $ilDB;
799
800 $query = 'SELECT * FROM ' . self::$sessionTable . ' WHERE user_id = ' .
801 $ilDB->quote( $user->getUserId(), 'integer' ) .
802 ' ORDER BY connected DESC';
803
804 $ilDB->setLimit( 1 );
805 $rset = $ilDB->query( $query );
806
807 if( $row = $ilDB->fetchAssoc( $rset ) )
808 {
809 return $row;
810 }
811 }
812
823 public function getSessions(ilChatroomUser $user)
824 {
825 global $ilDB;
826
827 $query = 'SELECT * FROM ' . self::$sessionTable
828 . ' WHERE room_id = '.
829 $ilDB->quote( $this->getRoomId(), 'integer' ) .
830 ' ORDER BY connected DESC';
831
832 $rset = $ilDB->query( $query );
833
834 $result = array();
835
836 while( $row = $ilDB->fetchAssoc( $rset ) )
837 {
838 $result[] = $row;
839 }
840
841 return $result;
842 }
843
844 public function addPrivateRoom($title, ilChatroomUser $owner, $settings)
845 {
846 global $ilDB;
847
848 $nextId = $ilDB->nextId('chatroom_prooms');
849
850 $ilDB->insert(
851 self::$privateRoomsTable,
852 array(
853 'proom_id' => array('integer', $nextId),
854 'parent_id' => array('integer', $this->roomId),
855 'title' => array('text', $title),
856 'owner' => array('integer', $owner->getUserId()),
857 'created' => array('integer', time()),
858 'is_public' => array('integer', $settings['public']),
859 )
860 );
861
862 return $nextId;
863 }
864
865 public function closePrivateRoom($id)
866 {
867 global $ilDB;
868
869 $ilDB->manipulateF(
870 'UPDATE ' . self::$privateRoomsTable . ' SET closed = %s WHERE proom_id = %s',
871 array('integer', 'integer'),
872 array(time(), $id)
873 );
874 }
875
876 public function isOwnerOfPrivateRoom($user_id, $proom_id) {
877 global $ilDB;
878
879 $query = 'SELECT proom_id FROM ' . self::$privateRoomsTable . ' WHERE proom_id = %s AND owner = %s';
880 $types = array('integer', 'integer');
881 $values = array($proom_id, $user_id);
882
883 $rset = $ilDB->queryF($query, $types, $values);
884
885 if ($rset && $ilDB->fetchAssoc($rset)) {
886 return true;
887 }
888 return false;
889 }
890
895 public function inviteUserToPrivateRoom($user_id, $proom_id)
896 {
900 global $ilDB;
901
902 $query = 'DELETE FROM ' . self::$privateRoomsAccessTable . ' WHERE user_id = %s AND proom_id = %s';
903 $types = array('integer', 'integer');
904 $values = array($user_id, $proom_id);
905
906 $ilDB->manipulateF($query, $types, $values);
907
908 $ilDB->insert(self::$privateRoomsAccessTable, array(
909 'user_id' => array('integer', $user_id),
910 'proom_id' => array('integer', $proom_id)
911 ));
912 }
913
920 public function getChatURL($gui, $scope_id = 0)
921 {
922 include_once 'Services/Link/classes/class.ilLink.php';
923
924 $url = '';
925
926 if(is_object($gui))
927 {
928 if($scope_id)
929 {
930 $url = ilLink::_getStaticLink($gui->object->getRefId(), $gui->object->getType(), true, '_'.$scope_id);
931 }
932 else
933 {
934 $url = ilLink::_getStaticLink($gui->object->getRefId(), $gui->object->getType());
935 }
936 }
937
938 return $url;
939 }
940
949 public function sendInvitationNotification($gui, $sender, $recipient_id, $subScope = 0, $invitationLink = '')
950 {
954 global $lng;
955
956 if($gui && !$invitationLink)
957 {
958 $invitationLink = $this->getChatURL($gui, $subScope);
959 }
960
961 if($recipient_id > 0 && !in_array(ANONYMOUS_USER_ID, array($recipient_id)))
962 {
963 if(is_numeric($sender) && $sender > 0)
964 {
965 $sender_id = $sender;
970 $public_name = $usr->getPublicName();
971 }
972 else if($sender instanceof ilChatroomUser)
973 {
974 if($sender->getUserId() > 0)
975 {
976 $sender_id = $sender->getUserId();
977 }
978 else
979 {
980 $sender_id = ANONYMOUS_USER_ID;
981 }
982 $public_name = $sender->getUsername();
983 }
984 else
985 {
986 throw new InvalidArgumentException('$sender must be an instance of ilChatroomUser or an id of an ilObjUser instance');
987 }
988
989 $lng->loadLanguageModule('mail');
990
991 $recipient = ilObjectFactory::getInstanceByObjId($recipient_id);
992 $bodyParams = array(
993 'link' => $invitationLink,
994 'inviter_name' => $public_name,
995 'room_name' => $this->getTitle(),
996 'salutation' => $lng->txt('mail_salutation_' . $recipient->getGender()) . ' ' . $recipient->getFullname()
997 );
998
999 if($subScope)
1000 {
1001 $bodyParams['room_name'] .= ' - ' . self::lookupPrivateRoomTitle($subScope);
1002 }
1003
1004 require_once 'Services/Notifications/classes/class.ilNotificationConfig.php';
1005 $notification = new ilNotificationConfig('chat_invitation');
1006 $notification->setTitleVar('chat_invitation', $bodyParams, 'chatroom');
1007 $notification->setShortDescriptionVar('chat_invitation_short', $bodyParams, 'chatroom');
1008 $notification->setLongDescriptionVar('chat_invitation_long', $bodyParams, 'chatroom');
1009 $notification->setAutoDisable(false);
1010 $notification->setLink($invitationLink);
1011 $notification->setIconPath('templates/default/images/icon_chtr.svg');
1012 $notification->setValidForSeconds(0);
1013
1014 $notification->setHandlerParam('mail.sender', $sender_id);
1015
1016 $notification->notifyByUsers(array($recipient_id));
1017 }
1018 }
1019
1020 public function inviteUserToPrivateRoomByLogin($login, $proom_id) {
1021 global $ilDB;
1022 $user_id = ilObjUser::_lookupId($login);
1023 $this->inviteUserToPrivateRoom($user_id, $proom_id);
1024 }
1025
1026 public static function lookupPrivateRoomTitle($proom_id) {
1027 global $ilDB;
1028
1029 $query = 'SELECT title FROM ' . self::$privateRoomsTable . ' WHERE proom_id = %s';
1030 $types = array('integer');
1031 $values = array($proom_id);
1032
1033 $rset = $ilDB->queryF($query, $types, $values);
1034
1035 if ($row = $ilDB->fetchAssoc($rset)) {
1036 return $row['title'];
1037 }
1038
1039 return 'unkown';
1040 }
1041
1042 public function getActivePrivateRooms($userid)
1043 {
1044 global $ilDB;
1045
1046 $query = '
1047 SELECT roomtable.title, roomtable.proom_id, accesstable.user_id id, roomtable.owner owner FROM ' . self::$privateRoomsTable . ' roomtable
1048 LEFT JOIN '.self::$privateRoomsAccessTable.' accesstable ON roomtable.proom_id = accesstable.proom_id AND accesstable.user_id = %s
1049 WHERE parent_id = %s AND (closed = 0 OR closed IS NULL) AND (accesstable.user_id IS NOT NULL OR roomtable.owner = %s)';
1050 $types = array('integer', 'integer', 'integer');
1051 $values = array($userid, $this->roomId, $userid);
1052 $rset = $ilDB->queryF( $query, $types, $values );
1053 $rooms = array();
1054
1055 while( $row = $ilDB->fetchAssoc( $rset ) )
1056 {
1057 $row['active_users'] = $this->listUsersInPrivateRoom($row['id']);
1058 $row['owner'] = $row['owner'];
1059 $rooms[$row['proom_id']] = $row;
1060 }
1061
1062 return $rooms;
1063 }
1064
1065 public function listUsersInPrivateRoom($private_room_id) {
1066 global $ilDB;
1067
1068 $query = '
1069 SELECT chatroom_users.user_id FROM ' . self::$privateSessionsTable . '
1070 INNER JOIN chatroom_users ON chatroom_users.user_id = ' . self::$privateSessionsTable . '.user_id WHERE proom_id = %s AND disconnected = 0
1071 ';
1072 $types = array('integer');
1073 $values = array($private_room_id);
1074 $rset = $ilDB->queryF( $query, $types, $values );
1075
1076 $users = array();
1077
1078 while ($row = $ilDB->fetchAssoc($rset)) {
1079 $users[$row['user_id']] = $row['user_id'];
1080 }
1081
1082 return array_values($users);
1083 }
1084
1085 public function userIsInPrivateRoom($room_id, $user_id)
1086 {
1087 global $ilDB;
1088
1089 $query = 'SELECT proom_id id FROM ' . self::$privateSessionsTable . ' WHERE user_id = %s AND proom_id = %s AND disconnected = 0 OR disconnected IS NULL';
1090 $types = array('integer', 'integer');
1091 $values = array($user_id, $room_id);
1092 $rset = $ilDB->queryF( $query, $types, $values );
1093 if ($ilDB->fetchAssoc($rset))
1094 return true;
1095 return false;
1096 }
1097
1098 public function subscribeUserToPrivateRoom($room_id, $user_id)
1099 {
1100 global $ilDB;
1101
1102 if (!$this->userIsInPrivateRoom($room_id, $user_id)) {
1103 $ilDB->insert(
1104 self::$privateSessionsTable,
1105 array(
1106 'proom_id' => array('integer', $room_id),
1107 'user_id' => array('integer', $user_id),
1108 'connected' => array('integer', time()),
1109 'disconnected' => array('integer', 0),
1110 )
1111 );
1112 }
1113 }
1114
1121 public function unsubscribeUserFromPrivateRoom($room_id, $user_id)
1122 {
1123 global $ilDB;
1124
1125 $ilDB->update(
1126 self::$privateSessionsTable,
1127 array(
1128 'disconnected' => array('integer', time())
1129 ),
1130 array(
1131 'proom_id' => array('integer', $room_id),
1132 'user_id' => array('integer', $user_id),
1133 )
1134 );
1135 }
1136
1137 public function countActiveUsers() {
1138 global $ilDB;
1139
1140 $query = 'SELECT count(user_id) as cnt FROM ' . self::$userTable .
1141 ' WHERE room_id = %s';
1142
1143 $types = array('integer');
1144 $values = array($this->roomId);
1145 $rset = $ilDB->queryF( $query, $types, $values );
1146
1147 if( $rset && ($row = $ilDB->fetchAssoc( $rset )) && $row['cnt'] == 1 )
1148 return $row['cnt'];
1149
1150 return 0;
1151 }
1152
1153 public function getUniquePrivateRoomTitle($title) {
1154 global $ilDB;
1155
1156 $query = 'SELECT title FROM ' . self::$privateRoomsTable . ' WHERE parent_id = %s and closed = 0';
1157 $rset = $ilDB->queryF($query, array('integer'), array($this->roomId));
1158
1159 $titles = array();
1160
1161 while($row = $ilDB->fetchAssoc($rset)) {
1162 $titles[] = $row['title'];
1163 }
1164
1165 $suffix = '';
1166 $i = 0;
1167 do {
1168 if(!in_array($title . $suffix, $titles)) {
1169 $title .= $suffix;
1170 break;
1171 }
1172
1173 ++$i;
1174
1175 $suffix = ' (' . $i . ')';
1176 } while(true);
1177
1178 return $title;
1179 }
1180
1181 public static function findDeletablePrivateRooms() {
1182 global $ilDB;
1183
1184 $query = '
1185 SELECT private_rooms.proom_id id, MIN(disconnected) min_disconnected, MAX(disconnected) max_disconnected
1186 FROM ' . self::$privateSessionsTable . ' private_sessions
1187 INNER JOIN '.self::$privateRoomsTable.' private_rooms
1188 ON private_sessions.proom_id = private_rooms.proom_id
1189 WHERE closed = 0
1190 GROUP BY private_rooms.proom_id
1191 HAVING MIN(disconnected) > 0 AND MAX(disconnected) < %s';
1192 $rset = $ilDB->queryF(
1193 $query,
1194 array('integer'),
1195 array(time() + 60 * 5)
1196 );
1197
1198 $rooms = array();
1199
1200 while ($row = $ilDB->fetchAssoc($rset)) {
1201 $rooms[$row['id']] = $row['id'];
1202 }
1203
1204 $query = 'SELECT DISTINCT proom_id, room_id, object_id FROM ' . self::$privateRoomsTable
1205 . ' INNER JOIN ' . self::$settingsTable . ' ON parent_id = room_id '
1206 . ' WHERE ' . $ilDB->in('proom_id', $rooms, false, 'integer');
1207
1208 $rset = $ilDB->query($query);
1209 $rooms = array();
1210 while($row = $ilDB->fetchAssoc($rset)) {
1211 $rooms[] = array(
1212 'proom_id' => $row['proom_id'],
1213 'room_id' => $row['room_id'],
1214 'object_id' => $row['object_id']
1215 );
1216 }
1217
1218 return $rooms;
1219 }
1220
1229 public function getAllRooms($user_id)
1230 {
1234 global $ilDB;
1235
1236 $query = "
1237 SELECT room_id, od.title
1238 FROM object_data od
1239
1240 INNER JOIN " . self::$settingsTable . "
1241 ON object_id = od.obj_id
1242
1243 INNER JOIN " . self::$privateRoomsTable . " prt
1244 ON prt.owner = %s
1245
1246 WHERE od.type = 'chtr'
1247 ";
1248
1249 $types = array('integer');
1250 $values = array($user_id);
1251
1252 $res = $ilDB->queryF($query, $types, $values);
1253
1254 $rooms = array();
1255
1256 while($row = $ilDB->fetchAssoc($res))
1257 {
1258 $room_id = $row['room_id'];
1259 $rooms[$room_id] = $row['title'];
1260 }
1261
1262 return $rooms;
1263 }
1264
1265
1266
1267 public function getPrivateSubRooms($parent_room, $user_id)
1268 {
1269 global $ilDB;
1270
1271 $query = "
1272 SELECT proom_id, parent_id
1273 FROM chatroom_prooms
1274 WHERE parent_id = %s
1275 AND owner = %s
1276 AND closed = 0
1277 ";
1278
1279 $types = array( 'integer', 'integer' );
1280 $values = array( $parent_room, $user_id );
1281
1282 $res = $ilDB->queryF( $query, $types, $values );
1283
1284 $priv_rooms = array();
1285
1286 while( $row = $ilDB->fetchAssoc( $res ) )
1287 {
1288 $proom_id = $row['proom_id'];
1289 $priv_rooms[$proom_id] = $row['parent_id'];
1290 }
1291
1292 return $priv_rooms;
1293 }
1294
1302 public function getRefIdByRoomId($room_id)
1303 {
1304 global $ilDB;
1305
1306 $query = "
1307 SELECT objr.ref_id
1308 FROM object_reference objr
1309
1310 INNER JOIN chatroom_settings cs
1311 ON cs.object_id = objr.obj_id
1312
1313 INNER JOIN object_data od
1314 ON od.obj_id = cs.object_id
1315
1316 WHERE cs.room_id = %s
1317 ";
1318
1319 $types = array( 'integer' );
1320 $values = array( $room_id );
1321
1322 $res = $ilDB->queryF( $query, $types, $values );
1323
1324 $row = $ilDB->fetchAssoc( $res );
1325
1326 return $row['ref_id'];
1327 }
1328
1329public function getLastMessages($number, $chatuser = null) {
1330 global $ilDB;
1331
1332 // There is currently no way to check if a message is private or not
1333 // by sql. So we fetch twice as much as we need and hope that there
1334 // are not more than $number private messages.
1335 $ilDB->setLimit($number * 2);
1336 $rset = $ilDB->queryF('SELECT * FROM ' . self::$historyTable . ' WHERE room_id = %s AND sub_room = 0 ORDER BY timestamp DESC', array('integer'), array($this->roomId));
1337
1338 $result_count = 0;
1339 $results = array();
1340 while(($row = $ilDB->fetchAssoc($rset)) && $result_count < $number) {
1341 $tmp = json_decode($row['message']);
1342 if ($chatuser !== null && $tmp->public == 0 && $tmp->recipients) {
1343 if (in_array($chatuser->getUserId(), explode(',',$tmp->recipients))) {
1344 $results[] = $tmp;
1345 ++$result_count;
1346 }
1347 }
1348 else if ($tmp->public == 1) {
1349 $results[] = $tmp;
1350 ++$result_count;
1351 }
1352
1353 }
1354 return $results;
1355 }
1356
1357 public function getLastMessagesForChatViewer($number, $chatuser = null)
1358 {
1362 global $ilDB;
1363
1364 $ilDB->setLimit($number);
1365 $rset = $ilDB->query(
1366 'SELECT *
1367 FROM ' . self::$historyTable . '
1368 WHERE room_id = '.$ilDB->quote($this->roomId, 'integer').'
1369 AND sub_room = 0
1370 AND (
1371 (' . $ilDB->like('message', 'text', '%"type":"message"%') . ' AND ' . $ilDB->like('message', 'text', '%"public":1%') . ' AND ' . $ilDB->like('message', 'text', '%"recipients":null%') . ')
1372 OR
1373 ' . $ilDB->like('message', 'text', '%"type":"%connected"%') . ')
1374 ORDER BY timestamp DESC'
1375 );
1376
1377 $results = array();
1378 while(($row = $ilDB->fetchAssoc($rset)))
1379 {
1380 $tmp = json_decode($row['message']);
1381 if($tmp->type != 'message' && $row['timestamp'] && !is_numeric($tmp->timestamp))
1382 {
1383 $tmp->timestamp = $row['timestamp'] * 1000;
1384 }
1385 $results[] = $tmp;
1386 }
1387 return $results;
1388 }
1389
1390 public function clearMessages($sub_room) {
1391 global $ilDB;
1392
1393 $ilDB->queryF(
1394 'DELETE FROM ' . self::$historyTable . ' WHERE room_id = %s AND sub_room = %s',
1395 array('integer', 'integer'),
1396 array($this->roomId, (int)$sub_room)
1397 );
1398
1399 if ($sub_room) {
1400 $ilDB->queryF(
1401 'DELETE FROM ' . self::$privateSessionsTable . ' WHERE proom_id = %s AND disconnected < %s',
1402 array('integer', 'integer'),
1403 array($sub_room, time())
1404 );
1405 }
1406 else {
1407 $ilDB->queryF(
1408 'DELETE FROM ' . self::$sessionTable . ' WHERE room_id = %s AND disconnected < %s',
1409 array('integer', 'integer'),
1410 array($this->roomId, time())
1411 );
1412 }
1413 }
1414
1415 public static function getUntrashedChatReferences($filter = array())
1416 {
1420 global $ilDB;
1421
1422 // Check for parent because of an invalid parent node for the old public chat (thx @ jposselt ;-)).
1423 // We cannot find this old public chat and clean this automatically
1424 $query = '
1425 SELECT od.obj_id, od.title, ore.ref_id, od.type, odp.title parent_title
1426 FROM object_data od
1427 INNER JOIN object_reference ore ON ore.obj_id = od.obj_id
1428 INNER JOIN tree t ON t.child = ore.ref_id
1429 INNER JOIN tree p ON p.child = t.parent
1430 INNER JOIN object_reference orep ON orep.ref_id = p.child
1431 INNER JOIN object_data odp ON odp.obj_id = orep.obj_id
1432 INNER JOIN object_reference pre ON pre.ref_id = t.parent
1433 INNER JOIN object_data pod ON pod.obj_id = pre.obj_id
1434 ';
1435
1436 if(isset($filter['last_activity']))
1437 {
1438 $threshold = $ilDB->quote($filter['last_activity'], 'integer');
1439 $query .= "
1440 INNER JOIN chatroom_settings ON chatroom_settings.object_id = od.obj_id
1441 INNER JOIN chatroom_history ON chatroom_history.room_id = chatroom_settings.room_id AND chatroom_history.timestamp > $threshold
1442 ";
1443 }
1444
1445 $query .= '
1446 WHERE od.type = %s AND t.tree > 0 AND ore.deleted IS NULL
1447 GROUP BY od.obj_id, od.title, ore.ref_id, od.type, odp.title
1448 ORDER BY od.title
1449 ';
1450 $res = $ilDB->queryF($query, array('text'), array('chtr'));
1451
1452 $chats = array();
1453 while($row = $ilDB->fetchAssoc($res))
1454 {
1455 $chats[] = $row;
1456 }
1457
1458 return $chats;
1459 }
1460}
1461
1462?>
$result
$filename
Definition: buildRTE.php:89
$comment
Definition: buildRTE.php:83
Class ilChatroomUser.
getUserId()
Returns Ilias User ID.
getUsername()
Returns username from Object or SESSION.
Class ilChatroom.
getBannedUsers()
Returns an multidimensional array containing userdata from users having an entry in banTable with mat...
getPrivateRoomSessions(ilDateTime $from=null, ilDateTime $to=null, $user_id=0, $room_id=0)
phpTypeToMDBType($type)
inviteUserToPrivateRoomByLogin($login, $proom_id)
addHistoryEntry($message, $recipient=null, $publicMessage=true)
Inserts entry into historyTable.
isSubscribed($chat_userid)
Returns true if entry exists in userTable matching given $chat_userid and $this->roomId.
getRefIdByRoomId($room_id)
Returns ref_id of given room_id.
saveFileUploadToDb($user_id, $filename, $type)
Saves information about file uploads in DB.
initialize(array $rowdata)
Sets $this->roomId by given array $rowdata and calls setSetting method foreach available setting in $...
isUserBanned($user_id)
Returns true if there's an entry in banTable matching roomId and given $user_id.
static $uploadTable
static $privateRoomsTable
getHistory(ilDateTime $from=null, ilDateTime $to=null, $restricted_session_userid=null, $proom_id=0)
Returns array containing history data selected from historyTable by given ilDateTime,...
addPrivateRoom($title, ilChatroomUser $owner, $settings)
static $sessionTable
saveSettings(array $settings)
Saves settings into settingsTable using given settings array.
static lookupPrivateRoomTitle($proom_id)
disconnectAllUsersFromAllRooms()
Deletes all entrys from userTable.
static findDeletablePrivateRooms()
isOwnerOfPrivateRoom($user_id, $proom_id)
static checkPermissionsOfUser($usr_id, $permissions, $ref_id)
Checks user permissions in question for a given user id in relation to a given ref_id.
static byObjectId($object_id)
Returns ilChatroom object by given $object_id.
banUser($user_id, $comment='')
Inserts user into banTable, using given $user_id.
getConnectedUsers()
Returns an array of connected users.
static byRoomId($room_id, $initObject=false)
Returns ilChatroom by given $room_id.
clearMessages($sub_room)
save()
Saves settings using $this->settings.
static $historyTable
userIsInPrivateRoom($room_id, $user_id)
static checkUserPermissions($permissions, $ref_id, $send_info=true)
Checks user permissions by given array and ref_id.
disconnectUsers(array $userIds)
Disconnects users by deleting userdata from userTable using given userId array.
getActivePrivateRooms($userid)
subscribeUserToPrivateRoom($room_id, $user_id)
getChatURL($gui, $scope_id=0)
@global ilCtrl $ilCtrl
listUsersInPrivateRoom($private_room_id)
getLastMessages($number, $chatuser=null)
static $privateRoomsAccessTable
setSetting($name, $value)
Sets given name and value as setting into $this->settings array.
getRoomId()
Returns roomID from $this->roomId.
unsubscribeUserFromPrivateRoom($room_id, $user_id)
@global ilDB $ilDB
getUniquePrivateRoomTitle($title)
getPrivateSubRooms($parent_room, $user_id)
disconnectUser($user_id)
Creates userId array by given $user object and calls disconnectUsers method.
unbanUser($user_id)
Deletes entry from banTable matching roomId and given $user_id and returns true if sucessful.
getSettings()
Returns $this->settings array.
getSetting($name)
Returns setting from $this->settings array by given name.
static $settingsTable
getSessions(ilChatroomUser $user)
Returns all session from user.
static $privateSessionsTable
isAllowedToEnterPrivateRoom($chat_userid, $proom_id)
getLastSession(ilChatroomUser $user)
Returns last session from user.
@classDescription Date and time handling
Describes a notification and provides methods for publishing this notification.
static _lookupId($a_user_str)
lookup id by login
getInstanceByObjId($a_obj_id, $stop_on_error=true)
get an instance of an Ilias object by object id
static sendFailure($a_info="", $a_keep=false)
Send Failure Message to Screen.
global $lng
Definition: privfeed.php:40
$ref_id
Definition: sahs_server.php:39
$results
global $ilDB
global $ilUser
Definition: imgupload.php:15