Finished working on ChatRequestHandler.
This commit is contained in:
@@ -52,23 +52,23 @@ public class AdminRequestHandler extends LotroServerRequestHandler implements Ur
|
|||||||
@Override
|
@Override
|
||||||
public void handleRequest(String uri, HttpRequest request, Map<Type, Object> context, ResponseWriter responseWriter, MessageEvent e) {
|
public void handleRequest(String uri, HttpRequest request, Map<Type, Object> context, ResponseWriter responseWriter, MessageEvent e) {
|
||||||
try {
|
try {
|
||||||
if (uri.equals("clearCache") && request.getMethod() == HttpMethod.GET) {
|
if (uri.equals("/clearCache") && request.getMethod() == HttpMethod.GET) {
|
||||||
clearCache(request, responseWriter);
|
clearCache(request, responseWriter);
|
||||||
} else if (uri.equals("shutdown") && request.getMethod() == HttpMethod.GET) {
|
} else if (uri.equals("/shutdown") && request.getMethod() == HttpMethod.GET) {
|
||||||
shutdown(request, responseWriter);
|
shutdown(request, responseWriter);
|
||||||
} else if (uri.equals("setMotd") && request.getMethod() == HttpMethod.POST) {
|
} else if (uri.equals("/setMotd") && request.getMethod() == HttpMethod.POST) {
|
||||||
setMotd(request, responseWriter);
|
setMotd(request, responseWriter);
|
||||||
} else if (uri.equals("previewSealedLeague") && request.getMethod() == HttpMethod.POST) {
|
} else if (uri.equals("/previewSealedLeague") && request.getMethod() == HttpMethod.POST) {
|
||||||
previewSealedLeague(request, responseWriter);
|
previewSealedLeague(request, responseWriter);
|
||||||
} else if (uri.equals("addSealedLeague") && request.getMethod() == HttpMethod.POST) {
|
} else if (uri.equals("/addSealedLeague") && request.getMethod() == HttpMethod.POST) {
|
||||||
addSealedLeague(request, responseWriter);
|
addSealedLeague(request, responseWriter);
|
||||||
} else if (uri.equals("previewConstructedLeague") && request.getMethod() == HttpMethod.POST) {
|
} else if (uri.equals("/previewConstructedLeague") && request.getMethod() == HttpMethod.POST) {
|
||||||
previewConstructedLeague(request, responseWriter);
|
previewConstructedLeague(request, responseWriter);
|
||||||
} else if (uri.equals("addConstructedLeague") && request.getMethod() == HttpMethod.POST) {
|
} else if (uri.equals("/addConstructedLeague") && request.getMethod() == HttpMethod.POST) {
|
||||||
addConstructedLeague(request, responseWriter);
|
addConstructedLeague(request, responseWriter);
|
||||||
} else if (uri.equals("addItems") && request.getMethod() == HttpMethod.POST) {
|
} else if (uri.equals("/addItems") && request.getMethod() == HttpMethod.POST) {
|
||||||
addItems(request, responseWriter);
|
addItems(request, responseWriter);
|
||||||
} else if (uri.equals("addItemsToCollection") && request.getMethod() == HttpMethod.POST) {
|
} else if (uri.equals("/addItemsToCollection") && request.getMethod() == HttpMethod.POST) {
|
||||||
addItemsToCollection(request, responseWriter);
|
addItemsToCollection(request, responseWriter);
|
||||||
} else {
|
} else {
|
||||||
responseWriter.writeError(404);
|
responseWriter.writeError(404);
|
||||||
|
|||||||
@@ -0,0 +1,148 @@
|
|||||||
|
package com.gempukku.lotro.async.handler;
|
||||||
|
|
||||||
|
import com.gempukku.lotro.PrivateInformationException;
|
||||||
|
import com.gempukku.lotro.SubscriptionExpiredException;
|
||||||
|
import com.gempukku.lotro.async.HttpProcessingException;
|
||||||
|
import com.gempukku.lotro.async.ResponseWriter;
|
||||||
|
import com.gempukku.lotro.chat.ChatMessage;
|
||||||
|
import com.gempukku.lotro.chat.ChatRoomMediator;
|
||||||
|
import com.gempukku.lotro.chat.ChatServer;
|
||||||
|
import com.gempukku.lotro.game.Player;
|
||||||
|
import org.apache.commons.lang.StringEscapeUtils;
|
||||||
|
import org.jboss.netty.channel.MessageEvent;
|
||||||
|
import org.jboss.netty.handler.codec.http.HttpMethod;
|
||||||
|
import org.jboss.netty.handler.codec.http.HttpRequest;
|
||||||
|
import org.jboss.netty.handler.codec.http.QueryStringDecoder;
|
||||||
|
import org.jboss.netty.handler.codec.http.multipart.HttpPostRequestDecoder;
|
||||||
|
import org.w3c.dom.Document;
|
||||||
|
import org.w3c.dom.Element;
|
||||||
|
|
||||||
|
import javax.xml.parsers.DocumentBuilder;
|
||||||
|
import javax.xml.parsers.DocumentBuilderFactory;
|
||||||
|
import java.lang.reflect.Type;
|
||||||
|
import java.net.URLDecoder;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class ChatRequestHandler extends LotroServerRequestHandler implements UriRequestHandler {
|
||||||
|
private long _longPollingLength = 5000;
|
||||||
|
private long _longPollingInterval = 200;
|
||||||
|
private ChatServer _chatServer;
|
||||||
|
|
||||||
|
public ChatRequestHandler(Map<Type, Object> context) {
|
||||||
|
super(context);
|
||||||
|
_chatServer = extractObject(context, ChatServer.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void handleRequest(String uri, HttpRequest request, Map<Type, Object> context, ResponseWriter responseWriter, MessageEvent e) {
|
||||||
|
try {
|
||||||
|
if (uri.startsWith("/") && request.getMethod() == HttpMethod.GET) {
|
||||||
|
getMessages(request, URLDecoder.decode(uri.substring(1)), responseWriter);
|
||||||
|
} else if (uri.startsWith("/") && request.getMethod() == HttpMethod.POST) {
|
||||||
|
postMessages(request, URLDecoder.decode(uri.substring(1)), responseWriter);
|
||||||
|
} else {
|
||||||
|
responseWriter.writeError(404);
|
||||||
|
}
|
||||||
|
} catch (HttpProcessingException exp) {
|
||||||
|
responseWriter.writeError(exp.getStatus());
|
||||||
|
} catch (Exception exp) {
|
||||||
|
responseWriter.writeError(500);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void postMessages(HttpRequest request, String room, ResponseWriter responseWriter) throws Exception {
|
||||||
|
HttpPostRequestDecoder postDecoder = new HttpPostRequestDecoder(request);
|
||||||
|
String participantId = getFormParameterSafely(postDecoder, "participantId");
|
||||||
|
String message = getFormParameterSafely(postDecoder, "message");
|
||||||
|
|
||||||
|
Player resourceOwner = getResourceOwnerSafely(request, participantId);
|
||||||
|
|
||||||
|
ChatRoomMediator chatRoom = _chatServer.getChatRoom(room);
|
||||||
|
if (chatRoom == null)
|
||||||
|
throw new HttpProcessingException(404);
|
||||||
|
|
||||||
|
try {
|
||||||
|
if (message != null && message.trim().length() > 0)
|
||||||
|
chatRoom.sendMessage(resourceOwner.getName(), StringEscapeUtils.escapeHtml(message), resourceOwner.getType().contains("a"));
|
||||||
|
} catch (PrivateInformationException exp) {
|
||||||
|
throw new HttpProcessingException(403);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Use long polling
|
||||||
|
long start = System.currentTimeMillis();
|
||||||
|
while (System.currentTimeMillis() < start + _longPollingLength && !chatRoom.hasPendingMessages(resourceOwner.getName())) {
|
||||||
|
try {
|
||||||
|
Thread.sleep(_longPollingInterval);
|
||||||
|
} catch (InterruptedException exp) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
List<ChatMessage> chatMessages = chatRoom.getPendingMessages(resourceOwner.getName());
|
||||||
|
|
||||||
|
Collection<String> usersInRoom = chatRoom.getUsersInRoom();
|
||||||
|
|
||||||
|
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
|
||||||
|
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
|
||||||
|
|
||||||
|
Document doc = documentBuilder.newDocument();
|
||||||
|
|
||||||
|
serializeChatRoomData(room, chatMessages, usersInRoom, doc);
|
||||||
|
|
||||||
|
responseWriter.writeResponse(doc);
|
||||||
|
} catch (SubscriptionExpiredException exp) {
|
||||||
|
throw new HttpProcessingException(410);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void getMessages(HttpRequest request, String room, ResponseWriter responseWriter) throws Exception {
|
||||||
|
QueryStringDecoder queryDecoder = new QueryStringDecoder(request.getUri());
|
||||||
|
String participantId = getQueryParameterSafely(queryDecoder, "participantId");
|
||||||
|
|
||||||
|
Player resourceOwner = getResourceOwnerSafely(request, participantId);
|
||||||
|
|
||||||
|
ChatRoomMediator chatRoom = _chatServer.getChatRoom(room);
|
||||||
|
if (chatRoom == null)
|
||||||
|
throw new HttpProcessingException(404);
|
||||||
|
try {
|
||||||
|
List<ChatMessage> chatMessages = chatRoom.joinUser(resourceOwner.getName(), resourceOwner.getType().contains("a"));
|
||||||
|
Collection<String> usersInRoom = chatRoom.getUsersInRoom();
|
||||||
|
|
||||||
|
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
|
||||||
|
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
|
||||||
|
|
||||||
|
Document doc = documentBuilder.newDocument();
|
||||||
|
|
||||||
|
serializeChatRoomData(room, chatMessages, usersInRoom, doc);
|
||||||
|
|
||||||
|
responseWriter.writeResponse(doc);
|
||||||
|
} catch (PrivateInformationException exp) {
|
||||||
|
throw new HttpProcessingException(403);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private void serializeChatRoomData(String room, List<ChatMessage> chatMessages, Collection<String> usersInRoom, Document doc) {
|
||||||
|
Element chatElem = doc.createElement("chat");
|
||||||
|
chatElem.setAttribute("roomName", room);
|
||||||
|
doc.appendChild(chatElem);
|
||||||
|
|
||||||
|
for (ChatMessage chatMessage : chatMessages) {
|
||||||
|
Element message = doc.createElement("message");
|
||||||
|
message.setAttribute("from", chatMessage.getFrom());
|
||||||
|
message.setAttribute("date", String.valueOf(chatMessage.getWhen().getTime()));
|
||||||
|
message.appendChild(doc.createTextNode(chatMessage.getMessage()));
|
||||||
|
chatElem.appendChild(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (String userInRoom : usersInRoom) {
|
||||||
|
Element user = doc.createElement("user");
|
||||||
|
user.appendChild(doc.createTextNode(userInRoom));
|
||||||
|
chatElem.appendChild(user);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -24,8 +24,6 @@ import org.jboss.netty.handler.codec.http.multipart.HttpPostRequestDecoder;
|
|||||||
import org.w3c.dom.Document;
|
import org.w3c.dom.Document;
|
||||||
import org.w3c.dom.Element;
|
import org.w3c.dom.Element;
|
||||||
|
|
||||||
import javax.ws.rs.WebApplicationException;
|
|
||||||
import javax.ws.rs.core.Response;
|
|
||||||
import javax.xml.parsers.DocumentBuilder;
|
import javax.xml.parsers.DocumentBuilder;
|
||||||
import javax.xml.parsers.DocumentBuilderFactory;
|
import javax.xml.parsers.DocumentBuilderFactory;
|
||||||
import javax.xml.parsers.ParserConfigurationException;
|
import javax.xml.parsers.ParserConfigurationException;
|
||||||
@@ -326,9 +324,9 @@ public class HallRequestHandler extends LotroServerRequestHandler implements Uri
|
|||||||
}
|
}
|
||||||
_hallServer.processHall(resourceOwner, channelNumber, new SerializeHallInfoVisitor(doc, hall));
|
_hallServer.processHall(resourceOwner, channelNumber, new SerializeHallInfoVisitor(doc, hall));
|
||||||
} catch (SubscriptionExpiredException exp) {
|
} catch (SubscriptionExpiredException exp) {
|
||||||
throw new WebApplicationException(Response.Status.GONE);
|
throw new HttpProcessingException(410);
|
||||||
} catch (SubscriptionConflictException exp) {
|
} catch (SubscriptionConflictException exp) {
|
||||||
throw new WebApplicationException(Response.Status.CONFLICT);
|
throw new HttpProcessingException(409);
|
||||||
}
|
}
|
||||||
hall.setAttribute("currency", String.valueOf(_collectionManager.getPlayerCollection(resourceOwner, "permanent").getCurrency()));
|
hall.setAttribute("currency", String.valueOf(_collectionManager.getPlayerCollection(resourceOwner, "permanent").getCurrency()));
|
||||||
|
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ public class RootUriRequestHandler implements UriRequestHandler {
|
|||||||
private StatusRequestHandler _statusRequestHandler;
|
private StatusRequestHandler _statusRequestHandler;
|
||||||
private DeckRequestHandler _deckRequestHandler;
|
private DeckRequestHandler _deckRequestHandler;
|
||||||
private AdminRequestHandler _adminRequestHandler;
|
private AdminRequestHandler _adminRequestHandler;
|
||||||
|
private ChatRequestHandler _chatRequestHandler;
|
||||||
|
|
||||||
public RootUriRequestHandler(Map<Type, Object> context) {
|
public RootUriRequestHandler(Map<Type, Object> context) {
|
||||||
_hallRequestHandler = new HallRequestHandler(context);
|
_hallRequestHandler = new HallRequestHandler(context);
|
||||||
@@ -24,6 +25,7 @@ public class RootUriRequestHandler implements UriRequestHandler {
|
|||||||
_loginRequestHandler = new LoginRequestHandler(context);
|
_loginRequestHandler = new LoginRequestHandler(context);
|
||||||
_statusRequestHandler = new StatusRequestHandler(context);
|
_statusRequestHandler = new StatusRequestHandler(context);
|
||||||
_adminRequestHandler = new AdminRequestHandler(context);
|
_adminRequestHandler = new AdminRequestHandler(context);
|
||||||
|
_chatRequestHandler = new ChatRequestHandler(context);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -40,6 +42,8 @@ public class RootUriRequestHandler implements UriRequestHandler {
|
|||||||
_loginRequestHandler.handleRequest(uri.substring(_serverContextPath.length()+5), request, context, responseWriter, e);
|
_loginRequestHandler.handleRequest(uri.substring(_serverContextPath.length()+5), request, context, responseWriter, e);
|
||||||
} else if (uri.startsWith(_serverContextPath+"admin")) {
|
} else if (uri.startsWith(_serverContextPath+"admin")) {
|
||||||
_adminRequestHandler.handleRequest(uri.substring(_serverContextPath.length()+5), request, context, responseWriter, e);
|
_adminRequestHandler.handleRequest(uri.substring(_serverContextPath.length()+5), request, context, responseWriter, e);
|
||||||
|
} else if (uri.startsWith(_serverContextPath + "chat")) {
|
||||||
|
_chatRequestHandler.handleRequest(uri.substring(_serverContextPath.length()+4), request, context, responseWriter, e);
|
||||||
} else if (uri.equals(_serverContextPath)) {
|
} else if (uri.equals(_serverContextPath)) {
|
||||||
_statusRequestHandler.handleRequest(uri.substring(_serverContextPath.length()), request, context, responseWriter, e);
|
_statusRequestHandler.handleRequest(uri.substring(_serverContextPath.length()), request, context, responseWriter, e);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
Reference in New Issue
Block a user