diff --git a/api/src/main/java/net/luckperms/api/track/TrackManager.java b/api/src/main/java/net/luckperms/api/track/TrackManager.java index f1719a673..c5c22ae4e 100644 --- a/api/src/main/java/net/luckperms/api/track/TrackManager.java +++ b/api/src/main/java/net/luckperms/api/track/TrackManager.java @@ -96,6 +96,27 @@ public interface TrackManager { */ @NonNull CompletableFuture deleteTrack(@NonNull Track track); + /** + * Loads (or creates) a track from the plugin's storage provider, applies the given {@code action}, + * then saves the track's data back to storage. + * + *

This method effectively calls {@link #createAndLoadTrack(String)}, followed by the + * {@code action}, then {@link #saveTrack(Track)}, and returns an encapsulation of the whole + * process as a {@link CompletableFuture}.

+ * + * @param name the name of the track + * @param action the action to apply to the track + * @return a future to encapsulate the operation + * @since 5.5 + */ + default @NonNull CompletableFuture modifyTrack(@NonNull String name, @NonNull Consumer action) { + /* This default method is overridden in the implementation, and is just here + to demonstrate what this method does in the API sources. */ + return createAndLoadTrack(name) + .thenApplyAsync(track -> { action.accept(track); return track; }) + .thenCompose(this::saveTrack); + } + /** * Loads all tracks into memory. * diff --git a/common/src/main/java/me/lucko/luckperms/common/api/implementation/ApiTrackManager.java b/common/src/main/java/me/lucko/luckperms/common/api/implementation/ApiTrackManager.java index d329022db..1d2ce0df7 100644 --- a/common/src/main/java/me/lucko/luckperms/common/api/implementation/ApiTrackManager.java +++ b/common/src/main/java/me/lucko/luckperms/common/api/implementation/ApiTrackManager.java @@ -38,6 +38,7 @@ import java.util.Objects; import java.util.Optional; import java.util.Set; import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; public class ApiTrackManager extends ApiAbstractManager> implements net.luckperms.api.track.TrackManager { public ApiTrackManager(LuckPermsPlugin plugin, TrackManager handle) { @@ -74,6 +75,19 @@ public class ApiTrackManager extends ApiAbstractManager modifyTrack(@NonNull String name, @NonNull Consumer action) { + Objects.requireNonNull(name, "name"); + Objects.requireNonNull(action, "action"); + + return this.plugin.getStorage().createAndLoadTrack(name, CreationCause.API) + .thenApplyAsync(track -> { + action.accept(track.getApiProxy()); + return track; + }, this.plugin.getBootstrap().getScheduler().async()) + .thenCompose(track -> this.plugin.getStorage().saveTrack(track)); + } + @Override public @NonNull CompletableFuture loadAllTracks() { return this.plugin.getStorage().loadAllTracks();