2 /****************************************************************/
4 /****************************************************************/
5 /* Copyright (c) 2002-2010 */
6 /* Inclusive Design Institute */
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 /****************************************************************/
14 function getAdminSettings() {
15 if (!file_exists(AT_CONTENT_DIR . 'chat/'.$_SESSION['course_id'].'/admin.settings')) {
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]);
27 if ($admin['returnT'] && $admin['returnL']) {
28 $admin['returnLink'] = '<a href="'.$admin['returnL'].'">'.$admin['returnT'].'</a>';
30 $admin['returnLink'] = '';
36 require('chat_defaults.inc.php');
37 $admin = getAdminSettings();
39 $admin = defaultAdminSettings();
42 function postMessage($chatID, $message, &$topMsgNum, &$bottomMsgNum) {
46 if (!is_dir(AT_CONTENT_DIR . 'chat/'.$_SESSION['course_id'].'/msgs')) {
47 @mkdir(AT_CONTENT_DIR . 'chat/'.$_SESSION['course_id'].'/msgs');
49 $fp = @fopen(AT_CONTENT_DIR . 'chat/'.$_SESSION['course_id'].'/msgs/'.$topMsgNum.'.message', 'w+');
56 if (!@fwrite($fp, $chatID."\n".$message."\n")) {
61 chmod(AT_CONTENT_DIR . 'chat/'.$_SESSION['course_id'].'/msgs/'.$topMsgNum.'.message', 0600);
64 if ($admin['produceTran'] > 0) {
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>');
72 function printToTran($message) {
74 $fp = fopen(AT_CONTENT_DIR . 'chat/'.$_SESSION['course_id'].'/tran/'.$admin['tranFile'], 'a');
76 fwrite($fp, $message."\n");
84 function howManyMessages(&$topMsgNum, &$bottomMsgNum) {
88 if ($dir = @opendir(AT_CONTENT_DIR . 'chat/'.$_SESSION['course_id'].'/msgs/')) {
89 while (($file = readdir($dir)) !== false) {
90 if (($file == '..') || ($file == '.')) {
93 $tempNum = substr($file, 0, -strlen('.message'));
94 if ($tempNum > $topMsgNum) {
95 $topMsgNum = $tempNum;
97 if (($tempNum < $bottomMsgNum) || ($bottomMsgNum == 0)) {
98 $bottomMsgNum = $tempNum;
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);
115 if (($colours == 'blackYellow')
116 || ($colours == 'blueWhite')
117 || ($colours == 'blackWhite'))
119 if ($refNumT1%3 == 0) {
121 } else if ($refNumT1%3 == 1) {
127 if ($refNumT2%3 == 0) {
129 } else if ($refNumT2%3 == 1) {
135 if ($refNumT3%3 == 0) {
137 } else if ($refNumT3%3 == 1) {
143 if ($refNumT1%3 == 0) {
145 } else if ($refNumT1%3 == 1) {
150 if ($refNumT2%3 == 0) {
152 } else if ($refNumT2%3 == 1) {
157 if ($refNumT3%3 == 0) {
159 } else if ($refNumT3%3 == 1) {
168 function letterToNumber($letter) {
169 $letter = strtolower($letter);
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; }
211 function printStylesheet($prefs) {
212 $h3SizeT = $prefs['fontSize'] + 4;
213 $h4SizeT = $prefs['fontSize'] + 2;
215 print "<style type=\"text/css\"><!--
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; }
231 function getLastAccessed($chatID) {
232 $tempPrefs = getPrefs($chatID, false);
233 return $tempPrefs['lastAccessed'];
236 function &defaultAdminSettings() {
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';
254 function getAdminSettings() {
255 if (!file_exists('admin.settings')) {
261 $file_prefs = file('admin.settings');
262 foreach ($file_prefs as $pref) {
263 $pref = explode('=', $pref, 2);
264 $admin[$pref[0]] = trim($pref[1]);
267 if ($admin['returnT'] && $admin['returnL']) {
268 $admin['returnLink'] = '<a href="'.$admin['returnL'].'">'.$admin['returnT'].'</a>';
270 $admin['returnLink'] = '';
276 function resetLastAccessed($chatID) {
277 $tempPrefs = getPrefs($chatID);
278 $tempPrefs['lastAccessed'] = 0;
279 writePrefs($tempPrefs, $chatID);
282 open(LA,">$cgiDIR"."users/$tempChatID.la") || &printError("resetLastAccessed","$!");
286 chmod (0666, "$cgiDIR"."users/$tempChatID.la");
294 $msgLifeSpan = $admin['msgLifeSpan'];
295 $chatSessionLifeSpan = $admin['chatSessionLifeSpan'];
296 $chatIDLifeSpan = $admin['chatIDLifeSpan'];
300 if (!$msgLifeSpan || !$chatSessionLifeSpan || !$chatIDLifeSpan) {
301 echo 'Nope, something missing: '.$msgLifeSpan.', '.$chatSessionLifeSpan.', '.$chatIDLifeSpan.'<br />';
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);
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.',
326 resetLastAccessed($chatName);
336 /* @See ./history.php */
337 function getLower20Bound($topNum, $bottomMsgNum) {
338 for ($i = $topNum; ($i-$bottomMsgNum)%20 !=0; $i--) { ; }
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');
347 $sender = trim($msg[0]);
348 $msg = stripslashes(htmlspecialchars(trim($msg[1])));
349 $colour = getChatIDColour($sender, $prefs['colours']);
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>';
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>';
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');
366 $sender = trim($msg[0]);
367 $msg = trim($msg[1]);
369 if ($sender == $chatID) {
370 $colour = getChatIDColour($sender, $prefs['colours']);
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>';
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>';
381 /* @See ./prefs.php */
382 function getAndWriteFormPrefs(&$prefs) {
383 if (isset($_POST['fontSize'])) {
384 $prefs['fontSize'] = $_POST['fontSize'];
387 if (isset($_POST['fontFace'])) {
388 $prefs['fontFace'] = $_POST['fontFace'];
391 if (isset($_POST['colours'])) {
392 $prefs['colours'] = $_POST['colours'];
395 if (isset($_POST['navigationAidFlag'])) {
396 $prefs['navigationAidFlag'] = $_POST['navigationAidFlag'];
399 if (isset($_POST['newestFirstFlag'])) {
400 $prefs['newestFirstFlag'] = $_POST['newestFirstFlag'];
403 if (isset($_POST['onlyNewFlag'])) {
404 $prefs['onlyNewFlag'] = $_POST['onlyNewFlag'];
407 if (isset($_POST['bingFlag'])) {
408 $prefs['bingFlag'] = $_POST['bingFlag'];
411 if (isset($_POST['refresh'])) {
412 $prefs['refresh'] = $_POST['refresh'];
415 writePrefs($prefs, $_SESSION['login']);
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);
425 $fp = @fopen(AT_CONTENT_DIR . 'chat/'.$_SESSION['course_id'].'/admin.settings', 'w+');
432 foreach ($admin as $prefKey => $prefValue) {
433 $settings .= $prefKey.'='.$prefValue."\n";
437 if (!@fwrite($fp, $settings)) {
441 chmod(AT_CONTENT_DIR . 'chat/'.$_SESSION['course_id'].'/admin.settings', 0600);
446 function clearOutOldChatPrefs() {
447 /* Clear out old user names */
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);
457 if ($admin['chatIDLifeSpan'] && ($now - $la > $admin['chatIDLifeSpan'])) {
458 $return .= 'Automated Clean Up: Deleting old Chat ID '.$chatName.'<br />';
459 deleteUser($chatName);
468 function deleteUser($chatName) {
469 @unlink(AT_CONTENT_DIR . 'chat/'.$_SESSION['course_id'].'/users/'.$chatName.'.prefs');
472 @unlink ('bings/'.$chatName.'.html');
476 function makeBingFile($chatName) {
477 global $myPrefs, $admin;
479 if (($myPrefs['refresh'] == 'manual' && $myPrefs['bingFlag'] > 0)) {
481 $bing = '<html><script language="vbscript">
489 IntervalID = Window.setInterval("askServer",5000)
498 set objAsp = CreateObject("Microsoft.XMLHTTP")
499 objAsp.open "GET", "'.$admin[cgiURL].'bing.php?uselessVar=" + CStr(count) + "&chatID='.$chatName.'", false
501 theFile = objAsp.responsetext
502 if InStr(theFile,"yes") > 0 then
503 Player.URL = "chime.wav"
507 document.f1.f2.value = CStr(count) + theFile
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>
519 } else if ($myPrefs['refresh'] == 'manual' && $myPrefs['bingFlag'] > 0) {
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";
528 $fp = @fopen('bings/'.$chatName.'.html', 'w+');
531 if (@fwrite($fp, $bing)) {
539 function securityCheck($uniqueID) {
542 if ($myPrefs['uniqueID'] == $uniqueID) {
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";