19 declare(strict_types=1);
34 public static function install():
void 41 $ilDB = $DIC->database();
43 if (!
$ilDB->tableExists(
'chatroom_settings')) {
45 'room_id' => [
'type' =>
'integer',
'length' => 4,
'notnull' =>
true],
46 'object_id' => [
'type' =>
'integer',
'length' => 4,
'notnull' =>
false,
'default' => 0],
47 'room_type' => [
'type' =>
'text',
'length' => 20,
'notnull' =>
true],
48 'allow_anonymous' => [
'type' =>
'integer',
'length' => 1,
'notnull' =>
false,
'default' => 0],
49 'allow_custom_usernames' => [
'type' =>
'integer',
'length' => 1,
'notnull' =>
false,
'default' => 0],
50 'enable_history' => [
'type' =>
'integer',
'length' => 1,
'notnull' =>
false,
'default' => 0],
51 'restrict_history' => [
'type' =>
'integer',
'length' => 1,
'notnull' =>
false,
'default' => 0],
52 'autogen_usernames' => [
'type' =>
'text',
'length' => 50,
'notnull' =>
false,
'default' =>
'Anonymous #'],
53 'allow_private_rooms' => [
'type' =>
'integer',
'length' => 1,
'notnull' =>
false,
'default' => 0],
56 $ilDB->createTable(
'chatroom_settings', $fields);
57 $ilDB->addPrimaryKey(
'chatroom_settings', [
'room_id']);
58 $ilDB->createSequence(
'chatroom_settings');
61 if (!
$ilDB->tableExists(
'chatroom_users')) {
63 'room_id' => [
'type' =>
'integer',
'length' => 4,
'notnull' =>
true],
64 'user_id' => [
'type' =>
'integer',
'length' => 4,
'notnull' =>
true],
65 'userdata' => [
'type' =>
'text',
'length' => 4000,
'notnull' =>
true],
66 'connected' => [
'type' =>
'integer',
'length' => 4,
'notnull' =>
true],
68 $ilDB->createTable(
'chatroom_users', $fields);
69 $ilDB->addPrimaryKey(
'chatroom_users', [
'room_id',
'user_id']);
72 if (!
$ilDB->tableExists(
'chatroom_sessions')) {
74 'room_id' => [
'type' =>
'integer',
'length' => 4,
'notnull' =>
true],
75 'user_id' => [
'type' =>
'integer',
'length' => 4,
'notnull' =>
true],
76 'userdata' => [
'type' =>
'text',
'length' => 4000,
'notnull' =>
true],
77 'connected' => [
'type' =>
'integer',
'length' => 4,
'notnull' =>
true],
78 'disconnected' => [
'type' =>
'integer',
'length' => 4,
'notnull' =>
true],
80 $ilDB->createTable(
'chatroom_sessions', $fields);
83 if (!
$ilDB->tableExists(
'chatroom_history')) {
85 'room_id' => [
'type' =>
'integer',
'length' => 4,
'notnull' =>
true],
86 'message' => [
'type' =>
'text',
'length' => 4000,
'notnull' =>
true],
87 'timestamp' => [
'type' =>
'integer',
'length' => 4,
'notnull' =>
true],
89 $ilDB->createTable(
'chatroom_history', $fields);
92 if (!
$ilDB->tableExists(
'chatroom_bans')) {
94 'room_id' => [
'type' =>
'integer',
'length' => 4,
'notnull' =>
true],
95 'user_id' => [
'type' =>
'integer',
'length' => 4,
'notnull' =>
true],
96 'timestamp' => [
'type' =>
'integer',
'length' => 4,
'notnull' =>
true],
97 'remark' => [
'type' =>
'text',
'length' => 1000,
'notnull' =>
false],
99 $ilDB->createTable(
'chatroom_bans', $fields);
102 if (!
$ilDB->tableExists(
'chatroom_admconfig')) {
104 'instance_id' => [
'type' =>
'integer',
'length' => 4,
'notnull' =>
true],
105 'server_settings' => [
'type' =>
'text',
'length' => 2000,
'notnull' =>
true],
106 'default_config' => [
'type' =>
'integer',
'length' => 1,
'notnull' =>
true,
'default' => 0],
108 $ilDB->createTable(
'chatroom_admconfig', $fields);
109 $ilDB->addPrimaryKey(
'chatroom_admconfig', [
'instance_id']);
110 $ilDB->createSequence(
'chatroom_admconfig');
113 if (!
$ilDB->tableExists(
'chatroom_prooms')) {
115 'proom_id' => [
'type' =>
'integer',
'length' => 4,
'notnull' =>
true],
116 'parent_id' => [
'type' =>
'text',
'length' => 2000,
'notnull' =>
true],
117 'title' => [
'type' =>
'text',
'length' => 200,
'notnull' =>
true,
'default' => 0],
118 'owner' => [
'type' =>
'integer',
'length' => 4,
'notnull' =>
true,
'default' => 0],
119 'created' => [
'type' =>
'integer',
'length' => 4,
'notnull' =>
true,
'default' => 0],
120 'closed' => [
'type' =>
'integer',
'length' => 4,
'notnull' =>
false,
'default' => 0],
122 $ilDB->createTable(
'chatroom_prooms', $fields);
123 $ilDB->addPrimaryKey(
'chatroom_prooms', [
'proom_id']);
124 $ilDB->createSequence(
'chatroom_prooms');
127 if (!
$ilDB->tableExists(
'chatroom_psessions')) {
129 'proom_id' => [
'type' =>
'integer',
'length' => 4,
'notnull' =>
true],
130 'user_id' => [
'type' =>
'integer',
'length' => 4,
'notnull' =>
true],
131 'connected' => [
'type' =>
'integer',
'length' => 4,
'notnull' =>
true],
132 'disconnected' => [
'type' =>
'integer',
'length' => 4,
'notnull' =>
true],
134 $ilDB->createTable(
'chatroom_psessions', $fields);
137 if (!
$ilDB->tableExists(
'chatroom_uploads')) {
139 'upload_id' => [
'type' =>
'integer',
'length' => 4,
'notnull' =>
true],
140 'room_id' => [
'type' =>
'integer',
'length' => 4,
'notnull' =>
true],
141 'user_id' => [
'type' =>
'integer',
'length' => 4,
'notnull' =>
true],
142 'filename' => [
'type' =>
'text',
'length' => 200,
'notnull' =>
true],
143 'filetype' => [
'type' =>
'text',
'length' => 200,
'notnull' =>
true],
144 'timestamp' => [
'type' =>
'integer',
'length' => 4,
'notnull' =>
true]
146 $ilDB->createTable(
'chatroom_uploads', $fields);
147 $ilDB->addPrimaryKey(
'chatroom_uploads', [
'upload_id']);
148 $ilDB->createSequence(
'chatroom_uploads');
151 if (!
$ilDB->tableColumnExists(
'chatroom_prooms',
'is_public')) {
152 $ilDB->addTableColumn(
'chatroom_prooms',
'is_public', [
'type' =>
'integer',
'default' => 1,
'length' => 1]);
155 if (!
$ilDB->tableExists(
'chatroom_psessions')) {
157 'proom_id' => [
'type' =>
'integer',
'length' => 4,
'notnull' =>
true],
158 'user_id' => [
'type' =>
'integer',
'length' => 4,
'notnull' =>
true],
159 'connected' => [
'type' =>
'integer',
'length' => 4,
'notnull' =>
true],
160 'disconnected' => [
'type' =>
'integer',
'length' => 4,
'notnull' =>
true],
162 $ilDB->createTable(
'chatroom_psessions', $fields);
165 if (!
$ilDB->tableExists(
'chatroom_proomaccess')) {
167 'proom_id' => [
'type' =>
'integer',
'length' => 4,
'notnull' =>
true],
168 'user_id' => [
'type' =>
'integer',
'length' => 4,
'notnull' =>
true],
170 $ilDB->createTable(
'chatroom_proomaccess', $fields);
173 if (!
$ilDB->tableColumnExists(
'chatroom_admconfig',
'client_settings')) {
174 $ilDB->addTableColumn(
175 "chatroom_admconfig",
185 if (!
$ilDB->tableExists(
'chatroom_smilies')) {
191 'smiley_keywords' => [
201 $ilDB->createTable(
'chatroom_smilies', $fields);
202 $ilDB->addPrimaryKey(
'chatroom_smilies', [
'smiley_id']);
203 $ilDB->createSequence(
'chatroom_smilies');
206 self::registerObject();
207 self::registerAdminObject();
208 self::removeOldChatEntries();
209 self::convertChatObjects();
211 $notificationSettings =
new ilSetting(
'notifications');
212 $notificationSettings->set(
'enable_osd',
'1');
219 public static function registerObject():
void 224 $ilDB = $DIC->database();
228 $query =
'SELECT obj_id FROM object_data ' .
229 'WHERE type = ' .
$ilDB->quote(
'typ',
'text') .
' ' .
230 'AND title = ' .
$ilDB->quote(
'chtr',
'text');
232 $typ_id =
$ilDB->nextId(
'object_data');
236 'obj_id' => [
'integer', $typ_id],
237 'type' => [
'text',
'typ'],
238 'title' => [
'text',
'chtr'],
239 'description' => [
'text',
'Chatroom Object'],
240 'owner' => [
'integer', -1],
241 'create_date' => [
'timestamp', date(
'Y-m-d H:i:s')],
242 'last_update' => [
'timestamp', date(
'Y-m-d H:i:s')]
248 foreach ([1, 2, 3, 4] as $ops_id) {
249 $query =
"INSERT INTO rbac_ta (typ_id, ops_id) VALUES ( " .
250 $ilDB->quote($typ_id,
'integer') .
"," .
$ilDB->quote($ops_id,
'integer') .
")";
255 if ($moderatePermissionId = self::getModeratorPermissionId()) {
257 $typ_id = (
int) $object_definition_row[
'obj_id'];
262 'DELETE FROM rbac_ta WHERE typ_id = %s AND ops_id = %s',
263 [
'integer',
'integer'],
264 [$typ_id, $moderatePermissionId]
270 'typ_id' => [
'integer', $typ_id],
271 'ops_id' => [
'integer', $moderatePermissionId],
278 private static function getModeratorPermissionId():
int 283 $ilDB = $DIC->database();
285 $rset =
$ilDB->queryF(
286 'SELECT ops_id FROM rbac_operations WHERE operation = %s',
290 if ($row =
$ilDB->fetchAssoc($rset)) {
291 return (
int) $row[
'ops_id'];
301 public static function registerAdminObject():
void 306 $ilDB = $DIC->database();
308 $query =
'SELECT * FROM object_data WHERE type = ' .
$ilDB->quote(
'chta',
'text');
310 $obj_id =
$ilDB->nextId(
'object_data');
314 'obj_id' => [
'integer', $obj_id],
315 'type' => [
'text',
'chta'],
316 'title' => [
'text',
'Chatroom Admin'],
317 'description' => [
'text',
'Chatroom General Settings'],
318 'owner' => [
'integer', -1],
319 'create_date' => [
'timestamp', date(
'Y-m-d H:i:s')],
320 'last_update' => [
'timestamp', date(
'Y-m-d H:i:s')]
326 INSERT INTO object_reference (ref_id, obj_id) VALUES(" .
327 $ilDB->quote(
$ref_id,
'integer') .
", " .
$ilDB->quote($obj_id,
'integer') .
")";
335 public static function removeOldChatEntries():
void 340 $ilDB = $DIC->database();
343 'SELECT object_data.obj_id, ref_id, lft, rgt 345 INNER JOIN object_reference ON object_reference.obj_id = object_data.obj_id 346 INNER JOIN tree ON child = ref_id 356 INNER JOIN object_reference ON ref_id = child 357 INNER JOIN object_data ON object_data.obj_id = object_reference.obj_id 358 WHERE lft BETWEEN %s AND %s',
359 [
'integer',
'integer'],
364 'DELETE FROM object_data WHERE obj_id = ' .
$ilDB->quote($row[
'obj_id'],
'integer')
368 'DELETE FROM object_reference WHERE ref_id = ' .
$ilDB->quote($row[
'ref_id'],
'integer')
371 $ilDB->manipulate(
'DELETE FROM tree WHERE child = ' .
$ilDB->quote($row[
'ref_id'],
'integer'));
375 $ilDB->manipulateF(
'DELETE FROM object_data WHERE type = %s AND title = %s', [
'text',
'text'], [
'typ',
'chat']);
376 $ilDB->manipulateF(
'DELETE FROM object_data WHERE type = %s AND title = %s', [
'text',
'text'], [
'typ',
'chac']);
382 public static function convertChatObjects():
void 387 $ilDB = $DIC->database();
390 'SELECT obj_id FROM object_data WHERE type = %s',
398 $obj_ids[] = (
int) $row[
'obj_id'];
402 'UPDATE object_data SET type = %s WHERE type = %s',
407 self::setChatroomSettings($obj_ids);
416 foreach ($obj_ids as $obj_id) {
418 $room->saveSettings([
419 'object_id' => $obj_id,
420 'autogen_usernames' =>
'Autogen #',
421 'room_type' =>
'repository' 426 public static function createDefaultPublicRoom(
bool $force =
false):
void 431 $ilDB = $DIC->database();
434 $query =
'DELETE FROM chatroom_settings WHERE room_type = ' .
$ilDB->quote(
'default',
'text');
438 $query =
'SELECT * FROM chatroom_settings WHERE room_type = ' .
$ilDB->quote(
'default',
'text');
440 $create = !
$ilDB->fetchAssoc($rset);
444 SELECT object_data.obj_id, object_reference.ref_id 446 INNER JOIN object_reference ON object_reference.obj_id = object_data.obj_id 447 WHERE type = " .
$ilDB->quote(
'chta',
'text');
449 $row =
$ilDB->fetchAssoc($rset);
450 $chatfolder_ref_id = (
int) $row[
'ref_id'];
454 $newObj->setType(
'chtr');
455 $newObj->setTitle(
'Public Chat');
456 $newObj->setDescription(
'');
458 $newObj->createReference();
459 $newObj->putInTree($chatfolder_ref_id);
460 $newObj->setPermissions($chatfolder_ref_id);
462 $obj_id = $newObj->getId();
465 $id =
$ilDB->nextId(
'chatroom_settings');
469 'room_id' => [
'integer',
$id],
470 'object_id' => [
'integer', $obj_id],
471 'room_type' => [
'text',
'default'],
472 'allow_anonymous' => [
'integer', 0],
473 'allow_custom_usernames' => [
'integer', 0],
474 'enable_history' => [
'integer', 0],
475 'restrict_history' => [
'integer', 0],
476 'autogen_usernames' => [
'text',
'Anonymous #'],
477 'allow_private_rooms' => [
'integer', 1],
486 public static function createMissinRoomSettingsForConvertedObjects():
void 491 $ilDB = $DIC->database();
494 'SELECT obj_id FROM object_data LEFT JOIN chatroom_settings ON object_id = obj_id ' .
495 'WHERE type = %s AND room_id IS NULL',
502 $roomsToFix[] = (
int) $row[
'obj_id'];
505 self::setChatroomSettings($roomsToFix);
511 public static function ensureCorrectPublicChatroomTreeLocation(
int $ref_id):
void 516 $tree = $DIC->repositoryTree();
518 $ilDB = $DIC->database();
520 $rbacadmin = $DIC->rbac()->admin();
522 $ilDB->setLimit(1, 0);
524 SELECT object_data.obj_id, object_reference.ref_id 526 INNER JOIN object_reference ON object_reference.obj_id = object_data.obj_id 527 WHERE type = ' .
$ilDB->quote(
'chta',
'text');
529 $row =
$ilDB->fetchAssoc($rset);
530 $chatfolder_ref_id = (
int) $row[
'ref_id'];
531 $pid = (
int) $tree->getParentId($ref_id);
534 $chatfolder_ref_id &&
535 $pid !== $chatfolder_ref_id &&
536 !$tree->isDeleted($chatfolder_ref_id)
538 $tree->moveTree($ref_id, $chatfolder_ref_id);
539 $rbacadmin->adjustMovedObjectPermissions($ref_id, $pid);
static _adjustMovedObjectConditions(int $a_ref_id)
In the moment it is not allowed to create preconditions on objects that are located outside of a cour...
$id
plugin.php for ilComponentBuildPluginInfoObjectiveTest::testAddPlugins
static setChatroomSettings(array $obj_ids)
Sets autogen_usernames default option for chatrooms.
Class ilChatroomInstaller.