Finished working on ChatRequestHandler.
This commit is contained in:
@@ -52,23 +52,23 @@ public class AdminRequestHandler extends LotroServerRequestHandler implements Ur
|
||||
@Override
|
||||
public void handleRequest(String uri, HttpRequest request, Map<Type, Object> context, ResponseWriter responseWriter, MessageEvent e) {
|
||||
try {
|
||||
if (uri.equals("clearCache") && request.getMethod() == HttpMethod.GET) {
|
||||
if (uri.equals("/clearCache") && request.getMethod() == HttpMethod.GET) {
|
||||
clearCache(request, responseWriter);
|
||||
} else if (uri.equals("shutdown") && request.getMethod() == HttpMethod.GET) {
|
||||
} else if (uri.equals("/shutdown") && request.getMethod() == HttpMethod.GET) {
|
||||
shutdown(request, responseWriter);
|
||||
} else if (uri.equals("setMotd") && request.getMethod() == HttpMethod.POST) {
|
||||
} else if (uri.equals("/setMotd") && request.getMethod() == HttpMethod.POST) {
|
||||
setMotd(request, responseWriter);
|
||||
} else if (uri.equals("previewSealedLeague") && request.getMethod() == HttpMethod.POST) {
|
||||
} else if (uri.equals("/previewSealedLeague") && request.getMethod() == HttpMethod.POST) {
|
||||
previewSealedLeague(request, responseWriter);
|
||||
} else if (uri.equals("addSealedLeague") && request.getMethod() == HttpMethod.POST) {
|
||||
} else if (uri.equals("/addSealedLeague") && request.getMethod() == HttpMethod.POST) {
|
||||
addSealedLeague(request, responseWriter);
|
||||
} else if (uri.equals("previewConstructedLeague") && request.getMethod() == HttpMethod.POST) {
|
||||
} else if (uri.equals("/previewConstructedLeague") && request.getMethod() == HttpMethod.POST) {
|
||||
previewConstructedLeague(request, responseWriter);
|
||||
} else if (uri.equals("addConstructedLeague") && request.getMethod() == HttpMethod.POST) {
|
||||
} else if (uri.equals("/addConstructedLeague") && request.getMethod() == HttpMethod.POST) {
|
||||
addConstructedLeague(request, responseWriter);
|
||||
} else if (uri.equals("addItems") && request.getMethod() == HttpMethod.POST) {
|
||||
} else if (uri.equals("/addItems") && request.getMethod() == HttpMethod.POST) {
|
||||
addItems(request, responseWriter);
|
||||
} else if (uri.equals("addItemsToCollection") && request.getMethod() == HttpMethod.POST) {
|
||||
} else if (uri.equals("/addItemsToCollection") && request.getMethod() == HttpMethod.POST) {
|
||||
addItemsToCollection(request, responseWriter);
|
||||
} else {
|
||||
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.Element;
|
||||
|
||||
import javax.ws.rs.WebApplicationException;
|
||||
import javax.ws.rs.core.Response;
|
||||
import javax.xml.parsers.DocumentBuilder;
|
||||
import javax.xml.parsers.DocumentBuilderFactory;
|
||||
import javax.xml.parsers.ParserConfigurationException;
|
||||
@@ -326,9 +324,9 @@ public class HallRequestHandler extends LotroServerRequestHandler implements Uri
|
||||
}
|
||||
_hallServer.processHall(resourceOwner, channelNumber, new SerializeHallInfoVisitor(doc, hall));
|
||||
} catch (SubscriptionExpiredException exp) {
|
||||
throw new WebApplicationException(Response.Status.GONE);
|
||||
throw new HttpProcessingException(410);
|
||||
} catch (SubscriptionConflictException exp) {
|
||||
throw new WebApplicationException(Response.Status.CONFLICT);
|
||||
throw new HttpProcessingException(409);
|
||||
}
|
||||
hall.setAttribute("currency", String.valueOf(_collectionManager.getPlayerCollection(resourceOwner, "permanent").getCurrency()));
|
||||
|
||||
|
||||
@@ -17,6 +17,7 @@ public class RootUriRequestHandler implements UriRequestHandler {
|
||||
private StatusRequestHandler _statusRequestHandler;
|
||||
private DeckRequestHandler _deckRequestHandler;
|
||||
private AdminRequestHandler _adminRequestHandler;
|
||||
private ChatRequestHandler _chatRequestHandler;
|
||||
|
||||
public RootUriRequestHandler(Map<Type, Object> context) {
|
||||
_hallRequestHandler = new HallRequestHandler(context);
|
||||
@@ -24,6 +25,7 @@ public class RootUriRequestHandler implements UriRequestHandler {
|
||||
_loginRequestHandler = new LoginRequestHandler(context);
|
||||
_statusRequestHandler = new StatusRequestHandler(context);
|
||||
_adminRequestHandler = new AdminRequestHandler(context);
|
||||
_chatRequestHandler = new ChatRequestHandler(context);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -40,6 +42,8 @@ public class RootUriRequestHandler implements UriRequestHandler {
|
||||
_loginRequestHandler.handleRequest(uri.substring(_serverContextPath.length()+5), request, context, responseWriter, e);
|
||||
} else if (uri.startsWith(_serverContextPath+"admin")) {
|
||||
_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)) {
|
||||
_statusRequestHandler.handleRequest(uri.substring(_serverContextPath.length()), request, context, responseWriter, e);
|
||||
} else {
|
||||
|
||||
Reference in New Issue
Block a user