else {
foreach ($this->sets_info as $usersid => $userinfo) {
$lastping = $timenow - $userinfo['chatuser']->lastmessageping;
+ $popuppar = '\'/user/view.php?id='.$userinfo['user']->id.'&course='.$userinfo['courseid'].'\',\'user'.$userinfo['chatuser']->id.'\',\'\'';
echo '<tr><td width="35">';
-
- echo '<a target="_new" onclick="return openpopup(\'/user/view.php?id='.$userinfo['chatuser']->id.'&course='.$userinfo['courseid'].'\',\'user'.$userinfo['chatuser']->id.'\',\'\');" href="'.$CFG->wwwroot.'/user/view.php?id='.$userinfo['chatuser']->id.'&course='.$userinfo['courseid'].'">';
+ echo '<a target="_new" onclick="return openpopup('.$popuppar.');" href="'.$CFG->wwwroot.'/user/view.php?id='.$userinfo['chatuser']->id.'&course='.$userinfo['courseid'].'">';
print_user_picture($userinfo['user']->id, 0, $userinfo['user']->picture, false, false, false);
echo "</a></td><td valign=center>";
echo "<p><font size=1>";
break;
case CHAT_SIDEKICK_MESSAGE:
// Incoming message
+
+ // Browser stupidity protection from duplicate messages:
+ $messageindex = intval($customdata['index']);
+
+ if($this->sets_info[$sessionid]['lastmessageindex'] >= $messageindex) {
+ // We have already broadcasted that!
+ trace('discarding message with stale index');
+ break;
+ }
+ else {
+ // Update our info
+ $this->sets_info[$sessionid]['lastmessageindex'] = $messageindex;
+ }
+
$msg = &New stdClass;
$msg->chatid = $this->sets_info[$sessionid]['chatid'];
$msg->userid = $this->sets_info[$sessionid]['userid'];
// code base to follow suit. But AFTER development is done.
$this->sets_info[$sessionid] = array(
'lastinfocommit' => 0,
+ 'lastmessageindex' => 0,
'courseid' => $course->id,
'chatuser' => $chatuser,
'chatid' => $chatuser->chatid,
break;
case 'message':
$type = CHAT_SIDEKICK_MESSAGE;
- if(!ereg('chat_message=([^&]*)[& ]', $data, $info)) {
+ if(!ereg('chat_message=([^&]*)[& ]chat_msgidnr=([^&]*)[& ]', $data, $info)) {
trace('Message sidekick did not contain a valid message', E_USER_WARNING);
$DAEMON->dismiss_ufo($handle);
continue;
}
else {
- $customdata = array('message' => $info[1]);
+ $customdata = array('message' => $info[1], 'index' => $info[2]);
}
break;
default:
scroll_active = true;
function empty_field_and_submit() {
cf = document.getElementById('chatform');
- cf.chat_message.value=document.f.chat_message.value;
+ cf.chat_msgidnr.value = parseInt(cf.chat_msgidnr.value) + 1;
+ cf.chat_message.value = document.f.chat_message.value;
cf.submit();
document.f.chat_message.value='';
document.f.chat_message.focus();
</script>
</head>
-<body bgcolor="<?php echo $THEME->body ?>"
- OnLoad="document.f.chat_message.focus();document.f.chat_message.select();">
-
-
+<body bgcolor="<?php echo $THEME->body ?>" onload="document.f.chat_message.focus();document.f.chat_message.select();">
<!--
<form action="<?php echo "http://$CFG->chat_serverhost:$CFG->chat_serverport"; ?>" method="GET" target="empty" name="f" onsubmit="return empty_field_and_submit()">
<!--
<form action="../insert.php" method="GET" target="empty" id="chatform" onsubmit="return empty_field_and_submit()">
-->
- <input type="hidden" name="win" value="message">
- <input type="hidden" name="chat_version" value="sockets">
- <input type="hidden" name="chat_message">
- <input type="hidden" name="chat_sid" value="<?php echo $chat_sid ?>">
- <input type="hidden" name="groupid" value="<?php echo $groupid ?>">
+ <input type="hidden" name="win" value="message" />
+ <input type="hidden" name="chat_version" value="sockets" />
+ <input type="hidden" name="chat_message" value="" />
+ <input type="hidden" name="chat_msgidnr" value="0" />
+ <input type="hidden" name="chat_sid" value="<?php echo $chat_sid ?>" />
+ <input type="hidden" name="groupid" value="<?php echo $groupid ?>" />
</form>
</body>