Fixes and improvements

- Fixed message receiving
- Fixed message chunk loading
- Added unread indicator
- Other fixes
This commit is contained in:
Norbi Peti 2016-08-16 12:51:06 +02:00
parent 01a1ce097c
commit 4b90fdf8b9
9 changed files with 71 additions and 38 deletions

View file

@ -1,6 +1,6 @@
<!DOCTYPE html> <!DOCTYPE html>
<head> <head>
<title>ChatServer</title> <title>Chat</title>
<meta charset="UTF-8"/> <meta charset="UTF-8"/>
<script src="js/jquery-3.1.0.js"></script> <script src="js/jquery-3.1.0.js"></script>
<script src="js/moment-with-locales.js" charset="UTF-8"></script> <script src="js/moment-with-locales.js" charset="UTF-8"></script>

View file

@ -8,7 +8,8 @@ $(document).ready(function () {
var nodes = cmsgs.children; var nodes = cmsgs.children;
for (var x = 0; x < nodes.length; x++) { for (var x = 0; x < nodes.length; x++) {
var item = nodes[x]; var item = nodes[x];
handlereceivedmessage(item); if (item.tagName == "DIV")
handlereceivedmessage(item);
} }
} }
}); });

View file

@ -1,4 +1,4 @@
var handlereceivedmessage = function handlereceivedmessage(msgnode) { function handlereceivedmessage(msgnode) {
var spans = msgnode.getElementsByTagName("span"); var spans = msgnode.getElementsByTagName("span");
var ctime = null; var ctime = null;
for (var i = 0; i < spans.length; i++) for (var i = 0; i < spans.length; i++)
@ -9,22 +9,53 @@ var handlereceivedmessage = function handlereceivedmessage(msgnode) {
msgnode.scrollIntoView(false); msgnode.scrollIntoView(false);
} }
(function poll() { var unreadCount = 0;
setTimeout(function () {
$.ajax({ var updateUnreadCount = function () {
url: "/receivemessage", success: function (data) { if (unreadCount > 0)
console.log(data); document.title = "(" + unreadCount + ") Chat";
var msgelement = document.getElementById("channelmessages").appendChild(document.createElement("div")); else
var header = msgelement.appendChild(document.createElement("p"); document.title = "Chat";
header.innerText = data.sender.name + " - "; var msgs = document.getElementById("channelmessages").children;
var isoFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); for (var i = msgs.length - 1; i >= 0; i--) {
isoFormat.setTimeZone(TimeZone.getTimeZone("UTC")); if (i >= msgs.length - unreadCount)
header.appendElement("span").addClass("converttime") msgs[i].style.backgroundColor = "darkgray";
.value = isoFormat.format(data.time) + "+00:00"; else
var body = msgelement.appendChild(document.createElement("p")); msgs[i].style = "";
body.innerText = data.message; }
handlereceivedmessage(msgnode); };
}, dataType: "json", complete: poll
}); var addUnread = function addUnread() {
}, 100); unreadCount++;
})(); updateUnreadCount();
};
var resetUnread = function resetUnread() {
unreadCount = 0;
updateUnreadCount();
};
(function poll() {
setTimeout(function () {
$.ajax({
url: "/receivemessage", success: function (data) {
console.log(data);
var msgelement = document.getElementById("channelmessages").appendChild(document.createElement("div"));
var header = msgelement.appendChild(document.createElement("p"));
header.innerText = data.sender.name + " - ";
var span = header.appendChild(document.createElement("span"));
span.className = "converttime";
span.innerText = data.time;
var body = msgelement.appendChild(document.createElement("p"));
body.innerText = data.message;
handlereceivedmessage(msgelement);
addUnread();
}, dataType: "json", complete: poll
});
}, 100);
})();
$(document).ready(function () {
$('#msginput').on("focus", resetUnread);
$('#msginput').on("keydown", resetUnread);
});

View file

@ -17,11 +17,13 @@ var respfunc = function respfunc(result) {
else { else {
showError(result.responseText); showError(result.responseText);
msginput.disabled = false; msginput.disabled = false;
msginput.focus();
} }
} }
else { else {
msginput.value = ""; msginput.value = "";
msginput.disabled = false; msginput.disabled = false;
msginput.focus();
} }
}; };
@ -31,7 +33,7 @@ var sendmsgonenter = function sendmsgonenter(e) {
return; return;
} }
e.preventDefault(); e.preventDefault();
var textarea = event.target; var textarea = e.target;
if (textarea.value.trim().length == 0) if (textarea.value.trim().length == 0)
return; return;
textarea.disabled = true; //msginput textarea.disabled = true; //msginput

