package fr.lyrgard.hexScape.server.listener;
import com.google.common.eventbus.Subscribe;
import fr.lyrgard.hexScape.bus.CoreMessageBus;
import fr.lyrgard.hexScape.message.DisconnectedFromServerMessage;
import fr.lyrgard.hexScape.message.GameEndedMessage;
import fr.lyrgard.hexScape.message.GameLeftMessage;
import fr.lyrgard.hexScape.model.Universe;
import fr.lyrgard.hexScape.model.game.Game;
import fr.lyrgard.hexScape.model.player.Player;
import fr.lyrgard.hexScape.model.player.User;
import fr.lyrgard.hexScape.model.room.Room;
import fr.lyrgard.hexscape.server.network.ServerNetwork;
public class ServerMessageListener {
private static ServerMessageListener instance;
public static void start() {
if (instance == null) {
instance = new ServerMessageListener();
CoreMessageBus.register(instance);
}
}
private ServerMessageListener() {
}
@Subscribe public void onDisconnect(DisconnectedFromServerMessage message) {
String userId = message.getSessionUserId();
User user = Universe.getInstance().getUsersByIds().get(userId);
if (user != null) {
Room room = user.getRoom();
if (room != null) {
room.getUsers().remove(user);
user.setRoom(null);
DisconnectedFromServerMessage returnMessage = new DisconnectedFromServerMessage(userId);
ServerNetwork.getInstance().sendMessageToRoomExceptUser(returnMessage, room.getId(), userId);
if (user.getGame() != null) {
Game game = user.getGame();
Player player = game.getPlayerByUserId(userId);
String playerId = null;
if (player != null) {
player.setUserId(null);
user.setGame(null);
user.setPlayer(null);
playerId = player.getId();
}
GameLeftMessage returnMessage2 = new GameLeftMessage(user.getId(), playerId, game.getId());
ServerNetwork.getInstance().sendMessageToRoomExceptUser(returnMessage2, room.getId(), user.getId());
if (game.getFreePlayers().size() == game.getPlayers().size()) {
// Empty game, remove
room.getGames().remove(game);
Universe.getInstance().getGamesByGameIds().remove(game.getId());
GameEndedMessage returnMessage3 = new GameEndedMessage(game.getId());
ServerNetwork.getInstance().sendMessageToRoomExceptUser(returnMessage3, room.getId(), userId);
}
}
}
Universe.getInstance().getUsersByIds().remove(userId);
}
}
}