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.DisconnectReason; import net.socialgamer.cah.Constants.ErrorCode; import net.socialgamer.cah.Constants.LongPollEvent; import net.socialgamer.cah.Constants.LongPollResponse; 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.QueuedMessage; import net.socialgamer.cah.data.QueuedMessage.MessageType; import net.socialgamer.cah.data.User; import org.apache.log4j.Logger; import com.google.inject.Inject; public class KickHandler extends Handler { protected final Logger logger = Logger.getLogger(KickHandler.class); public static final String OP = AjaxOperation.KICK.toString(); private final ConnectedUsers connectedUsers; @Inject public KickHandler(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); if (!user.isAdmin()) { return error(ErrorCode.NOT_ADMIN); } if (null == request.getParameter(AjaxRequest.NICKNAME) || request.getParameter(AjaxRequest.NICKNAME).isEmpty()) { return error(ErrorCode.NO_NICK_SPECIFIED); } final User kickUser = connectedUsers.getUser(request.getParameter(AjaxRequest.NICKNAME)); if (null == kickUser) { return error(ErrorCode.NO_SUCH_USER); } final Map<ReturnableData, Object> kickData = new HashMap<ReturnableData, Object>(); kickData.put(LongPollResponse.EVENT, LongPollEvent.KICKED.toString()); final QueuedMessage qm = new QueuedMessage(MessageType.KICKED, kickData); kickUser.enqueueMessage(qm); connectedUsers.removeUser(kickUser, DisconnectReason.KICKED); logger.warn(String.format("Kicking %s by request of %s", kickUser.getNickname(), user.getNickname())); return new HashMap<ReturnableData, Object>(); } }