@Override public void gameChanged(final IMPL game, final P initiatingPlayer, final boolean initiatingServer) { if (broadcasterFactory.getBroadcasterFactory() != null) { try { //noinspection unchecked List<P> players = game.getAllPlayers().stream() .map(p -> (P) p) .filter(x -> initiatingPlayer == null || !x.equals(initiatingPlayer)) .collect(Collectors.toList()); logger.trace( "Publishing {} to {} players.", game.getIdAsString(), players.size()); players.forEach(player -> publishWithRetry(new PlayerCallable() { @Override public Boolean call() throws Exception { return publishGameToPlayer(player, game); } })); } catch (Exception e) { logger.error("Error publishing game " + game.getId(), e); } } else { logger.warn("No broadcaster in game changed"); } }
private boolean publishGameToPlayer(final P player, final IMPL game) { logger.trace("Publishing game update on game " + game.getId() + " to player " + player.getId()); final boolean[] status = new boolean[]{false}; try { Broadcaster broadcaster = broadcasterFactory.getBroadcasterFactory() .lookup(LiveFeedService.PATH_ROOT + player.getIdAsString()); if (broadcaster != null) { WebSocketMessage message = new WebSocketMessage(); message.setMessageType(MessageType.Game); message.setGame(gameMasker.maskGameForPlayer(game, player)); broadcaster.broadcast(message); status[0] = true; } else { logger.trace( "Player {} is not connected to this server for {}.", player.getIdAsString(), game.getIdAsString()); } } catch (Exception e) { logger.error("Error publishing game " + game.getId() + " to player " + player.getId(), e); } publicationListeners.forEach(listener -> { try { listener.publishedGameUpdateToPlayer(player, game, status[0]); } catch (Exception e) { logger.error("Error publishing to publication listener", e); } }); return status[0]; }