RedisBungee/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungeeListener.java

152 lines
6.9 KiB
Java
Raw Normal View History

/**
* Copyright © 2013 tuxed <write@imaginarycode.com>
* This work is free. You can redistribute it and/or modify it under the
* terms of the Do What The Fuck You Want To Public License, Version 2,
* as published by Sam Hocevar. See http://www.wtfpl.net/ for more details.
*/
2014-04-19 20:08:49 +00:00
package com.imaginarycode.minecraft.redisbungee;
import com.google.common.base.Joiner;
import com.google.common.io.ByteArrayDataInput;
import com.google.common.io.ByteArrayDataOutput;
import com.google.common.io.ByteStreams;
import com.imaginarycode.minecraft.redisbungee.consumerevents.PlayerChangedServerConsumerEvent;
import com.imaginarycode.minecraft.redisbungee.consumerevents.PlayerLoggedInConsumerEvent;
import com.imaginarycode.minecraft.redisbungee.consumerevents.PlayerLoggedOffConsumerEvent;
2014-04-19 20:08:49 +00:00
import com.imaginarycode.minecraft.redisbungee.events.PubSubMessageEvent;
import lombok.AllArgsConstructor;
import net.md_5.bungee.api.ChatColor;
2014-04-19 20:08:49 +00:00
import net.md_5.bungee.api.ServerPing;
2014-09-11 20:38:40 +00:00
import net.md_5.bungee.api.chat.BaseComponent;
import net.md_5.bungee.api.chat.ComponentBuilder;
2014-04-19 20:08:49 +00:00
import net.md_5.bungee.api.connection.Server;
import net.md_5.bungee.api.event.*;
import net.md_5.bungee.api.plugin.Listener;
import net.md_5.bungee.event.EventHandler;
import net.md_5.bungee.event.EventPriority;
2014-04-19 20:08:49 +00:00
import redis.clients.jedis.Jedis;
import java.util.*;
2014-04-19 20:08:49 +00:00
@AllArgsConstructor
public class RedisBungeeListener implements Listener {
private final RedisBungee plugin;
2014-09-11 20:38:40 +00:00
private static final BaseComponent[] ALREADY_LOGGED_IN =
new ComponentBuilder("You are already logged on to this server.").color(ChatColor.RED)
.append("\n\nIf you were disconnected forcefully, please wait up to one minute.\nIf this does not resolve your issue, please contact staff.")
.color(ChatColor.GRAY)
.create();
2014-04-19 20:08:49 +00:00
@EventHandler
public void onPlayerConnect(final PostLoginEvent event) {
Jedis rsc = plugin.getPool().getResource();
try {
for (String server : plugin.getServerIds()) {
if (rsc.sismember("proxy:" + server + ":usersOnline", event.getPlayer().getUniqueId().toString())) {
2014-09-11 20:38:40 +00:00
event.getPlayer().disconnect(ALREADY_LOGGED_IN);
return;
2014-04-19 20:08:49 +00:00
}
}
2014-09-11 20:38:40 +00:00
plugin.getConsumer().queue(new PlayerLoggedInConsumerEvent(event.getPlayer()));
} finally {
plugin.getPool().returnResource(rsc);
2014-04-19 20:08:49 +00:00
}
}
@EventHandler
public void onPlayerDisconnect(final PlayerDisconnectEvent event) {
plugin.getConsumer().queue(new PlayerLoggedOffConsumerEvent(event.getPlayer()));
2014-04-19 20:08:49 +00:00
}
@EventHandler
public void onServerChange(final ServerConnectedEvent event) {
plugin.getConsumer().queue(new PlayerChangedServerConsumerEvent(event.getPlayer(), event.getServer().getInfo()));
2014-04-19 20:08:49 +00:00
}
@EventHandler(priority = EventPriority.LOWEST)
2014-04-19 20:08:49 +00:00
public void onPing(ProxyPingEvent event) {
ServerPing old = event.getResponse();
ServerPing reply = new ServerPing();
2014-06-14 03:36:20 +00:00
reply.setPlayers(new ServerPing.Players(old.getPlayers().getMax(), plugin.getCount(), old.getPlayers().getSample()));
2014-04-19 20:08:49 +00:00
reply.setDescription(old.getDescription());
reply.setFavicon(old.getFaviconObject());
reply.setVersion(old.getVersion());
event.setResponse(reply);
}
@EventHandler
public void onPluginMessage(final PluginMessageEvent event) {
2014-04-19 20:08:49 +00:00
if (event.getTag().equals("RedisBungee") && event.getSender() instanceof Server) {
final byte[] data = Arrays.copyOf(event.getData(), event.getData().length);
plugin.getProxy().getScheduler().runAsync(plugin, new Runnable() {
@Override
public void run() {
ByteArrayDataInput in = ByteStreams.newDataInput(data);
2014-04-19 20:08:49 +00:00
String subchannel = in.readUTF();
ByteArrayDataOutput out = ByteStreams.newDataOutput();
String type;
2014-04-19 20:08:49 +00:00
switch (subchannel) {
case "PlayerList":
2014-06-04 17:15:25 +00:00
out.writeUTF("PlayerList");
Set<UUID> original = Collections.emptySet();
type = in.readUTF();
if (type.equals("ALL")) {
out.writeUTF("ALL");
original = plugin.getPlayers();
} else {
try {
original = plugin.getPlayersOnServer(type);
} catch (IllegalArgumentException ignored) {
}
}
Set<String> players = new HashSet<>();
for (UUID uuid : original)
players.add(plugin.getUuidTranslator().getNameFromUuid(uuid, false));
out.writeUTF(Joiner.on(',').join(players));
break;
case "PlayerCount":
out.writeUTF("PlayerCount");
type = in.readUTF();
if (type.equals("ALL")) {
out.writeUTF("ALL");
out.writeInt(plugin.getCount());
} else {
out.writeUTF(type);
try {
out.writeInt(plugin.getPlayersOnServer(type).size());
} catch (IllegalArgumentException e) {
out.writeInt(0);
}
}
break;
case "LastOnline":
String user = in.readUTF();
out.writeUTF("LastOnline");
out.writeUTF(user);
out.writeLong(RedisBungee.getApi().getLastOnline(plugin.getUuidTranslator().getTranslatedUuid(user, true)));
break;
default:
break;
2014-04-19 20:08:49 +00:00
}
((Server) event.getSender()).sendData("RedisBungee", out.toByteArray());
}
});
2014-04-19 20:08:49 +00:00
}
}
@EventHandler
public void onPubSubMessage(PubSubMessageEvent event) {
if (event.getChannel().equals("redisbungee-allservers") || event.getChannel().equals("redisbungee-" + RedisBungee.getApi().getServerId())) {
2014-04-19 20:08:49 +00:00
String message = event.getMessage();
if (message.startsWith("/"))
message = message.substring(1);
plugin.getLogger().info("Invoking command via PubSub: /" + message);
plugin.getProxy().getPluginManager().dispatchCommand(RedisBungeeCommandSender.instance, message);
}
}
}