From f5051022aa5ad1bb8cab4d979afab57d199caa40 Mon Sep 17 00:00:00 2001 From: Andre601 <11576465+Andre601@users.noreply.github.com> Date: Tue, 6 Dec 2022 21:24:43 +0100 Subject: [PATCH 1/6] Create unified EventHandler --- .../bungeecord/events/BungeeEventWrapper.java | 148 ++++++++++++++++++ .../bungeecord/events/PingEvent.java | 101 +----------- .../core/events/PingEventHandler.java | 103 ++++++++++++ .../core/interfaces/GenericEventWrapper.java | 65 ++++++++ 4 files changed, 318 insertions(+), 99 deletions(-) create mode 100644 bungeecord/src/main/java/ch/andre601/advancedserverlist/bungeecord/events/BungeeEventWrapper.java create mode 100644 core/src/main/java/ch/andre601/advancedserverlist/core/events/PingEventHandler.java create mode 100644 core/src/main/java/ch/andre601/advancedserverlist/core/interfaces/GenericEventWrapper.java diff --git a/bungeecord/src/main/java/ch/andre601/advancedserverlist/bungeecord/events/BungeeEventWrapper.java b/bungeecord/src/main/java/ch/andre601/advancedserverlist/bungeecord/events/BungeeEventWrapper.java new file mode 100644 index 00000000..4e64105a --- /dev/null +++ b/bungeecord/src/main/java/ch/andre601/advancedserverlist/bungeecord/events/BungeeEventWrapper.java @@ -0,0 +1,148 @@ +/* + * MIT License + * + * Copyright (c) 2022 Andre_601 + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + */ + +package ch.andre601.advancedserverlist.bungeecord.events; + +import ch.andre601.advancedserverlist.bungeecord.BungeeCordCore; +import ch.andre601.advancedserverlist.bungeecord.BungeePlayer; +import ch.andre601.advancedserverlist.core.interfaces.GenericEventWrapper; +import ch.andre601.advancedserverlist.core.profiles.players.GenericPlayer; +import ch.andre601.advancedserverlist.core.profiles.replacer.placeholders.PlayerPlaceholders; +import ch.andre601.advancedserverlist.core.profiles.replacer.placeholders.ServerPlaceholders; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.serializer.bungeecord.BungeeComponentSerializer; +import net.md_5.bungee.api.Favicon; +import net.md_5.bungee.api.ServerPing; +import net.md_5.bungee.api.chat.TextComponent; +import net.md_5.bungee.api.connection.ProxiedPlayer; +import net.md_5.bungee.api.event.ProxyPingEvent; + +import java.net.InetSocketAddress; +import java.util.List; + +public class BungeeEventWrapper implements GenericEventWrapper{ + + private final BungeeCordCore plugin; + private final ProxyPingEvent event; + private ServerPing.Protocol protocol; + private ServerPing ping; + + public BungeeEventWrapper(BungeeCordCore plugin, ProxyPingEvent event){ + this.plugin = plugin; + this.event = event; + this.protocol = event.getResponse().getVersion(); + this.ping = event.getResponse(); + } + + @Override + public void setMaxPlayers(int maxPlayers){ + ping.getPlayers().setMax(maxPlayers); + } + + @Override + public void setMotd(Component component){ + ping.setDescriptionComponent(new TextComponent(BungeeComponentSerializer.get().serialize(component))); + } + + @Override + public void hidePlayers(){ + ping.setPlayers(null); + } + + @Override + public void setPlayerCount(String name){ + protocol.setName(name); + protocol.setProtocol(-1); + } + + @Override + public void setPlayers(List players, PlayerPlaceholders playerPlaceholders, ServerPlaceholders serverPlaceholders){ + ServerPing.PlayerInfo[] playerInfos = plugin.createPlayers(players, playerPlaceholders, serverPlaceholders) + .toArray(new ServerPing.PlayerInfo[0]); + + if(playerInfos.length > 0) + ping.getPlayers().setSample(playerInfos); + } + + @Override + public void setFavicon(String favicon){ + Favicon fav = plugin.getFaviconHandler().getFavicon(favicon, image -> { + try{ + return Favicon.create(image); + }catch(Exception ex){ + plugin.getPluginLogger().warn("Unable to create Favicon. %s", ex.getMessage()); + return null; + } + }); + + if(fav == null){ + plugin.getPluginLogger().warn("Cannot apply valid favicon. See previous messages for reasons"); + ping.setFavicon(ping.getFaviconObject()); + }else{ + ping.setFavicon(fav); + } + } + + @Override + public void updateEvent(){ + this.ping.setVersion(this.protocol); + this.event.setResponse(this.ping); + } + + @Override + public ServerPing.Protocol getProtocol(){ + return this.protocol; + } + + @Override + public int getProtocolVersion(){ + return this.protocol.getProtocol(); + } + + @Override + public int getOnlinePlayers(){ + return ping.getPlayers().getOnline(); + } + + @Override + public int getMaxPlayers(){ + return ping.getPlayers().getMax(); + } + + @Override + public String getHostString(){ + return ((InetSocketAddress)event.getConnection().getSocketAddress()).getHostString(); + } + + @Override + public InetSocketAddress getVirtualHost(){ + return event.getConnection().getVirtualHost(); + } + + @Override + public GenericPlayer createPlayer(String name, int protocol){ + return new BungeePlayer(name, protocol); + } +} diff --git a/bungeecord/src/main/java/ch/andre601/advancedserverlist/bungeecord/events/PingEvent.java b/bungeecord/src/main/java/ch/andre601/advancedserverlist/bungeecord/events/PingEvent.java index b91191be..be38fefc 100644 --- a/bungeecord/src/main/java/ch/andre601/advancedserverlist/bungeecord/events/PingEvent.java +++ b/bungeecord/src/main/java/ch/andre601/advancedserverlist/bungeecord/events/PingEvent.java @@ -26,24 +26,12 @@ package ch.andre601.advancedserverlist.bungeecord.events; import ch.andre601.advancedserverlist.bungeecord.BungeeCordCore; -import ch.andre601.advancedserverlist.bungeecord.BungeePlayer; -import ch.andre601.advancedserverlist.core.parsing.ComponentParser; -import ch.andre601.advancedserverlist.core.profiles.ProfileManager; -import ch.andre601.advancedserverlist.core.profiles.ServerListProfile; -import ch.andre601.advancedserverlist.core.profiles.replacer.StringReplacer; -import ch.andre601.advancedserverlist.core.profiles.replacer.placeholders.PlayerPlaceholders; -import ch.andre601.advancedserverlist.core.profiles.replacer.placeholders.ServerPlaceholders; -import net.kyori.adventure.text.serializer.bungeecord.BungeeComponentSerializer; -import net.md_5.bungee.api.Favicon; -import net.md_5.bungee.api.ServerPing; -import net.md_5.bungee.api.chat.TextComponent; +import ch.andre601.advancedserverlist.core.events.PingEventHandler; import net.md_5.bungee.api.event.ProxyPingEvent; import net.md_5.bungee.api.plugin.Listener; import net.md_5.bungee.event.EventHandler; import net.md_5.bungee.event.EventPriority; -import java.net.InetSocketAddress; - public class PingEvent implements Listener{ private final BungeeCordCore plugin; @@ -55,91 +43,6 @@ public PingEvent(BungeeCordCore plugin){ @EventHandler(priority = EventPriority.LOW) public void onProxyPing(ProxyPingEvent event){ - ServerPing ping = event.getResponse(); - ServerPing.Protocol protocol = ping.getVersion(); - if(protocol == null) - return; - - String playerName = plugin.getCore().getPlayerHandler().getPlayerByIp( - ((InetSocketAddress)event.getConnection().getSocketAddress()).getHostString() - ); - InetSocketAddress host = event.getConnection().getVirtualHost(); - - int online = ping.getPlayers().getOnline(); - int max = ping.getPlayers().getMax(); - - PlayerPlaceholders playerPlaceholders = new PlayerPlaceholders(new BungeePlayer(playerName, protocol.getProtocol())); - ServerPlaceholders serverPlaceholders = new ServerPlaceholders(online, max, host == null ? null : host.getHostString()); - - ServerListProfile profile = ProfileManager.get(plugin.getCore()) - .replacements(playerPlaceholders) - .replacements(serverPlaceholders) - .getProfile(); - - if(profile == null) - return; - - if(profile.isExtraPlayersEnabled()){ - max = online + profile.getExtraPlayers(); - ping.getPlayers().setMax(max); - } - - serverPlaceholders = new ServerPlaceholders(online, max, host == null ? null : host.getHostString()); - - if(!profile.getMotd().isEmpty()){ - TextComponent component = new TextComponent(BungeeComponentSerializer.get().serialize( - ComponentParser.list(profile.getMotd()) - .replacements(playerPlaceholders) - .replacements(serverPlaceholders) - .toComponent() - )); - - ping.setDescriptionComponent(component); - } - - if(profile.shouldHidePlayers()){ - ping.setPlayers(null); - } - - if(!profile.getPlayerCount().isEmpty() && !profile.shouldHidePlayers()){ - protocol.setName(ComponentParser.text(profile.getPlayerCount()) - .replacements(playerPlaceholders) - .replacements(serverPlaceholders) - .toString() - ); - protocol.setProtocol(-1); - } - - if(!profile.getPlayers().isEmpty() && !profile.shouldHidePlayers()){ - ServerPing.PlayerInfo[] playerInfos = plugin.createPlayers(profile.getPlayers(), playerPlaceholders, serverPlaceholders) - .toArray(new ServerPing.PlayerInfo[0]); - - if(playerInfos.length > 0) - ping.getPlayers().setSample(playerInfos); - } - - if(!profile.getFavicon().isEmpty()){ - String favName = StringReplacer.replace(profile.getFavicon(), playerPlaceholders.getReplacements()); - - Favicon favicon = plugin.getFaviconHandler().getFavicon(favName, image -> { - try{ - return Favicon.create(image); - }catch(Exception ex){ - plugin.getPluginLogger().warn("Unable to create Favicon. %s", ex.getMessage()); - return null; - } - }); - - if(favicon == null){ - plugin.getPluginLogger().warn("Could not obtain valid Favicon to use."); - ping.setFavicon(ping.getFaviconObject()); - }else{ - ping.setFavicon(favicon); - } - } - - ping.setVersion(protocol); - - event.setResponse(ping); + PingEventHandler.handleEvent(plugin, new BungeeEventWrapper(plugin, event)); } } diff --git a/core/src/main/java/ch/andre601/advancedserverlist/core/events/PingEventHandler.java b/core/src/main/java/ch/andre601/advancedserverlist/core/events/PingEventHandler.java new file mode 100644 index 00000000..9f8a21b8 --- /dev/null +++ b/core/src/main/java/ch/andre601/advancedserverlist/core/events/PingEventHandler.java @@ -0,0 +1,103 @@ +/* + * MIT License + * + * Copyright (c) 2022 Andre_601 + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + */ + +package ch.andre601.advancedserverlist.core.events; + +import ch.andre601.advancedserverlist.core.interfaces.GenericEventWrapper; +import ch.andre601.advancedserverlist.core.interfaces.core.PluginCore; +import ch.andre601.advancedserverlist.core.parsing.ComponentParser; +import ch.andre601.advancedserverlist.core.profiles.ProfileManager; +import ch.andre601.advancedserverlist.core.profiles.ServerListProfile; +import ch.andre601.advancedserverlist.core.profiles.replacer.StringReplacer; +import ch.andre601.advancedserverlist.core.profiles.replacer.placeholders.PlayerPlaceholders; +import ch.andre601.advancedserverlist.core.profiles.replacer.placeholders.ServerPlaceholders; + +import java.net.InetSocketAddress; + +public class PingEventHandler{ + + public static void handleEvent(PluginCore plugin, GenericEventWrapper event){ + if(event.getProtocol() == null) + return; + + String name = plugin.getCore().getPlayerHandler().getPlayerByIp(event.getHostString()); + InetSocketAddress host = event.getVirtualHost(); + + int online = event.getOnlinePlayers(); + int max = event.getMaxPlayers(); + + PlayerPlaceholders playerPlaceholders = new PlayerPlaceholders(event.createPlayer(name, event.getProtocolVersion())); + ServerPlaceholders serverPlaceholders = new ServerPlaceholders(online, max, host == null ? null : host.getHostString()); + + ServerListProfile profile = ProfileManager.get(plugin.getCore()) + .replacements(playerPlaceholders) + .replacements(serverPlaceholders) + .getProfile(); + + if(profile == null) + return; + + if(profile.isExtraPlayersEnabled()){ + max = online + profile.getExtraPlayers(); + event.setMaxPlayers(max); + } + + serverPlaceholders = new ServerPlaceholders(online, max, host == null ? null : host.getHostString()); + + if(!profile.getMotd().isEmpty()){ + event.setMotd( + ComponentParser.list(profile.getMotd()) + .replacements(playerPlaceholders) + .replacements(serverPlaceholders) + .toComponent() + ); + } + + if(profile.shouldHidePlayers()){ + event.hidePlayers(); + } + + if(!profile.getPlayerCount().isEmpty() && !profile.shouldHidePlayers()){ + event.setPlayerCount( + ComponentParser.text(profile.getPlayerCount()) + .replacements(playerPlaceholders) + .replacements(serverPlaceholders) + .toString() + ); + } + + if(!profile.getPlayers().isEmpty() && !profile.shouldHidePlayers()){ + event.setPlayers(profile.getPlayers(), playerPlaceholders, serverPlaceholders); + } + + if(!profile.getFavicon().isEmpty()){ + String favicon = StringReplacer.replace(profile.getFavicon(), playerPlaceholders.getReplacements()); + + event.setFavicon(favicon); + } + + event.updateEvent(); + } +} diff --git a/core/src/main/java/ch/andre601/advancedserverlist/core/interfaces/GenericEventWrapper.java b/core/src/main/java/ch/andre601/advancedserverlist/core/interfaces/GenericEventWrapper.java new file mode 100644 index 00000000..507994c7 --- /dev/null +++ b/core/src/main/java/ch/andre601/advancedserverlist/core/interfaces/GenericEventWrapper.java @@ -0,0 +1,65 @@ +/* + * MIT License + * + * Copyright (c) 2022 Andre_601 + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + */ + +package ch.andre601.advancedserverlist.core.interfaces; + +import ch.andre601.advancedserverlist.core.profiles.players.GenericPlayer; +import ch.andre601.advancedserverlist.core.profiles.replacer.placeholders.PlayerPlaceholders; +import ch.andre601.advancedserverlist.core.profiles.replacer.placeholders.ServerPlaceholders; +import net.kyori.adventure.text.Component; + +import java.net.InetSocketAddress; +import java.util.List; + +public interface GenericEventWrapper{ + + void setMaxPlayers(int maxPlayers); + + void setMotd(Component component); + + void hidePlayers(); + + void setPlayerCount(String name); + + void setPlayers(List players, PlayerPlaceholders playerPlaceholders, ServerPlaceholders serverPlaceholders); + + void setFavicon(String favicon); + + void updateEvent(); + + P getProtocol(); + + int getProtocolVersion(); + + int getOnlinePlayers(); + + int getMaxPlayers(); + + String getHostString(); + + InetSocketAddress getVirtualHost(); + + GenericPlayer createPlayer(String name, int protocol); +} From 08b4f1029c846b4b54ad01fbd376c4250950b7a1 Mon Sep 17 00:00:00 2001 From: Andre601 <11576465+Andre601@users.noreply.github.com> Date: Tue, 6 Dec 2022 21:27:09 +0100 Subject: [PATCH 2/6] Make Protocol and ServerPing final --- .../bungeecord/events/BungeeEventWrapper.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bungeecord/src/main/java/ch/andre601/advancedserverlist/bungeecord/events/BungeeEventWrapper.java b/bungeecord/src/main/java/ch/andre601/advancedserverlist/bungeecord/events/BungeeEventWrapper.java index 4e64105a..71ff5a4e 100644 --- a/bungeecord/src/main/java/ch/andre601/advancedserverlist/bungeecord/events/BungeeEventWrapper.java +++ b/bungeecord/src/main/java/ch/andre601/advancedserverlist/bungeecord/events/BungeeEventWrapper.java @@ -46,8 +46,8 @@ public class BungeeEventWrapper implements GenericEventWrapper Date: Tue, 6 Dec 2022 21:32:16 +0100 Subject: [PATCH 3/6] Smaller changes --- .../bungeecord/events/BungeeEventWrapper.java | 12 +++++++++--- .../bungeecord/events/PingEvent.java | 2 +- .../core/events/PingEventHandler.java | 6 ++++-- .../core/interfaces/GenericEventWrapper.java | 9 ++++++--- 4 files changed, 20 insertions(+), 9 deletions(-) diff --git a/bungeecord/src/main/java/ch/andre601/advancedserverlist/bungeecord/events/BungeeEventWrapper.java b/bungeecord/src/main/java/ch/andre601/advancedserverlist/bungeecord/events/BungeeEventWrapper.java index 71ff5a4e..08cc76a7 100644 --- a/bungeecord/src/main/java/ch/andre601/advancedserverlist/bungeecord/events/BungeeEventWrapper.java +++ b/bungeecord/src/main/java/ch/andre601/advancedserverlist/bungeecord/events/BungeeEventWrapper.java @@ -28,6 +28,7 @@ import ch.andre601.advancedserverlist.bungeecord.BungeeCordCore; import ch.andre601.advancedserverlist.bungeecord.BungeePlayer; import ch.andre601.advancedserverlist.core.interfaces.GenericEventWrapper; +import ch.andre601.advancedserverlist.core.interfaces.core.PluginCore; import ch.andre601.advancedserverlist.core.profiles.players.GenericPlayer; import ch.andre601.advancedserverlist.core.profiles.replacer.placeholders.PlayerPlaceholders; import ch.andre601.advancedserverlist.core.profiles.replacer.placeholders.ServerPlaceholders; @@ -42,7 +43,7 @@ import java.net.InetSocketAddress; import java.util.List; -public class BungeeEventWrapper implements GenericEventWrapper{ +public class BungeeEventWrapper implements GenericEventWrapper{ private final BungeeCordCore plugin; private final ProxyPingEvent event; @@ -112,8 +113,8 @@ public void updateEvent(){ } @Override - public ServerPing.Protocol getProtocol(){ - return this.protocol; + public boolean isInvalidProtocol(){ + return protocol == null; } @Override @@ -141,6 +142,11 @@ public InetSocketAddress getVirtualHost(){ return event.getConnection().getVirtualHost(); } + @Override + public PluginCore getPlugin(){ + return plugin; + } + @Override public GenericPlayer createPlayer(String name, int protocol){ return new BungeePlayer(name, protocol); diff --git a/bungeecord/src/main/java/ch/andre601/advancedserverlist/bungeecord/events/PingEvent.java b/bungeecord/src/main/java/ch/andre601/advancedserverlist/bungeecord/events/PingEvent.java index be38fefc..f9fec02f 100644 --- a/bungeecord/src/main/java/ch/andre601/advancedserverlist/bungeecord/events/PingEvent.java +++ b/bungeecord/src/main/java/ch/andre601/advancedserverlist/bungeecord/events/PingEvent.java @@ -43,6 +43,6 @@ public PingEvent(BungeeCordCore plugin){ @EventHandler(priority = EventPriority.LOW) public void onProxyPing(ProxyPingEvent event){ - PingEventHandler.handleEvent(plugin, new BungeeEventWrapper(plugin, event)); + PingEventHandler.handleEvent(new BungeeEventWrapper(plugin, event)); } } diff --git a/core/src/main/java/ch/andre601/advancedserverlist/core/events/PingEventHandler.java b/core/src/main/java/ch/andre601/advancedserverlist/core/events/PingEventHandler.java index 9f8a21b8..328efa11 100644 --- a/core/src/main/java/ch/andre601/advancedserverlist/core/events/PingEventHandler.java +++ b/core/src/main/java/ch/andre601/advancedserverlist/core/events/PingEventHandler.java @@ -38,10 +38,12 @@ public class PingEventHandler{ - public static void handleEvent(PluginCore plugin, GenericEventWrapper event){ - if(event.getProtocol() == null) + public static void handleEvent(GenericEventWrapper event){ + if(event.isInvalidProtocol()) return; + PluginCore plugin = event.getPlugin(); + String name = plugin.getCore().getPlayerHandler().getPlayerByIp(event.getHostString()); InetSocketAddress host = event.getVirtualHost(); diff --git a/core/src/main/java/ch/andre601/advancedserverlist/core/interfaces/GenericEventWrapper.java b/core/src/main/java/ch/andre601/advancedserverlist/core/interfaces/GenericEventWrapper.java index 507994c7..90b84720 100644 --- a/core/src/main/java/ch/andre601/advancedserverlist/core/interfaces/GenericEventWrapper.java +++ b/core/src/main/java/ch/andre601/advancedserverlist/core/interfaces/GenericEventWrapper.java @@ -25,6 +25,7 @@ package ch.andre601.advancedserverlist.core.interfaces; +import ch.andre601.advancedserverlist.core.interfaces.core.PluginCore; import ch.andre601.advancedserverlist.core.profiles.players.GenericPlayer; import ch.andre601.advancedserverlist.core.profiles.replacer.placeholders.PlayerPlaceholders; import ch.andre601.advancedserverlist.core.profiles.replacer.placeholders.ServerPlaceholders; @@ -33,7 +34,7 @@ import java.net.InetSocketAddress; import java.util.List; -public interface GenericEventWrapper{ +public interface GenericEventWrapper{ void setMaxPlayers(int maxPlayers); @@ -49,7 +50,7 @@ public interface GenericEventWrapper{ void updateEvent(); - P getProtocol(); + boolean isInvalidProtocol(); int getProtocolVersion(); @@ -61,5 +62,7 @@ public interface GenericEventWrapper{ InetSocketAddress getVirtualHost(); - GenericPlayer createPlayer(String name, int protocol); + PluginCore getPlugin(); + + GenericPlayer

createPlayer(String name, int protocol); } From 2fcef08f5a407dcedadb20c5b3bafb6a1750f0f6 Mon Sep 17 00:00:00 2001 From: Andre601 <11576465+Andre601@users.noreply.github.com> Date: Wed, 7 Dec 2022 16:28:39 +0100 Subject: [PATCH 4/6] Wrap up (no pun intended) remaining platform events --- .../bungeecord/events/BungeeEventWrapper.java | 15 +- .../core/events/PingEventHandler.java | 28 +-- .../{ => events}/GenericEventWrapper.java | 14 +- .../paper/events/PaperEventWrapper.java | 162 +++++++++++++++++ .../paper/events/PingEvent.java | 111 +---------- .../spigot/events/PingEvent.java | 116 +----------- .../events/ProtocolLibEventWrapper.java | 172 ++++++++++++++++++ .../velocity/events/PingEvent.java | 94 +--------- .../velocity/events/VelocityEventWrapper.java | 152 ++++++++++++++++ 9 files changed, 528 insertions(+), 336 deletions(-) rename core/src/main/java/ch/andre601/advancedserverlist/core/interfaces/{ => events}/GenericEventWrapper.java (81%) create mode 100644 paper/src/main/java/ch/andre601/advancedserverlist/paper/events/PaperEventWrapper.java create mode 100644 spigot/src/main/java/ch/andre601/advancedserverlist/spigot/events/ProtocolLibEventWrapper.java create mode 100644 velocity/src/main/java/ch/andre601/advancedserverlist/velocity/events/VelocityEventWrapper.java diff --git a/bungeecord/src/main/java/ch/andre601/advancedserverlist/bungeecord/events/BungeeEventWrapper.java b/bungeecord/src/main/java/ch/andre601/advancedserverlist/bungeecord/events/BungeeEventWrapper.java index 08cc76a7..cd5e1ff5 100644 --- a/bungeecord/src/main/java/ch/andre601/advancedserverlist/bungeecord/events/BungeeEventWrapper.java +++ b/bungeecord/src/main/java/ch/andre601/advancedserverlist/bungeecord/events/BungeeEventWrapper.java @@ -27,7 +27,7 @@ import ch.andre601.advancedserverlist.bungeecord.BungeeCordCore; import ch.andre601.advancedserverlist.bungeecord.BungeePlayer; -import ch.andre601.advancedserverlist.core.interfaces.GenericEventWrapper; +import ch.andre601.advancedserverlist.core.interfaces.events.GenericEventWrapper; import ch.andre601.advancedserverlist.core.interfaces.core.PluginCore; import ch.andre601.advancedserverlist.core.profiles.players.GenericPlayer; import ch.andre601.advancedserverlist.core.profiles.replacer.placeholders.PlayerPlaceholders; @@ -79,7 +79,7 @@ public void setPlayerCount(String name){ } @Override - public void setPlayers(List players, PlayerPlaceholders playerPlaceholders, ServerPlaceholders serverPlaceholders){ + public void setPlayers(List players, GenericPlayer player, PlayerPlaceholders playerPlaceholders, ServerPlaceholders serverPlaceholders){ ServerPing.PlayerInfo[] playerInfos = plugin.createPlayers(players, playerPlaceholders, serverPlaceholders) .toArray(new ServerPing.PlayerInfo[0]); @@ -133,13 +133,18 @@ public int getMaxPlayers(){ } @Override - public String getHostString(){ + public String getPlayerIP(){ return ((InetSocketAddress)event.getConnection().getSocketAddress()).getHostString(); } @Override - public InetSocketAddress getVirtualHost(){ - return event.getConnection().getVirtualHost(); + public String parsePAPIPlaceholders(String text, GenericPlayer player){ + return text; + } + + @Override + public String getVirtualHost(){ + return this.resolveHost(event.getConnection().getVirtualHost()); } @Override diff --git a/core/src/main/java/ch/andre601/advancedserverlist/core/events/PingEventHandler.java b/core/src/main/java/ch/andre601/advancedserverlist/core/events/PingEventHandler.java index 328efa11..cd86e084 100644 --- a/core/src/main/java/ch/andre601/advancedserverlist/core/events/PingEventHandler.java +++ b/core/src/main/java/ch/andre601/advancedserverlist/core/events/PingEventHandler.java @@ -25,33 +25,35 @@ package ch.andre601.advancedserverlist.core.events; -import ch.andre601.advancedserverlist.core.interfaces.GenericEventWrapper; +import ch.andre601.advancedserverlist.core.interfaces.events.GenericEventWrapper; import ch.andre601.advancedserverlist.core.interfaces.core.PluginCore; import ch.andre601.advancedserverlist.core.parsing.ComponentParser; import ch.andre601.advancedserverlist.core.profiles.ProfileManager; import ch.andre601.advancedserverlist.core.profiles.ServerListProfile; +import ch.andre601.advancedserverlist.core.profiles.players.GenericPlayer; import ch.andre601.advancedserverlist.core.profiles.replacer.StringReplacer; import ch.andre601.advancedserverlist.core.profiles.replacer.placeholders.PlayerPlaceholders; import ch.andre601.advancedserverlist.core.profiles.replacer.placeholders.ServerPlaceholders; -import java.net.InetSocketAddress; - public class PingEventHandler{ - public static void handleEvent(GenericEventWrapper event){ + public static void handleEvent(GenericEventWrapper event){ if(event.isInvalidProtocol()) return; - PluginCore plugin = event.getPlugin(); - - String name = plugin.getCore().getPlayerHandler().getPlayerByIp(event.getHostString()); - InetSocketAddress host = event.getVirtualHost(); + PluginCore plugin = event.getPlugin(); + + GenericPlayer

player = event.createPlayer( + plugin.getCore().getPlayerHandler().getPlayerByIp(event.getPlayerIP()), + event.getProtocolVersion() + ); + String host = event.getVirtualHost(); int online = event.getOnlinePlayers(); int max = event.getMaxPlayers(); - PlayerPlaceholders playerPlaceholders = new PlayerPlaceholders(event.createPlayer(name, event.getProtocolVersion())); - ServerPlaceholders serverPlaceholders = new ServerPlaceholders(online, max, host == null ? null : host.getHostString()); + PlayerPlaceholders playerPlaceholders = new PlayerPlaceholders(player); + ServerPlaceholders serverPlaceholders = new ServerPlaceholders(online, max, host); ServerListProfile profile = ProfileManager.get(plugin.getCore()) .replacements(playerPlaceholders) @@ -66,13 +68,14 @@ public static void handleEvent(GenericEventWrapper event){ event.setMaxPlayers(max); } - serverPlaceholders = new ServerPlaceholders(online, max, host == null ? null : host.getHostString()); + serverPlaceholders = new ServerPlaceholders(online, max, host); if(!profile.getMotd().isEmpty()){ event.setMotd( ComponentParser.list(profile.getMotd()) .replacements(playerPlaceholders) .replacements(serverPlaceholders) + .modifyText(text -> event.parsePAPIPlaceholders(text, player)) .toComponent() ); } @@ -86,12 +89,13 @@ public static void handleEvent(GenericEventWrapper event){ ComponentParser.text(profile.getPlayerCount()) .replacements(playerPlaceholders) .replacements(serverPlaceholders) + .modifyText(text -> event.parsePAPIPlaceholders(text, player)) .toString() ); } if(!profile.getPlayers().isEmpty() && !profile.shouldHidePlayers()){ - event.setPlayers(profile.getPlayers(), playerPlaceholders, serverPlaceholders); + event.setPlayers(profile.getPlayers(), player, playerPlaceholders, serverPlaceholders); } if(!profile.getFavicon().isEmpty()){ diff --git a/core/src/main/java/ch/andre601/advancedserverlist/core/interfaces/GenericEventWrapper.java b/core/src/main/java/ch/andre601/advancedserverlist/core/interfaces/events/GenericEventWrapper.java similarity index 81% rename from core/src/main/java/ch/andre601/advancedserverlist/core/interfaces/GenericEventWrapper.java rename to core/src/main/java/ch/andre601/advancedserverlist/core/interfaces/events/GenericEventWrapper.java index 90b84720..c26625c6 100644 --- a/core/src/main/java/ch/andre601/advancedserverlist/core/interfaces/GenericEventWrapper.java +++ b/core/src/main/java/ch/andre601/advancedserverlist/core/interfaces/events/GenericEventWrapper.java @@ -23,7 +23,7 @@ * */ -package ch.andre601.advancedserverlist.core.interfaces; +package ch.andre601.advancedserverlist.core.interfaces.events; import ch.andre601.advancedserverlist.core.interfaces.core.PluginCore; import ch.andre601.advancedserverlist.core.profiles.players.GenericPlayer; @@ -44,7 +44,7 @@ public interface GenericEventWrapper{ void setPlayerCount(String name); - void setPlayers(List players, PlayerPlaceholders playerPlaceholders, ServerPlaceholders serverPlaceholders); + void setPlayers(List players, GenericPlayer

player, PlayerPlaceholders playerPlaceholders, ServerPlaceholders serverPlaceholders); void setFavicon(String favicon); @@ -58,11 +58,17 @@ public interface GenericEventWrapper{ int getMaxPlayers(); - String getHostString(); + String getPlayerIP(); - InetSocketAddress getVirtualHost(); + String parsePAPIPlaceholders(String text, GenericPlayer

player); + + String getVirtualHost(); PluginCore getPlugin(); GenericPlayer

createPlayer(String name, int protocol); + + default String resolveHost(InetSocketAddress address){ + return address == null ? null : address.getHostString(); + } } diff --git a/paper/src/main/java/ch/andre601/advancedserverlist/paper/events/PaperEventWrapper.java b/paper/src/main/java/ch/andre601/advancedserverlist/paper/events/PaperEventWrapper.java new file mode 100644 index 00000000..97ef12f3 --- /dev/null +++ b/paper/src/main/java/ch/andre601/advancedserverlist/paper/events/PaperEventWrapper.java @@ -0,0 +1,162 @@ +/* + * MIT License + * + * Copyright (c) 2022 Andre_601 + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + */ + +package ch.andre601.advancedserverlist.paper.events; + +import ch.andre601.advancedserverlist.core.interfaces.events.GenericEventWrapper; +import ch.andre601.advancedserverlist.core.interfaces.core.PluginCore; +import ch.andre601.advancedserverlist.core.profiles.players.GenericPlayer; +import ch.andre601.advancedserverlist.core.profiles.replacer.placeholders.PlayerPlaceholders; +import ch.andre601.advancedserverlist.core.profiles.replacer.placeholders.ServerPlaceholders; +import ch.andre601.advancedserverlist.paper.PaperCore; +import ch.andre601.advancedserverlist.paper.PaperPlayer; +import com.destroystokyo.paper.event.server.PaperServerListPingEvent; +import me.clip.placeholderapi.PlaceholderAPI; +import net.kyori.adventure.text.Component; +import org.bukkit.Bukkit; +import org.bukkit.OfflinePlayer; +import org.bukkit.util.CachedServerIcon; + +import java.util.List; + +public class PaperEventWrapper implements GenericEventWrapper{ + + private final PaperCore plugin; + private final PaperServerListPingEvent event; + + public PaperEventWrapper(PaperCore plugin, PaperServerListPingEvent event){ + this.plugin = plugin; + this.event = event; + } + + @Override + public void setMaxPlayers(int maxPlayers){ + event.setMaxPlayers(maxPlayers); + } + + @Override + public void setMotd(Component component){ + event.motd(component); + } + + @Override + public void hidePlayers(){ + event.setHidePlayers(true); + } + + @Override + public void setPlayerCount(String name){ + event.setVersion(name); + event.setProtocolVersion(-1); + } + + @Override + public void setPlayers(List players, GenericPlayer player, PlayerPlaceholders playerPlaceholders, ServerPlaceholders serverPlaceholders){ + event.getPlayerSample().clear(); + + event.getPlayerSample().addAll( + plugin.createPlayers(players, player.getPlayer(), playerPlaceholders, serverPlaceholders) + ); + } + + @Override + public void setFavicon(String favicon){ + CachedServerIcon fav = plugin.getFaviconHandler().getFavicon(favicon, image -> { + try{ + return Bukkit.loadServerIcon(image); + }catch(Exception ex){ + return null; + } + }); + + if(fav == null){ + plugin.getPluginLogger().warn("Cannot apply valid favicon. See previous messages for reasons"); + event.setServerIcon(event.getServerIcon()); + }else{ + event.setServerIcon(fav); + } + } + + // Not used in Paper + @Override + public void updateEvent(){} + + // Not used in Paper + @Override + public boolean isInvalidProtocol(){ + return false; + } + + @Override + public int getProtocolVersion(){ + return event.getClient().getProtocolVersion(); + } + + @Override + public int getOnlinePlayers(){ + return event.getNumPlayers(); + } + + @Override + public int getMaxPlayers(){ + return event.getMaxPlayers(); + } + + @Override + public String getPlayerIP(){ + return event.getClient().getAddress().getHostString(); + } + + @Override + public String parsePAPIPlaceholders(String text, GenericPlayer player){ + if(plugin.getServer().getPluginManager().isPluginEnabled("PlaceholderAPI")) + return PlaceholderAPI.setPlaceholders(player.getPlayer(), text); + + return text; + } + + @Override + public String getVirtualHost(){ + return this.resolveHost(event.getClient().getVirtualHost()); + } + + @Override + public PluginCore getPlugin(){ + return plugin; + } + + @Override + public GenericPlayer createPlayer(String name, int protocol){ + OfflinePlayer player = Bukkit.getPlayerExact(name); + + if(player == null){ + player = Bukkit.getOfflinePlayer(name); + + return new PaperPlayer(player.hasPlayedBefore() ? player : null, name, protocol); + } + + return new PaperPlayer(player, name, protocol); + } +} diff --git a/paper/src/main/java/ch/andre601/advancedserverlist/paper/events/PingEvent.java b/paper/src/main/java/ch/andre601/advancedserverlist/paper/events/PingEvent.java index cb25fae8..1b4c2dc5 100644 --- a/paper/src/main/java/ch/andre601/advancedserverlist/paper/events/PingEvent.java +++ b/paper/src/main/java/ch/andre601/advancedserverlist/paper/events/PingEvent.java @@ -25,23 +25,11 @@ package ch.andre601.advancedserverlist.paper.events; -import ch.andre601.advancedserverlist.core.parsing.ComponentParser; -import ch.andre601.advancedserverlist.core.profiles.ProfileManager; -import ch.andre601.advancedserverlist.core.profiles.ServerListProfile; -import ch.andre601.advancedserverlist.core.profiles.replacer.StringReplacer; -import ch.andre601.advancedserverlist.core.profiles.replacer.placeholders.PlayerPlaceholders; -import ch.andre601.advancedserverlist.core.profiles.replacer.placeholders.ServerPlaceholders; +import ch.andre601.advancedserverlist.core.events.PingEventHandler; import ch.andre601.advancedserverlist.paper.PaperCore; -import ch.andre601.advancedserverlist.paper.PaperPlayer; import com.destroystokyo.paper.event.server.PaperServerListPingEvent; -import me.clip.placeholderapi.PlaceholderAPI; -import org.bukkit.Bukkit; -import org.bukkit.OfflinePlayer; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; -import org.bukkit.util.CachedServerIcon; - -import java.net.InetSocketAddress; public class PingEvent implements Listener{ @@ -54,101 +42,6 @@ public PingEvent(PaperCore plugin){ @EventHandler public void onServerPing(PaperServerListPingEvent event){ - InetSocketAddress address = event.getClient().getAddress(); - InetSocketAddress host = event.getClient().getVirtualHost(); - - PaperPlayer player = resolvePlayer(address, event.getClient().getProtocolVersion()); - - int online = event.getNumPlayers(); - int max = event.getMaxPlayers(); - - PlayerPlaceholders playerPlaceholders = new PlayerPlaceholders(player); - ServerPlaceholders serverPlaceholders = new ServerPlaceholders(online, max, host == null ? null : host.getHostString()); - - ServerListProfile profile = ProfileManager.get(plugin.getCore()) - .replacements(playerPlaceholders) - .replacements(serverPlaceholders) - .getProfile(); - - if(profile == null) - return; - - if(profile.isExtraPlayersEnabled()){ - max = online + profile.getExtraPlayers(); - event.setMaxPlayers(max); - } - - serverPlaceholders = new ServerPlaceholders(online, max, host == null ? null : host.getHostString()); - - if(!profile.getMotd().isEmpty()){ - event.motd(ComponentParser.list(profile.getMotd()) - .replacements(playerPlaceholders) - .replacements(serverPlaceholders) - .modifyText(text -> { - if(plugin.getServer().getPluginManager().isPluginEnabled("PlaceholderAPI")) - return PlaceholderAPI.setPlaceholders(player.getPlayer(), text); - - return text; - }) - .toComponent()); - } - - if(profile.shouldHidePlayers()){ - event.setHidePlayers(true); - } - - if(!profile.getPlayerCount().isEmpty() && !profile.shouldHidePlayers()){ - event.setVersion(ComponentParser.text(profile.getPlayerCount()) - .replacements(playerPlaceholders) - .replacements(serverPlaceholders) - .modifyText(text -> { - if(plugin.getServer().getPluginManager().isPluginEnabled("PlaceholderAPI")) - return PlaceholderAPI.setPlaceholders(player.getPlayer(), text); - - return text; - }) - .toString()); - event.setProtocolVersion(-1); - } - - if(!profile.getPlayers().isEmpty() && !profile.shouldHidePlayers()){ - event.getPlayerSample().clear(); - - event.getPlayerSample().addAll( - plugin.createPlayers(profile.getPlayers(), player.getPlayer(), playerPlaceholders, serverPlaceholders) - ); - } - - if(!profile.getFavicon().isEmpty()){ - String favName = StringReplacer.replace(profile.getFavicon(), playerPlaceholders.getReplacements()); - - CachedServerIcon favicon = plugin.getFaviconHandler().getFavicon(favName, image -> { - try{ - return Bukkit.loadServerIcon(image); - }catch(Exception ex){ - return null; - } - }); - - if(favicon == null){ - plugin.getPluginLogger().warn("Could not obtain valid Favicon to use."); - event.setServerIcon(event.getServerIcon()); - }else{ - event.setServerIcon(favicon); - } - } - } - - private PaperPlayer resolvePlayer(InetSocketAddress address, int protocol){ - String playerName = plugin.getCore().getPlayerHandler().getPlayerByIp(address.getHostString()); - OfflinePlayer player = Bukkit.getPlayerExact(playerName); - - if(player == null){ - player = Bukkit.getOfflinePlayer(playerName); - - return new PaperPlayer(player.hasPlayedBefore() ? player : null, playerName, protocol); - } - - return new PaperPlayer(player, playerName, protocol); + PingEventHandler.handleEvent(new PaperEventWrapper(plugin, event)); } } diff --git a/spigot/src/main/java/ch/andre601/advancedserverlist/spigot/events/PingEvent.java b/spigot/src/main/java/ch/andre601/advancedserverlist/spigot/events/PingEvent.java index bc9e128a..ce1d929b 100644 --- a/spigot/src/main/java/ch/andre601/advancedserverlist/spigot/events/PingEvent.java +++ b/spigot/src/main/java/ch/andre601/advancedserverlist/spigot/events/PingEvent.java @@ -25,25 +25,13 @@ package ch.andre601.advancedserverlist.spigot.events; -import ch.andre601.advancedserverlist.core.parsing.ComponentParser; -import ch.andre601.advancedserverlist.core.profiles.ProfileManager; -import ch.andre601.advancedserverlist.core.profiles.ServerListProfile; -import ch.andre601.advancedserverlist.core.profiles.replacer.StringReplacer; -import ch.andre601.advancedserverlist.core.profiles.replacer.placeholders.PlayerPlaceholders; -import ch.andre601.advancedserverlist.core.profiles.replacer.placeholders.ServerPlaceholders; +import ch.andre601.advancedserverlist.core.events.PingEventHandler; import ch.andre601.advancedserverlist.spigot.SpigotCore; -import ch.andre601.advancedserverlist.spigot.SpigotPlayer; import com.comphenix.protocol.PacketType; import com.comphenix.protocol.ProtocolManager; import com.comphenix.protocol.events.ListenerPriority; import com.comphenix.protocol.events.PacketAdapter; import com.comphenix.protocol.events.PacketEvent; -import com.comphenix.protocol.wrappers.AdventureComponentConverter; -import com.comphenix.protocol.wrappers.WrappedServerPing; -import me.clip.placeholderapi.PlaceholderAPI; -import net.kyori.adventure.text.Component; -import org.bukkit.Bukkit; -import org.bukkit.OfflinePlayer; import org.bukkit.event.Listener; import java.net.InetSocketAddress; @@ -52,13 +40,11 @@ public class PingEvent implements Listener{ - private final SpigotCore plugin; private final ProtocolManager protocolManager; private final Map hostAddresses = new HashMap<>(); public PingEvent(SpigotCore plugin, ProtocolManager protocolManager){ - this.plugin = plugin; this.protocolManager = protocolManager; loadPacketListener(plugin); @@ -81,106 +67,8 @@ public void onPacketReceiving(PacketEvent event){ protocolManager.addPacketListener(new PacketAdapter(spigotPlugin, ListenerPriority.LOW, PacketType.Status.Server.SERVER_INFO){ @Override public void onPacketSending(PacketEvent event){ - WrappedServerPing ping = event.getPacket().getServerPings().read(0); - InetSocketAddress address = event.getPlayer().getAddress(); - if(address == null) - return; - - SpigotPlayer player = resolvePlayer(address, ping.getVersionProtocol()); - - int online = ping.getPlayersOnline(); - int max = ping.getPlayersMaximum(); - - PlayerPlaceholders playerPlaceholders = new PlayerPlaceholders(player); - ServerPlaceholders serverPlaceholders = new ServerPlaceholders(online, max, hostAddresses.get(address.getHostString())); - - ServerListProfile profile = ProfileManager.get(spigotPlugin.getCore()) - .replacements(playerPlaceholders) - .replacements(serverPlaceholders) - .getProfile(); - - if(profile == null) - return; - - if(profile.isExtraPlayersEnabled()){ - max = online + profile.getExtraPlayers(); - ping.setPlayersMaximum(max); - } - - serverPlaceholders = new ServerPlaceholders(online, max, hostAddresses.get(address.getHostString())); - - if(!profile.getMotd().isEmpty()){ - Component component = ComponentParser.list(profile.getMotd()) - .replacements(playerPlaceholders) - .replacements(serverPlaceholders) - .modifyText(text -> { - if(plugin.getServer().getPluginManager().isPluginEnabled("PlaceholderAPI")) - return PlaceholderAPI.setPlaceholders(player.getPlayer(), text); - - return text; - }) - .toComponent(); - ping.setMotD(AdventureComponentConverter.fromComponent(component)); - } - - if(profile.shouldHidePlayers()){ - ping.setPlayersVisible(false); - } - - if(!profile.getPlayerCount().isEmpty() && !profile.shouldHidePlayers()){ - ping.setVersionName(ComponentParser.text(profile.getPlayerCount()) - .replacements(playerPlaceholders) - .replacements(serverPlaceholders) - .modifyText(text -> { - if(plugin.getServer().getPluginManager().isPluginEnabled("PlaceholderAPI")) - return PlaceholderAPI.setPlaceholders(player.getPlayer(), text); - - return text; - }) - .toString() - ); - ping.setVersionProtocol(-1); - } - - if(!profile.getPlayers().isEmpty() && !profile.shouldHidePlayers()){ - ping.setPlayers( - spigotPlugin.createPlayers(profile.getPlayers(), player.getPlayer(), playerPlaceholders, serverPlaceholders) - ); - } - - if(!profile.getFavicon().isEmpty()){ - String favName = StringReplacer.replace(profile.getFavicon(), playerPlaceholders.getReplacements()); - - WrappedServerPing.CompressedImage favicon = spigotPlugin.getFaviconHandler().getFavicon(favName, image -> { - try{ - return WrappedServerPing.CompressedImage.fromPng(image); - }catch(Exception ex){ - return null; - } - }); - - if(favicon == null){ - spigotPlugin.getPluginLogger().warn("Could not obtain valid Favicon to use."); - ping.setFavicon(ping.getFavicon()); - }else{ - ping.setFavicon(favicon); - } - } + PingEventHandler.handleEvent(new ProtocolLibEventWrapper(spigotPlugin, event, hostAddresses)); } }); } - - private SpigotPlayer resolvePlayer(InetSocketAddress address, int protocol){ - String playerName = plugin.getCore().getPlayerHandler().getPlayerByIp(address.getHostString()); - OfflinePlayer player = Bukkit.getPlayerExact(playerName); - - if(player == null){ - //noinspection deprecation - player = Bukkit.getOfflinePlayer(playerName); - - return new SpigotPlayer(player.hasPlayedBefore() ? player : null, playerName, protocol); - } - - return new SpigotPlayer(player, playerName, protocol); - } } diff --git a/spigot/src/main/java/ch/andre601/advancedserverlist/spigot/events/ProtocolLibEventWrapper.java b/spigot/src/main/java/ch/andre601/advancedserverlist/spigot/events/ProtocolLibEventWrapper.java new file mode 100644 index 00000000..a1591de8 --- /dev/null +++ b/spigot/src/main/java/ch/andre601/advancedserverlist/spigot/events/ProtocolLibEventWrapper.java @@ -0,0 +1,172 @@ +/* + * MIT License + * + * Copyright (c) 2022 Andre_601 + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + */ + +package ch.andre601.advancedserverlist.spigot.events; + +import ch.andre601.advancedserverlist.core.interfaces.events.GenericEventWrapper; +import ch.andre601.advancedserverlist.core.interfaces.core.PluginCore; +import ch.andre601.advancedserverlist.core.profiles.players.GenericPlayer; +import ch.andre601.advancedserverlist.core.profiles.replacer.placeholders.PlayerPlaceholders; +import ch.andre601.advancedserverlist.core.profiles.replacer.placeholders.ServerPlaceholders; +import ch.andre601.advancedserverlist.spigot.SpigotCore; +import ch.andre601.advancedserverlist.spigot.SpigotPlayer; +import com.comphenix.protocol.events.PacketEvent; +import com.comphenix.protocol.wrappers.AdventureComponentConverter; +import com.comphenix.protocol.wrappers.WrappedServerPing; +import me.clip.placeholderapi.PlaceholderAPI; +import net.kyori.adventure.text.Component; +import org.bukkit.Bukkit; +import org.bukkit.OfflinePlayer; + +import java.util.List; +import java.util.Map; + +public class ProtocolLibEventWrapper implements GenericEventWrapper{ + + private final SpigotCore plugin; + private final PacketEvent event; + private final WrappedServerPing ping; + + private final Map hostAddresses; + + public ProtocolLibEventWrapper(SpigotCore plugin, PacketEvent event, Map hostAddresses){ + this.plugin = plugin; + this.event = event; + this.ping = event.getPacket().getServerPings().read(0); + + this.hostAddresses = hostAddresses; + } + + @Override + public void setMaxPlayers(int maxPlayers){ + ping.setPlayersMaximum(maxPlayers); + } + + @Override + public void setMotd(Component component){ + ping.setMotD(AdventureComponentConverter.fromComponent(component)); + } + + @Override + public void hidePlayers(){ + ping.setPlayersVisible(false); + } + + @Override + public void setPlayerCount(String name){ + ping.setVersionName(name); + ping.setVersionProtocol(-1); + } + + @Override + public void setPlayers(List players, GenericPlayer player, PlayerPlaceholders playerPlaceholders, ServerPlaceholders serverPlaceholders){ + ping.setPlayers( + plugin.createPlayers(players, player.getPlayer(), playerPlaceholders, serverPlaceholders) + ); + } + + @Override + public void setFavicon(String favicon){ + WrappedServerPing.CompressedImage fav = plugin.getFaviconHandler().getFavicon(favicon, image -> { + try{ + return WrappedServerPing.CompressedImage.fromPng(image); + }catch(Exception ex){ + return null; + } + }); + + if(fav == null){ + plugin.getPluginLogger().warn("Cannot apply valid favicon. See previous messages for reasons"); + ping.setFavicon(ping.getFavicon()); + }else{ + ping.setFavicon(fav); + } + } + + // Not used in ProtocolLib + @Override + public void updateEvent(){} + + @Override + public boolean isInvalidProtocol(){ + return event.getPlayer().getAddress() == null; + } + + @Override + public int getProtocolVersion(){ + return ping.getVersionProtocol(); + } + + @Override + public int getOnlinePlayers(){ + return ping.getPlayersOnline(); + } + + @Override + public int getMaxPlayers(){ + return ping.getPlayersMaximum(); + } + + @Override + public String getPlayerIP(){ + return event.getPlayer().getAddress() == null ? "UNKNOWN" : event.getPlayer().getAddress().getHostString(); + } + + @Override + public String parsePAPIPlaceholders(String text, GenericPlayer player){ + if(plugin.getServer().getPluginManager().isPluginEnabled("PlaceholderAPI")) + return PlaceholderAPI.setPlaceholders(player.getPlayer(), text); + + return text; + } + + @Override + public String getVirtualHost(){ + String host = this.resolveHost(event.getPlayer().getAddress()); + if(host == null) + return null; + + return hostAddresses.get(host); + } + + @Override + public PluginCore getPlugin(){ + return plugin; + } + + @Override + public GenericPlayer createPlayer(String name, int protocol){ + OfflinePlayer player = Bukkit.getPlayerExact(name); + + if(player == null){ + //noinspection deprecation + player = Bukkit.getOfflinePlayer(name); + + return new SpigotPlayer(player.hasPlayedBefore() ? player : null, name, protocol); + } + + return new SpigotPlayer(player, name, protocol); + } +} diff --git a/velocity/src/main/java/ch/andre601/advancedserverlist/velocity/events/PingEvent.java b/velocity/src/main/java/ch/andre601/advancedserverlist/velocity/events/PingEvent.java index af99aed1..160bd79f 100644 --- a/velocity/src/main/java/ch/andre601/advancedserverlist/velocity/events/PingEvent.java +++ b/velocity/src/main/java/ch/andre601/advancedserverlist/velocity/events/PingEvent.java @@ -25,22 +25,11 @@ package ch.andre601.advancedserverlist.velocity.events; -import ch.andre601.advancedserverlist.core.parsing.ComponentParser; -import ch.andre601.advancedserverlist.core.profiles.ProfileManager; -import ch.andre601.advancedserverlist.core.profiles.ServerListProfile; -import ch.andre601.advancedserverlist.core.profiles.replacer.StringReplacer; -import ch.andre601.advancedserverlist.core.profiles.replacer.placeholders.PlayerPlaceholders; -import ch.andre601.advancedserverlist.core.profiles.replacer.placeholders.ServerPlaceholders; +import ch.andre601.advancedserverlist.core.events.PingEventHandler; import ch.andre601.advancedserverlist.velocity.VelocityCore; -import ch.andre601.advancedserverlist.velocity.VelocityPlayer; import com.velocitypowered.api.event.PostOrder; import com.velocitypowered.api.event.Subscribe; import com.velocitypowered.api.event.proxy.ProxyPingEvent; -import com.velocitypowered.api.proxy.server.ServerPing; -import com.velocitypowered.api.util.Favicon; - -import java.net.InetSocketAddress; -import java.util.List; public class PingEvent{ @@ -53,85 +42,6 @@ public PingEvent(VelocityCore plugin){ @Subscribe(order = PostOrder.EARLY) public void onProxyPing(ProxyPingEvent event){ - ServerPing ping = event.getPing(); - ServerPing.Version protocol = ping.getVersion(); - if(protocol == null) - return; - - ServerPing.Builder builder = ping.asBuilder(); - String playerName = plugin.getCore().getPlayerHandler().getPlayerByIp(event.getConnection().getRemoteAddress().getHostString()); - InetSocketAddress host = event.getConnection().getVirtualHost().orElse(null); - - int online = builder.getOnlinePlayers(); - int max = builder.getMaximumPlayers(); - - PlayerPlaceholders playerPlaceholders = new PlayerPlaceholders(new VelocityPlayer(playerName, protocol.getProtocol())); - ServerPlaceholders serverPlaceholders = new ServerPlaceholders(online, max, host == null ? null : host.getHostString()); - - ServerListProfile profile = ProfileManager.get(plugin.getCore()) - .replacements(playerPlaceholders) - .replacements(serverPlaceholders) - .getProfile(); - - if(profile == null) - return; - - if(profile.isExtraPlayersEnabled()){ - max = online + profile.getExtraPlayers(); - builder.maximumPlayers(max); - } - - serverPlaceholders = new ServerPlaceholders(online, max, host == null ? null : host.getHostString()); - - if(!profile.getMotd().isEmpty()){ - List motd = profile.getMotd(); - builder.description(ComponentParser.list(motd) - .replacements(playerPlaceholders) - .replacements(serverPlaceholders) - .toComponent() - ); - } - - if(profile.shouldHidePlayers()){ - builder.nullPlayers(); - } - - if(!profile.getPlayerCount().isEmpty() && !profile.shouldHidePlayers()){ - builder.version(new ServerPing.Version( - -1, - ComponentParser.text(profile.getPlayerCount()) - .replacements(playerPlaceholders) - .replacements(serverPlaceholders) - .toString() - )); - } - - if(!profile.getPlayers().isEmpty() && !profile.shouldHidePlayers()){ - ServerPing.SamplePlayer[] playerSamples = plugin.createPlayers(profile.getPlayers(), playerPlaceholders, serverPlaceholders) - .toArray(new ServerPing.SamplePlayer[0]); - - if(playerSamples.length > 0) - builder.clearSamplePlayers().samplePlayers(playerSamples); - } - - if(!profile.getFavicon().isEmpty()){ - String favName = StringReplacer.replace(profile.getFavicon(), playerPlaceholders.getReplacements()); - - Favicon favicon = plugin.getFaviconHandler().getFavicon(favName, image -> { - try{ - return Favicon.create(image); - }catch(Exception ex){ - return null; - } - }); - - if(favicon == null){ - plugin.getPluginLogger().warn("Could not obtain valid Favicon to use."); - }else{ - builder.favicon(favicon); - } - } - - event.setPing(builder.build()); + PingEventHandler.handleEvent(new VelocityEventWrapper(plugin, event)); } } diff --git a/velocity/src/main/java/ch/andre601/advancedserverlist/velocity/events/VelocityEventWrapper.java b/velocity/src/main/java/ch/andre601/advancedserverlist/velocity/events/VelocityEventWrapper.java new file mode 100644 index 00000000..1566db3c --- /dev/null +++ b/velocity/src/main/java/ch/andre601/advancedserverlist/velocity/events/VelocityEventWrapper.java @@ -0,0 +1,152 @@ +/* + * MIT License + * + * Copyright (c) 2022 Andre_601 + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + */ + +package ch.andre601.advancedserverlist.velocity.events; + +import ch.andre601.advancedserverlist.core.interfaces.core.PluginCore; +import ch.andre601.advancedserverlist.core.interfaces.events.GenericEventWrapper; +import ch.andre601.advancedserverlist.core.profiles.players.GenericPlayer; +import ch.andre601.advancedserverlist.core.profiles.replacer.placeholders.PlayerPlaceholders; +import ch.andre601.advancedserverlist.core.profiles.replacer.placeholders.ServerPlaceholders; +import ch.andre601.advancedserverlist.velocity.VelocityCore; +import ch.andre601.advancedserverlist.velocity.VelocityPlayer; +import com.velocitypowered.api.event.proxy.ProxyPingEvent; +import com.velocitypowered.api.proxy.Player; +import com.velocitypowered.api.proxy.server.ServerPing; +import com.velocitypowered.api.util.Favicon; +import net.kyori.adventure.text.Component; + +import java.util.List; + +public class VelocityEventWrapper implements GenericEventWrapper{ + + private final VelocityCore plugin; + private final ProxyPingEvent event; + private final ServerPing.Builder builder; + private final ServerPing.Version protocol; + + public VelocityEventWrapper(VelocityCore plugin, ProxyPingEvent event){ + this.plugin = plugin; + this.event = event; + this.builder = event.getPing().asBuilder(); + this.protocol = event.getPing().getVersion(); + } + + @Override + public void setMaxPlayers(int maxPlayers){ + builder.maximumPlayers(maxPlayers); + } + + @Override + public void setMotd(Component component){ + builder.description(component); + } + + @Override + public void hidePlayers(){ + builder.nullPlayers(); + } + + @Override + public void setPlayerCount(String name){ + builder.version(new ServerPing.Version(-1, name)); + } + + @Override + public void setPlayers(List players, GenericPlayer player, PlayerPlaceholders playerPlaceholders, ServerPlaceholders serverPlaceholders){ + ServerPing.SamplePlayer[] playerSamples = plugin.createPlayers(players, playerPlaceholders, serverPlaceholders) + .toArray(new ServerPing.SamplePlayer[0]); + + if(playerSamples.length > 0) + builder.clearSamplePlayers().samplePlayers(playerSamples); + } + + @Override + public void setFavicon(String favicon){ + Favicon fav = plugin.getFaviconHandler().getFavicon(favicon, image -> { + try{ + return Favicon.create(image); + }catch(Exception ex){ + return null; + } + }); + + if(fav == null){ + plugin.getPluginLogger().warn("Cannot apply valid favicon. See previous messages for reasons"); + }else{ + builder.favicon(fav); + } + } + + @Override + public void updateEvent(){ + event.setPing(builder.build()); + } + + @Override + public boolean isInvalidProtocol(){ + return protocol == null; + } + + @Override + public int getProtocolVersion(){ + return protocol.getProtocol(); + } + + @Override + public int getOnlinePlayers(){ + return builder.getOnlinePlayers(); + } + + @Override + public int getMaxPlayers(){ + return builder.getMaximumPlayers(); + } + + @Override + public String getPlayerIP(){ + return event.getConnection().getRemoteAddress().getHostString(); + } + + @Override + public String parsePAPIPlaceholders(String text, GenericPlayer player){ + return text; + } + + @Override + public String getVirtualHost(){ + return this.resolveHost(event.getConnection().getVirtualHost().orElse(null)); + } + + @Override + public PluginCore getPlugin(){ + return plugin; + } + + @Override + public GenericPlayer createPlayer(String name, int protocol){ + return new VelocityPlayer(name, protocol); + } +} From 5922b2235e4923d56ff35d019735913072403a60 Mon Sep 17 00:00:00 2001 From: Andre601 <11576465+Andre601@users.noreply.github.com> Date: Wed, 7 Dec 2022 21:19:23 +0100 Subject: [PATCH 5/6] Bump version --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 4323f8aa..ef37d74c 100644 --- a/pom.xml +++ b/pom.xml @@ -12,7 +12,7 @@ UTF-8 - 1.7.0 + 1.8.0 Create multiple Server lists based on conditions. 16 From 4cd4aeb12aba2d5d92dccf11306476e9bc0b3516 Mon Sep 17 00:00:00 2001 From: Andre601 <11576465+Andre601@users.noreply.github.com> Date: Thu, 8 Dec 2022 16:42:23 +0100 Subject: [PATCH 6/6] Move Favicon creation and logging to PingEventHandler --- .../bungeecord/events/BungeeEventWrapper.java | 29 +++++++++---------- .../core/check/UpdateChecker.java | 2 ++ .../core/events/PingEventHandler.java | 15 +++++++++- .../events/GenericEventWrapper.java | 7 ++++- .../paper/events/PaperEventWrapper.java | 28 +++++++++--------- .../events/ProtocolLibEventWrapper.java | 28 +++++++++--------- .../velocity/events/VelocityEventWrapper.java | 26 ++++++++--------- 7 files changed, 73 insertions(+), 62 deletions(-) diff --git a/bungeecord/src/main/java/ch/andre601/advancedserverlist/bungeecord/events/BungeeEventWrapper.java b/bungeecord/src/main/java/ch/andre601/advancedserverlist/bungeecord/events/BungeeEventWrapper.java index cd5e1ff5..cf338316 100644 --- a/bungeecord/src/main/java/ch/andre601/advancedserverlist/bungeecord/events/BungeeEventWrapper.java +++ b/bungeecord/src/main/java/ch/andre601/advancedserverlist/bungeecord/events/BungeeEventWrapper.java @@ -40,6 +40,7 @@ import net.md_5.bungee.api.connection.ProxiedPlayer; import net.md_5.bungee.api.event.ProxyPingEvent; +import java.awt.image.BufferedImage; import java.net.InetSocketAddress; import java.util.List; @@ -88,22 +89,13 @@ public void setPlayers(List players, GenericPlayer player } @Override - public void setFavicon(String favicon){ - Favicon fav = plugin.getFaviconHandler().getFavicon(favicon, image -> { - try{ - return Favicon.create(image); - }catch(Exception ex){ - plugin.getPluginLogger().warn("Unable to create Favicon. %s", ex.getMessage()); - return null; - } - }); - - if(fav == null){ - plugin.getPluginLogger().warn("Cannot apply valid favicon. See previous messages for reasons"); - ping.setFavicon(ping.getFaviconObject()); - }else{ - ping.setFavicon(fav); - } + public void setFavicon(Favicon favicon){ + ping.setFavicon(favicon); + } + + @Override + public void setDefaultFavicon(){ + ping.setFavicon(ping.getFaviconObject()); } @Override @@ -156,4 +148,9 @@ public PluginCore getPlugin(){ public GenericPlayer createPlayer(String name, int protocol){ return new BungeePlayer(name, protocol); } + + @Override + public Favicon createFavicon(BufferedImage image) throws IllegalArgumentException{ + return Favicon.create(image); + } } diff --git a/core/src/main/java/ch/andre601/advancedserverlist/core/check/UpdateChecker.java b/core/src/main/java/ch/andre601/advancedserverlist/core/check/UpdateChecker.java index 57199675..bebccc94 100644 --- a/core/src/main/java/ch/andre601/advancedserverlist/core/check/UpdateChecker.java +++ b/core/src/main/java/ch/andre601/advancedserverlist/core/check/UpdateChecker.java @@ -173,7 +173,9 @@ private void printUpdateBanner(String version, String versionId){ } public static class ModrinthVersion{ + @SuppressWarnings("FieldMayBeFinal") private String id; + @SuppressWarnings("FieldMayBeFinal") private String versionNumber; public ModrinthVersion(String id, String versionNumber){ diff --git a/core/src/main/java/ch/andre601/advancedserverlist/core/events/PingEventHandler.java b/core/src/main/java/ch/andre601/advancedserverlist/core/events/PingEventHandler.java index cd86e084..9c13d48a 100644 --- a/core/src/main/java/ch/andre601/advancedserverlist/core/events/PingEventHandler.java +++ b/core/src/main/java/ch/andre601/advancedserverlist/core/events/PingEventHandler.java @@ -101,7 +101,20 @@ public static void handleEvent(GenericEventWrapper event){ if(!profile.getFavicon().isEmpty()){ String favicon = StringReplacer.replace(profile.getFavicon(), playerPlaceholders.getReplacements()); - event.setFavicon(favicon); + F fav = plugin.getFaviconHandler().getFavicon(favicon, image -> { + try{ + return event.createFavicon(image); + }catch(Exception ex){ + plugin.getPluginLogger().warn("Encountered an Exception while creating Favicon!", ex); + return null; + } + }); + + if(fav == null){ + event.setDefaultFavicon(); + }else{ + event.setFavicon(fav); + } } event.updateEvent(); diff --git a/core/src/main/java/ch/andre601/advancedserverlist/core/interfaces/events/GenericEventWrapper.java b/core/src/main/java/ch/andre601/advancedserverlist/core/interfaces/events/GenericEventWrapper.java index c26625c6..46632012 100644 --- a/core/src/main/java/ch/andre601/advancedserverlist/core/interfaces/events/GenericEventWrapper.java +++ b/core/src/main/java/ch/andre601/advancedserverlist/core/interfaces/events/GenericEventWrapper.java @@ -31,6 +31,7 @@ import ch.andre601.advancedserverlist.core.profiles.replacer.placeholders.ServerPlaceholders; import net.kyori.adventure.text.Component; +import java.awt.image.BufferedImage; import java.net.InetSocketAddress; import java.util.List; @@ -46,7 +47,9 @@ public interface GenericEventWrapper{ void setPlayers(List players, GenericPlayer

player, PlayerPlaceholders playerPlaceholders, ServerPlaceholders serverPlaceholders); - void setFavicon(String favicon); + void setFavicon(F favicon); + + void setDefaultFavicon(); void updateEvent(); @@ -68,6 +71,8 @@ public interface GenericEventWrapper{ GenericPlayer

createPlayer(String name, int protocol); + F createFavicon(BufferedImage image) throws Exception; + default String resolveHost(InetSocketAddress address){ return address == null ? null : address.getHostString(); } diff --git a/paper/src/main/java/ch/andre601/advancedserverlist/paper/events/PaperEventWrapper.java b/paper/src/main/java/ch/andre601/advancedserverlist/paper/events/PaperEventWrapper.java index 97ef12f3..4dd9580e 100644 --- a/paper/src/main/java/ch/andre601/advancedserverlist/paper/events/PaperEventWrapper.java +++ b/paper/src/main/java/ch/andre601/advancedserverlist/paper/events/PaperEventWrapper.java @@ -39,6 +39,7 @@ import org.bukkit.OfflinePlayer; import org.bukkit.util.CachedServerIcon; +import java.awt.image.BufferedImage; import java.util.List; public class PaperEventWrapper implements GenericEventWrapper{ @@ -82,21 +83,13 @@ public void setPlayers(List players, GenericPlayer player } @Override - public void setFavicon(String favicon){ - CachedServerIcon fav = plugin.getFaviconHandler().getFavicon(favicon, image -> { - try{ - return Bukkit.loadServerIcon(image); - }catch(Exception ex){ - return null; - } - }); - - if(fav == null){ - plugin.getPluginLogger().warn("Cannot apply valid favicon. See previous messages for reasons"); - event.setServerIcon(event.getServerIcon()); - }else{ - event.setServerIcon(fav); - } + public void setFavicon(CachedServerIcon favicon){ + event.setServerIcon(favicon); + } + + @Override + public void setDefaultFavicon(){ + event.setServerIcon(event.getServerIcon()); } // Not used in Paper @@ -159,4 +152,9 @@ public GenericPlayer createPlayer(String name, int protocol){ return new PaperPlayer(player, name, protocol); } + + @Override + public CachedServerIcon createFavicon(BufferedImage image) throws Exception{ + return Bukkit.loadServerIcon(image); + } } diff --git a/spigot/src/main/java/ch/andre601/advancedserverlist/spigot/events/ProtocolLibEventWrapper.java b/spigot/src/main/java/ch/andre601/advancedserverlist/spigot/events/ProtocolLibEventWrapper.java index a1591de8..b91f5f1b 100644 --- a/spigot/src/main/java/ch/andre601/advancedserverlist/spigot/events/ProtocolLibEventWrapper.java +++ b/spigot/src/main/java/ch/andre601/advancedserverlist/spigot/events/ProtocolLibEventWrapper.java @@ -40,6 +40,7 @@ import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; +import java.awt.image.BufferedImage; import java.util.List; import java.util.Map; @@ -88,21 +89,13 @@ public void setPlayers(List players, GenericPlayer player } @Override - public void setFavicon(String favicon){ - WrappedServerPing.CompressedImage fav = plugin.getFaviconHandler().getFavicon(favicon, image -> { - try{ - return WrappedServerPing.CompressedImage.fromPng(image); - }catch(Exception ex){ - return null; - } - }); - - if(fav == null){ - plugin.getPluginLogger().warn("Cannot apply valid favicon. See previous messages for reasons"); - ping.setFavicon(ping.getFavicon()); - }else{ - ping.setFavicon(fav); - } + public void setFavicon(WrappedServerPing.CompressedImage favicon){ + ping.setFavicon(favicon); + } + + @Override + public void setDefaultFavicon(){ + ping.setFavicon(ping.getFavicon()); } // Not used in ProtocolLib @@ -169,4 +162,9 @@ public GenericPlayer createPlayer(String name, int protocol){ return new SpigotPlayer(player, name, protocol); } + + @Override + public WrappedServerPing.CompressedImage createFavicon(BufferedImage image) throws Exception{ + return WrappedServerPing.CompressedImage.fromPng(image); + } } diff --git a/velocity/src/main/java/ch/andre601/advancedserverlist/velocity/events/VelocityEventWrapper.java b/velocity/src/main/java/ch/andre601/advancedserverlist/velocity/events/VelocityEventWrapper.java index 1566db3c..3dce3494 100644 --- a/velocity/src/main/java/ch/andre601/advancedserverlist/velocity/events/VelocityEventWrapper.java +++ b/velocity/src/main/java/ch/andre601/advancedserverlist/velocity/events/VelocityEventWrapper.java @@ -38,6 +38,7 @@ import com.velocitypowered.api.util.Favicon; import net.kyori.adventure.text.Component; +import java.awt.image.BufferedImage; import java.util.List; public class VelocityEventWrapper implements GenericEventWrapper{ @@ -84,22 +85,14 @@ public void setPlayers(List players, GenericPlayer player, Playe } @Override - public void setFavicon(String favicon){ - Favicon fav = plugin.getFaviconHandler().getFavicon(favicon, image -> { - try{ - return Favicon.create(image); - }catch(Exception ex){ - return null; - } - }); - - if(fav == null){ - plugin.getPluginLogger().warn("Cannot apply valid favicon. See previous messages for reasons"); - }else{ - builder.favicon(fav); - } + public void setFavicon(Favicon favicon){ + builder.favicon(favicon); } + // Not used in Velocity + @Override + public void setDefaultFavicon(){} + @Override public void updateEvent(){ event.setPing(builder.build()); @@ -149,4 +142,9 @@ public PluginCore getPlugin(){ public GenericPlayer createPlayer(String name, int protocol){ return new VelocityPlayer(name, protocol); } + + @Override + public Favicon createFavicon(BufferedImage image){ + return Favicon.create(image); + } }