package fr.lyrgard.hexScape.listener;
import java.util.Iterator;
import com.google.common.eventbus.Subscribe;
import fr.lyrgard.hexScape.bus.CoreMessageBus;
import fr.lyrgard.hexScape.bus.GuiMessageBus;
import fr.lyrgard.hexScape.message.DisconnectedFromServerMessage;
import fr.lyrgard.hexScape.message.UserJoinedRoomMessage;
import fr.lyrgard.hexScape.message.RoomJoinedMessage;
import fr.lyrgard.hexScape.model.CurrentUserInfo;
import fr.lyrgard.hexScape.model.Universe;
import fr.lyrgard.hexScape.model.game.Game;
import fr.lyrgard.hexScape.model.player.ColorEnum;
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.service.ColorService;
import fr.lyrgard.hexScape.service.MarkerService;
public class RoomMessageListener {
private static RoomMessageListener INSTANCE = new RoomMessageListener();
public static void start() {
CoreMessageBus.register(INSTANCE);
}
private RoomMessageListener() {
}
@Subscribe public void onRoomJoined(RoomJoinedMessage message) {
Room room = message.getRoom();
Universe.getInstance().getRoomsByRoomIds().put(room.getId(), room);
User user = Universe.getInstance().getUsersByIds().get(CurrentUserInfo.getInstance().getId());
CurrentUserInfo.getInstance().setRoom(room);
Iterator<User> it = room.getUsers().iterator();
while (it.hasNext()) {
User otherUser = it.next();
if (!otherUser.getId().equals(CurrentUserInfo.getInstance().getId())) {
if (otherUser.getColor() == user.getColor()) {
otherUser.setColor(ColorService.getInstance().getNextColorThatIsNot(user.getColor()));
}
otherUser.setRoom(room);
Universe.getInstance().getUsersByIds().put(otherUser.getId(), otherUser);
} else {
// We need to replace ourself in the list by our own Player object (already created)
// so remove the player to is ourself
it.remove();
}
}
// add our own Player object
room.getUsers().add(user);
for (Game game : room.getGames()) {
MarkerService.getInstance().normalizeMarkers(game);
Universe.getInstance().getGamesByGameIds().put(game.getId(), game);
for (Player player : game.getPlayers()) {
if (player.getUserId() != null) {
User aUser = Universe.getInstance().getUsersByIds().get(player.getUserId());
aUser.setPlayer(player);
aUser.setGame(game);
}
}
}
GuiMessageBus.post(message);
}
@Subscribe public void onPlayerJoindedRoom(UserJoinedRoomMessage message) {
String userId = message.getUserId();
String name = message.getName();
ColorEnum color = message.getColor();
User user = Universe.getInstance().getUsersByIds().get(CurrentUserInfo.getInstance().getId());
User joiningUser = new User();
joiningUser.setId(userId);
joiningUser.setName(name);
joiningUser.setColor(color);
String roomId = CurrentUserInfo.getInstance().getRoomId();
Room room = Universe.getInstance().getRoomsByRoomIds().get(roomId);
if (room != null) {
if (joiningUser.getColor() == user.getColor()) {
joiningUser.setColor(ColorService.getInstance().getNextColorThatIsNot(user.getColor()));
}
Universe.getInstance().getUsersByIds().put(joiningUser.getId(), joiningUser);
room.getUsers().add(joiningUser);
}
GuiMessageBus.post(message);
}
@Subscribe public void onRoomLeft(DisconnectedFromServerMessage message) {
GuiMessageBus.post(message);
}
}