package net.socialgamer.cah.handlers; import java.util.HashMap; import java.util.Map; import javax.servlet.http.HttpSession; import net.socialgamer.cah.Constants.AjaxOperation; import net.socialgamer.cah.Constants.AjaxRequest; import net.socialgamer.cah.Constants.AjaxResponse; import net.socialgamer.cah.Constants.ErrorCode; import net.socialgamer.cah.Constants.ReturnableData; import net.socialgamer.cah.Constants.SessionAttribute; import net.socialgamer.cah.RequestWrapper; import net.socialgamer.cah.data.ConnectedUsers; import net.socialgamer.cah.data.Game; import net.socialgamer.cah.data.Player; import net.socialgamer.cah.data.User; import com.google.inject.Inject; public class ScoreHandler extends Handler { public static final String OP = AjaxOperation.SCORE.toString(); private final ConnectedUsers connectedUsers; @Inject public ScoreHandler(final ConnectedUsers connectedUsers) { this.connectedUsers = connectedUsers; } @Override public Map<ReturnableData, Object> handle(final RequestWrapper request, final HttpSession session) { final User user = (User) session.getAttribute(SessionAttribute.USER); assert (user != null); final String params = request.getParameter(AjaxRequest.MESSAGE); final String[] args = (params == null || params.isEmpty()) ? new String[0] : params.trim() .split(" "); final User target = (args.length > 0) ? connectedUsers.getUser(args[0]) : user; if (null == target) { return error(ErrorCode.NO_SUCH_USER); } final Game game = target.getGame(); if (null == game) { return error(ErrorCode.INVALID_GAME); } final Player player = game.getPlayerForUser(target); if (null == player) { return error(ErrorCode.INVALID_GAME); } final Map<ReturnableData, Object> data = new HashMap<ReturnableData, Object>(); if (user.isAdmin() && args.length == 2) { // for now only admins can change scores. could possibly extend this to let the host do it, // provided it's for a player in the same game and it does a gamewide announcement. try { final int offset = Integer.parseInt(args[1]); player.increaseScore(offset); game.notifyPlayerInfoChange(player); } catch (final NumberFormatException e) { return error(ErrorCode.BAD_REQUEST); } } data.put(AjaxResponse.PLAYER_INFO, game.getPlayerInfo(player)); return data; } }