package com.cardshifter.server.model; import com.cardshifter.api.*; import com.cardshifter.api.both.*; import com.cardshifter.api.incoming.*; import com.cardshifter.api.messages.*; import com.cardshifter.api.outgoing.*; import com.cardshifter.core.messages.*; import org.apache.log4j.*; import java.util.*; public class HandlerManager { private static final Logger logger = LogManager.getLogger(HandlerManager.class); private final IncomingHandler incomingHandler; private final CommandHandler commandHandler; public HandlerManager(Server server) { incomingHandler = new IncomingHandler(); commandHandler = new CommandHandler(server); Handlers handlers = new Handlers(server); addUnauthorizedHandler("login", LoginMessage.class, handlers::loginMessage); addUnauthorizedHandler("query", ServerQueryMessage.class, handlers::query); addHandler("chat", ChatMessage.class, handlers::chat); addHandler("startgame", StartGameRequest.class, handlers::play); addHandler("inviteResponse", InviteResponse.class, handlers::inviteResponse); // Directly game-related addHandler("use", UseAbilityMessage.class, handlers::useAbility); addHandler("requestTargets", RequestTargetsMessage.class, handlers::requestTargets); addHandler("playerconfig", PlayerConfigMessage.class, handlers::incomingConfig); } public IncomingHandler getIncomingHandler() { return incomingHandler; } public CommandHandler getCommandHandler() { return commandHandler; } public <E extends Message> void addHandler(String command, Class<E> handler, MessageHandler<E> consumer) { this.addUnauthorizedHandler(command, handler, new AuthorizationDecorator<>(consumer)); } public <E extends Message> void addUnauthorizedHandler(String command, Class<E> handler, MessageHandler<E> consumer) { this.incomingHandler.addHandler(command, handler, consumer); } public void handleMessage(ClientIO client, String json) { Objects.requireNonNull(client, "Cannot handle message from a null client"); logger.info("Handle message " + client + ": " + json); Message message; try { message = getIncomingHandler().parse(json); logger.info("Parsed Message: " + message); getIncomingHandler().perform(message, client); } catch (Exception e) { logger.error("Unable to parse incoming json: " + json, e); client.sendToClient(new ServerErrorMessage(e.getMessage())); } } }