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.ErrorCode;
import net.socialgamer.cah.Constants.GameState;
import net.socialgamer.cah.Constants.ReturnableData;
import net.socialgamer.cah.RequestWrapper;
import net.socialgamer.cah.data.Game;
import net.socialgamer.cah.data.GameManager;
import net.socialgamer.cah.data.GameOptions;
import net.socialgamer.cah.data.User;
import com.google.inject.Inject;
public class ChangeGameOptionHandler extends GameWithPlayerHandler {
public static final String OP = AjaxOperation.CHANGE_GAME_OPTIONS.toString();
@Inject
public ChangeGameOptionHandler(final GameManager gameManager) {
super(gameManager);
}
@Override
public Map<ReturnableData, Object> handleWithUserInGame(final RequestWrapper request,
final HttpSession session, final User user, final Game game) {
final Map<ReturnableData, Object> data = new HashMap<ReturnableData, Object>();
if (game.getHost() != user) {
return error(ErrorCode.NOT_GAME_HOST);
} else if (game.getState() != GameState.LOBBY) {
return error(ErrorCode.ALREADY_STARTED);
} else {
try {
final String value = request.getParameter(AjaxRequest.GAME_OPTIONS);
final GameOptions options = GameOptions.deserialize(value);
final String oldPassword = game.getPassword();
game.updateGameSettings(options);
// only broadcast an update if the password state has changed, because it needs to change
// the text on the join button and the sort order
if (!game.getPassword().equals(oldPassword)) {
gameManager.broadcastGameListRefresh();
}
} catch (final Exception e) {
return error(ErrorCode.BAD_REQUEST);
}
return data;
}
}
}