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

134 lines
4.1 KiB
Java

package tc.oc.pgm.api;
import java.util.HashMap;
import java.util.Map;
import javax.annotation.Nullable;
import javax.inject.Inject;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import java.time.Instant;
import tc.oc.api.bukkit.users.BukkitUserStore;
import tc.oc.api.docs.Participation;
import tc.oc.api.docs.Server;
import tc.oc.api.model.BatchUpdater;
import tc.oc.api.model.BatchUpdaterFactory;
import tc.oc.api.model.IdFactory;
import tc.oc.pgm.events.ListenerScope;
import tc.oc.pgm.events.PlayerPartyChangeEvent;
import tc.oc.pgm.match.Competitor;
import tc.oc.pgm.match.Match;
import tc.oc.pgm.match.MatchModule;
import tc.oc.pgm.match.MatchPlayer;
import tc.oc.pgm.match.MatchScope;
import tc.oc.pgm.match.Party;
import tc.oc.pgm.teams.Team;
@ListenerScope(MatchScope.LOADED)
public class ParticipationPublishingMatchModule extends MatchModule implements Listener {
private final Server localServer;
private final BukkitUserStore userStore;
private final IdFactory idFactory;
private final BatchUpdater<Participation.Partial> batchUpdater;
private final Map<MatchPlayer, String> participationIds = new HashMap<>();
@Inject ParticipationPublishingMatchModule(Match match, Server localServer, BukkitUserStore userStore, IdFactory idFactory, BatchUpdaterFactory<Participation.Partial> updaterFactory) {
super(match);
this.localServer = localServer;
this.userStore = userStore;
this.idFactory = idFactory;
this.batchUpdater = updaterFactory.createBatchUpdater();
}
@Override
public void unload() {
for(MatchPlayer player : getMatch().getParticipatingPlayers()) {
finish(player);
}
batchUpdater.flush();
super.unload();
}
private void finish(MatchPlayer player) {
final String oldId = participationIds.remove(player);
if(oldId != null) {
batchUpdater.update(new Participation.Finish() {
@Override
public String _id() {
return oldId;
}
@Override
public Instant end() {
return Instant.now();
}
});
}
}
private void start(final MatchPlayer player, @Nullable Party party) {
if(party instanceof Competitor) {
final String id = idFactory.newId();
final Team team = party instanceof Team ? ((Team) party) : null;
participationIds.put(player, id);
batchUpdater.update(new Participation.Start() {
@Override
public String _id() {
return id;
}
@Override
public String player_id() {
return player.getPlayerId().player_id();
}
@Override
public Instant start() {
return Instant.now();
}
@Override
public String team_id() {
return team == null ? null : team.slug();
}
@Override
public String league_team_id() {
return team == null ? null : team.getLeagueTeamId();
}
@Override
public String family() {
return localServer.family();
}
@Override
public String match_id() {
return getMatch().getId();
}
@Override
public String server_id() {
return localServer._id();
}
@Override
public String session_id() {
return userStore.getSession(player.getBukkit())._id();
}
});
}
}
@EventHandler(priority = EventPriority.MONITOR)
public void onPartyChange(final PlayerPartyChangeEvent event) {
finish(event.getPlayer());
start(event.getPlayer(), event.getNewParty());
}
}