From 4c586d1803a9762183caef93531a1ae69058ea8f Mon Sep 17 00:00:00 2001 From: Sxtanna Date: Fri, 24 Jul 2020 08:24:07 -0400 Subject: [PATCH 1/4] updated cloud manager to not be weird --- .../cloud/ExpansionCloudManager.java | 125 +++++++++--------- 1 file changed, 59 insertions(+), 66 deletions(-) diff --git a/src/main/java/me/clip/placeholderapi/expansion/cloud/ExpansionCloudManager.java b/src/main/java/me/clip/placeholderapi/expansion/cloud/ExpansionCloudManager.java index 86fa45c..7cbfb44 100644 --- a/src/main/java/me/clip/placeholderapi/expansion/cloud/ExpansionCloudManager.java +++ b/src/main/java/me/clip/placeholderapi/expansion/cloud/ExpansionCloudManager.java @@ -22,6 +22,7 @@ package me.clip.placeholderapi.expansion.cloud; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; +import com.google.common.io.Resources; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import me.clip.placeholderapi.PlaceholderAPI; @@ -30,26 +31,22 @@ import me.clip.placeholderapi.expansion.PlaceholderExpansion; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Unmodifiable; -import java.io.BufferedReader; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; -import java.io.InputStreamReader; +import java.lang.reflect.Type; import java.net.URL; import java.nio.channels.Channels; import java.nio.channels.ReadableByteChannel; -import java.util.ArrayList; +import java.nio.charset.StandardCharsets; import java.util.Collections; -import java.util.Comparator; import java.util.HashMap; -import java.util.List; import java.util.Map; import java.util.Optional; import java.util.Set; import java.util.TreeMap; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionException; -import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Function; import java.util.logging.Level; import java.util.stream.Collectors; @@ -58,7 +55,9 @@ public final class ExpansionCloudManager { private static final String API_URL = "http://api.extendedclip.com/v2/"; - private static final Gson GSON = new Gson(); + + private static final Gson GSON = new Gson(); + private static final Type TYPE = new TypeToken>() {}.getType(); @NotNull @@ -68,7 +67,7 @@ public final class ExpansionCloudManager @NotNull - private final Map expansions = new TreeMap<>(); + private final Map expansions = new TreeMap<>(); @NotNull private final Map> downloading = new HashMap<>(); @@ -87,7 +86,7 @@ public final class ExpansionCloudManager @NotNull @Unmodifiable - public Map getCloudExpansions() + public Map getCloudExpansions() { return ImmutableMap.copyOf(expansions); } @@ -127,36 +126,32 @@ public final class ExpansionCloudManager @NotNull @Unmodifiable - public Map getAllByAuthor(@NotNull final String author) + public Map getAllByAuthor(@NotNull final String author) { if (expansions.isEmpty()) { return Collections.emptyMap(); } - final AtomicInteger index = new AtomicInteger(); - return expansions.values() .stream() .filter(expansion -> author.equalsIgnoreCase(expansion.getAuthor())) - .collect(Collectors.toMap(($) -> index.incrementAndGet(), Function.identity())); + .collect(Collectors.toMap(CloudExpansion::getName, Function.identity())); } @NotNull @Unmodifiable - public Map getAllInstalled() + public Map getAllInstalled() { if (expansions.isEmpty()) { return Collections.emptyMap(); } - final AtomicInteger index = new AtomicInteger(); - return expansions.values() .stream() .filter(CloudExpansion::hasExpansion) - .collect(Collectors.toMap(($) -> index.incrementAndGet(), Function.identity())); + .collect(Collectors.toMap(CloudExpansion::getName, Function.identity())); } @@ -168,70 +163,68 @@ public final class ExpansionCloudManager downloading.clear(); } - public void fetch(boolean allowUnverified) + @NotNull + public CompletableFuture> fetch(boolean allowUnverified) { plugin.getLogger().info("Fetching available expansion information..."); - plugin.getServer().getScheduler().runTaskAsynchronously(plugin, () -> { - final Map data = new HashMap<>(); + CompletableFuture> future = CompletableFuture.supplyAsync(() -> { + final Map values = new HashMap<>(); - try (BufferedReader reader = new BufferedReader(new InputStreamReader(new URL(API_URL).openStream()))) + try { - data.putAll(GSON.fromJson(reader, new TypeToken>() - { - }.getType())); + //noinspection UnstableApiUsage + final String json = Resources.toString(new URL(API_URL), StandardCharsets.UTF_8); + values.putAll(GSON.fromJson(json, TYPE)); } - catch (Exception ex) + catch (final IOException ex) { - if (plugin.getPlaceholderAPIConfig().isDebugMode()) - { - ex.printStackTrace(); - } - else - { - plugin.getLogger().warning("Unable to fetch expansions!\nThere was an error with the server host connecting to the PlaceholderAPI eCloud (https://api.extendedclip.com/v2/)"); - } + throw new CompletionException(ex); } - final List unsorted = new ArrayList<>(); + values.values().removeIf(value -> value.getLatestVersion() == null || value.getVersion(value.getLatestVersion()) == null); - data.forEach((name, cexp) -> { - if ((allowUnverified || cexp.isVerified()) && cexp.getLatestVersion() != null && cexp.getVersion(cexp.getLatestVersion()) != null) + return values; + }); + + + if (!allowUnverified) + { + future = future.thenApplyAsync((values) -> { + values.values().removeIf(expansion -> !expansion.isVerified()); + return values; + }); + } + + + future = future.thenApplyAsync((values) -> { + + values.forEach((name, expansion) -> { + expansion.setName(name); + + final PlaceholderExpansion local = plugin.getExpansionManager().getRegisteredExpansion(name); + if (local != null && local.isRegistered()) { - cexp.setName(name); - - PlaceholderExpansion ex = plugin.getExpansionManager().getRegisteredExpansion(cexp.getName()); - - if (ex != null && ex.isRegistered()) - { - cexp.setHasExpansion(true); - if (!ex.getVersion().equals(cexp.getLatestVersion())) - { - cexp.setShouldUpdate(true); - } - } - - unsorted.add(cexp); + expansion.setHasExpansion(true); + expansion.setShouldUpdate(!local.getVersion().equals(expansion.getLatestVersion())); } }); - unsorted.sort(Comparator.comparing(CloudExpansion::getLastUpdate).reversed()); - - int count = 0; - for (CloudExpansion e : unsorted) - { - expansions.put(count++, e); - } - - plugin.getLogger().info(count + " placeholder expansions are available on the cloud."); - - long updates = getCloudUpdateCount(); - - if (updates > 0) - { - plugin.getLogger().info(updates + " installed expansions have updates available."); - } + return values; }); + + future.whenComplete((expansions, exception) -> { + + if (exception != null) + { + plugin.getLogger().log(Level.WARNING, "failed to download expansion information", exception); + return; + } + + this.expansions.putAll(expansions); + }); + + return future; } From 651de80a014b6a0ebfba2e8f2c9024aae1da701a Mon Sep 17 00:00:00 2001 From: Sxtanna Date: Fri, 24 Jul 2020 08:24:35 -0400 Subject: [PATCH 2/4] updated expansion list command to send messages using json --- .../cloud/CommandECloudExpansionList.java | 159 ++++++++++++++---- 1 file changed, 128 insertions(+), 31 deletions(-) diff --git a/src/main/java/me/clip/placeholderapi/commands/impl/cloud/CommandECloudExpansionList.java b/src/main/java/me/clip/placeholderapi/commands/impl/cloud/CommandECloudExpansionList.java index 4e4a8d5..70b5615 100644 --- a/src/main/java/me/clip/placeholderapi/commands/impl/cloud/CommandECloudExpansionList.java +++ b/src/main/java/me/clip/placeholderapi/commands/impl/cloud/CommandECloudExpansionList.java @@ -1,19 +1,25 @@ package me.clip.placeholderapi.commands.impl.cloud; import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Lists; import com.google.common.collect.Sets; import com.google.common.primitives.Ints; import me.clip.placeholderapi.PlaceholderAPIPlugin; import me.clip.placeholderapi.commands.PlaceholderCommand; import me.clip.placeholderapi.expansion.cloud.CloudExpansion; import me.clip.placeholderapi.util.Msg; +import me.rayzr522.jsonmessage.JSONMessage; +import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Unmodifiable; +import java.text.SimpleDateFormat; +import java.util.Collection; import java.util.Collections; +import java.util.Comparator; import java.util.List; -import java.util.Map; import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; @@ -22,7 +28,7 @@ import java.util.stream.IntStream; public final class CommandECloudExpansionList extends PlaceholderCommand { - private static final int PAGE_SIZE = 3; + private static final int PAGE_SIZE = 10; @Unmodifiable @@ -45,8 +51,7 @@ public final class CommandECloudExpansionList extends PlaceholderCommand return; } - - @Unmodifiable final Map expansions = getExpansions(params.get(0), plugin); + final List expansions = Lists.newArrayList(getExpansions(params.get(0), plugin)); final int page; @@ -77,6 +82,7 @@ public final class CommandECloudExpansionList extends PlaceholderCommand page = parsed; } + expansions.sort(Comparator.comparing(CloudExpansion::getLastUpdate).reversed()); final StringBuilder builder = new StringBuilder(); final List values = getPage(expansions, page - 1, PAGE_SIZE); @@ -100,27 +106,63 @@ public final class CommandECloudExpansionList extends PlaceholderCommand .append(page) .append('\n'); - int index = ((page - 1) * PAGE_SIZE) + 1; - for (final CloudExpansion expansion : values) + + if (sender instanceof Player) { - builder.append("&8") - .append(index++) - .append(". ") - .append(expansion.shouldUpdate() ? "&e" : "&a") - .append(expansion.getName()) - .append('\n') - .append(" &bAuthor: &f") - .append(expansion.getAuthor()) - .append('\n') - .append(" &bVerified: ") - .append(expansion.isVerified() ? "&a&l✔&r" : "&c&l❌&r") - .append('\n') - .append(" &bLatest Version: &f") - .append(expansion.getLatestVersion()) - .append('\n'); + Msg.msg(sender, builder.toString()); + + final int limit = (int) Math.ceil((double) expansions.size() / PAGE_SIZE); + + final JSONMessage message = getMessage(values, page); + + if (limit > 1) + { + message.newline(); + + message.then("◀") + .color(page <= 1 ? ChatColor.GRAY : ChatColor.DARK_GRAY); + if (page > 1) + { + message.runCommand("/papi ecloud list " + params.get(0) + " " + (page - 1)); + } + + message.then(" " + page + " ").color(ChatColor.GREEN); + + message.then("▶") + .color(page >= limit ? ChatColor.GRAY : ChatColor.DARK_GRAY); + if (page < limit) + { + message.runCommand("/papi ecloud list " + params.get(0) + " " + (page + 1)); + } + } + + message.send(((Player) sender)); + } + else + { + int index = ((page - 1) * PAGE_SIZE) + 1; + for (final CloudExpansion expansion : values) + { + builder.append("&8") + .append(index++) + .append(". ") + .append((expansion.shouldUpdate() ? "&6" : expansion.hasExpansion() ? "&a" : "&7")) + .append(expansion.getName()) + .append('\n') + .append(" &bAuthor: &f") + .append(expansion.getAuthor()) + .append('\n') + .append(" &bVerified: ") + .append(expansion.isVerified() ? "&a&l✔&r" : "&c&l❌&r") + .append('\n') + .append(" &bLatest Version: &f") + .append(expansion.getLatestVersion()) + .append('\n'); + } + + Msg.msg(sender, builder.toString()); } - Msg.msg(sender, builder.toString()); } @Override @@ -137,14 +179,12 @@ public final class CommandECloudExpansionList extends PlaceholderCommand return; } - final Map expansions = getExpansions(params.get(0), plugin); - - suggestByParameter(IntStream.rangeClosed(1, (int) Math.ceil((double) expansions.size() / PAGE_SIZE)).mapToObj(Objects::toString), suggestions, params.get(1)); + suggestByParameter(IntStream.rangeClosed(1, (int) Math.ceil((double) getExpansions(params.get(0), plugin).size() / PAGE_SIZE)).mapToObj(Objects::toString), suggestions, params.get(1)); } @NotNull - private static List getPage(@NotNull final Map expansions, final int page, final int pageSize) + private static List getPage(@NotNull final List expansions, final int page, final int pageSize) { if (expansions.isEmpty()) { @@ -152,23 +192,80 @@ public final class CommandECloudExpansionList extends PlaceholderCommand } final int head = (page * pageSize); - final int tail = (head + pageSize); + final int tail = Math.min(expansions.size(), head + pageSize); + + if (expansions.size() < head) + { + return Collections.emptyList(); + } return IntStream.range(head, tail).mapToObj(expansions::get).filter(Objects::nonNull).collect(Collectors.toList()); } @NotNull - private static Map getExpansions(@NotNull final String target, @NotNull final PlaceholderAPIPlugin plugin) + private static Collection getExpansions(@NotNull final String target, @NotNull final PlaceholderAPIPlugin plugin) { switch (target.toLowerCase()) { case "all": - return plugin.getExpansionCloud().getCloudExpansions(); + return plugin.getExpansionCloud().getCloudExpansions().values(); case "installed": - return plugin.getExpansionCloud().getAllInstalled(); + return plugin.getExpansionCloud().getAllInstalled().values(); default: - return plugin.getExpansionCloud().getAllByAuthor(target); + return plugin.getExpansionCloud().getAllByAuthor(target).values(); } } + @NotNull + private static JSONMessage getMessage(@NotNull final List expansions, final int page) + { + final SimpleDateFormat format = PlaceholderAPIPlugin.getDateFormat(); + + final StringBuilder tooltip = new StringBuilder(); + final JSONMessage message = JSONMessage.create(); + + int index = ((page - 1) * PAGE_SIZE) + 1; + for (int i = 0; i < expansions.size(); i++) + { + final CloudExpansion expansion = expansions.get(i); + tooltip.append("&bClick to download this expansion!") + .append('\n') + .append('\n') + .append("&bAuthor: &f") + .append(expansion.getAuthor()) + .append('\n') + .append("&bVerified: ") + .append(expansion.isVerified() ? "&a&l✔&r" : "&c&l❌&r") + .append('\n') + .append("&bLatest Version: &f") + .append(expansion.getLatestVersion()) + .append('\n') + .append("&bReleased: &f") + .append(format.format(expansion.getLastUpdate())); + + final String description = expansion.getDescription(); + if (description != null && !description.isEmpty()) + { + tooltip.append('\n') + .append('\n') + .append("&f") + .append(description.replace("\r", "").trim()); + } + + message.then(Msg.color("&8" + (index++) + ".&r " + (expansion.shouldUpdate() ? "&6" : expansion.hasExpansion() ? "&a" : "&7") + expansion.getName())); + + message.tooltip(Msg.color(tooltip.toString())); + message.suggestCommand("/papi ecloud download " + expansion.getName()); + + if (i < expansions.size() - 1) + { + message.newline(); + } + + tooltip.setLength(0); + } + + return message; + } + } From ffe2bb28ba63d720cdd320981ec4dae8d0b5c220 Mon Sep 17 00:00:00 2001 From: darbyjack Date: Fri, 24 Jul 2020 10:48:37 -0500 Subject: [PATCH 3/4] Fix gradle resolve --- build.gradle | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index c99195b..9c49f70 100644 --- a/build.gradle +++ b/build.gradle @@ -10,6 +10,7 @@ description 'PlaceholderAPI' sourceCompatibility = JavaVersion.VERSION_1_8 repositories { + mavenCentral() mavenLocal() maven { url = 'https://hub.spigotmc.org/nexus/content/repositories/snapshots/' @@ -20,9 +21,6 @@ repositories { maven { url = 'https://rayzr.dev/repo/' } - maven { - url = 'http://repo.maven.apache.org/maven2' - } } dependencies { From 623fd68ccc3e2170b477946861b6d0f0d5cc22aa Mon Sep 17 00:00:00 2001 From: extendedclip Date: Fri, 24 Jul 2020 12:40:07 -0400 Subject: [PATCH 4/4] eCloud list outputs expansion information on a single line instead of multiple. Fixes #367 --- .../impl/cloud/CommandECloudExpansionList.java | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/main/java/me/clip/placeholderapi/commands/impl/cloud/CommandECloudExpansionList.java b/src/main/java/me/clip/placeholderapi/commands/impl/cloud/CommandECloudExpansionList.java index 70b5615..71962ac 100644 --- a/src/main/java/me/clip/placeholderapi/commands/impl/cloud/CommandECloudExpansionList.java +++ b/src/main/java/me/clip/placeholderapi/commands/impl/cloud/CommandECloudExpansionList.java @@ -148,16 +148,15 @@ public final class CommandECloudExpansionList extends PlaceholderCommand .append(". ") .append((expansion.shouldUpdate() ? "&6" : expansion.hasExpansion() ? "&a" : "&7")) .append(expansion.getName()) - .append('\n') - .append(" &bAuthor: &f") + .append(" &8[&bAuthor: &f") .append(expansion.getAuthor()) - .append('\n') - .append(" &bVerified: ") + .append("&8, ") + .append("&bVerified: ") .append(expansion.isVerified() ? "&a&l✔&r" : "&c&l❌&r") - .append('\n') - .append(" &bLatest Version: &f") + .append("&8, ") + .append("&bLatest Version: &f") .append(expansion.getLatestVersion()) - .append('\n'); + .append("&8]"); } Msg.msg(sender, builder.toString());