- change register error message only showing up once instead of repeating every time you try and get an error. it probably should blank when you start typing again though
- pull the long polling handlers out to their own file like the ajax response handlers - chat
This commit is contained in:
parent
b73320d614
commit
0183ca5357
|
@ -9,26 +9,56 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
#canvass {
|
#canvass {
|
||||||
/* */
|
/* * /
|
||||||
display: none;
|
display: none;
|
||||||
/* */
|
/* */
|
||||||
height: 768px;
|
height: 750px;
|
||||||
overflow: none;
|
overflow: none;
|
||||||
position: relative;
|
position: relative;
|
||||||
width: 1024px;
|
width: 1000px;
|
||||||
border: 1px solid red;
|
border: 1px solid red;
|
||||||
}
|
}
|
||||||
|
|
||||||
#log {
|
#chat_area {
|
||||||
width: 50%;
|
width: 500px;
|
||||||
height: 200px;
|
height: 215px;
|
||||||
border: 1px solid black;
|
border: 0px;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
bottom: 0px;
|
bottom: 0px;
|
||||||
right: 0px;
|
right: 0px;
|
||||||
|
overflow: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
#log {
|
||||||
|
width: 500px;
|
||||||
|
height: 198px;
|
||||||
|
border: 1px solid black;
|
||||||
|
position: absolute;
|
||||||
|
bottom: 17px;
|
||||||
|
right: 0px;
|
||||||
overflow: auto;
|
overflow: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#chat {
|
||||||
|
border: 1px solid black;
|
||||||
|
width: 451px;
|
||||||
|
height: 17px;
|
||||||
|
position: absolute;
|
||||||
|
bottom: -1px;
|
||||||
|
right: 49px;
|
||||||
|
padding: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#chat_submit {
|
||||||
|
width: 50px;
|
||||||
|
height: 19px;
|
||||||
|
position: absolute;
|
||||||
|
right: 0px;
|
||||||
|
bottom: -1px;
|
||||||
|
margin: 0px;
|
||||||
|
padding: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
span.error {
|
span.error {
|
||||||
color: red;
|
color: red;
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
<%-- TODO make this be dynamic with looking at the filesystem and using jquery --%>
|
<%-- TODO make this be dynamic with looking at the filesystem and using jquery --%>
|
||||||
<script type="text/javascript" src="js/cah.log.js"></script>
|
<script type="text/javascript" src="js/cah.log.js"></script>
|
||||||
<script type="text/javascript" src="js/cah.longpoll.js"></script>
|
<script type="text/javascript" src="js/cah.longpoll.js"></script>
|
||||||
|
<script type="text/javascript" src="js/cah.longpoll.handlers.js"></script>
|
||||||
<script type="text/javascript" src="js/cah.ajax.js"></script>
|
<script type="text/javascript" src="js/cah.ajax.js"></script>
|
||||||
<script type="text/javascript" src="js/cah.ajax.handlers.js"></script>
|
<script type="text/javascript" src="js/cah.ajax.handlers.js"></script>
|
||||||
<script type="text/javascript" src="js/cah.app.js"></script>
|
<script type="text/javascript" src="js/cah.app.js"></script>
|
||||||
|
@ -26,10 +27,15 @@
|
||||||
<div id="nickbox">
|
<div id="nickbox">
|
||||||
Nickname: <input type="text" id="nickname" value="" maxlength="30" />
|
Nickname: <input type="text" id="nickname" value="" maxlength="30" />
|
||||||
<input type="button" id="nicknameconfirm" value="Set" />
|
<input type="button" id="nicknameconfirm" value="Set" />
|
||||||
|
<span id="nickbox_error" class="error"></span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="canvass">
|
<div id="canvass">
|
||||||
|
<div id="chat_area">
|
||||||
<div id="log"></div>
|
<div id="log"></div>
|
||||||
|
<input type="text" id="chat" maxlength="200" />
|
||||||
|
<input type="button" id="chat_submit" value="Chat" />
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
|
|
|
@ -14,7 +14,7 @@ cah.ajax.SuccessHandlers.register = function(data) {
|
||||||
};
|
};
|
||||||
|
|
||||||
cah.ajax.ErrorHandlers.register = function(data) {
|
cah.ajax.ErrorHandlers.register = function(data) {
|
||||||
$("#nickbox").append("<span class='error'>" + data.error_message + "</span>");
|
$("#nickbox_error").text(data.error_message);
|
||||||
$("#nickname").focus();
|
$("#nickname").focus();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -31,7 +31,7 @@ cah.ajax.SuccessHandlers.firstload = function(data) {
|
||||||
};
|
};
|
||||||
|
|
||||||
cah.ajax.ErrorHandlers.firstload = function(data) {
|
cah.ajax.ErrorHandlers.firstload = function(data) {
|
||||||
// TODO dunno what to do here
|
// TODO dunno what to do here, if anything
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -42,3 +42,7 @@ cah.ajax.after_registered = function() {
|
||||||
cah.log.debug("done registering");
|
cah.log.debug("done registering");
|
||||||
cah.longpoll.longPoll();
|
cah.longpoll.longPoll();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
cah.ajax.SuccessHandlers.chat = function(data) {
|
||||||
|
// pass
|
||||||
|
};
|
||||||
|
|
|
@ -5,10 +5,16 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
$(document).ready(function() {
|
$(document).ready(function() {
|
||||||
|
// see if we already exist on the server so we can resume
|
||||||
|
cah.Ajax.request("firstload", {});
|
||||||
|
|
||||||
// TODO see if we have a stored nickname somewhere
|
// TODO see if we have a stored nickname somewhere
|
||||||
$("#nicknameconfirm").click(nicknameconfirm_click);
|
$("#nicknameconfirm").click(nicknameconfirm_click);
|
||||||
$("#nickbox").keyup(nickbox_keyup);
|
$("#nickbox").keyup(nickbox_keyup);
|
||||||
$("#nickbox").focus();
|
$("#nickbox").focus();
|
||||||
|
|
||||||
|
$("#chat").keyup(chat_keyup);
|
||||||
|
$("#chat_submit").click(chatsubmit_click);
|
||||||
});
|
});
|
||||||
|
|
||||||
function nickbox_keyup(e) {
|
function nickbox_keyup(e) {
|
||||||
|
@ -19,8 +25,26 @@ function nickbox_keyup(e) {
|
||||||
}
|
}
|
||||||
|
|
||||||
function nicknameconfirm_click(e) {
|
function nicknameconfirm_click(e) {
|
||||||
nickname = $.trim($("#nickname").val());
|
var nickname = $.trim($("#nickname").val());
|
||||||
cah.ajax.request("register", {
|
cah.Ajax.request("register", {
|
||||||
nickname : nickname
|
nickname : nickname,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function chat_keyup(e) {
|
||||||
|
if (e.which == 13) {
|
||||||
|
$("#chat_submit").click();
|
||||||
|
e.preventDefault();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function chatsubmit_click(e) {
|
||||||
|
var text = $.trim($("#chat").val());
|
||||||
|
// TODO when I get multiple channels working, this needs to know active and pass it
|
||||||
|
cah.Ajax.request("chat", {
|
||||||
|
message : text,
|
||||||
|
});
|
||||||
|
cah.log.status("<" + cah.nickname + "> " + text);
|
||||||
|
$("#chat").val("");
|
||||||
|
$("#chat").focus();
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,28 @@
|
||||||
|
/**
|
||||||
|
* Event handlers from long-poll operations.
|
||||||
|
*
|
||||||
|
* @author ajanata
|
||||||
|
*/
|
||||||
|
|
||||||
|
cah.longpoll.ErrorCodeHandlers.not_registered = function(data) {
|
||||||
|
cah.longpoll.Resume = false;
|
||||||
|
// TODO disable interface
|
||||||
|
cah.log.error("The server seems to have restarted. Any in-progress games have been lost.");
|
||||||
|
cah.log.error("You will need to refresh the page to start a new game.");
|
||||||
|
};
|
||||||
|
|
||||||
|
cah.longpoll.EventHandlers.new_player = function(data) {
|
||||||
|
cah.log.status(data.nickname + " has connected.");
|
||||||
|
};
|
||||||
|
|
||||||
|
cah.longpoll.EventHandlers.noop = function(data) {
|
||||||
|
// pass
|
||||||
|
};
|
||||||
|
|
||||||
|
cah.longpoll.EventHandlers.chat = function(data) {
|
||||||
|
// TODO deal with multiple channels eventually
|
||||||
|
// don't display our own chat
|
||||||
|
if (data.from != cah.nickname) {
|
||||||
|
cah.log.status("<" + data.from + "> " + data.message);
|
||||||
|
}
|
||||||
|
};
|
|
@ -11,6 +11,7 @@ cah.longpoll.INITIAL_BACKOFF = 500;
|
||||||
cah.longpoll.Backoff = cah.longpoll.INITIAL_BACKOFF;
|
cah.longpoll.Backoff = cah.longpoll.INITIAL_BACKOFF;
|
||||||
cah.longpoll.Resume = true;
|
cah.longpoll.Resume = true;
|
||||||
cah.longpoll.ErrorCodeHandlers = {};
|
cah.longpoll.ErrorCodeHandlers = {};
|
||||||
|
cah.longpoll.EventHandlers = {};
|
||||||
|
|
||||||
cah.longpoll.longPoll = function() {
|
cah.longpoll.longPoll = function() {
|
||||||
cah.log.debug("starting long poll");
|
cah.log.debug("starting long poll");
|
||||||
|
@ -42,15 +43,11 @@ cah.longpoll.done = function(data) {
|
||||||
cah.log.error(data.error_message);
|
cah.log.error(data.error_message);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// TODO process data
|
if (cah.longpoll.EventHandlers[data.event]) {
|
||||||
// var req = pendingRequests[data.serial];
|
cah.longpoll.EventHandlers[data.event](data);
|
||||||
// if (req && cah.ajax.SuccessHandlers[req.op]) {
|
} else {
|
||||||
// cah.ajax.SuccessHandlers[req.op](data);
|
cah.log.error("Unhandled event " + data.event);
|
||||||
// } else if (req) {
|
}
|
||||||
// addLogError("Unhandled response for op " + req.op);
|
|
||||||
// } else {
|
|
||||||
// addLogError("Unknown response for serial " + data.serial);
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// reset the backoff to normal when there's a successful operation
|
// reset the backoff to normal when there's a successful operation
|
||||||
|
@ -66,10 +63,3 @@ cah.longpoll.error = function(jqXHR, textStatus, errorThrown) {
|
||||||
.error("Error communicating with server. Will try again in " + (cah.longpoll.Backoff / 1000)
|
.error("Error communicating with server. Will try again in " + (cah.longpoll.Backoff / 1000)
|
||||||
+ " second" + (cah.longpoll.Backoff != 1000 ? "s" : "") + ".");
|
+ " second" + (cah.longpoll.Backoff != 1000 ? "s" : "") + ".");
|
||||||
};
|
};
|
||||||
|
|
||||||
cah.longpoll.ErrorCodeHandlers.not_registered = function(data) {
|
|
||||||
cah.longpoll.Resume = false;
|
|
||||||
// TODO disable interface
|
|
||||||
cah.log.error("The server seems to have restarted. Any in-progress games have been lost.");
|
|
||||||
cah.log.error("You will need to refresh the page to start a new game.");
|
|
||||||
};
|
|
||||||
|
|
|
@ -38,7 +38,7 @@ public class QueuedMessage implements Comparable<QueuedMessage> {
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public enum Type {
|
public enum Type {
|
||||||
PING(0), NEW_PLAYER(5);
|
PING(0), NEW_PLAYER(5), CHAT(5);
|
||||||
|
|
||||||
private final int weight;
|
private final int weight;
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,54 @@
|
||||||
|
package net.socialgamer.cah.handlers;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import javax.servlet.http.HttpSession;
|
||||||
|
|
||||||
|
import net.socialgamer.cah.Server;
|
||||||
|
import net.socialgamer.cah.data.ConnectedUsers;
|
||||||
|
import net.socialgamer.cah.data.QueuedMessage.Type;
|
||||||
|
import net.socialgamer.cah.data.User;
|
||||||
|
|
||||||
|
import com.google.inject.Inject;
|
||||||
|
|
||||||
|
|
||||||
|
public class ChatHandler extends Handler {
|
||||||
|
|
||||||
|
public static final String OP = "chat";
|
||||||
|
|
||||||
|
private final ConnectedUsers users;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
public ChatHandler(final Server server) {
|
||||||
|
this.users = server.getConnectedUsers();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Map<String, Object> handle(final Map<String, String[]> parameters,
|
||||||
|
final HttpSession session) {
|
||||||
|
final Map<String, Object> data = new HashMap<String, Object>();
|
||||||
|
|
||||||
|
final User user = (User) session.getAttribute("user");
|
||||||
|
assert (user != null);
|
||||||
|
|
||||||
|
if (!parameters.containsKey("message") || parameters.get("message").length != 1) {
|
||||||
|
return error("No message specified.");
|
||||||
|
} else {
|
||||||
|
final String message = parameters.get("message")[0].trim();
|
||||||
|
if (message.length() > 200) {
|
||||||
|
return error("Messages cannot be longer than 200 characters.");
|
||||||
|
} else {
|
||||||
|
final HashMap<String, Object> broadcastData = new HashMap<String, Object>();
|
||||||
|
broadcastData.put("event", "chat");
|
||||||
|
broadcastData.put("from", user.getNickname());
|
||||||
|
broadcastData.put("message", message);
|
||||||
|
// TODO once there are multiple chat channels, put the destination here
|
||||||
|
// TODO once there are games and they have their own chat, make it only send to participants
|
||||||
|
users.broadcastToAll(Type.CHAT, broadcastData);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
}
|
|
@ -10,6 +10,7 @@ public class Handlers {
|
||||||
|
|
||||||
static {
|
static {
|
||||||
LIST = new HashMap<String, Class<? extends Handler>>();
|
LIST = new HashMap<String, Class<? extends Handler>>();
|
||||||
|
LIST.put(ChatHandler.OP, ChatHandler.class);
|
||||||
LIST.put(FirstLoadHandler.OP, FirstLoadHandler.class);
|
LIST.put(FirstLoadHandler.OP, FirstLoadHandler.class);
|
||||||
LIST.put(RegisterHandler.OP, RegisterHandler.class);
|
LIST.put(RegisterHandler.OP, RegisterHandler.class);
|
||||||
LIST.put(TestHandler.OP, TestHandler.class);
|
LIST.put(TestHandler.OP, TestHandler.class);
|
||||||
|
|
Loading…
Reference in New Issue