134 lines
4.1 KiB
Java
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());
|
|
}
|
|
}
|