Latest fixes from Jon ... it's much more stable now!
... the only thing remaining is that the user window is still done old-style, and not yet converted over to the new -style daemon
This commit is contained in:
+208
-100
@@ -67,6 +67,34 @@ class ChatDaemon {
|
||||
|
||||
var $message_queue = array(); // Holds messages that we haven't committed to the DB yet
|
||||
|
||||
function get_user_window($sessionid) {
|
||||
ob_start();
|
||||
echo "<html>\n<head>\n";
|
||||
|
||||
// <head>
|
||||
/*
|
||||
echo "<script type='text/javascript'>\n";
|
||||
echo " function reloadme() {\n";
|
||||
//echo " return false;\n";
|
||||
echo " window.location.reload();\n";
|
||||
echo " }\n";
|
||||
echo "</script>";
|
||||
*/
|
||||
// </head>
|
||||
|
||||
//echo "</head>\n<body onload='window.setTimeout(\"reloadme()\", 2000);'>\n";
|
||||
echo "</head>\n<body>\n";
|
||||
|
||||
// <body>
|
||||
echo '<p style="font-size: 0.75em;">User window for session '.$sessionid.'</p>';
|
||||
echo '<p style="font-size: 0.75em;">The time is '.time().'</p>';
|
||||
// </body>
|
||||
|
||||
echo "</body>\n</html>\n";
|
||||
return ob_get_clean();
|
||||
|
||||
}
|
||||
|
||||
function new_ufo_id() {
|
||||
static $id = 0;
|
||||
if($id++ === 0x1000000) { // Cycling very very slowly to prevent overflow
|
||||
@@ -91,7 +119,8 @@ class ChatDaemon {
|
||||
|
||||
switch($type) {
|
||||
case CHAT_SIDEKICK_USERS:
|
||||
$x = pusers($this->sets_info[$sessionid]['chat'], $this->sets_info[$sessionid]['groupid']);
|
||||
/*
|
||||
//$x = pusers($this->sets_info[$sessionid]['chatid'], $this->sets_info[$sessionid]['groupid']);
|
||||
//$x = "<html>Lalalala! ".time()."</html>";
|
||||
|
||||
$header = "HTTP/1.1 200 OK\n";
|
||||
@@ -102,16 +131,38 @@ class ChatDaemon {
|
||||
$header .= "Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT\n";
|
||||
$header .= "Cache-Control: no-cache, must-revalidate\n";
|
||||
$header .= "Expires: Wed, 4 Oct 1978 09:32:45 GMT\n";
|
||||
$header .= "Refresh: 3; url=http://$CFG->chat_serverhost:$CFG->chat_serverport?win=users&".
|
||||
"chat_sid=".$sessionid."&groupid=".$this->sets_info[$sessionid]['groupid']."\n";
|
||||
//$header .= "Refresh: 3; url=http://$CFG->chat_serverhost:$CFG->chat_serverport?win=users&".
|
||||
// "chat_sid=".$sessionid."&groupid=".$this->sets_info[$sessionid]['groupid']."\n";
|
||||
$header .= "\n";
|
||||
|
||||
$x = $header.$x;
|
||||
*/
|
||||
|
||||
/*
|
||||
trace('Outputting user list('.strlen($x).' chars)');
|
||||
//trace($x);
|
||||
|
||||
chat_socket_write($handle, $x);
|
||||
*/
|
||||
|
||||
$content = $this->get_user_window($sessionid);
|
||||
|
||||
$header = "HTTP/1.1 200 OK\n";
|
||||
$header .= "Connection: close\n";
|
||||
$header .= "Date: ".date('r')."\n";
|
||||
$header .= "Server: Moodle\n";
|
||||
$header .= "Content-Type: text/html\n";
|
||||
$header .= "Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT\n";
|
||||
$header .= "Cache-Control: no-cache, must-revalidate\n";
|
||||
$header .= "Expires: Wed, 4 Oct 1978 09:32:45 GMT\n";
|
||||
$header .= "Content-Length: ".strlen($content)."\n";
|
||||
$header .= "Refresh: 3; url=http://$CFG->chat_serverhost:$CFG->chat_serverport/?win=users&".
|
||||
"chat_sid=".$sessionid."&groupid=".$this->sets_info[$sessionid]['groupid']."\n";
|
||||
$header .= "\n";
|
||||
|
||||
// That's enough headers for one lousy dummy response
|
||||
chat_socket_write($handle, $header . $content);
|
||||
|
||||
break;
|
||||
case CHAT_SIDEKICK_MESSAGE:
|
||||
// Incoming message
|
||||
@@ -128,21 +179,11 @@ class ChatDaemon {
|
||||
break;
|
||||
}
|
||||
|
||||
// Format the message object here
|
||||
$output = chat_format_message($msg);
|
||||
|
||||
$msg->message = $output->text; // This is for writing into the DB
|
||||
$msg->text_ = $output->text;
|
||||
$msg->html_ = $output->html;
|
||||
$msg->beep_ = $output->beep;
|
||||
// Commit to DB
|
||||
insert_record('chat_messages', $msg);
|
||||
|
||||
// OK, now push it out to all users
|
||||
$this->message_broadcast($msg);
|
||||
|
||||
// Put it on the uncommitted queue
|
||||
// TODO: error checking!!!
|
||||
//$message_queue[] = $msg;
|
||||
insert_record('chat_messages', $msg);
|
||||
$this->message_broadcast($msg, $this->sets_info[$sessionid]['user']);
|
||||
|
||||
// Update that user's lastmessageping
|
||||
// TODO: this can and should be written as a single UPDATE query
|
||||
@@ -152,6 +193,23 @@ class ChatDaemon {
|
||||
update_record('chat_users', $user);
|
||||
}
|
||||
|
||||
// We did our work, but before slamming the door on the poor browser
|
||||
// show the courtesy of responding to the HTTP request. Otherwise, some
|
||||
// browsers decide to get vengeance by flooding us with repeat requests.
|
||||
|
||||
$header = "HTTP/1.1 200 OK\n";
|
||||
$header .= "Connection: close\n";
|
||||
$header .= "Date: ".date('r')."\n";
|
||||
$header .= "Server: Moodle\n";
|
||||
$header .= "Content-Type: text/html\n";
|
||||
$header .= "Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT\n";
|
||||
$header .= "Cache-Control: no-cache, must-revalidate\n";
|
||||
$header .= "Expires: Wed, 4 Oct 1978 09:32:45 GMT\n";
|
||||
$header .= "\n";
|
||||
|
||||
// That's enough headers for one lousy dummy response
|
||||
chat_socket_write($handle, $header);
|
||||
|
||||
// All done
|
||||
break;
|
||||
}
|
||||
@@ -176,11 +234,41 @@ class ChatDaemon {
|
||||
$this->dismiss_half($sessionid);
|
||||
return false;
|
||||
}
|
||||
$user = get_record('user', 'id', $chatuser->userid);
|
||||
if($user === false) {
|
||||
$this->dismiss_half($sessionid);
|
||||
return false;
|
||||
}
|
||||
$course = get_record('course', 'id', $chat->course); {
|
||||
if($course === false) {
|
||||
$this->dismiss_half($sessionid);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
global $CHAT_HTMLHEAD_JS;
|
||||
global $CHAT_HTMLHEAD_JS, $CFG;
|
||||
|
||||
// A really sad thing, to have to do this by hand.... :-(
|
||||
$lang = NULL;
|
||||
if(empty($lang) && !empty($course->lang)) {
|
||||
$lang = $course->lang;
|
||||
}
|
||||
if(empty($lang) && !empty($user->lang)) {
|
||||
$lang = $user->lang;
|
||||
}
|
||||
if(empty($lang)) {
|
||||
$lang = $CFG->lang;
|
||||
}
|
||||
|
||||
$this->conn_sets[$sessionid] = $this->conn_half[$sessionid];
|
||||
$this->sets_info[$sessionid] = array('chatid' => $chatuser->chatid, 'userid' => $chatuser->userid, 'groupid' => $groupid, 'lastmessages' => array(), 'lastmsgindex' => 0);
|
||||
$this->sets_info[$sessionid] = array(
|
||||
'chatid' => $chatuser->chatid,
|
||||
'user' => $user,
|
||||
'userid' => $chatuser->userid,
|
||||
'groupid' => $groupid,
|
||||
'lang' => $lang
|
||||
);
|
||||
|
||||
$this->dismiss_half($sessionid, false);
|
||||
chat_socket_write($this->conn_sets[$sessionid][CHAT_CONNECTION_CHANNEL], $CHAT_HTMLHEAD_JS);
|
||||
trace('Finalized client: sid: '.$sessionid.' uid: '.$chatuser->userid.' gid: '.intval($groupid));
|
||||
@@ -196,16 +284,7 @@ class ChatDaemon {
|
||||
$msg->timestamp = time();
|
||||
|
||||
insert_record('chat_messages', $msg);
|
||||
|
||||
// Format the message object here
|
||||
$output = chat_format_message($msg);
|
||||
|
||||
$msg->message = $output->text; // This is for writing into the DB
|
||||
$msg->text_ = $output->text;
|
||||
$msg->html_ = $output->html;
|
||||
$msg->beep_ = $output->beep;
|
||||
|
||||
$this->message_broadcast($msg);
|
||||
$this->message_broadcast($msg, $this->sets_info[$sessionid]['user']);
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -293,8 +372,9 @@ class ChatDaemon {
|
||||
return false;
|
||||
}
|
||||
foreach($this->conn_sets[$sessionid] as $handle) {
|
||||
socket_shutdown($handle);
|
||||
socket_close($handle);
|
||||
// Since we want to dismiss this, don't generate any errors if it's dead already
|
||||
@socket_shutdown($handle);
|
||||
@socket_close($handle);
|
||||
}
|
||||
unset($this->conn_sets[$sessionid]);
|
||||
unset($this->sets_info[$sessionid]);
|
||||
@@ -355,12 +435,11 @@ class ChatDaemon {
|
||||
return $retval;
|
||||
}
|
||||
|
||||
function message_broadcast($message) {
|
||||
function message_broadcast($message, $sender) {
|
||||
if(empty($this->conn_sets)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
//trace('Broadcasting message');
|
||||
foreach($this->sets_info as $sessionid => $info) {
|
||||
// We need to get handles from users that are in the same chatroom, same group
|
||||
if($info['chatid'] == $message->chatid &&
|
||||
@@ -368,8 +447,13 @@ class ChatDaemon {
|
||||
{
|
||||
|
||||
// Simply give them the message
|
||||
$output = chat_format_message_manually($message, 0, $sender, $info['userid'], $info['lang']);
|
||||
|
||||
if(!chat_socket_write($this->conn_sets[$sessionid][CHAT_CONNECTION_CHANNEL], $message->html_)) {
|
||||
if($output->beep) {
|
||||
chat_socket_write($this->conn_sets[$sessionid][CHAT_CONNECTION_CHANNEL], '<embed src="'.$this->beepsoundsrc.'" autostart="true" hidden="true" />');
|
||||
}
|
||||
|
||||
if(!chat_socket_write($this->conn_sets[$sessionid][CHAT_CONNECTION_CHANNEL], $output->html)) {
|
||||
|
||||
// Send failed! We must now disconnect/forget about the user FIRST
|
||||
// and THEN broadcast a message to all others... otherwise, infinite recursion.
|
||||
@@ -386,17 +470,14 @@ class ChatDaemon {
|
||||
trace('Client socket write failed, destroying uid '.$info['userid'].' with SID '.$sessionid);
|
||||
insert_record('chat_messages', $msg);
|
||||
|
||||
// Format the message object here
|
||||
$output = chat_format_message($msg);
|
||||
|
||||
$msg->message = $output->text; // This is for writing into the DB
|
||||
$msg->text_ = $output->text;
|
||||
$msg->html_ = $output->html;
|
||||
$msg->beep_ = $output->beep;
|
||||
|
||||
// Kill him before broadcasting!!
|
||||
// *************************** IMPORTANT
|
||||
//
|
||||
// Kill him BEFORE broadcasting, otherwise we 'll get infinite recursion!
|
||||
//
|
||||
// **********************************************************************
|
||||
$latesender = $this->sets_info[$sessionid]['user'];
|
||||
$this->dismiss_set($sessionid);
|
||||
$this->message_broadcast($msg);
|
||||
$this->message_broadcast($msg, $latesender);
|
||||
}
|
||||
//trace('Sent to UID '.$this->sets_info[$sessionid]['userid'].': '.$message->text_);
|
||||
}
|
||||
@@ -426,9 +507,7 @@ $DAEMON->trace_level = E_ALL;
|
||||
$DAEMON->socketserver_refresh = 10;
|
||||
$DAEMON->rememberlast = 10;
|
||||
$DAEMON->can_daemonize = function_exists('pcntl_fork');
|
||||
|
||||
$logfile = fopen('chatd.log', 'a+');
|
||||
|
||||
$DAEMON->beepsoundsrc = $CFG->wwwroot.'/mod/chat/beep.wav';
|
||||
|
||||
/// Check the parameters //////////////////////////////////////////////////////
|
||||
|
||||
@@ -448,6 +527,7 @@ $logfile = fopen('chatd.log', 'a+');
|
||||
}
|
||||
|
||||
|
||||
$logfile = fopen('chatd.log', 'a+');
|
||||
|
||||
/// Try to set up all the sockets ////////////////////////////////////////////////
|
||||
|
||||
@@ -482,6 +562,13 @@ if(!socket_bind($DAEMON->listen_socket, $CFG->chat_serverip, $CFG->chat_serverpo
|
||||
// Failed to bind socket
|
||||
$DAEMON->last_error = socket_last_error();
|
||||
echo "Error: socket_bind() failed: ". socket_strerror(socket_last_error($DAEMON->last_error)).' ['.$DAEMON->last_error."]\n";
|
||||
|
||||
// If $DAEMON->last_error == 98 (Success), maybe we need to try cleaning up a bit before dying
|
||||
// This is EXPERIMENTAL code!
|
||||
if($DAEMON->last_error == 98) {
|
||||
trace('experimental fix kicks in');
|
||||
socket_close($DAEMON->listen_socket);
|
||||
}
|
||||
die();
|
||||
}
|
||||
if(!socket_listen($DAEMON->listen_socket, $CFG->chat_servermax)) {
|
||||
@@ -653,17 +740,21 @@ function chat_socket_write($connection, $text) {
|
||||
$check_socket = array($connection);
|
||||
$socket_changed = socket_select($read = NULL, $check_socket, $except = NULL, 0, 0);
|
||||
if($socket_changed > 0) {
|
||||
socket_write($connection, $text, strlen($text));
|
||||
$written = socket_write($connection, $text, strlen($text));
|
||||
//trace('socket_write wrote '.$written.' of '.strlen($text).' bytes');
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
function pusers($chat, $groupid) {
|
||||
function pusers($chatid, $groupid) {
|
||||
/// Delete users who are using text version and are old
|
||||
|
||||
global $CFG, $str;
|
||||
|
||||
static $lastupdate = 0;
|
||||
static $outputcache = NULL;
|
||||
|
||||
//chat_delete_old_users();
|
||||
|
||||
|
||||
@@ -674,61 +765,78 @@ ob_start();
|
||||
|
||||
$timenow = time();
|
||||
|
||||
if (empty($str)) {
|
||||
$str->idle = get_string("idle", "chat");
|
||||
$str->beep = get_string("beep", "chat");
|
||||
$str->day = get_string("day");
|
||||
$str->days = get_string("days");
|
||||
$str->hour = get_string("hour");
|
||||
$str->hours = get_string("hours");
|
||||
$str->min = get_string("min");
|
||||
$str->mins = get_string("mins");
|
||||
$str->sec = get_string("sec");
|
||||
$str->secs = get_string("secs");
|
||||
|
||||
// WARNING!!!! THESE ARE HERE TO REMOVE NOTICES!!!
|
||||
// THEY SHOULD BE FIXED!
|
||||
$chat_sid = 0;
|
||||
$chat->course = 0;
|
||||
|
||||
// Keep the results cached for 5 seconds
|
||||
if($timenow - 5 > $lastupdate || empty($outputcache)) {
|
||||
|
||||
if (empty($str)) {
|
||||
$str->idle = get_string("idle", "chat");
|
||||
$str->beep = get_string("beep", "chat");
|
||||
$str->day = get_string("day");
|
||||
$str->days = get_string("days");
|
||||
$str->hour = get_string("hour");
|
||||
$str->hours = get_string("hours");
|
||||
$str->min = get_string("min");
|
||||
$str->mins = get_string("mins");
|
||||
$str->sec = get_string("sec");
|
||||
$str->secs = get_string("secs");
|
||||
}
|
||||
|
||||
/// Get list of users
|
||||
|
||||
if (!$chatusers = chat_get_users($chatid, $groupid)) {
|
||||
print_string("errornousers", "chat");
|
||||
die('no users');
|
||||
//return ob_get_clean();
|
||||
//exit;
|
||||
}
|
||||
|
||||
echo "<html>\n";
|
||||
echo "<head>\n";
|
||||
echo "<script lang=\"Javascript\">\n";
|
||||
echo " function reloadme() {\n";
|
||||
echo " return false;\n";
|
||||
echo " window.location.reload();\n";
|
||||
echo " }\n";
|
||||
echo "</script></head>\n";
|
||||
//echo '<body onload="setTimeout(\'reloadme()\', 5000);">'."\n\n";
|
||||
//for ($i = 0; $i < 100; ++$i) {
|
||||
// echo "<!-- nix -->\n";
|
||||
//}
|
||||
|
||||
echo "<body>\n<table width=\"100%\">\n";
|
||||
foreach ($chatusers as $chatuser) {
|
||||
$lastping = $timenow - $chatuser->lastmessageping;
|
||||
echo "<tr>\n<td width=35>";
|
||||
echo "<a target=\"_new\" onClick=\"return openpopup('/user/view.php?id=$chatuser->id&course=$chat->course','user$chatuser->id','');\" href=\"$CFG->wwwroot/user/view.php?id=$chatuser->id&course=$chat->course\">";
|
||||
print_user_picture($chatuser->id, 0, $chatuser->picture, false, false, false);
|
||||
echo "</a></td><td valign=center>";
|
||||
echo "<p><font size=1>";
|
||||
echo fullname($chatuser)."<br />";
|
||||
echo "<font color=\"#888888\">$str->idle: ".format_time($lastping, $str)."</font>";
|
||||
echo " <a href=\"users.php?chat_sid=$chat_sid&beep=$chatuser->id&groupid=$groupid\">$str->beep</a>";
|
||||
echo "</font></p>";
|
||||
echo "<td>\n</tr>\n";
|
||||
}
|
||||
echo "</table>\n";
|
||||
|
||||
//window.setTimeout('reloadme', 1000)
|
||||
echo "</body>\n</html>\n";
|
||||
|
||||
$lastupdate = $timenow;
|
||||
return $outputcache = ob_get_clean();
|
||||
}
|
||||
|
||||
/// Get list of users
|
||||
|
||||
if (!$chatusers = chat_get_users($chat->id, $groupid)) {
|
||||
print_string("errornousers", "chat");
|
||||
die('no users');
|
||||
//return ob_get_clean();
|
||||
//exit;
|
||||
else {
|
||||
// Return cached output
|
||||
trace('User window cached return');
|
||||
return $outputcache;
|
||||
}
|
||||
|
||||
echo "<html>\n";
|
||||
echo "<head>\n";
|
||||
echo "<script lang=\"Javascript\">\n";
|
||||
echo " function reloadme() {\n";
|
||||
echo " return false;\n";
|
||||
echo " window.location.reload();\n";
|
||||
echo " }\n";
|
||||
echo "</script></head>\n";
|
||||
echo '<body onload="setTimeout(\'reloadme()\', 5000);">'."\n\n";
|
||||
for ($i = 0; $i < 100; ++$i) {
|
||||
echo "<!-- nix -->\n";
|
||||
}
|
||||
|
||||
echo "<table width=\"100%\">";
|
||||
foreach ($chatusers as $chatuser) {
|
||||
$lastping = $timenow - $chatuser->lastmessageping;
|
||||
echo "<tr><td width=35>";
|
||||
echo "<a target=\"_new\" onClick=\"return openpopup('/user/view.php?id=$chatuser->id&course=$chat->course','user$chatuser->id','');\" href=\"$CFG->wwwroot/user/view.php?id=$chatuser->id&course=$chat->course\">";
|
||||
print_user_picture($chatuser->id, 0, $chatuser->picture, false, false, false);
|
||||
echo "</a></td><td valign=center>";
|
||||
echo "<p><font size=1>";
|
||||
echo fullname($chatuser)."<br />";
|
||||
echo "<font color=\"#888888\">$str->idle: ".format_time($lastping, $str)."</font>";
|
||||
echo " <a href=\"users.php?chat_sid=$chat_sid&beep=$chatuser->id&groupid=$groupid\">$str->beep</a>";
|
||||
echo "</font></p>";
|
||||
echo "<td></tr>";
|
||||
}
|
||||
echo "</table>";
|
||||
|
||||
//window.setTimeout('reloadme', 1000)
|
||||
echo '</body></html>';
|
||||
return ob_get_clean();
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
|
||||
+108
-75
@@ -4,28 +4,28 @@
|
||||
|
||||
if (!isset($CFG->chat_refresh_room)) {
|
||||
set_config("chat_refresh_room", 5);
|
||||
}
|
||||
}
|
||||
if (!isset($CFG->chat_refresh_userlist)) {
|
||||
set_config("chat_refresh_userlist", 10);
|
||||
}
|
||||
}
|
||||
if (!isset($CFG->chat_old_ping)) {
|
||||
set_config("chat_old_ping", 30);
|
||||
}
|
||||
}
|
||||
if (!isset($CFG->chat_method)) {
|
||||
set_config("chat_method", "header_js");
|
||||
}
|
||||
}
|
||||
if (!isset($CFG->chat_serverhost)) {
|
||||
set_config("chat_serverhost", $_SERVER['HTTP_HOST']);
|
||||
}
|
||||
}
|
||||
if (!isset($CFG->chat_serverip)) {
|
||||
set_config("chat_serverip", $_SERVER['SERVER_ADDR']);
|
||||
}
|
||||
}
|
||||
if (!isset($CFG->chat_serverport)) {
|
||||
set_config("chat_serverport", 9111);
|
||||
}
|
||||
}
|
||||
if (!isset($CFG->chat_servermax)) {
|
||||
set_config("chat_servermax", 100);
|
||||
}
|
||||
}
|
||||
|
||||
define("CHAT_DRAWBOARD", false); // Look into this later
|
||||
|
||||
@@ -47,16 +47,16 @@ $CHAT_HTMLHEAD_MSGINPUT_JS = "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Trans
|
||||
|
||||
|
||||
function chat_add_instance($chat) {
|
||||
/// Given an object containing all the necessary data,
|
||||
/// (defined by the form in mod.html) this function
|
||||
/// will create a new instance and return the id number
|
||||
/// Given an object containing all the necessary data,
|
||||
/// (defined by the form in mod.html) this function
|
||||
/// will create a new instance and return the id number
|
||||
/// of the new instance.
|
||||
|
||||
$chat->timemodified = time();
|
||||
|
||||
$chat->chattime = make_timestamp($chat->chatyear, $chat->chatmonth, $chat->chatday,
|
||||
$chat->chattime = make_timestamp($chat->chatyear, $chat->chatmonth, $chat->chatday,
|
||||
$chat->chathour, $chat->chatminute);
|
||||
|
||||
|
||||
if ($returnid = insert_record("chat", $chat)) {
|
||||
|
||||
$event = NULL;
|
||||
@@ -79,14 +79,14 @@ function chat_add_instance($chat) {
|
||||
|
||||
|
||||
function chat_update_instance($chat) {
|
||||
/// Given an object containing all the necessary data,
|
||||
/// (defined by the form in mod.html) this function
|
||||
/// Given an object containing all the necessary data,
|
||||
/// (defined by the form in mod.html) this function
|
||||
/// will update an existing instance with new data.
|
||||
|
||||
$chat->timemodified = time();
|
||||
$chat->id = $chat->instance;
|
||||
|
||||
$chat->chattime = make_timestamp($chat->chatyear, $chat->chatmonth, $chat->chatday,
|
||||
$chat->chattime = make_timestamp($chat->chatyear, $chat->chatmonth, $chat->chatday,
|
||||
$chat->chathour, $chat->chatminute);
|
||||
|
||||
if ($returnid = update_record("chat", $chat)) {
|
||||
@@ -108,9 +108,9 @@ function chat_update_instance($chat) {
|
||||
|
||||
|
||||
function chat_delete_instance($id) {
|
||||
/// Given an ID of an instance of this module,
|
||||
/// this function will permanently delete the instance
|
||||
/// and any data that depends on it.
|
||||
/// Given an ID of an instance of this module,
|
||||
/// this function will permanently delete the instance
|
||||
/// and any data that depends on it.
|
||||
|
||||
if (! $chat = get_record("chat", "id", "$id")) {
|
||||
return false;
|
||||
@@ -132,7 +132,7 @@ function chat_delete_instance($id) {
|
||||
}
|
||||
|
||||
function chat_user_outline($course, $user, $mod, $chat) {
|
||||
/// Return a small object with summary information about what a
|
||||
/// Return a small object with summary information about what a
|
||||
/// user has done with a given particular instance of this module
|
||||
/// Used for user activity reports.
|
||||
/// $return->time = the time they did it
|
||||
@@ -142,7 +142,7 @@ function chat_user_outline($course, $user, $mod, $chat) {
|
||||
}
|
||||
|
||||
function chat_user_complete($course, $user, $mod, $chat) {
|
||||
/// Print a detailed representation of what a user has done with
|
||||
/// Print a detailed representation of what a user has done with
|
||||
/// a given particular instance of this module, for user activity reports.
|
||||
|
||||
return true;
|
||||
@@ -161,7 +161,7 @@ function chat_print_recent_activity($course, $isteacher, $timestart) {
|
||||
FROM {$CFG->prefix}chat_users as cu,
|
||||
{$CFG->prefix}chat as ch,
|
||||
{$CFG->prefix}user as u
|
||||
WHERE cu.userid = u.id
|
||||
WHERE cu.userid = u.id
|
||||
AND cu.chatid = ch.id
|
||||
AND cu.lastping > '$timeold'
|
||||
AND ch.course = '$course->id'
|
||||
@@ -200,8 +200,8 @@ function chat_print_recent_activity($course, $isteacher, $timestart) {
|
||||
|
||||
function chat_cron () {
|
||||
/// Function to be run periodically according to the moodle cron
|
||||
/// This function searches for things that need to be done, such
|
||||
/// as sending out mail, toggling flags etc ...
|
||||
/// This function searches for things that need to be done, such
|
||||
/// as sending out mail, toggling flags etc ...
|
||||
|
||||
global $CFG;
|
||||
|
||||
@@ -281,7 +281,7 @@ function chat_refresh_events($courseid = 0) {
|
||||
$event->eventtype = $chat->schedule;
|
||||
$event->timeduration = 0;
|
||||
$event->visible = get_field('course_modules', 'visible', 'module', $moduleid, 'instance', $chat->id);
|
||||
|
||||
|
||||
add_event($event);
|
||||
}
|
||||
}
|
||||
@@ -300,7 +300,7 @@ function chat_get_users($chatid, $groupid=0) {
|
||||
} else {
|
||||
$groupselect = "";
|
||||
}
|
||||
|
||||
|
||||
return get_records_sql("SELECT DISTINCT u.id, u.firstname, u.lastname, u.picture, c.lastmessageping, c.firstping
|
||||
FROM {$CFG->prefix}chat_users c,
|
||||
{$CFG->prefix}user u
|
||||
@@ -312,7 +312,7 @@ function chat_get_users($chatid, $groupid=0) {
|
||||
function chat_get_latest_message($chatid, $groupid=0) {
|
||||
/// Efficient way to extract just the latest message
|
||||
/// Uses ADOdb directly instead of get_record_sql()
|
||||
/// because the LIMIT command causes problems with
|
||||
/// because the LIMIT command causes problems with
|
||||
/// the developer debugging in there.
|
||||
|
||||
global $db, $CFG;
|
||||
@@ -324,7 +324,7 @@ function chat_get_latest_message($chatid, $groupid=0) {
|
||||
}
|
||||
|
||||
if (!$rs = $db->Execute("SELECT *
|
||||
FROM {$CFG->prefix}chat_messages
|
||||
FROM {$CFG->prefix}chat_messages
|
||||
WHERE chatid = '$chatid' $groupselect
|
||||
ORDER BY timestamp DESC LIMIT 1")) {
|
||||
return false;
|
||||
@@ -373,7 +373,7 @@ function chat_delete_old_users() {
|
||||
$message->message = "exit";
|
||||
$message->system = 1;
|
||||
$message->timestamp = time();
|
||||
|
||||
|
||||
if (!insert_record("chat_messages", $message)) {
|
||||
error("Could not insert a chat message!");
|
||||
}
|
||||
@@ -532,7 +532,7 @@ function chat_browser_detect($HTTP_USER_AGENT) {
|
||||
{
|
||||
$BPlatform = "Unknown";
|
||||
}
|
||||
|
||||
|
||||
$return["name"] = $BName;
|
||||
$return["version"] = $BVersion;
|
||||
$return["platform"] = $BPlatform;
|
||||
@@ -600,92 +600,125 @@ function chat_display_version($version, $browser)
|
||||
}
|
||||
|
||||
|
||||
function chat_format_message($message, $courseid=0) {
|
||||
/// Given a message object full of information, this function
|
||||
/// formats it appropriately into text and html, then
|
||||
/// returns the formatted data.
|
||||
|
||||
global $CFG, $USER;
|
||||
|
||||
$output = new object;
|
||||
|
||||
if (!$user = get_record("user", "id", $message->userid)) {
|
||||
return "Error finding user id = $message->userid";
|
||||
}
|
||||
|
||||
$picture = print_user_picture($user->id, 0, $user->picture, false, true, false);
|
||||
if ($courseid) {
|
||||
$picture = "<a target=\"_new\" href=\"$CFG->wwwroot/user/view.php?id=$user->id&course=$courseid\">$picture</a>";
|
||||
}
|
||||
|
||||
$strtime = userdate($message->timestamp, get_string("strftimemessage", "chat"));
|
||||
function chat_format_message_manually($message, $courseid, $sender, $currentuserid, $language = NULL) {
|
||||
global $CFG;
|
||||
|
||||
$output = New stdClass;
|
||||
$output->beep = false; // by default
|
||||
|
||||
$text = $message->message;
|
||||
if(empty($language)) {
|
||||
$language = current_language();
|
||||
}
|
||||
|
||||
if (!empty($message->system)) { /// It's a system message
|
||||
$output->text = get_string("message$text", "chat", fullname($user));
|
||||
$output->text = "$strtime: $output->text";
|
||||
$output->html = "<table><tr><td valign=top>$picture</td><td>";
|
||||
$output->html .= "<font size=2 color=\"#CCAAAA\">$output->text</font>";
|
||||
$output->html .= "</td></tr></table>";
|
||||
// Override the highest-ranking language variable from current_language() here
|
||||
// And save it so we can restore it again afterwards
|
||||
|
||||
$oldcfglang = empty($CFG->courselang) ? NULL : $CFG->courselang;
|
||||
$CFG->courselang = $language;
|
||||
|
||||
// Get some additional info now that the language has been correctly set
|
||||
|
||||
// But before that :-) let's override get_user_timezone() for this call... messy stuff...
|
||||
$tz = ($sender->timezone == 99) ? $CFG->timezone : $sender->timezone;
|
||||
$message->strtime = userdate($message->timestamp, get_string('strftimemessage', 'chat'), $tz);
|
||||
|
||||
$message->picture = print_user_picture($sender->id, 0, $sender->picture, false, true, false);
|
||||
if ($courseid) {
|
||||
$message->picture = "<a target=\"_new\" href=\"$CFG->wwwroot/user/view.php?id=$sender->id&course=$courseid\">$picture</a>";
|
||||
}
|
||||
|
||||
// Start processing the message
|
||||
|
||||
if(!empty($message->system)) {
|
||||
// System event
|
||||
$output->text = $message->strtime.': '.get_string('message'.$message->message, 'chat', fullname($sender));
|
||||
$output->html = '<table><tr><td style="vertical-align: top;">'.$message->picture.'</td><td>';
|
||||
$output->html .= '<font size=2 color="#CCAAAA">'.$output->text.'</font></td></tr></table>';
|
||||
|
||||
// Don't forget to reset the language before returning!!!
|
||||
if(!empty($oldcfglang)) {
|
||||
$CFG->courselang = $oldcfglang;
|
||||
}
|
||||
return $output;
|
||||
}
|
||||
|
||||
// It's not a system event, so format it nicely
|
||||
|
||||
$text = $message->message;
|
||||
convert_urls_into_links($text);
|
||||
replace_smilies($text);
|
||||
$text = filter_text($text, $courseid);
|
||||
|
||||
if (substr($text, 0, 5) == "beep ") { /// It's a beep!
|
||||
// And now check for special cases
|
||||
|
||||
if (substr($text, 0, 5) == 'beep ') {
|
||||
/// It's a beep!
|
||||
$beepwho = trim(substr($text, 5));
|
||||
|
||||
if ($beepwho == "all") { // everyone
|
||||
$outinfo = "$strtime: ". get_string("messagebeepseveryone", "chat", fullname($user));
|
||||
$outmain = "";
|
||||
$output->beep = true; // (eventually this should be set to
|
||||
if ($beepwho == 'all') { // everyone
|
||||
$outinfo = $message->strtime.': '.get_string('messagebeepseveryone', 'chat', fullname($sender));
|
||||
$outmain = '';
|
||||
$output->beep = true; // (eventually this should be set to
|
||||
// to a filename uploaded by the user)
|
||||
|
||||
} else if ($beepwho == $USER->id) { // current user
|
||||
$outinfo = "$strtime: ". get_string("messagebeepsyou", "chat", fullname($user));
|
||||
$outmain = "";
|
||||
} else if ($beepwho == $currentuserid) { // current user
|
||||
$outinfo = $message->strtime.': '.get_string('messagebeepsyou', 'chat', fullname($sender));
|
||||
$outmain = '';
|
||||
$output->beep = true;
|
||||
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
} else if (substr($text, 0, 1) == ':') { /// It's an MOO emote
|
||||
$outinfo = $message->strtime;
|
||||
$outmain = $sender->firstname.' '.substr($text, 1);
|
||||
|
||||
} else if (substr($text, 0, 1) == ":") { /// It's an MOO emote
|
||||
$outinfo = $strtime;
|
||||
$outmain = "$user->firstname ".substr($text, 1);
|
||||
|
||||
} else if (substr($text, 0, 1) == "/") { /// It's a user command
|
||||
} else if (substr($text, 0, 1) == '/') { /// It's a user command
|
||||
|
||||
if (substr($text, 0, 4) == "/me ") {
|
||||
$outinfo = $strtime;
|
||||
$outmain = "$user->firstname ".substr($text, 4);
|
||||
$outinfo = $message->strtime;
|
||||
$outmain = $sender->firstname.' '.substr($text, 4);
|
||||
} else {
|
||||
$outinfo = $strtime;
|
||||
$outinfo = $message->strtime;
|
||||
$outmain = $text;
|
||||
}
|
||||
|
||||
} else { /// It's a normal message
|
||||
$outinfo = "$strtime $user->firstname";
|
||||
$outinfo = $message->strtime.' '.$sender->firstname;
|
||||
$outmain = $text;
|
||||
}
|
||||
|
||||
/// Format the message as a small table
|
||||
|
||||
$output->text = strip_tags("$outinfo: $outmain");
|
||||
$output->text = strip_tags($outinfo.': '.$outmain);
|
||||
|
||||
$output->html = "<table><tr><td valign=top>$picture</td><td><font size=2>";
|
||||
$output->html = "<table><tr><td valign=top>$message->picture</td><td><font size=2>";
|
||||
$output->html .= "<font color=\"#888888\">$outinfo</font>";
|
||||
if ($outmain) {
|
||||
$output->html .= ": $outmain";
|
||||
}
|
||||
$output->html .= "</font></td></tr></table>";
|
||||
|
||||
// Don't forget to reset the language before returning!!!
|
||||
if(!empty($oldcfglang)) {
|
||||
$CFG->courselang = $oldcfglang;
|
||||
}
|
||||
|
||||
return $output;
|
||||
}
|
||||
|
||||
function chat_format_message($message, $courseid=0) {
|
||||
/// Given a message object full of information, this function
|
||||
/// formats it appropriately into text and html, then
|
||||
/// returns the formatted data.
|
||||
|
||||
global $CFG, $USER;
|
||||
|
||||
if (!$user = get_record("user", "id", $message->userid)) {
|
||||
return "Error finding user id = $message->userid";
|
||||
}
|
||||
|
||||
return chat_format_message_manually($message, $courseid, $user, $USER->id);
|
||||
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user