18         public static function install()
 
   25                 if(!$ilDB->tableExists(
'chatroom_settings'))
 
   28                                 'room_id'                => array(
'type' => 
'integer', 
'length' => 4, 
'notnull' => 
true),
 
   29                                 'object_id'              => array(
'type' => 
'integer', 
'length' => 4, 
'notnull' => 
false, 
'default' => 0),
 
   30                                 'room_type'              => array(
'type' => 
'text', 
'length' => 20, 
'notnull' => 
true),
 
   31                                 'allow_anonymous'        => array(
'type' => 
'integer', 
'length' => 1, 
'notnull' => 
false, 
'default' => 0),
 
   32                                 'allow_custom_usernames' => array(
'type' => 
'integer', 
'length' => 1, 
'notnull' => 
false, 
'default' => 0),
 
   33                                 'enable_history'         => array(
'type' => 
'integer', 
'length' => 1, 
'notnull' => 
false, 
'default' => 0),
 
   34                                 'restrict_history'       => array(
'type' => 
'integer', 
'length' => 1, 
'notnull' => 
false, 
'default' => 0),
 
   35                                 'autogen_usernames'      => array(
'type' => 
'text', 
'length' => 50, 
'notnull' => 
false, 
'default' => 
'Anonymous #'),
 
   36                                 'allow_private_rooms'    => array(
'type' => 
'integer', 
'length' => 1, 
'notnull' => 
false, 
'default' => 0),
 
   39                         $ilDB->createTable(
'chatroom_settings', $fields);
 
   40                         $ilDB->addPrimaryKey(
'chatroom_settings', array(
'room_id'));
 
   41                         $ilDB->createSequence(
'chatroom_settings');
 
   44                 if(!$ilDB->tableExists(
'chatroom_users'))
 
   47                                 'room_id'   => array(
'type' => 
'integer', 
'length' => 4, 
'notnull' => 
true),
 
   48                                 'user_id'   => array(
'type' => 
'integer', 
'length' => 4, 
'notnull' => 
true),
 
   49                                 'userdata'  => array(
'type' => 
'text', 
'length' => 4000, 
'notnull' => 
true),
 
   50                                 'connected' => array(
'type' => 
'integer', 
'length' => 4, 
'notnull' => 
true),
 
   52                         $ilDB->createTable(
'chatroom_users', $fields);
 
   53                         $ilDB->addPrimaryKey(
'chatroom_users', array(
'room_id', 
'user_id'));
 
   56                 if(!$ilDB->tableExists(
'chatroom_sessions'))
 
   59                                 'room_id'      => array(
'type' => 
'integer', 
'length' => 4, 
'notnull' => 
true),
 
   60                                 'user_id'      => array(
'type' => 
'integer', 
'length' => 4, 
'notnull' => 
true),
 
   61                                 'userdata'     => array(
'type' => 
'text', 
'length' => 4000, 
'notnull' => 
true),
 
   62                                 'connected'    => array(
'type' => 
'integer', 
'length' => 4, 
'notnull' => 
true),
 
   63                                 'disconnected' => array(
'type' => 
'integer', 
'length' => 4, 
'notnull' => 
true),
 
   65                         $ilDB->createTable(
'chatroom_sessions', $fields);
 
   68                 if(!$ilDB->tableExists(
'chatroom_history'))
 
   71                                 'room_id'   => array(
'type' => 
'integer', 
'length' => 4, 
'notnull' => 
true),
 
   72                                 'message'   => array(
'type' => 
'text', 
'length' => 4000, 
'notnull' => 
true),
 
   73                                 'timestamp' => array(
'type' => 
'integer', 
'length' => 4, 
'notnull' => 
true),
 
   75                         $ilDB->createTable(
'chatroom_history', $fields);
 
   78                 if(!$ilDB->tableExists(
'chatroom_bans'))
 
   81                                 'room_id'   => array(
'type' => 
'integer', 
'length' => 4, 
'notnull' => 
true),
 
   82                                 'user_id'   => array(
'type' => 
'integer', 
'length' => 4, 
'notnull' => 
true),
 
   83                                 'timestamp' => array(
'type' => 
'integer', 
'length' => 4, 
'notnull' => 
true),
 
   84                                 'remark'    => array(
'type' => 
'text', 
'length' => 1000, 
'notnull' => 
false),
 
   86                         $ilDB->createTable(
'chatroom_bans', $fields);
 
   89                 if(!$ilDB->tableExists(
'chatroom_admconfig'))
 
   92                                 'instance_id'     => array(
'type' => 
'integer', 
'length' => 4, 
'notnull' => 
true),
 
   93                                 'server_settings' => array(
'type' => 
'text', 
'length' => 2000, 
'notnull' => 
true),
 
   94                                 'default_config'  => array(
'type' => 
'integer', 
'length' => 1, 
'notnull' => 
true, 
'default' => 0),
 
   96                         $ilDB->createTable(
'chatroom_admconfig', $fields);
 
   97                         $ilDB->addPrimaryKey(
'chatroom_admconfig', array(
'instance_id'));
 
   98                         $ilDB->createSequence(
'chatroom_admconfig');
 
  101                 if(!$ilDB->tableExists(
'chatroom_prooms'))
 
  104                                 'proom_id'  => array(
'type' => 
'integer', 
'length' => 4, 
'notnull' => 
true),
 
  105                                 'parent_id' => array(
'type' => 
'text', 
'length' => 2000, 
'notnull' => 
true),
 
  106                                 'title'     => array(
'type' => 
'text', 
'length' => 200, 
'notnull' => 
true, 
'default' => 0),
 
  107                                 'owner'     => array(
'type' => 
'integer', 
'length' => 4, 
'notnull' => 
true, 
'default' => 0),
 
  108                                 'created'   => array(
'type' => 
'integer', 
'length' => 4, 
'notnull' => 
true, 
'default' => 0),
 
  109                                 'closed'    => array(
'type' => 
'integer', 
'length' => 4, 
'notnull' => 
false, 
'default' => 0),
 
  111                         $ilDB->createTable(
'chatroom_prooms', $fields);
 
  112                         $ilDB->addPrimaryKey(
'chatroom_prooms', array(
'proom_id'));
 
  113                         $ilDB->createSequence(
'chatroom_prooms');
 
  116                 if(!$ilDB->tableExists(
'chatroom_psessions'))
 
  119                                 'proom_id'     => array(
'type' => 
'integer', 
'length' => 4, 
'notnull' => 
true),
 
  120                                 'user_id'      => array(
'type' => 
'integer', 
'length' => 4, 
'notnull' => 
true),
 
  121                                 'connected'    => array(
'type' => 
'integer', 
'length' => 4, 
'notnull' => 
true),
 
  122                                 'disconnected' => array(
'type' => 
'integer', 
'length' => 4, 
'notnull' => 
true),
 
  124                         $ilDB->createTable(
'chatroom_psessions', $fields);
 
  127                 if(!$ilDB->tableExists(
'chatroom_uploads'))
 
  130                                 'upload_id'    => array(
'type' => 
'integer', 
'length' => 4, 
'notnull' => 
true),
 
  131                                 'room_id'      => array(
'type' => 
'integer', 
'length' => 4, 
'notnull' => 
true),
 
  132                                 'user_id'      => array(
'type' => 
'integer', 
'length' => 4, 
'notnull' => 
true),
 
  133                                 'filename'     => array(
'type' => 
'text', 
'length' => 200, 
'notnull' => 
true),
 
  134                                 'filetype'     => array(
'type' => 
'text', 
'length' => 200, 
'notnull' => 
true),
 
  135                                 'timestamp'    => array(
'type' => 
'integer', 
'length' => 4, 
'notnull' => 
true)
 
  137                         $ilDB->createTable(
'chatroom_uploads', $fields);
 
  138                         $ilDB->addPrimaryKey(
'chatroom_uploads', array(
'upload_id'));
 
  139                         $ilDB->createSequence(
'chatroom_uploads');
 
  142                 if(!$ilDB->tableColumnExists(
'chatroom_prooms', 
'is_public'))
 
  144                         $ilDB->addTableColumn(
'chatroom_prooms', 
'is_public', array(
'type' => 
'integer', 
'default' => 1, 
'length' => 1));
 
  147                 if(!$ilDB->tableExists(
'chatroom_psessions'))
 
  150                                 'proom_id'     => array(
'type' => 
'integer', 
'length' => 4, 
'notnull' => 
true),
 
  151                                 'user_id'      => array(
'type' => 
'integer', 
'length' => 4, 
'notnull' => 
true),
 
  152                                 'connected'    => array(
'type' => 
'integer', 
'length' => 4, 
'notnull' => 
true),
 
  153                                 'disconnected' => array(
'type' => 
'integer', 
'length' => 4, 
'notnull' => 
true),
 
  155                         $ilDB->createTable(
'chatroom_psessions', $fields);
 
  158                 if(!$ilDB->tableExists(
'chatroom_proomaccess'))
 
  161                                 'proom_id' => array(
'type' => 
'integer', 
'length' => 4, 
'notnull' => 
true),
 
  162                                 'user_id'  => array(
'type' => 
'integer', 
'length' => 4, 
'notnull' => 
true),
 
  164                         $ilDB->createTable(
'chatroom_proomaccess', $fields);
 
  167                 if(!$ilDB->tableColumnExists(
'chatroom_admconfig', 
'client_settings'))
 
  169                         $ilDB->addTableColumn(
 
  170                                 "chatroom_admconfig", 
"client_settings",
 
  179                 if(!$ilDB->tableExists(
'chatroom_smilies'))
 
  182                                 'smiley_id'       => array(
 
  186                                 'smiley_keywords' => array(
 
  190                                 'smiley_path'     => array(
 
  196                         $ilDB->createTable(
'chatroom_smilies', $fields);
 
  197                         $ilDB->addPrimaryKey(
'chatroom_smilies', array(
'smiley_id'));
 
  198                         $ilDB->createSequence(
'chatroom_smilies');
 
  201                 self::registerObject();
 
  202                 self::registerAdminObject();
 
  203                 self::removeOldChatEntries();
 
  204                 self::convertChatObjects();
 
  207                 $notificationSettings = 
new ilSetting(
'notifications');
 
  208                 $notificationSettings->set(
'enable_osd', 
true);
 
  211         public static function removeOldChatEntries()
 
  218                 $res = $ilDB->queryF(
 
  219                         'SELECT object_data.obj_id, ref_id, lft, rgt 
  221             INNER JOIN object_reference ON object_reference.obj_id = object_data.obj_id 
  222                         INNER JOIN tree ON child = ref_id 
  228                 $data = $ilDB->fetchAssoc(
$res);
 
  231                         $res = $ilDB->queryF(
'SELECT * FROM tree 
  232                                                                   INNER JOIN object_reference ON ref_id = child 
  233                                                                   INNER JOIN object_data ON object_data.obj_id = object_reference.obj_id  
  234                                                                   WHERE lft BETWEEN %s AND %s', array(
'integer', 
'integer'), array($data[
'lft'], $data[
'rgt']));
 
  235                         while(
$row = $ilDB->fetchAssoc(
$res))
 
  240                                         WHERE obj_id = ' . $ilDB->quote(
$row[
'obj_id'], 
'integer')
 
  245                                         FROM object_reference 
  246                                         WHERE ref_id = ' . $ilDB->quote(
$row[
'ref_id'], 
'integer')
 
  252                                         WHERE child = ' . $ilDB->quote(
$row[
'ref_id'], 
'integer')
 
  257                 $ilDB->manipulateF(
'DELETE FROM object_data WHERE type = %s AND title = %s', array(
'text', 
'text'), array(
'typ', 
'chat'));
 
  258                 $ilDB->manipulateF(
'DELETE FROM object_data WHERE type = %s AND title = %s', array(
'text', 
'text'), array(
'typ', 
'chac'));
 
  261         public static function createDefaultPublicRoom($force = 
false)
 
  270                         $query = 
'DELETE FROM chatroom_settings WHERE room_type = ' . $ilDB->quote(
'default', 
'text');
 
  271                         $ilDB->manipulate(
$query);
 
  276                         $query  = 
'SELECT * FROM chatroom_settings WHERE room_type = ' . $ilDB->quote(
'default', 
'text');
 
  277                         $rset   = $ilDB->query(
$query);
 
  278                         $create = !$ilDB->fetchAssoc($rset);
 
  283                                 SELECT object_data.obj_id, object_reference.ref_id 
  285                                 INNER JOIN object_reference ON object_reference.obj_id = object_data.obj_id 
  286                                 WHERE type = " . $ilDB->quote(
'chta', 
'text');
 
  287                         $rset              = $ilDB->query(
$query);
 
  288                         $row               = $ilDB->fetchAssoc($rset);
 
  289                         $chatfolder_ref_id = 
