2
0
mirror of https://github.com/proxiodev/RedisBungee.git synced 2024-11-01 02:58:02 +00:00

If we find an async ping event-hostile plugin (currently only ServerListPlus), run the ping handling handler synchronously.

This is meant as a move to attempt to introduce a better mechanism for handling async events in a more sane way.
This commit is contained in:
Tux 2015-08-25 20:12:55 -04:00
parent 121040ad90
commit d1bfb9e162

View File

@ -28,6 +28,7 @@ package com.imaginarycode.minecraft.redisbungee;
import com.google.common.base.Joiner; import com.google.common.base.Joiner;
import com.google.common.collect.HashMultimap; import com.google.common.collect.HashMultimap;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Multimap; import com.google.common.collect.Multimap;
import com.google.common.io.ByteArrayDataInput; import com.google.common.io.ByteArrayDataInput;
import com.google.common.io.ByteArrayDataOutput; import com.google.common.io.ByteArrayDataOutput;
@ -37,6 +38,7 @@ import com.imaginarycode.minecraft.redisbungee.util.RedisCallable;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import net.md_5.bungee.api.AbstractReconnectHandler; import net.md_5.bungee.api.AbstractReconnectHandler;
import net.md_5.bungee.api.ChatColor; import net.md_5.bungee.api.ChatColor;
import net.md_5.bungee.api.ProxyServer;
import net.md_5.bungee.api.ServerPing; import net.md_5.bungee.api.ServerPing;
import net.md_5.bungee.api.chat.BaseComponent; import net.md_5.bungee.api.chat.BaseComponent;
import net.md_5.bungee.api.chat.ComponentBuilder; import net.md_5.bungee.api.chat.ComponentBuilder;
@ -69,6 +71,8 @@ public class RedisBungeeListener implements Listener {
private final RedisBungee plugin; private final RedisBungee plugin;
private final List<InetAddress> exemptAddresses; private final List<InetAddress> exemptAddresses;
private static final List<String> ASYNC_PING_EVENT_HOSTILE = ImmutableList.of("ServerListPlus");
@EventHandler(priority = EventPriority.LOWEST) @EventHandler(priority = EventPriority.LOWEST)
public void onLogin(final LoginEvent event) { public void onLogin(final LoginEvent event) {
event.registerIntent(plugin); event.registerIntent(plugin);
@ -179,6 +183,15 @@ public class RedisBungeeListener implements Listener {
return; return;
} }
boolean runAsync = true;
for (String s : ASYNC_PING_EVENT_HOSTILE) {
if (ProxyServer.getInstance().getPluginManager().getPlugin(s) != null) {
runAsync = false;
break;
}
}
if (runAsync) {
event.registerIntent(plugin); event.registerIntent(plugin);
plugin.getProxy().getScheduler().runAsync(plugin, new Runnable() { plugin.getProxy().getScheduler().runAsync(plugin, new Runnable() {
@Override @Override
@ -193,6 +206,16 @@ public class RedisBungeeListener implements Listener {
event.completeIntent(plugin); event.completeIntent(plugin);
} }
}); });
} else {
// Async ping event will not work as an async-hostile plugin was found, so perform the ping modification synchronously.
ServerPing old = event.getResponse();
ServerPing reply = new ServerPing();
reply.setPlayers(new ServerPing.Players(old.getPlayers().getMax(), plugin.getCount(), old.getPlayers().getSample()));
reply.setDescription(old.getDescription());
reply.setFavicon(old.getFaviconObject());
reply.setVersion(old.getVersion());
event.setResponse(reply);
}
} }
@EventHandler @EventHandler