54b650c3a493768cf5f1ad57c3fc784cfcfdc8a5
[atutor.git] / docs / mods / _standard / chat / lib / chat.inc.php
1 <?php
2 /****************************************************************/
3 /* ATutor                                                                                                               */
4 /****************************************************************/
5 /* Copyright (c) 2002-2010                                      */
6 /* Inclusive Design Institute                                   */
7 /* http://atutor.ca                                                                                             */
8 /*                                                              */
9 /* This program is free software. You can redistribute it and/or*/
10 /* modify it under the terms of the GNU General Public License  */
11 /* as published by the Free Software Foundation.                                */
12 /****************************************************************/
13
14 function getAdminSettings() {
15         if (!file_exists(AT_CONTENT_DIR . 'chat/'.$_SESSION['course_id'].'/admin.settings')) {
16                 return 0;
17         }
18
19         $admin = array();
20
21         $file_prefs = file(AT_CONTENT_DIR . 'chat/'.$_SESSION['course_id'].'/admin.settings');
22         foreach ($file_prefs as $pref) {
23                 $pref = explode('=', $pref, 2);
24                 $admin[$pref[0]] = trim($pref[1]);
25         }
26
27     if ($admin['returnT'] && $admin['returnL']) {
28         $admin['returnLink'] = '<a href="'.$admin['returnL'].'">'.$admin['returnT'].'</a>';
29     } else {
30         $admin['returnLink'] = '';
31     }
32
33         return $admin;
34 }
35
36 require('chat_defaults.inc.php');
37 $admin = getAdminSettings();
38 if ($admin === 0) {
39         $admin = defaultAdminSettings();
40 }
41
42 function postMessage($chatID, $message, &$topMsgNum, &$bottomMsgNum) {
43         global $admin;
44
45         $topMsgNum++;
46         if (!is_dir(AT_CONTENT_DIR . 'chat/'.$_SESSION['course_id'].'/msgs')) {
47                 @mkdir(AT_CONTENT_DIR . 'chat/'.$_SESSION['course_id'].'/msgs');
48         }
49         $fp = @fopen(AT_CONTENT_DIR . 'chat/'.$_SESSION['course_id'].'/msgs/'.$topMsgNum.'.message', 'w+');
50         if (!$fp) {
51                 // error
52                 return 0;
53         }
54
55         flock($fp, LOCK_EX);
56         if (!@fwrite($fp, $chatID."\n".$message."\n")) {
57                 return 0;
58         }
59         flock($fp, LOCK_UN);
60         fclose($fp);
61         chmod(AT_CONTENT_DIR . 'chat/'.$_SESSION['course_id'].'/msgs/'.$topMsgNum.'.message', 0600);
62
63         /* the transcript: */
64     if ($admin['produceTran'] > 0) {
65                 global $myPrefs;
66                 $message = htmlspecialchars($message);
67         $colourT = getChatIDColour($chatID,  'whiteBlack');
68         printToTran('<tr><td valign="top"><span style="color: '.$colourT.';">'.stripslashes($chatID).'</span></td><td><span style="color: '.$colourT.';">'.stripslashes($message).'</span></td></tr>');
69     }
70 }
71
72 function printToTran($message) {
73         global $admin;
74         $fp = fopen(AT_CONTENT_DIR . 'chat/'.$_SESSION['course_id'].'/tran/'.$admin['tranFile'], 'a');
75         if ($fp) {
76                 fwrite($fp, $message."\n");
77         }else{
78                 echo "nope";
79                 exit;
80         }
81         @fclose($fp);
82 }
83
84 function howManyMessages(&$topMsgNum, &$bottomMsgNum) {
85     $topMsgNum = 0;
86     $bottomMsgNum = 0;
87         
88         if ($dir = @opendir(AT_CONTENT_DIR . 'chat/'.$_SESSION['course_id'].'/msgs/')) {
89                 while (($file = readdir($dir)) !== false) {
90                         if (($file == '..') || ($file == '.')) {
91                                 continue;
92                         }
93                         $tempNum = substr($file, 0, -strlen('.message'));
94                         if ($tempNum > $topMsgNum) {
95                                 $topMsgNum = $tempNum;
96                         }
97                         if (($tempNum < $bottomMsgNum) || ($bottomMsgNum == 0)) {
98                                 $bottomMsgNum = $tempNum;
99                         }
100                 }  
101                 closedir($dir);
102         }
103 }
104
105
106
107 function getChatIDColour($chatID, $colours) {
108     $refNumT1 = strlen($chatID);
109     $char2T = substr($chatID, -1);
110     $refNumT2 = letterToNumber($char2T);
111         $char3T = substr($chatID, -2, 1);
112     $refNumT3 = letterToNumber($char3T);
113         $colourStr = '#';
114
115         if (($colours == 'blackYellow')
116                         || ($colours == 'blueWhite')
117                         || ($colours == 'blackWhite'))
118         {
119                 if ($refNumT1%3 == 0) { 
120                         $colourStr .= 'ff';
121                 } else if ($refNumT1%3 == 1) { 
122                         $colourStr .= 'cc';
123                 } else { 
124                         $colourStr .= '99';
125                 }
126
127                 if ($refNumT2%3 == 0) { 
128                         $colourStr .= 'ff';
129                 } else if ($refNumT2%3 == 1) { 
130                         $colourStr .= 'cc';
131                 } else { 
132                         $colourStr .= '99'; 
133                 }
134
135                 if ($refNumT3%3 == 0) { 
136                         $colourStr .= 'ff';
137                 } else if ($refNumT3%3 == 1) { 
138                         $colourStr .= 'cc';
139                 } else { 
140                    $colourStr .= '99';
141                 }
142         } else {
143                 if ($refNumT1%3 == 0) { 
144                         $colourStr .= '00';
145                 } else if ($refNumT1%3 == 1) { 
146                         $colourStr .= '33';
147                 } else { 
148                         $colourStr .= '66';
149                 }
150                 if ($refNumT2%3 == 0) { 
151                         $colourStr .= '00';
152                 } else if ($refNumT2%3 == 1) { 
153                         $colourStr .= '33';
154                 } else { 
155                         $colourStr .= '66'; 
156                 }
157                 if ($refNumT3%3 == 0) { 
158                         $colourStr .= '00';
159                 } else if ($refNumT3%3 == 1) {
160                         $colourStr .= '33';
161                 } else { 
162                         $colourStr .= '66';
163                 }
164     }
165     return $colourStr;
166 }
167
168 function letterToNumber($letter) {
169         $letter = strtolower($letter);
170
171     if ($letter == '0') { return 0; }
172     if ($letter == '1') { return 1; }
173     if ($letter == '2') { return 2; }
174     if ($letter == '3') { return 3; }
175     if ($letter == '4') { return 4; }
176     if ($letter == '5') { return 5; }
177     if ($letter == '6') { return 6; }
178     if ($letter == '7') { return 7; }
179     if ($letter == '8') { return 8; }
180     if ($letter == '9') { return 9; }
181     if ($letter == 'b') { return 10; }
182     if ($letter == 'c') { return 11; }
183     if ($letter == 'd') { return 12; }
184     if ($letter == 'e') { return 13; }
185     if ($letter == 'f') { return 14; }
186     if ($letter == 'g') { return 15; }
187     if ($letter == 'h') { return 16; }
188     if ($letter == 'i') { return 17; }
189     if ($letter == 'j') { return 18; }
190     if ($letter == 'k') { return 19; }
191     if ($letter == 'l') { return 20; }
192     if ($letter == 'm') { return 21; }
193     if ($letter == 'n') { return 22; }
194     if ($letter == 'o') { return 23; }
195     if ($letter == 'p') { return 24; }
196     if ($letter == 'q') { return 25; }
197     if ($letter == 'r') { return 26; }
198     if ($letter == 's') { return 27; }
199     if ($letter == 't') { return 28; }
200     if ($letter == 'u') { return 30; }
201     if ($letter == 'v') { return 31; }
202     if ($letter == 'w') { return 32; }
203     if ($letter == 'x') { return 33; }
204     if ($letter == 'y') { return 34; }
205     if ($letter == 'z') { return 35; }
206
207     return 36;
208 }
209
210
211 function printStylesheet($prefs) {
212     $h3SizeT = $prefs['fontSize'] + 4;
213     $h4SizeT = $prefs['fontSize'] + 2;
214
215         print "<style type=\"text/css\"><!--
216     BODY { margin: 5; }
217     TD { font-family: $prefs[fontFace]; font-size: $prefs[fontSize]; }
218     LI { font-family: $prefs[fontFace]; font-size: $prefs[fontSize]; }
219     UL { margin-left: 40; margin-right: 40; margin-top: 5; margin-bottom: 5; }
220     H3 { font-size: $h3SizeT; margin: 0; font-family: $prefs[fontFace]; }
221     H4 { font-size: $h4SizeT; margin: 0; font-family: $prefs[fontFace]; }
222     B { font-size: $h4SizeT; }
223     A { font-size: $prefs[fontSize]; font-weight: bold; color: $prefs[front]; text-decoration: underline; }
224     A:hover { font-size: $prefs[fontSize]; font-weight: bold; background-color: $prefs[darkBack]; text-decoration: underline; }
225     P { margin-left: 0; margin-right: 0; margin-top: 0; margin-bottom: 10; padding-left: 20; padding-right: 20; padding-top: 5; padding-bottom: 10; font-family: $prefs[fontFamily]; font-size: $prefs[fontSize]; }
226     P.light { background-color: $prefs[lightBack]; font-family: $prefs[fontFace]; font-size: $prefs[fontSize]; }
227     FORM { margin-left: 0; margin-right: 0; margin-top: 10; margin-bottom: 10; }
228     --></style>\n";
229 }
230
231 function getLastAccessed($chatID) {
232         $tempPrefs = getPrefs($chatID, false);
233         return $tempPrefs['lastAccessed'];
234 }
235
236 function &defaultAdminSettings() {
237         $admin = array();
238
239     //$admin['cgiURL'] = 'http://dev.atutor.ca/chat/';
240     //$admin['htmlDir'] = '/usr/webserver/content/snow/chat/';
241     //$admin['htmlURL'] = 'http://dev.atutor.ca/discussions/achat/';
242     $admin['msgLifeSpan']               = 1800;         /* 30 min  */
243     $admin['chatIDLifeSpan']    = 2678400;      /* 1 month */
244     $admin['chatSessionLifeSpan'] = 3600;       /* 1 hour  */
245     //$admin['chatName'] = 'Accessible Chat';
246     //$admin['chatIDListFlag'] = 0;
247    // $admin['returnL'] = 'http://dev.atutor.ca';
248     //$admin['returnT'] = 'Return to the ATRC';
249     //$admin['adminPass'] = 'temppass';
250
251         return $admin;
252 }
253 /*
254 function getAdminSettings() {
255         if (!file_exists('admin.settings')) {
256                 return 0;
257         }
258
259         $admin = array();
260
261         $file_prefs = file('admin.settings');
262         foreach ($file_prefs as $pref) {
263                 $pref = explode('=', $pref, 2);
264                 $admin[$pref[0]] = trim($pref[1]);
265         }
266
267     if ($admin['returnT'] && $admin['returnL']) {
268         $admin['returnLink'] = '<a href="'.$admin['returnL'].'">'.$admin['returnT'].'</a>';
269     } else {
270         $admin['returnLink'] = '';
271     }
272
273         return $admin;
274 }
275 */
276 function resetLastAccessed($chatID) {
277         $tempPrefs = getPrefs($chatID);
278         $tempPrefs['lastAccessed'] = 0;
279         writePrefs($tempPrefs, $chatID);
280
281         /*
282     open(LA,">$cgiDIR"."users/$tempChatID.la") || &printError("resetLastAccessed","$!");
283     flock(LA,2);
284     print LA "0\n";
285     close(LA);
286     chmod (0666, "$cgiDIR"."users/$tempChatID.la");
287         */
288 }
289
290
291
292 function cleanUp() {
293         global $admin;
294     $msgLifeSpan                        = $admin['msgLifeSpan'];
295     $chatSessionLifeSpan        = $admin['chatSessionLifeSpan'];
296     $chatIDLifeSpan                     = $admin['chatIDLifeSpan'];
297
298         $now = time();
299
300         if (!$msgLifeSpan || !$chatSessionLifeSpan || !$chatIDLifeSpan) {
301         echo 'Nope, something missing: '.$msgLifeSpan.', '.$chatSessionLifeSpan.', '.$chatIDLifeSpan.'<br />';
302     } else {
303                 /* Clean up messages */
304                 if ($dir = @opendir(AT_CONTENT_DIR . 'chat/'.$_SESSION['course_id'].'/msgs/')) {
305                         while (($file = readdir($dir)) !== false) {
306                                 if (substr($file, -strlen('.message')) == '.message') {
307                                         $info = @stat(AT_CONTENT_DIR . 'chat/'.$_SESSION['course_id'].'/msgs/'.$file);
308                                         if ($now - $info['mtime'] > $msgLifeSpan) {
309                                                 unlink(AT_CONTENT_DIR . 'chat/'.$_SESSION['course_id'].'/msgs/'.$file);
310                                         }
311                                 }
312                         }
313                 }
314
315                 /* Clean up inactive users (doesn't delete the users, just logs them out) */
316                 if ($dir = @opendir(AT_CONTENT_DIR . 'chat/'.$_SESSION['course_id'].'/users/')) {
317                         while (($file = readdir($dir)) !== false) {
318                                 if (substr($file, -strlen('.prefs')) == '.prefs') {
319                                         $chatName = substr($file, 0, -strlen('.prefs'));
320                                         $la     = getLastAccessed($chatName);
321                                         if ($now - $la > $chatSessionLifeSpan && $la > 0) {
322                                                 postMessage('system',
323                                                         'User '.$chatName.' has been logged out due to inactivity.',
324                                                         $topMsgNum,
325                                                         $bottomMsgNum);
326                                                 resetLastAccessed($chatName);
327
328                                         }
329                                 }
330                         }
331                 }
332         }
333 }
334
335
336 /* @See ./history.php */
337 function getLower20Bound($topNum, $bottomMsgNum) {
338     for ($i = $topNum; ($i-$bottomMsgNum)%20 !=0; $i--) { ; }
339     return $i;
340 }
341
342
343 function showMessage($msgNum, &$prefs) {
344         if (file_exists(AT_CONTENT_DIR . 'chat/'.$_SESSION['course_id'].'/msgs/'.$msgNum.'.message')) {
345                 $msg = file(AT_CONTENT_DIR . 'chat/'.$_SESSION['course_id'].'/msgs/'.$msgNum.'.message');
346
347                 $sender = trim($msg[0]);
348                 $msg = stripslashes(htmlspecialchars(trim($msg[1])));
349         $colour = getChatIDColour($sender, $prefs['colours']);
350         
351         if ($msgNum > $prefs['lastRead']) {
352             echo '<tr><td width="75" class="row1" align="right"><b><span style="color: '.$colour.';">'.stripslashes($sender).'</span></b>:</td><td class="row1"><b><span style="color: '.$colour.';">'.$msg.'</span></b></td></tr>';
353         } else {
354             echo '<tr><td width="75" class="row1" align="right"><span style="color: '.$colour.';">'.stripslashes($sender).'</span>:</td><td class="row1"><span style="color: '.$colour.';">'.$msg.'</span></td></tr>';
355         }
356         }
357
358 }
359
360
361 /* @See ./filterHistory.php */
362 function showMessageFiltered($msgNum, &$prefs, $chatID) {
363     if (file_exists(AT_CONTENT_DIR . 'chat/'.$_SESSION['course_id'].'/msgs/'.$msgNum.'.message')) {
364                 $msg = file(AT_CONTENT_DIR . 'chat/'.$_SESSION['course_id'].'/msgs/'.$msgNum.'.message');
365
366                 $sender = trim($msg[0]);
367                 $msg = trim($msg[1]);
368
369         if ($sender == $chatID) {
370                 $colour = getChatIDColour($sender, $prefs['colours']);
371                         
372                         if ($msgNum > $prefs['lastRead']) {
373                 echo '<tr><td width="75" class="row1" align="right"><b><span style="color: '.$colour.';">'.stripslashes($sender).' : </span></b></td><td class="row1"><b><span style="color: '.$colour.';">'.stripslashes($msg).'</span></b></td></tr>';
374             } else {
375                 echo '<tr><td width="75" class="row1" align="right"><span style="color: '.$colour.';">'.stripslashes($sender).' : </span></td><td class="row1"><span style="color: '.$colour.';">'.stripslashes($msg).'</span></td></tr>';
376             }
377         }
378     }
379 }
380
381 /* @See ./prefs.php */
382 function getAndWriteFormPrefs(&$prefs) {
383     if (isset($_POST['fontSize'])) { 
384                 $prefs['fontSize'] = $_POST['fontSize'];
385         }
386
387     if (isset($_POST['fontFace'])) { 
388                 $prefs['fontFace'] = $_POST['fontFace'];
389         }
390
391     if (isset($_POST['colours'])) { 
392                 $prefs['colours'] = $_POST['colours'];
393         }
394
395     if (isset($_POST['navigationAidFlag'])) {
396                 $prefs['navigationAidFlag'] = $_POST['navigationAidFlag'];
397         }
398
399     if (isset($_POST['newestFirstFlag'])) { 
400                 $prefs['newestFirstFlag'] = $_POST['newestFirstFlag'];
401         }
402
403     if (isset($_POST['onlyNewFlag'])) { 
404                 $prefs['onlyNewFlag'] = $_POST['onlyNewFlag'];
405         }
406
407     if (isset($_POST['bingFlag'])) { 
408                 $prefs['bingFlag'] = $_POST['bingFlag'];
409         }
410
411     if (isset($_POST['refresh'])) { 
412                 $prefs['refresh'] = $_POST['refresh'];
413         }
414
415         writePrefs($prefs, $_SESSION['login']);
416 }
417
418
419 /* @See ./admin.php */
420 function writeAdminSettings(&$admin) {
421         if (file_exists(AT_CONTENT_DIR . 'chat/'.$_SESSION['course_id'].'/admin.settings')) {
422                 chmod(AT_CONTENT_DIR . 'chat/'.$_SESSION['course_id'].'/admin.settings', 0755);
423         }
424
425         $fp = @fopen(AT_CONTENT_DIR . 'chat/'.$_SESSION['course_id'].'/admin.settings', 'w+');
426         if (!$fp) {
427                 // error
428                 return 0;
429         }
430
431         $settings = '';
432         foreach ($admin as $prefKey => $prefValue) {
433                 $settings .= $prefKey.'='.$prefValue."\n";
434         }
435
436         flock($fp, LOCK_EX);
437         if (!@fwrite($fp, $settings)) {
438                 return 0;
439         }
440         flock($fp, LOCK_UN);
441         chmod(AT_CONTENT_DIR . 'chat/'.$_SESSION['course_id'].'/admin.settings', 0600);
442
443         return 1;
444 }
445
446 function clearOutOldChatPrefs() {
447     /* Clear out old user names */
448         $now = time();
449         $return = '';
450         if ($dir = @opendir(AT_CONTENT_DIR . 'chat/'.$_SESSION['course_id'].'/users/')) {
451                 while (($file = readdir($dir)) !== false) {
452                         if (substr($file, -strlen('.prefs')) == '.prefs') {
453                                 $chatName = substr($file, 0, -strlen('.prefs'));
454                                 $la     = @stat(AT_CONTENT_DIR . 'chat/'.$_SESSION['course_id'].'/users/'.$file);
455                                 $la = $la['mtime'];
456
457                                 if ($admin['chatIDLifeSpan'] && ($now - $la > $admin['chatIDLifeSpan'])) {
458                                         $return .= 'Automated Clean Up: Deleting old Chat ID '.$chatName.'<br />';
459                                         deleteUser($chatName);
460                                 }
461                         }
462                 }
463         }
464
465         return $return;
466 }
467
468 function deleteUser($chatName) {
469     @unlink(AT_CONTENT_DIR . 'chat/'.$_SESSION['course_id'].'/users/'.$chatName.'.prefs');
470
471         /* the bing file */
472     @unlink ('bings/'.$chatName.'.html');
473 }
474
475
476 function makeBingFile($chatName) {
477         global $myPrefs, $admin;
478
479     if (($myPrefs['refresh'] == 'manual' && $myPrefs['bingFlag'] > 0)) {
480
481         $bing = '<html><script language="vbscript">
482                 option explicit
483                 Dim IntervalID
484                 Dim count
485                 count = 0
486
487                 sub loaded
488
489                     IntervalID = Window.setInterval("askServer",5000)
490                 end sub
491
492                 sub changedF2
493                     askServer
494                 end sub
495
496                 sub askServer
497                     Dim objAsp, theFile
498                     set objAsp = CreateObject("Microsoft.XMLHTTP")
499                     objAsp.open "GET", "'.$admin[cgiURL].'bing.php?uselessVar=" + CStr(count) + "&chatID='.$chatName.'", false
500                     objAsp.send()
501                     theFile = objAsp.responsetext
502                     if InStr(theFile,"yes") > 0 then
503                         Player.URL = "chime.wav"
504                     else
505                     end if
506                     count = count + 1
507                     document.f1.f2.value = CStr(count) + theFile
508                     objAsp = 3
509                     theFile = ""
510                 end sub
511
512                 </script>
513                 <body onLoad="loaded" language="vbscript">
514                 <form name=f1><input type=text name=f2 length="200" /></form>
515                 <OBJECT ID="Player" height="0" width="0" CLASSID="CLSID:6BF52A52-394A-11d3-B153-00C04F79FAA6"></OBJECT>
516                 </body>
517                 </html>';    
518
519     } else if ($myPrefs['refresh'] == 'manual' && $myPrefs['bingFlag'] > 0) {
520         print "<html>
521         <body bgcolor=\"$myPrefs[back]\">
522         <applet code='MachineThatGoesBing.class' width='1' height='1'>
523         <param name='chatID' value='$chatName' />
524         <param name='url' value='chime.wav' />
525         </applet></body></html>\n";
526     }
527
528         $fp = @fopen('bings/'.$chatName.'.html', 'w+');
529         if ($fp) {
530                 flock($fp, LOCK_EX);
531                 if (@fwrite($fp, $bing)) {
532                         flock($fp, LOCK_UN);
533                 }
534         }
535         @fclose($fp);
536 }
537
538
539 function securityCheck($uniqueID) {
540         global $myPrefs;
541
542     if ($myPrefs['uniqueID'] == $uniqueID) {
543         return true;
544     }
545     return false;
546 }
547
548 function printError($err1, $err2) {
549     print "An error has occured. Please <a href='./login.php' target='_top'>login again</a><br />\n";
550     print "$err1 <br />\n";
551     print "$err2 <br />\n";
552         exit;
553 }
554
555 ?>