$row[
'ref_id'];
 
  291                         require_once 
'Modules/Chatroom/classes/class.ilObjChatroom.php';
 
  294                         $newObj->setType(
'chtr');
 
  295                         $newObj->setTitle(
'Public Chat');
 
  296                         $newObj->setDescription(
'');
 
  298                         $newObj->createReference();
 
  299                         $newObj->putInTree($chatfolder_ref_id);
 
  300                         $newObj->setPermissions($chatfolder_ref_id);
 
  302                         $obj_id = $newObj->getId();
 
  305                         $id = $ilDB->nextId(
'chatroom_settings');
 
  309                                         'room_id'                => array(
'integer', $id),
 
  310                                         'object_id'              => array(
'integer', $obj_id),
 
  311                                         'room_type'              => array(
'text', 
'default'),
 
  312                                         'allow_anonymous'        => array(
'integer', 0),
 
  313                                         'allow_custom_usernames' => array(
'integer', 0),
 
  314                                         'enable_history'         => array(
'integer', 0),
 
  315                                         'restrict_history'       => array(
'integer', 0),
 
  316                                         'autogen_usernames'      => array(
'text', 
'Anonymous #'),
 
  317                                         'allow_private_rooms'    => array(
'integer', 1),
 
  322                         $settings->set(
'public_room_ref', 
$ref_id);
 
  330         public static function registerObject()
 
  339                 $query = 
