servers;
+ try{
+ servers = papi.findServers().getNow(Collections.emptyList());
+ }catch(CancellationException | CompletionException ex){
+ return null;
+ }
+
+ if(servers == null || servers.isEmpty())
+ return null;
+
+ return servers.get(0);
+ });
+ }
+
+ public P getPlayer(Collection
players){
+ if(players.isEmpty())
+ return null;
+
+ return List.copyOf(players).get(0);
+ }
+
+ public String parse(String text, UUID carrier, UUID player){
+ try{
+ CompletableFuture future = papi.formatPlaceholders(text, carrier, player);
+ return future.getNow(text);
+ }catch(IllegalArgumentException | CancellationException | CompletionException ex){
+ return text;
+ }
+ }
+}
diff --git a/core/src/main/java/ch/andre601/advancedserverlist/core/profiles/favicon/FaviconHandler.java b/core/src/main/java/ch/andre601/advancedserverlist/core/profiles/favicon/FaviconHandler.java
index d078f6a2..6d8ac421 100644
--- a/core/src/main/java/ch/andre601/advancedserverlist/core/profiles/favicon/FaviconHandler.java
+++ b/core/src/main/java/ch/andre601/advancedserverlist/core/profiles/favicon/FaviconHandler.java
@@ -39,32 +39,27 @@
import java.net.URL;
import java.net.URLConnection;
import java.util.Locale;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.TimeUnit;
+import java.util.concurrent.*;
import java.util.function.Function;
public class FaviconHandler{
- private final Cache favicons = CacheBuilder.newBuilder()
+ private final Cache> favicons = CacheBuilder.newBuilder()
.expireAfterWrite(5, TimeUnit.MINUTES)
.build();
- private final AdvancedServerList core;
+ private final AdvancedServerList core;
+ private final ThreadPoolExecutor faviconThreadPool;
- public FaviconHandler(AdvancedServerList core){
+ public FaviconHandler(AdvancedServerList core){
this.core = core;
+ this.faviconThreadPool = createFaviconThreadPool();
}
public F getFavicon(String input, Function function){
try{
- return favicons.get(input, () -> {
- BufferedImage image = resolveImage(core, input);
- if(image == null)
- return null;
-
- return function.apply(image);
- });
- }catch(ExecutionException ignored){
+ return favicons.get(input, () -> convert(input, function)).getNow(null);
+ }catch(ExecutionException e){
return null;
}
}
@@ -73,7 +68,17 @@ public void clearCache(){
favicons.invalidateAll();
}
- private BufferedImage resolveImage(AdvancedServerList core, String input){
+ private CompletableFuture convert(String input, Function function){
+ return CompletableFuture.supplyAsync(() -> {
+ BufferedImage img = resolveImage(core, input);
+ if(img == null)
+ return null;
+
+ return function.apply(img);
+ }, faviconThreadPool);
+ }
+
+ private BufferedImage resolveImage(AdvancedServerList core, String input){
InputStream stream;
if(input.toLowerCase(Locale.ROOT).startsWith("https://")){
@@ -126,7 +131,7 @@ private BufferedImage resolveImage(AdvancedServerList core, String input){
}
}
- private InputStream getFromUrl(AdvancedServerList core, String url){
+ private InputStream getFromUrl(AdvancedServerList core, String url){
try{
URL faviconUrl = new URL(url);
URLConnection connection = faviconUrl.openConnection();
@@ -140,4 +145,12 @@ private InputStream getFromUrl(AdvancedServerList core, String url){
return null;
}
}
+
+ private ThreadPoolExecutor createFaviconThreadPool(){
+ return new ThreadPoolExecutor(3, 3, 60L, TimeUnit.SECONDS, new LinkedBlockingDeque<>(1024), r -> {
+ Thread t = new Thread(r, "AdvancedServerList-FaviconThread");
+ t.setDaemon(true);
+ return t;
+ });
+ }
}
diff --git a/core/src/main/resources/config.yml b/core/src/main/resources/config.yml
index d25aaca4..066a01e5 100644
--- a/core/src/main/resources/config.yml
+++ b/core/src/main/resources/config.yml
@@ -37,4 +37,4 @@ checkUpdates: true
# This is used internally to determine if the config needs to be migrated.
# Changing or even removing this option could result in your config being broken.
#
-config-version: 2
+config-version: 2
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 56f0d3ad..44dfc007 100644
--- a/pom.xml
+++ b/pom.xml
@@ -38,7 +38,7 @@
UTF-8
- 3.2.1
+ 3.3.0-b1
Create multiple Server lists based on conditions.
v3.0.0
diff --git a/velocity/src/main/java/ch/andre601/advancedserverlist/velocity/listeners/VelocityEventWrapper.java b/velocity/src/main/java/ch/andre601/advancedserverlist/velocity/listeners/VelocityEventWrapper.java
index 557e438f..feed67f0 100644
--- a/velocity/src/main/java/ch/andre601/advancedserverlist/velocity/listeners/VelocityEventWrapper.java
+++ b/velocity/src/main/java/ch/andre601/advancedserverlist/velocity/listeners/VelocityEventWrapper.java
@@ -28,6 +28,7 @@
import ch.andre601.advancedserverlist.api.events.GenericServerListEvent;
import ch.andre601.advancedserverlist.api.objects.GenericServer;
import ch.andre601.advancedserverlist.api.profiles.ProfileEntry;
+import ch.andre601.advancedserverlist.core.events.PingEventHandler;
import ch.andre601.advancedserverlist.core.interfaces.core.PluginCore;
import ch.andre601.advancedserverlist.core.interfaces.events.GenericEventWrapper;
import ch.andre601.advancedserverlist.core.objects.CachedPlayer;
@@ -37,6 +38,7 @@
import ch.andre601.advancedserverlist.velocity.objects.VelocityPlayerImpl;
import ch.andre601.advancedserverlist.velocity.objects.VelocityProxyImpl;
import com.velocitypowered.api.event.proxy.ProxyPingEvent;
+import com.velocitypowered.api.proxy.Player;
import com.velocitypowered.api.proxy.server.RegisteredServer;
import com.velocitypowered.api.proxy.server.ServerPing;
import com.velocitypowered.api.util.Favicon;
@@ -152,7 +154,25 @@ public String getPlayerIP(){
@Override
public String parsePAPIPlaceholders(String text, VelocityPlayerImpl player){
- return text;
+ if(!plugin.getProxy().getPluginManager().isLoaded("papiproxybridge"))
+ return text;
+
+ if(!PingEventHandler.getPAPIUtil().isCompatible())
+ return text;
+
+ String server = PingEventHandler.getPAPIUtil().getServer();
+ if(server == null || server.isEmpty())
+ return text;
+
+ RegisteredServer registeredServer = plugin.getProxy().getServer(server).orElse(null);
+ if(registeredServer == null || registeredServer.getPlayersConnected().isEmpty())
+ return text;
+
+ Player carrier = PingEventHandler.getPAPIUtil().getPlayer(registeredServer.getPlayersConnected());
+ if(carrier == null)
+ return text;
+
+ return PingEventHandler.getPAPIUtil().parse(text, carrier.getUniqueId(), player.getUUID());
}
@Override
diff --git a/velocity/src/main/resources/velocity-plugin.json b/velocity/src/main/resources/velocity-plugin.json
index 6357098f..6fe86cef 100644
--- a/velocity/src/main/resources/velocity-plugin.json
+++ b/velocity/src/main/resources/velocity-plugin.json
@@ -6,5 +6,11 @@
"authors": [
"Andre_601"
],
+ "dependencies": [
+ {
+ "id": "papiproxybridge",
+ "optional": true
+ }
+ ],
"main": "ch.andre601.advancedserverlist.velocity.VelocityCore"
}
\ No newline at end of file