oglimmer/ggo

View on GitHub
atmosphere-mvc/src/main/java/de/oglimmer/atmospheremvc/com/AtmosphereHandler.java

Summary

Maintainability
A
0 mins
Test Coverage
package de.oglimmer.atmospheremvc.com;

import static org.atmosphere.cpr.ApplicationConfig.MAX_INACTIVE;

import java.io.IOException;
import java.util.Date;

import javax.inject.Inject;

import org.atmosphere.config.service.Disconnect;
import org.atmosphere.config.service.Get;
import org.atmosphere.config.service.ManagedService;
import org.atmosphere.config.service.Message;
import org.atmosphere.config.service.Ready;
import org.atmosphere.cpr.AtmosphereResource;
import org.atmosphere.cpr.AtmosphereResourceImpl;

import de.oglimmer.atmospheremvc.game.Game;
import de.oglimmer.atmospheremvc.game.Games;
import de.oglimmer.atmospheremvc.game.Player;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@ManagedService(path = "/srvcom", atmosphereConfig = MAX_INACTIVE + "=120000")
public class AtmosphereHandler {

    @Inject
    private AtmosphereResource r;

    @Get
    public void init(AtmosphereResource r) {
        r.getResponse().setCharacterEncoding("UTF-8");
    }

    @Ready
    public void onReady(AtmosphereResource r) {
        log.debug("Browser {} connected", r.uuid());
        AtmosphereResourceCache.INSTANCE.connect((AtmosphereResourceImpl) r);
    }

    /*
     * If you don't want to use injection AtmosphereResourceEvent event
     */
    @Disconnect
    public void onDisconnect() {
        log.debug("Browser {} disconnect", r.uuid());
        AtmosphereResourceCache.INSTANCE.disconnect(r.uuid());
    }

    @Message(encoders = { JacksonEncoder.class }, decoders = { JacksonDecoder.class })
    public void onMessage(CommandMessage message) throws IOException {
        log.debug("onMessage: {}", message);
        Game game = Games.<Game> getGames().getGameByPlayerId(message.getPid());
        if (game == null) {
            // @TODO: send 'game not exists'
        } else {
            Player player = game.getPlayerById(message.getPid());
            player.setLastAction(new Date());
            player.setLastConnection(new Date());
            assert player != null;
            if ("join".equals(message.getCmd())) {
                AtmosphereResourceCache.INSTANCE.registerPlayer(player, r.uuid());
            }
            game.getCurrentPhase().execCmd(player, message.getCmd(), message.getParam());
            game.getCurrentPhase().updateMessages();
            game.getCurrentPhase().updateModalDialgs();
            MessageQueue messages = new MessageQueue(game);
            messages.process();
        }
    }

}