Skip to content

Commit

Permalink
address review comments
Browse files Browse the repository at this point in the history
  • Loading branch information
zml2008 committed Feb 12, 2023
1 parent a45d602 commit f7b2457
Show file tree
Hide file tree
Showing 4 changed files with 38 additions and 27 deletions.
28 changes: 17 additions & 11 deletions api/src/main/java/net/kyori/adventure/text/event/ClickCallback.java
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@
import net.kyori.adventure.permission.PermissionChecker;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.util.PlatformAPI;
import net.kyori.adventure.util.TriState;
import net.kyori.examination.Examinable;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
Expand Down Expand Up @@ -124,7 +123,7 @@ public interface ClickCallback<T extends Audience> {
/**
* Require that audiences receiving this callback have a certain permission.
*
* <p>For audiences without permissions information, this test will always pass.</p>
* <p>For audiences without permissions information, this test will always fail.</p>
*
* <p>Actions from audiences that do not match this predicate will be silently ignored.</p>
*
Expand All @@ -139,15 +138,15 @@ public interface ClickCallback<T extends Audience> {
/**
* Require that audiences receiving this callback have a certain permission.
*
* <p>For audiences without permissions information, this test will always pass.</p>
* <p>For audiences without permissions information, this test will always fail.</p>
*
* @param permission the permission to check
* @param failureMessage a message to send if the conditions are not met
* @return a modified callback
* @since 4.13.0
*/
default @NotNull ClickCallback<T> requiringPermission(final @NotNull String permission, final @Nullable Component failureMessage) {
return this.filter(audience -> audience.getOrDefault(PermissionChecker.POINTER, PermissionChecker.always(TriState.TRUE)).test(permission), failureMessage);
return this.filter(audience -> audience.getOrDefault(PermissionChecker.POINTER, ClickCallbackInternals.ALWAYS_FALSE).test(permission), failureMessage);
}

/**
Expand All @@ -157,6 +156,13 @@ public interface ClickCallback<T extends Audience> {
*/
@ApiStatus.NonExtendable
interface Options extends Examinable {
/**
* Indicate that a callback should have unlimited uses.
*
* @since 4.13.0
*/
int UNLIMITED_USES = -1;

/**
* Create a new builder.
*
Expand All @@ -179,19 +185,19 @@ interface Options extends Examinable {
}

/**
* Whether the callback can be executed multiple times.
* The number of times this callback can be executed.
*
* <p>By default callbacks are single-use.</p>
*
* @return whether this callback is multi-use
* @return allowable use count, or {@link #UNLIMITED_USES}
* @since 4.13.0
*/
boolean multiUse();
int uses();

/**
* How long this callback will last until it is made invalid.
*
* <p>By default callbacks last 12 hours..</p>
* <p>By default callbacks last 12 hours.</p>
*
* @return the duration of this callback
* @since 4.13.0
Expand All @@ -206,13 +212,13 @@ interface Options extends Examinable {
@ApiStatus.NonExtendable
interface Builder extends AbstractBuilder<Options> {
/**
* Set whether the callback can be multi-use.
* Set the number of uses allowed for this callback.
*
* @param multiUse whether multiple clicks are allowed
* @param useCount the number of allowed uses, or {@link Options#UNLIMITED_USES}
* @return this builder
* @since 4.13.0
*/
@NotNull Builder multiUse(boolean multiUse);
@NotNull Builder uses(int useCount);

/**
* Set how long the callback should last from sending.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,13 +24,17 @@
package net.kyori.adventure.text.event;

import net.kyori.adventure.audience.Audience;
import net.kyori.adventure.permission.PermissionChecker;
import net.kyori.adventure.util.Services;
import net.kyori.adventure.util.TriState;
import org.jetbrains.annotations.NotNull;

final class ClickCallbackProviderLookup {
private ClickCallbackProviderLookup() {
final class ClickCallbackInternals {
private ClickCallbackInternals() {
}

static final PermissionChecker ALWAYS_FALSE = PermissionChecker.always(TriState.FALSE);

static final ClickCallback.Provider PROVIDER = Services.service(ClickCallback.Provider.class)
.orElseGet(Fallback::new);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,17 +35,17 @@
final class ClickCallbackOptionsImpl implements ClickCallback.Options {
static final ClickCallback.Options DEFAULT = new ClickCallbackOptionsImpl.BuilderImpl().build();

private final boolean multiUse;
private final int uses;
private final Duration lifetime;

ClickCallbackOptionsImpl(final boolean multiUse, final Duration lifetime) {
this.multiUse = multiUse;
ClickCallbackOptionsImpl(final int uses, final Duration lifetime) {
this.uses = uses;
this.lifetime = lifetime;
}

@Override
public boolean multiUse() {
return this.multiUse;
public int uses() {
return this.uses;
}

@Override
Expand All @@ -56,7 +56,7 @@ public boolean multiUse() {
@Override
public @NotNull Stream<? extends ExaminableProperty> examinableProperties() {
return Stream.of(
ExaminableProperty.of("multiUse", this.multiUse),
ExaminableProperty.of("uses", this.uses),
ExaminableProperty.of("expiration", this.lifetime)
);
}
Expand All @@ -67,26 +67,27 @@ public String toString() {
}

static final class BuilderImpl implements Builder {
private boolean multiUse;
private int uses;
private Duration lifetime;

BuilderImpl() {
this.uses = 1;
this.lifetime = Duration.ofHours(12);
}

BuilderImpl(final ClickCallback.@NotNull Options existing) {
this.multiUse = existing.multiUse();
this.uses = existing.uses();
this.lifetime = existing.lifetime();
}

@Override
public ClickCallback.@NotNull Options build() {
return new ClickCallbackOptionsImpl(this.multiUse, this.lifetime);
return new ClickCallbackOptionsImpl(this.uses, this.lifetime);
}

@Override
public @NotNull Builder multiUse(final boolean multiUse) {
this.multiUse = multiUse;
public @NotNull Builder uses(final int uses) {
this.uses = uses;
return this;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,7 @@ public final class ClickEvent implements Examinable, StyleBuilderApplicable {
* @since 4.13.0
*/
public static @NotNull ClickEvent callback(final @NotNull ClickCallback<Audience> function) {
return ClickCallbackProviderLookup.PROVIDER.create(requireNonNull(function, "function"), ClickCallbackOptionsImpl.DEFAULT);
return ClickCallbackInternals.PROVIDER.create(requireNonNull(function, "function"), ClickCallbackOptionsImpl.DEFAULT);
}

/**
Expand All @@ -161,7 +161,7 @@ public final class ClickEvent implements Examinable, StyleBuilderApplicable {
* @since 4.13.0
*/
public static @NotNull ClickEvent callback(final @NotNull ClickCallback<Audience> function, final ClickCallback.@NotNull Options options) {
return ClickCallbackProviderLookup.PROVIDER.create(requireNonNull(function, "function"), requireNonNull(options, "options"));
return ClickCallbackInternals.PROVIDER.create(requireNonNull(function, "function"), requireNonNull(options, "options"));
}

/**
Expand All @@ -173,7 +173,7 @@ public final class ClickEvent implements Examinable, StyleBuilderApplicable {
* @since 4.13.0
*/
public static @NotNull ClickEvent callback(final @NotNull ClickCallback<Audience> function, final @NotNull Consumer<ClickCallback.Options.@NotNull Builder> optionsBuilder) {
return ClickCallbackProviderLookup.PROVIDER.create(
return ClickCallbackInternals.PROVIDER.create(
requireNonNull(function, "function"),
AbstractBuilder.configureAndBuild(ClickCallback.Options.builder(), requireNonNull(optionsBuilder, "optionsBuilder"))
);
Expand Down

0 comments on commit f7b2457

Please sign in to comment.