'SELECT obj_id FROM object_data ' .
 
  340                         'WHERE type = ' . $ilDB->quote(
'typ', 
'text') . 
' ' .
 
  341                         'AND title = ' . $ilDB->quote(
'chtr', 
'text');
 
  342                 if(!($object_definition_row = $ilDB->fetchAssoc($ilDB->query(
$query))))
 
  344                         $typ_id = $ilDB->nextId(
'object_data');
 
  348                                         'obj_id'                => array(
'integer', $typ_id),
 
  349                                         'type'                  => array(
'text', 
'typ'),
 
  350                                         'title'                 => array(
'text', 
'chtr'),
 
  351                                         'description'           => array(
'text', 
'Chatroom Object'),
 
  352                                         'owner'                 => array(
'integer', -1),
 
  353                                         'create_date'           => array(
'timestamp', date(
'Y-m-d H:i:s')),
 
  354                                         'last_update'           => array(
'timestamp', date(
'Y-m-d H:i:s'))
 
  360                         foreach(array(1, 2, 3, 4) as $ops_id)
 
  362                                 $query = 
"INSERT INTO rbac_ta (typ_id, ops_id) VALUES ( " .
 
  363                                         $ilDB->quote($typ_id, 
'integer') . 
"," . $ilDB->quote($ops_id, 
'integer') .
 
  365                                 $ilDB->manipulate(
$query);
 
  369                 if($moderatePermissionId = self::getModeratorPermissionId())
 
  373                                 $typ_id = $object_definition_row[
'obj_id'];
 
  379                                         'DELETE FROM rbac_ta WHERE typ_id = %s AND ops_id = %s',
 
  380                                         array(
'integer', 
'integer'),
 
  381                                         array($typ_id, $moderatePermissionId)
 
  387                                                 'typ_id' => array(
'integer', $typ_id),
 
  388                                                 'ops_id' => array(
'integer', $moderatePermissionId),
 
  395         private static function getModeratorPermissionId()
 
  402                 $rset = $ilDB->queryF(
 
  403                         'SELECT ops_id FROM rbac_operations WHERE operation = %s',
 
  407                 if(
$row = $ilDB->fetchAssoc($rset))
 
  409                         return $row[
'ops_id'];
 
  418         public static function registerAdminObject()
 
  425                 $query = 
'SELECT * FROM object_data WHERE type = ' . $ilDB->quote(
'chta', 
'text');
 
  426                 if(!$ilDB->fetchAssoc($ilDB->query(
$query)))
 
  428                         $obj_id = $ilDB->nextId(
'object_data');
 
  432                                         'obj_id'                => array(
'integer', $obj_id),
 
  433                                         'type'                  => array(
'text', 
'chta'),
 
  434                                         'title'                 => array(
'text', 
'Chatroom Admin'),
 
  435                                         'description'           => array(
'text', 
'Chatroom General Settings'),
 
  436                                         'owner'                 => array(
'integer', -1),
 
  437                                         'create_date'           => array(
'timestamp', date(
'Y-m-d H:i:s')),
 
  438                                         'last_update'           => array(
'timestamp', date(
'Y-m-d H:i:s'))
 
  442                         $ref_id = $ilDB->nextId(
'object_reference');
 
  443                         $query  = 
"INSERT INTO object_reference (ref_id, obj_id) VALUES(" . $ilDB->quote(
$ref_id, 
'integer') . 
", " . $ilDB->quote($obj_id, 
'integer') . 
")";
 
  444                         $ilDB->manipulate(
$query);
 
  446                         $tree = 
new ilTree(ROOT_FOLDER_ID);
 
  447                         $tree->insertNode(
$ref_id, SYSTEM_FOLDER_ID);
 
  457                 if(is_array($obj_ids))
 
  459                         foreach($obj_ids as $obj_id)
 
  462                                 $room->saveSettings(array(
 
  463                                         'object_id'                => $obj_id,
 
  464                                         'autogen_usernames'        => 
'Autogen #',
 
  465                                         'room_type'                => 
'repository' 
  474         public static function convertChatObjects()
 
  481                 $res = $ilDB->queryF(
 
  491                 while(
$row = $ilDB->fetchAssoc(
$res))
 
  493                         $obj_ids[] = 
$row[
'obj_id'];
 
  500                         array(
'text', 
'text'),
 
  501                         array(
'chtr', 
'chat')
 
  507         public static function createMissinRoomSettingsForConvertedObjects()
 
  514                 $res = $ilDB->queryF(
 
  515                         "SELECT obj_id FROM object_data 
  516                                 LEFT JOIN chatroom_settings ON object_id = obj_id 
  518                                 AND room_id IS NULL",
 
  523                 $roomsToFix = array();
 
  524                 while(
$row = $ilDB->fetchAssoc(
$res))
 
  526                         $roomsToFix[] = 
$row[
'obj_id'];
 
  535         public static function ensureCorrectPublicChatroomTreeLocation(
$ref_id)
 
  542                 global $tree, $ilDB, $rbacadmin;
 
  546                         SELECT object_data.obj_id, object_reference.ref_id 
  548                         INNER JOIN object_reference ON object_reference.obj_id = object_data.obj_id 
  549                         WHERE type = " . $ilDB->quote(
'chta', 
'text');
 
  550                 $rset              = $ilDB->query(
$query);
 
  551                 $row               = $ilDB->fetchAssoc($rset);
 
  552                 $chatfolder_ref_id = 
$row[
'ref_id'];
 
  553                 $pid               = $tree->getParentId(
$ref_id);
 
  556                         $chatfolder_ref_id &&
 
  557                         $pid != $chatfolder_ref_id &&
 
  558                         !$tree->isDeleted($chatfolder_ref_id)
 
  561                         $tree->moveTree(
$ref_id, $chatfolder_ref_id);
 
  562                         $rbacadmin->adjustMovedObjectPermissions(
$ref_id, $pid);
 
  563                         include_once(
'./Services/AccessControl/classes/class.ilConditionHandler.php');