59 lines
1.8 KiB
Java
59 lines
1.8 KiB
Java
package tc.oc.pgm.mutation;
|
|
|
|
import java.util.Collection;
|
|
import java.util.Collections;
|
|
import java.util.HashSet;
|
|
import java.util.stream.Collectors;
|
|
import javax.inject.Inject;
|
|
|
|
import com.google.common.util.concurrent.ListenableFuture;
|
|
import tc.oc.api.docs.Server;
|
|
import tc.oc.api.docs.virtual.ServerDoc;
|
|
import tc.oc.api.minecraft.MinecraftService;
|
|
|
|
/**
|
|
* The set of mutations queued to load for the next match, as stored in the local server document.
|
|
*/
|
|
public class MutationQueue {
|
|
|
|
private final MinecraftService minecraftService;
|
|
|
|
@Inject MutationQueue(MinecraftService minecraftService) {
|
|
this.minecraftService = minecraftService;
|
|
}
|
|
|
|
public Collection<Mutation> mutations() {
|
|
return minecraftService
|
|
.getLocalServer()
|
|
.queued_mutations()
|
|
.stream()
|
|
.flatMap(Mutation::fromString)
|
|
.collect(Collectors.toList());
|
|
}
|
|
|
|
public ListenableFuture<Server> clear() {
|
|
return force(Collections.emptyList());
|
|
}
|
|
|
|
public ListenableFuture<Server> removeAll(final Collection<Mutation> mutations) {
|
|
Collection<Mutation> removed = mutations();
|
|
removed.removeAll(mutations);
|
|
return force(removed);
|
|
}
|
|
|
|
public ListenableFuture<Server> mergeAll(final Collection<Mutation> mutations) {
|
|
Collection<Mutation> merged = new HashSet<>();
|
|
for(Mutation mutation : Mutation.values()) {
|
|
if(mutations.contains(mutation) || mutations().contains(mutation)) {
|
|
merged.add(mutation);
|
|
}
|
|
}
|
|
return force(merged);
|
|
}
|
|
|
|
private ListenableFuture<Server> force(final Collection<Mutation> mutations) {
|
|
return minecraftService.updateLocalServer((ServerDoc.Mutation) () -> mutations.stream().map(Mutation::name).collect(Collectors.toSet()));
|
|
}
|
|
|
|
}
|