ILIAS  release_4-3 Revision
 All Data Structures Namespaces Files Functions Variables Groups Pages
class.ilChatroomInstaller.php
Go to the documentation of this file.
1 <?php
2 /* Copyright (c) 1998-2012 ILIAS open source, Extended GPL, see docs/LICENSE */
3 
4 
12 {
18  public static function install()
19  {
23  global $ilDB;
24 
25  if(!$ilDB->tableExists('chatroom_settings'))
26  {
27  $fields = array(
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),
37  );
38 
39  $ilDB->createTable('chatroom_settings', $fields);
40  $ilDB->addPrimaryKey('chatroom_settings', array('room_id'));
41  $ilDB->createSequence('chatroom_settings');
42  }
43 
44  if(!$ilDB->tableExists('chatroom_users'))
45  {
46  $fields = array(
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),
51  );
52  $ilDB->createTable('chatroom_users', $fields);
53  $ilDB->addPrimaryKey('chatroom_users', array('room_id', 'user_id'));
54  }
55 
56  if(!$ilDB->tableExists('chatroom_sessions'))
57  {
58  $fields = array(
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),
64  );
65  $ilDB->createTable('chatroom_sessions', $fields);
66  }
67 
68  if(!$ilDB->tableExists('chatroom_history'))
69  {
70  $fields = array(
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),
74  );
75  $ilDB->createTable('chatroom_history', $fields);
76  }
77 
78  if(!$ilDB->tableExists('chatroom_bans'))
79  {
80  $fields = array(
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),
85  );
86  $ilDB->createTable('chatroom_bans', $fields);
87  }
88 
89  if(!$ilDB->tableExists('chatroom_admconfig'))
90  {
91  $fields = array(
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),
95  );
96  $ilDB->createTable('chatroom_admconfig', $fields);
97  $ilDB->addPrimaryKey('chatroom_admconfig', array('instance_id'));
98  $ilDB->createSequence('chatroom_admconfig');
99  }
100 
101  if(!$ilDB->tableExists('chatroom_prooms'))
102  {
103  $fields = array(
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),
110  );
111  $ilDB->createTable('chatroom_prooms', $fields);
112  $ilDB->addPrimaryKey('chatroom_prooms', array('proom_id'));
113  $ilDB->createSequence('chatroom_prooms');
114  }
115 
116  if(!$ilDB->tableExists('chatroom_psessions'))
117  {
118  $fields = array(
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),
123  );
124  $ilDB->createTable('chatroom_psessions', $fields);
125  }
126 
127  if(!$ilDB->tableExists('chatroom_uploads'))
128  {
129  $fields = array(
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)
136  );
137  $ilDB->createTable('chatroom_uploads', $fields);
138  $ilDB->addPrimaryKey('chatroom_uploads', array('upload_id'));
139  $ilDB->createSequence('chatroom_uploads');
140  }
141 
142  if(!$ilDB->tableColumnExists('chatroom_prooms', 'is_public'))
143  {
144  $ilDB->addTableColumn('chatroom_prooms', 'is_public', array('type' => 'integer', 'default' => 1, 'length' => 1));
145  }
146 
147  if(!$ilDB->tableExists('chatroom_psessions'))
148  {
149  $fields = array(
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),
154  );
155  $ilDB->createTable('chatroom_psessions', $fields);
156  }
157 
158  if(!$ilDB->tableExists('chatroom_proomaccess'))
159  {
160  $fields = array(
161  'proom_id' => array('type' => 'integer', 'length' => 4, 'notnull' => true),
162  'user_id' => array('type' => 'integer', 'length' => 4, 'notnull' => true),
163  );
164  $ilDB->createTable('chatroom_proomaccess', $fields);
165  }
166 
167  if(!$ilDB->tableColumnExists('chatroom_admconfig', 'client_settings'))
168  {
169  $ilDB->addTableColumn(
170  "chatroom_admconfig", "client_settings",
171  array(
172  "type" => "text",
173  "length" => 1000,
174  "notnull" => true
175  )
176  );
177  }
178 
179  if(!$ilDB->tableExists('chatroom_smilies'))
180  {
181  $fields = array(
182  'smiley_id' => array(
183  'type' => 'integer',
184  'length' => 4,
185  ),
186  'smiley_keywords' => array(
187  'type' => 'text',
188  'length' => 100,
189  ),
190  'smiley_path' => array(
191  'type' => 'text',
192  'length' => 200,
193  )
194  );
195 
196  $ilDB->createTable('chatroom_smilies', $fields);
197  $ilDB->addPrimaryKey('chatroom_smilies', array('smiley_id'));
198  $ilDB->createSequence('chatroom_smilies');
199  }
200 
201  self::registerObject();
202  self::registerAdminObject();
203  //self::createDefaultPublicRoom();
204  self::removeOldChatEntries();
205  self::convertChatObjects();
206 
207 
208  $notificationSettings = new ilSetting('notifications');
209  $notificationSettings->set('enable_osd', true);
210  }
211 
212  public static function removeOldChatEntries()
213  {
217  global $ilDB;
218 
219  $res = $ilDB->queryF(
220  'SELECT object_data.obj_id, ref_id, lft, rgt
221  FROM object_data
222  INNER JOIN object_reference ON object_reference.obj_id = object_data.obj_id
223  INNER JOIN tree ON child = ref_id
224  WHERE type = %s',
225  array('text'),
226  array('chac')
227  );
228 
229  $data = $ilDB->fetchAssoc($res);
230  if($data)
231  {
232  $res = $ilDB->queryF('SELECT * FROM tree
233  INNER JOIN object_reference ON ref_id = child
234  INNER JOIN object_data ON object_data.obj_id = object_reference.obj_id
235  WHERE lft BETWEEN %s AND %s', array('integer', 'integer'), array($data['lft'], $data['rgt']));
236  while($row = $ilDB->fetchAssoc($res))
237  {
238  $ilDB->manipulate(
239  'DELETE
240  FROM object_data
241  WHERE obj_id = ' . $ilDB->quote($row['obj_id'], 'integer')
242  );
243 
244  $ilDB->manipulate(
245  'DELETE
246  FROM object_reference
247  WHERE ref_id = ' . $ilDB->quote($row['ref_id'], 'integer')
248  );
249 
250  $ilDB->manipulate(
251  'DELETE
252  FROM tree
253  WHERE child = ' . $ilDB->quote($row['ref_id'], 'integer')
254  );
255  }
256  }
257 
258  $ilDB->manipulateF('DELETE FROM object_data WHERE type = %s AND title = %s', array('text', 'text'), array('typ', 'chat'));
259  $ilDB->manipulateF('DELETE FROM object_data WHERE type = %s AND title = %s', array('text', 'text'), array('typ', 'chac'));
260  }
261 
262  public static function createDefaultPublicRoom($force = false)
263  {
267  global $ilDB;
268 
269  if($force)
270  {
271  $query = 'DELETE FROM chatroom_settings WHERE room_type = ' . $ilDB->quote('default', 'text');
272  $ilDB->manipulate($query);
273  $create = true;
274  }
275  else
276  {
277  $query = 'SELECT * FROM chatroom_settings WHERE room_type = ' . $ilDB->quote('default', 'text');
278  $rset = $ilDB->query($query);
279  $create = !$ilDB->fetchAssoc($rset);
280  }
281  if($create)
282  {
283  require_once 'Modules/Chatroom/classes/class.ilObjChatroom.php';
284  $newObj = new ilObjChatroom();
285 
286  $newObj->setType('chtr');
287  $newObj->setTitle('Public Chat');
288  $newObj->setDescription('');
289  $newObj->create(); // true for upload
290  $newObj->createReference();
291  $newObj->putInTree(1);
292  $newObj->setPermissions(1);
293 
294  $obj_id = $newObj->getId();
295  $ref_id = $newObj->getRefId();
296 
297  $id = $ilDB->nextId('chatroom_settings');
298  $ilDB->insert(
299  'chatroom_settings',
300  array(
301  'room_id' => array('integer', $id),
302  'object_id' => array('integer', $obj_id),
303  'room_type' => array('text', 'default'),
304  'allow_anonymous' => array('integer', 0),
305  'allow_custom_usernames' => array('integer', 0),
306  'enable_history' => array('integer', 0),
307  'restrict_history' => array('integer', 0),
308  'autogen_usernames' => array('text', 'Anonymous #'),
309  'allow_private_rooms' => array('integer', 1),
310  )
311  );
312 
313  $settings = new ilSetting('chatroom');
314  $settings->set('public_room_ref', $ref_id);
315  }
316  }
317 
322  public static function registerObject()
323  {
327  global $ilDB;
328 
329  $typ_id = null;
330 
331  $query = 'SELECT obj_id FROM object_data ' .
332  'WHERE type = ' . $ilDB->quote('typ', 'text') . ' ' .
333  'AND title = ' . $ilDB->quote('chtr', 'text');
334  if(!($object_definition_row = $ilDB->fetchAssoc($ilDB->query($query))))
335  {
336  $typ_id = $ilDB->nextId('object_data');
337  $ilDB->insert(
338  'object_data',
339  array(
340  'obj_id' => array('integer', $typ_id),
341  'type' => array('text', 'typ'),
342  'title' => array('text', 'chtr'),
343  'description' => array('text', 'Chatroom Object'),
344  'owner' => array('integer', -1),
345  'create_date' => array('timestamp', date('Y-m-d H:i:s')),
346  'last_update' => array('timestamp', date('Y-m-d H:i:s'))
347  )
348  );
349 
350  // REGISTER RBAC OPERATIONS FOR OBJECT TYPE
351  // 1: edit_permissions, 2: visible, 3: read, 4:write
352  foreach(array(1, 2, 3, 4) as $ops_id)
353  {
354  $query = "INSERT INTO rbac_ta (typ_id, ops_id) VALUES ( " .
355  $ilDB->quote($typ_id, 'integer') . "," . $ilDB->quote($ops_id, 'integer') .
356  ")";
357  $ilDB->manipulate($query);
358  }
359  }
360 
361  if($moderatePermissionId = self::getModeratorPermissionId())
362  {
363  if(!$typ_id)
364  {
365  $typ_id = $object_definition_row['obj_id'];
366  }
367 
368  if($typ_id)
369  {
370  $ilDB->manipulateF(
371  'DELETE FROM rbac_ta WHERE typ_id = %s AND ops_id = %s',
372  array('integer', 'integer'),
373  array($typ_id, $moderatePermissionId)
374  );
375 
376  $ilDB->insert(
377  'rbac_ta',
378  array(
379  'typ_id' => array('integer', $typ_id),
380  'ops_id' => array('integer', $moderatePermissionId),
381  )
382  );
383  }
384  }
385  }
386 
387  private static function getModeratorPermissionId()
388  {
392  global $ilDB;
393 
394  $rset = $ilDB->queryF(
395  'SELECT ops_id FROM rbac_operations WHERE operation = %s',
396  array('text'),
397  array('moderate')
398  );
399  if($row = $ilDB->fetchAssoc($rset))
400  {
401  return $row['ops_id'];
402  }
403  return 0;
404  }
405 
410  public static function registerAdminObject()
411  {
415  global $ilDB;
416 
417  $query = 'SELECT * FROM object_data WHERE type = ' . $ilDB->quote('chta', 'text');
418  if(!$ilDB->fetchAssoc($ilDB->query($query)))
419  {
420  $obj_id = $ilDB->nextId('object_data');
421  $ilDB->insert(
422  'object_data',
423  array(
424  'obj_id' => array('integer', $obj_id),
425  'type' => array('text', 'chta'),
426  'title' => array('text', 'Chatroom Admin'),
427  'description' => array('text', 'Chatroom General Settings'),
428  'owner' => array('integer', -1),
429  'create_date' => array('timestamp', date('Y-m-d H:i:s')),
430  'last_update' => array('timestamp', date('Y-m-d H:i:s'))
431  )
432  );
433 
434  $ref_id = $ilDB->nextId('object_reference');
435  $query = "INSERT INTO object_reference (ref_id, obj_id) VALUES(" . $ilDB->quote($ref_id, 'integer') . ", " . $ilDB->quote($obj_id, 'integer') . ")";
436  $ilDB->manipulate($query);
437 
438  $tree = new ilTree(ROOT_FOLDER_ID);
439  $tree->insertNode($ref_id, SYSTEM_FOLDER_ID);
440  }
441  }
442 
447  public static function setChatroomSettings($obj_ids)
448  {
449  if(is_array($obj_ids))
450  {
451  foreach($obj_ids as $obj_id)
452  {
453  $room = new ilChatroom();
454  $room->saveSettings(array(
455  'object_id' => $obj_id,
456  'autogen_usernames' => 'Autogen #',
457  'room_type' => 'repository'
458  ));
459  }
460  }
461  }
462 
466  public static function convertChatObjects()
467  {
471  global $ilDB;
472 
473  $res = $ilDB->queryF(
474  "SELECT obj_id
475  FROM object_data
476  WHERE type = %s",
477  array('text'),
478  array('chat')
479  );
480 
481  $obj_ids = array();
482 
483  while($row = $ilDB->fetchAssoc($res))
484  {
485  $obj_ids[] = $row['obj_id'];
486  }
487 
488  $ilDB->manipulateF(
489  "UPDATE object_data
490  SET type = %s
491  WHERE type = %s",
492  array('text', 'text'),
493  array('chtr', 'chat')
494  );
495 
496  self::setChatroomSettings($obj_ids);
497  }
498 
499  public static function createMissinRoomSettingsForConvertedObjects()
500  {
504  global $ilDB;
505 
506  $res = $ilDB->queryF(
507  "SELECT obj_id FROM object_data
508  LEFT JOIN chatroom_settings ON object_id = obj_id
509  WHERE type = %s
510  AND room_id IS NULL",
511  array('text'),
512  array('chtr')
513  );
514 
515  $roomsToFix = array();
516  while($row = $ilDB->fetchAssoc($res))
517  {
518  $roomsToFix[] = $row['obj_id'];
519  }
520 
521  self::setChatroomSettings($roomsToFix);
522  }
523 }