/* * gw2live - GuildWars 2 Dynamic Map * * Website: http://gw2map.com * * Copyright 2013 zyclonite networx * http://zyclonite.net * Developer: Lukas Prettenthaler */ package net.zyclonite.gw2live.threads; import com.hazelcast.core.IMap; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.concurrent.Callable; import net.zyclonite.gw2live.model.GuildDetails; import net.zyclonite.gw2live.model.WvwEvent; import net.zyclonite.gw2live.model.WvwMap; import net.zyclonite.gw2live.model.WvwMatch; import net.zyclonite.gw2live.model.WvwMatchDetails; import net.zyclonite.gw2live.model.WvwObjective; import net.zyclonite.gw2live.model.WvwScore; import net.zyclonite.gw2live.service.EsperEngine; import net.zyclonite.gw2live.service.Gw2Client; import net.zyclonite.gw2live.service.HazelcastCache; import net.zyclonite.gw2live.service.MongoDB; /** * * @author zyclonite */ public class WvwEventMatcher implements Callable<Boolean> { private final IMap<Integer, WvwEvent> wvwEventCache; private final Gw2Client client; private final MongoDB db; private final EsperEngine esper; private final Date timestamp; public WvwEventMatcher() { final HazelcastCache hz = HazelcastCache.getInstance(); wvwEventCache = hz.getWvwCacheMap(); client = Gw2Client.getInstance(); db = MongoDB.getInstance(); esper = EsperEngine.getInstance(); timestamp = new Date(); } private Boolean getWvwEvents() { final List<WvwEvent> wvwevents = new ArrayList<>(); final List<WvwMatch> wvwmatches = db.findWvwMatches(); for (final WvwMatch match : wvwmatches) { final List<GuildDetails> guildDetails = new ArrayList<>(); final List<WvwScore> scores = new ArrayList<>(); final WvwMatchDetails matchDetails = client.getWvwMatchDetails(match.getWvw_match_id()); if(matchDetails.getMatch_id() == null) { return false; } final WvwScore score = new WvwScore(); score.setMatch_id(matchDetails.getMatch_id()); score.setMap_type("Total"); score.setScores(matchDetails.getScores()); scores.add(score); for (final WvwMap map : matchDetails.getMaps()) { final WvwScore mapscore = new WvwScore(); mapscore.setMatch_id(matchDetails.getMatch_id()); mapscore.setMap_type(map.getType()); mapscore.setScores(map.getScores()); scores.add(mapscore); for (final WvwObjective objective : map.getObjectives()) { final WvwEvent wvwevent = new WvwEvent(); wvwevent.setObjective_id(objective.getId()); wvwevent.setOwner(objective.getOwner()); wvwevent.setOwner_guild(objective.getOwner_guild()); wvwevent.setMap_type(map.getType()); wvwevent.setMap_scores(map.getScores()); wvwevent.setMatch_id(matchDetails.getMatch_id()); wvwevent.setMatch_scores(matchDetails.getScores()); if (objective.getOwner_guild() != null) { if (db.findGuildDetailsById(objective.getOwner_guild()) == null) { guildDetails.add(client.getGuildDetails(objective.getOwner_guild())); } } final WvwEvent oldWveevent = wvwEventCache.get(wvwevent.hashCode()); if (!wvwevent.equals(oldWveevent)) { if(oldWveevent != null && wvwevent.getOwner().equalsIgnoreCase(oldWveevent.getOwner())){ wvwevent.setTimestamp(oldWveevent.getTimestamp()); }else{ wvwevent.setTimestamp(timestamp); //only set timestamp for owner changed events } if (objective.getOwner_guild() != null) { if(oldWveevent != null && wvwevent.getOwner_guild().equalsIgnoreCase(oldWveevent.getOwner_guild())){ wvwevent.setGuild_timestamp(oldWveevent.getGuild_timestamp()); }else{ wvwevent.setGuild_timestamp(timestamp); //only set timestamp for owner_guild changed events } } wvwEventCache.putAsync(wvwevent.hashCode(), wvwevent); esper.sendEvent(wvwevent); wvwevents.add(wvwevent); } } } db.saveWvwScores(scores); db.saveGuildDetails(guildDetails); } db.saveWvwEvents(wvwevents); return true; } @Override public Boolean call() throws Exception { return getWvwEvents(); } }