Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added Support for passing ForwardingAudience.Single instead of the actual instance #70

Merged
merged 1 commit into from
May 2, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
58 changes: 35 additions & 23 deletions api/src/main/java/io/github/miniplaceholders/api/ExpansionImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import io.github.miniplaceholders.api.placeholder.AudiencePlaceholder;
import io.github.miniplaceholders.api.placeholder.RelationalPlaceholder;
import io.github.miniplaceholders.api.utils.Conditions;
import net.kyori.adventure.audience.ForwardingAudience;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

Expand All @@ -21,6 +22,8 @@
import net.kyori.adventure.text.minimessage.tag.resolver.ArgumentQueue;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;

import static java.util.Objects.requireNonNull;

final class ExpansionImpl implements Expansion {
private final String name;
private final Tags.Single[] audiencePlaceholders;
Expand Down Expand Up @@ -56,46 +59,55 @@ final class ExpansionImpl implements Expansion {
}

@Override
public @NotNull TagResolver audiencePlaceholders(@NotNull final Audience audience){
if(audiencePlaceholders.length == 0) return TagResolver.empty();
public @NotNull TagResolver audiencePlaceholders(@NotNull Audience audience) {
if (audiencePlaceholders.length == 0) return TagResolver.empty();

Objects.requireNonNull(audience, "the audience cannot be null");
requireNonNull(audience, "the audience cannot be null");

if(this.singleFilter(audience)) return TagResolver.empty();
if ((audience = expansionFilter(audience)) == null) return TagResolver.empty();

final TagResolver.Builder placeholders = TagResolver.builder();
for(final Tags.Single pl : this.audiencePlaceholders){
for (final Tags.Single pl : this.audiencePlaceholders) {
placeholders.resolver(pl.of(audience));
}
return placeholders.build();
}

private boolean singleFilter(final Audience audience){
return filterClass != null && !filterClass.isInstance(audience)
|| predicateFilter != null && predicateFilter.test(audience);
private Audience expansionFilter(final Audience audience) {
if (filterClass == null && predicateFilter == null) {
return audience;
}
final boolean eligible = filterClass != null && filterClass.isInstance(audience)
|| predicateFilter != null && predicateFilter.test(audience);
if (eligible) {
return audience;
}
if (audience instanceof final ForwardingAudience.Single forward) {
return expansionFilter(forward.audience());
}
return null;
}

@Override
public @NotNull TagResolver relationalPlaceholders(@NotNull final Audience audience, @NotNull final Audience otherAudience){
if(relationalPlaceholders.length == 0) return TagResolver.empty();
public @NotNull TagResolver relationalPlaceholders(@NotNull Audience audience, @NotNull Audience otherAudience){
if (relationalPlaceholders.length == 0) return TagResolver.empty();

Objects.requireNonNull(audience, "the audience cannot be null");
Objects.requireNonNull(otherAudience, "the other audience cannot be null");
requireNonNull(audience, "the audience cannot be null");
requireNonNull(otherAudience, "the other audience cannot be null");

if (this.relationalFilter(audience, otherAudience)) return TagResolver.empty();
audience = expansionFilter(audience);
otherAudience = expansionFilter(otherAudience);
if (audience == null || otherAudience == null) {
return TagResolver.empty();
}

final TagResolver.Builder placeholders = TagResolver.builder();
for (final Tags.Relational pl : this.relationalPlaceholders){
for (final Tags.Relational pl : this.relationalPlaceholders) {
placeholders.resolver(pl.of(audience, otherAudience));
}
return placeholders.build();
}

private boolean relationalFilter(final Audience audience, final Audience otherAudience){
return filterClass != null && (!filterClass.isInstance(audience) || !filterClass.isInstance(otherAudience))
|| predicateFilter != null && (!predicateFilter.test(audience) || !predicateFilter.test(otherAudience));
}

@Override
public @NotNull TagResolver globalPlaceholders(){
return this.globalPlaceholders;
Expand Down Expand Up @@ -138,7 +150,7 @@ static final class Builder implements Expansion.Builder {
@Override
public @NotNull Builder audiencePlaceholder(@NotNull final String key, @NotNull final AudiencePlaceholder audiencePlaceholder){
Conditions.nonNullOrEmptyString(key, () -> "placeholder key");
Objects.requireNonNull(audiencePlaceholder, "the audience placeholder cannot be null");
requireNonNull(audiencePlaceholder, "the audience placeholder cannot be null");

if (this.audiencePlaceholders == null) this.audiencePlaceholders = new HashSet<>(5);

Expand All @@ -149,7 +161,7 @@ static final class Builder implements Expansion.Builder {
@Override
public @NotNull Builder relationalPlaceholder(@NotNull final String key, @NotNull final RelationalPlaceholder relationalPlaceholder){
Conditions.nonNullOrEmptyString(key, () -> "placeholder key");
Objects.requireNonNull(relationalPlaceholder, "the relational placeholder cannot be null");
requireNonNull(relationalPlaceholder, "the relational placeholder cannot be null");

if (this.relationalPlaceholders == null) this.relationalPlaceholders = new HashSet<>(4);

Expand All @@ -160,7 +172,7 @@ static final class Builder implements Expansion.Builder {
@Override
public @NotNull Builder globalPlaceholder(@NotNull final String key, @NotNull final BiFunction<ArgumentQueue, Context, Tag> function){
Conditions.nonNullOrEmptyString(key, () -> "placeholder key");
Objects.requireNonNull(function, "the global placeholder cannot be null");
requireNonNull(function, "the global placeholder cannot be null");

if(this.globalPlaceholders == null) this.globalPlaceholders = TagResolver.builder();

Expand All @@ -171,7 +183,7 @@ static final class Builder implements Expansion.Builder {
@Override
public @NotNull Builder globalPlaceholder(@NotNull final String key, @NotNull final Tag tag){
Conditions.nonNullOrEmptyString(key, () -> "placeholder key");
Objects.requireNonNull(tag, "the tag cannot be null");
requireNonNull(tag, "the tag cannot be null");

if(this.globalPlaceholders == null) this.globalPlaceholders = TagResolver.builder();

Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
package io.github.miniplaceholders.test;

import static net.kyori.adventure.text.minimessage.MiniMessage.miniMessage;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.*;

import io.github.miniplaceholders.test.testobjects.TestAudience;
import org.junit.jupiter.api.Test;
Expand All @@ -25,12 +24,15 @@ void audienceExpansionPlaceholdersTest(){
TestAudience player = new TestAudience("4drian3d");

Expansion expansion = Expansion.builder("example")
.audiencePlaceholder("name", (aud, queue, ctx) -> Tag.selfClosingInserting(Component.text(((TestAudience)aud).name()))).build();
.audiencePlaceholder("name", (aud, queue, ctx) -> {
TestAudience audience = (TestAudience) aud;
return Tag.selfClosingInserting(Component.text(audience.name()));
}).build();

final Component expected = Component.text("Player Name: 4drian3d");
final Component result = MiniMessage.miniMessage().deserialize("Player Name: <example_name>", expansion.audiencePlaceholders(player));
final Component result = miniMessage().deserialize("Player Name: <example_name>", expansion.audiencePlaceholders(player));

assertEquals(expected, result);
assertContentEquals(expected, result);
}

@Test
Expand Down Expand Up @@ -61,7 +63,7 @@ void globalExpansionPlaceholderTest(){
final Component expected = Component.text("Online players: 1305 | Servers: 7");
final Component actual = MiniMessage.miniMessage().deserialize("Online players: <global_players> | Servers: <global_servers>", expansion.globalPlaceholders());

assertEquals(expected, actual);
assertContentEquals(expected, actual);
}

@Test
Expand Down Expand Up @@ -94,8 +96,8 @@ void filteredExpansion(){
Component playerExpected = Component.text("Player Name: TestPlayer04");
Component emptyExpected = Component.text("Player Name: <filter_name>");

assertEquals(playerExpected, MiniMessage.miniMessage().deserialize(string, expansion.audiencePlaceholders(player)));
assertEquals(emptyExpected, MiniMessage.miniMessage().deserialize(string, expansion.audiencePlaceholders(emptyAudience)));
assertContentEquals(playerExpected, MiniMessage.miniMessage().deserialize(string, expansion.audiencePlaceholders(player)));
assertContentEquals(emptyExpected, MiniMessage.miniMessage().deserialize(string, expansion.audiencePlaceholders(emptyAudience)));
}

@Test
Expand All @@ -118,6 +120,25 @@ void testEmptyArguments() {
assertContentEquals(parsed, Component.text("Arguments: 2"));
}

@Test
@DisplayName("Forwarding Audience Parsing Test")
void forwardingAudienceTest() {
Expansion expansion = Expansion.builder("test")
.filter(TestAudience.class)
.audiencePlaceholder("testing", (audience, queue, ctx) -> {
TestAudience testAudience = (TestAudience) audience;
return Tag.selfClosingInserting(Component.text("Name: "+testAudience.name()));
}).build();

TestAudience testAudience = new TestAudience("4drian3d");
Audience forward = Audience.audience(testAudience);

Component parsed = miniMessage().deserialize("<test_testing>.", expansion.audiencePlaceholders(forward));
Component expected = Component.text("Name: 4drian3d.");

assertContentEquals(parsed, expected);
}

void assertContentEquals(Component first, Component second){
String firstSerialized = PlainTextComponentSerializer.plainText().serialize(first);
String secondSerialized = PlainTextComponentSerializer.plainText().serialize(second);
Expand Down