View file

@ -17,4 +17,4 @@ function showError(message) {
errormsg.innerHTML = message; errormsg.innerHTML = message;
errormsg.style = "display: block"; errormsg.style = "display: block";
setTimeout(function () { errormsg.style.display = "none"; }, 2000); setTimeout(function () { errormsg.style.display = "none"; }, 2000);
} }

View file

@ -58,14 +58,9 @@ public class IndexPage extends Page {
cide.attr("id", "convidp"); cide.attr("id", "convidp");
cide.text(Long.toString(conv.getId())); cide.text(Long.toString(conv.getId()));
LogManager.getLogger().log(Level.DEBUG, "Messages: " + conv.getMesssageChunks().size()); LogManager.getLogger().log(Level.DEBUG, "Messages: " + conv.getMesssageChunks().size());
@SuppressWarnings("unchecked") MessageChunk chunk = conv.getMesssageChunks().get(conv.getMesssageChunks().size() - 1);
LoaderCollection<MessageChunk> chunks = (LoaderCollection<MessageChunk>) conv.getMesssageChunks() for (Message message : chunk.getMessages()) {
.clone(); message.getAsHTML(channelmessages);
Collections.reverse(chunks);
for (MessageChunk chunk : chunks) {
for (Message message : chunk.getMessages()) {
message.getAsHTML(channelmessages);
}
} }
return doc; return doc;
}, exchange); }, exchange);

View file

@ -49,10 +49,14 @@ public class ReceiveMessageAjaxPage extends Page {
public static void sendMessageBack(Message msg, Conversation conv) throws IOException { public static void sendMessageBack(Message msg, Conversation conv) throws IOException {
for (User user : conv.getUsers()) { for (User user : conv.getUsers()) {
LogManager.getLogger().debug("User: " + user); LogManager.getLogger().debug("User: " + user);
if (exmap.containsKey(user)) { if (exmap.containsKey(user)) { // TODO: Save new messages if not listening
LogManager.getLogger().debug("Exmap contains user"); LogManager.getLogger().debug("Exmap contains user");
JsonObject msgobj = msg.getAsJson(); JsonObject msgobj = msg.getAsJson();
IOHelper.SendResponse(200, msgobj.toString(), exmap.get(user)); try {
IOHelper.SendResponse(200, msgobj.toString(), exmap.get(user));
} catch (IOException e) { // Remove users even if an error occurs (otherwise they may not be able to send a new message due to "headers already sent")
e.printStackTrace();
}
exmap.remove(user); exmap.remove(user);
} else } else
LogManager.getLogger().warn("User is not listening: " + user); LogManager.getLogger().warn("User is not listening: " + user);

View file

@ -23,12 +23,12 @@ public class RegisterAjaxPage extends Page {
return; // TODO: Use JavaScript too, for error checks return; // TODO: Use JavaScript too, for error checks
} }
for (User user : DataManager.getAll(User.class)) { // TODO: Optimize for (User user : DataManager.getAll(User.class)) { // TODO: Optimize
if (post.get("email").equals(user.getEmail())) { if (post.get("email").getAsString().equals(user.getEmail())) {
errormsg += "<p>An user with this name already exists</p>"; errormsg += "<p>An user with this E-mail already exists</p>";
break; break;
} }
} }
if (!post.get("pass").equals(post.get("pass2"))) if (!post.get("pass").getAsString().equals(post.get("pass2").getAsString()))
errormsg += "<p>The passwords don't match</p>"; errormsg += "<p>The passwords don't match</p>";
if (errormsg.length() > 0) { if (errormsg.length() > 0) {
final String msg = errormsg; final String msg = errormsg;

View file

@ -69,7 +69,7 @@ public class SendMessageAjaxPage extends Page {
msg.setTime(new Date()); msg.setTime(new Date());
DataManager.save(conv); DataManager.save(conv);
LogManager.getLogger().log(Level.DEBUG, LogManager.getLogger().log(Level.DEBUG,
"Added conversation's message count: " + conv.getMesssageChunks().size()); "Added conversation's messagechunk count: " + conv.getMesssageChunks().size());
ReceiveMessageAjaxPage.sendMessageBack(msg, conv); ReceiveMessageAjaxPage.sendMessageBack(msg, conv);