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;
}
}