ProjectAres/PGM/src/main/java/tc/oc/pgm/api/MatchDocument.java

146 lines
4.6 KiB
Java
Raw Normal View History

2017-01-30 01:43:34 +01:00
package tc.oc.pgm.api;
import java.util.Collection;
import java.util.Optional;
import java.util.Set;
import javax.annotation.Nullable;
import javax.inject.Inject;
import com.google.common.collect.Collections2;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import java.time.Instant;
import tc.oc.api.docs.AbstractModel;
import tc.oc.api.docs.PlayerId;
import tc.oc.api.docs.virtual.CompetitorDoc;
import tc.oc.api.docs.virtual.MapDoc;
import tc.oc.api.docs.virtual.MatchDoc;
import tc.oc.api.docs.virtual.Model;
import tc.oc.api.docs.virtual.ServerDoc;
import tc.oc.commons.core.stream.Collectors;
import tc.oc.commons.core.util.Streams;
import tc.oc.pgm.goals.GoalMatchModule;
import tc.oc.pgm.join.JoinMatchModule;
2017-04-01 01:20:27 +02:00
import tc.oc.pgm.blitz.BlitzMatchModule;
2017-01-30 01:43:34 +01:00
import tc.oc.pgm.match.Competitor;
import tc.oc.pgm.match.Match;
import tc.oc.pgm.match.MatchState;
import tc.oc.pgm.mutation.MutationMatchModule;
import tc.oc.pgm.victory.VictoryMatchModule;
public class MatchDocument extends AbstractModel implements MatchDoc {
private final ServerDoc.Identity localServer;
private final MapDoc map;
private final Match match;
private final VictoryMatchModule victory;
private final Optional<MutationMatchModule> mutations;
private final Optional<GoalMatchModule> goals;
2017-04-01 01:20:27 +02:00
private final BlitzMatchModule blitz;
2017-01-30 01:43:34 +01:00
private final Optional<JoinMatchModule> join;
2017-04-01 01:20:27 +02:00
@Inject MatchDocument(ServerDoc.Identity localServer, MapDoc map, Match match, VictoryMatchModule victory, Optional<MutationMatchModule> mutations, Optional<GoalMatchModule> goals, BlitzMatchModule blitz, Optional<JoinMatchModule> join) {
2017-01-30 01:43:34 +01:00
this.match = match;
this.localServer = localServer;
this.map = map;
this.victory = victory;
this.mutations = mutations;
this.goals = goals;
this.blitz = blitz;
this.join = join;
}
@Override
public String _id() {
return match.getId();
}
@Override
public String server_id() {
return localServer._id();
}
@Override
public String family_id() {
return localServer.family();
}
@Override
public Instant load() {
return match.getLoadTime();
}
@Override
public @Nullable Instant start() {
return match.getStateChangeTime(MatchState.Running);
}
@Override
public @Nullable Instant end() {
return match.getStateChangeTime(MatchState.Finished);
}
@Override
public @Nullable Instant unload() {
return match.getUnloadTime();
}
@Override
public boolean join_mid_match() {
2017-04-01 01:20:27 +02:00
return !blitz.activated() && join.isPresent() && join.get().canJoinMid();
2017-01-30 01:43:34 +01:00
}
@Override public MapDoc map() {
return map;
}
@Override
public int player_count() {
return match.getParticipationClock().getAllWithNonZeroPresence().size();
}
private Collection<String> winningIds(Class<? extends CompetitorDoc> type) {
return match.hasStarted() ? victory.leaders()
.stream()
.map(Competitor::getDocument)
.filter(type::isInstance)
.map(Model::_id)
.collect(Collectors.toImmutableList())
: ImmutableList.of();
}
@Override
public Collection<String> winning_team_ids() {
return winningIds(Team.class);
}
@Override
public Collection<String> winning_user_ids() {
return winningIds(PlayerId.class);
}
@Override
2017-03-31 23:30:41 +02:00
public Set<String> mutations() {
return mutations.map(mmm -> mmm.mutationsHistorical()
2017-01-30 01:43:34 +01:00
.stream()
2017-03-31 23:30:41 +02:00
.map(tc.oc.pgm.mutation.Mutation::name)
2017-01-30 01:43:34 +01:00
.collect(Collectors.toImmutableSet()))
.orElse(ImmutableSet.of());
}
@Override
public Collection<? extends Team> competitors() {
return Streams.instancesOf(match.competitors()
.map(Competitor::getDocument),
Team.class)
.collect(Collectors.toImmutableList());
}
@Override
public Collection<? extends Goal> objectives() {
return goals.map(gmm -> Collections2.transform(gmm.getGoals(),
tc.oc.pgm.goals.Goal::getDocument))
.orElse(ImmutableSet.of());
}
}