mirror of
https://github.com/proxiodev/RedisBungee.git
synced 2024-10-31 18:48:01 +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:
parent
121040ad90
commit
d1bfb9e162
@ -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,20 +183,39 @@ public class RedisBungeeListener implements Listener {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
event.registerIntent(plugin);
|
boolean runAsync = true;
|
||||||
plugin.getProxy().getScheduler().runAsync(plugin, new Runnable() {
|
for (String s : ASYNC_PING_EVENT_HOSTILE) {
|
||||||
@Override
|
if (ProxyServer.getInstance().getPluginManager().getPlugin(s) != null) {
|
||||||
public void run() {
|
runAsync = false;
|
||||||
ServerPing old = event.getResponse();
|
break;
|
||||||
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);
|
|
||||||
event.completeIntent(plugin);
|
|
||||||
}
|
}
|
||||||
});
|
}
|
||||||
|
|
||||||
|
if (runAsync) {
|
||||||
|
event.registerIntent(plugin);
|
||||||
|
plugin.getProxy().getScheduler().runAsync(plugin, new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
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);
|
||||||
|
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
|
||||||
|
Loading…
Reference in New Issue
Block a user