mirror of
https://github.com/proxiodev/RedisBungee.git
synced 2024-11-22 20:28:00 +00:00
Update Jedis version, some refactoring, add PubSub support :D
This commit is contained in:
parent
72429b004a
commit
516ed35fed
2
pom.xml
2
pom.xml
@ -112,7 +112,7 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>redis.clients</groupId>
|
<groupId>redis.clients</groupId>
|
||||||
<artifactId>jedis</artifactId>
|
<artifactId>jedis</artifactId>
|
||||||
<version>2.0.0</version>
|
<version>2.2.1</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>net.md-5</groupId>
|
<groupId>net.md-5</groupId>
|
||||||
|
@ -7,7 +7,10 @@
|
|||||||
package com.imaginarycode.minecraft.redisbungee;
|
package com.imaginarycode.minecraft.redisbungee;
|
||||||
|
|
||||||
import com.google.common.base.Joiner;
|
import com.google.common.base.Joiner;
|
||||||
import com.google.common.collect.*;
|
import com.google.common.collect.HashMultimap;
|
||||||
|
import com.google.common.collect.ImmutableSet;
|
||||||
|
import com.google.common.collect.Lists;
|
||||||
|
import com.google.common.collect.Multimap;
|
||||||
import com.google.common.io.ByteStreams;
|
import com.google.common.io.ByteStreams;
|
||||||
import net.md_5.bungee.api.ChatColor;
|
import net.md_5.bungee.api.ChatColor;
|
||||||
import net.md_5.bungee.api.CommandSender;
|
import net.md_5.bungee.api.CommandSender;
|
||||||
@ -21,31 +24,48 @@ import net.md_5.bungee.api.event.ServerConnectedEvent;
|
|||||||
import net.md_5.bungee.api.plugin.Command;
|
import net.md_5.bungee.api.plugin.Command;
|
||||||
import net.md_5.bungee.api.plugin.Listener;
|
import net.md_5.bungee.api.plugin.Listener;
|
||||||
import net.md_5.bungee.api.plugin.Plugin;
|
import net.md_5.bungee.api.plugin.Plugin;
|
||||||
|
import net.md_5.bungee.api.scheduler.ScheduledTask;
|
||||||
import net.md_5.bungee.event.EventHandler;
|
import net.md_5.bungee.event.EventHandler;
|
||||||
import org.apache.commons.lang3.time.FastDateFormat;
|
import org.apache.commons.lang3.time.FastDateFormat;
|
||||||
import org.yaml.snakeyaml.Yaml;
|
import org.yaml.snakeyaml.Yaml;
|
||||||
import redis.clients.jedis.Jedis;
|
import redis.clients.jedis.Jedis;
|
||||||
import redis.clients.jedis.JedisPool;
|
import redis.clients.jedis.JedisPool;
|
||||||
import redis.clients.jedis.JedisPoolConfig;
|
import redis.clients.jedis.JedisPoolConfig;
|
||||||
|
import redis.clients.jedis.JedisPubSub;
|
||||||
|
import redis.clients.jedis.exceptions.JedisConnectionException;
|
||||||
|
import redis.clients.jedis.exceptions.JedisException;
|
||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The RedisBungee plugin.
|
||||||
|
* <p/>
|
||||||
|
* The only function of interest is {@link #getApi()}, which exposes some functions in this class.
|
||||||
|
*/
|
||||||
public class RedisBungee extends Plugin implements Listener {
|
public class RedisBungee extends Plugin implements Listener {
|
||||||
private static final ServerPing.PlayerInfo[] EMPTY_PLAYERINFO = new ServerPing.PlayerInfo[]{};
|
private static final ServerPing.PlayerInfo[] EMPTY_PLAYERINFO = new ServerPing.PlayerInfo[]{};
|
||||||
private static JedisPool pool;
|
private RedisBungeeCommandSender commandSender = new RedisBungeeCommandSender();
|
||||||
private static String serverId;
|
private JedisPool pool;
|
||||||
private static List<String> servers = Lists.newArrayList();
|
private String serverId;
|
||||||
private static RedisBungee plugin;
|
private List<String> servers = Lists.newArrayList();
|
||||||
|
private RedisBungee plugin;
|
||||||
|
private static RedisBungeeAPI api;
|
||||||
|
private PubSubListener psl;
|
||||||
|
private ScheduledTask pubSubTask;
|
||||||
private boolean canonicalGlist = true;
|
private boolean canonicalGlist = true;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a combined count of all players on this network.
|
* Fetch the {@link RedisBungeeAPI} object created on plugin start.
|
||||||
*
|
*
|
||||||
* @return a count of all players found
|
* @return the {@link RedisBungeeAPI} object
|
||||||
*/
|
*/
|
||||||
public static int getCount() {
|
public static RedisBungeeAPI getApi() {
|
||||||
|
return api;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getCount() {
|
||||||
Jedis rsc = pool.getResource();
|
Jedis rsc = pool.getResource();
|
||||||
int c = 0;
|
int c = 0;
|
||||||
try {
|
try {
|
||||||
@ -61,14 +81,7 @@ public class RedisBungee extends Plugin implements Listener {
|
|||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
public Set<String> getPlayers() {
|
||||||
* Get a combined list of players on this network.
|
|
||||||
* <p/>
|
|
||||||
* Note that this function returns an immutable {@link java.util.Set}.
|
|
||||||
*
|
|
||||||
* @return a Set with all players found
|
|
||||||
*/
|
|
||||||
public static Set<String> getPlayers() {
|
|
||||||
Set<String> players = new HashSet<>();
|
Set<String> players = new HashSet<>();
|
||||||
for (ProxiedPlayer pp : plugin.getProxy().getPlayers()) {
|
for (ProxiedPlayer pp : plugin.getProxy().getPlayers()) {
|
||||||
players.add(pp.getName());
|
players.add(pp.getName());
|
||||||
@ -91,14 +104,7 @@ public class RedisBungee extends Plugin implements Listener {
|
|||||||
return ImmutableSet.copyOf(players);
|
return ImmutableSet.copyOf(players);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
public ServerInfo getServerFor(String name) {
|
||||||
* Get the server where the specified player is playing. This function also deals with the case of local players
|
|
||||||
* as well, and will return local information on them.
|
|
||||||
*
|
|
||||||
* @param name a player name
|
|
||||||
* @return a {@link net.md_5.bungee.api.config.ServerInfo} for the server the player is on.
|
|
||||||
*/
|
|
||||||
public static ServerInfo getServerFor(String name) {
|
|
||||||
ServerInfo server = null;
|
ServerInfo server = null;
|
||||||
if (plugin.getProxy().getPlayer(name) != null) return plugin.getProxy().getPlayer(name).getServer().getInfo();
|
if (plugin.getProxy().getPlayer(name) != null) return plugin.getProxy().getPlayer(name).getServer().getInfo();
|
||||||
if (pool != null) {
|
if (pool != null) {
|
||||||
@ -113,18 +119,11 @@ public class RedisBungee extends Plugin implements Listener {
|
|||||||
return server;
|
return server;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static long getUnixTimestamp() {
|
private long getUnixTimestamp() {
|
||||||
return TimeUnit.SECONDS.convert(System.currentTimeMillis(), TimeUnit.MILLISECONDS);
|
return TimeUnit.SECONDS.convert(System.currentTimeMillis(), TimeUnit.MILLISECONDS);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
public long getLastOnline(String name) {
|
||||||
* Get the last time a player was on. If the player is currently online, this will return 0. If the player has not been recorded,
|
|
||||||
* this will return -1. Otherwise it will return a value in seconds.
|
|
||||||
*
|
|
||||||
* @param name a player name
|
|
||||||
* @return the last time a player was on, if online returns a 0
|
|
||||||
*/
|
|
||||||
public static long getLastOnline(String name) {
|
|
||||||
long time = -1L;
|
long time = -1L;
|
||||||
if (plugin.getProxy().getPlayer(name) != null) return 0;
|
if (plugin.getProxy().getPlayer(name) != null) return 0;
|
||||||
if (pool != null) {
|
if (pool != null) {
|
||||||
@ -231,18 +230,25 @@ public class RedisBungee extends Plugin implements Listener {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
getProxy().getPluginManager().registerListener(this, this);
|
getProxy().getPluginManager().registerListener(this, this);
|
||||||
|
api = new RedisBungeeAPI(this);
|
||||||
|
psl = new PubSubListener();
|
||||||
|
pubSubTask = getProxy().getScheduler().runAsync(this, psl);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onDisable() {
|
public void onDisable() {
|
||||||
if (pool != null) {
|
if (pool != null) {
|
||||||
|
// Poison the PubSub listener
|
||||||
|
psl.poison();
|
||||||
|
getProxy().getScheduler().cancel(this);
|
||||||
Jedis tmpRsc = pool.getResource();
|
Jedis tmpRsc = pool.getResource();
|
||||||
try {
|
try {
|
||||||
tmpRsc.set("server:" + serverId + ":playerCount", "0"); // reset
|
tmpRsc.set("server:" + serverId + ":playerCount", "0"); // reset
|
||||||
for (String i : tmpRsc.smembers("server:" + serverId + ":usersOnline")) {
|
for (String i : tmpRsc.smembers("server:" + serverId + ":usersOnline")) {
|
||||||
tmpRsc.srem("server:" + serverId + ":usersOnline", i);
|
tmpRsc.srem("server:" + serverId + ":usersOnline", i);
|
||||||
}
|
}
|
||||||
|
} catch (JedisException | ClassCastException ignored) {
|
||||||
} finally {
|
} finally {
|
||||||
pool.returnResource(tmpRsc);
|
pool.returnResource(tmpRsc);
|
||||||
}
|
}
|
||||||
@ -354,4 +360,58 @@ public class RedisBungee extends Plugin implements Listener {
|
|||||||
reply.setVersion(old.getVersion());
|
reply.setVersion(old.getVersion());
|
||||||
event.setResponse(reply);
|
event.setResponse(reply);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private class PubSubListener implements Runnable {
|
||||||
|
|
||||||
|
private Jedis rsc;
|
||||||
|
private JedisPubSubHandler jpsh;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
try {
|
||||||
|
rsc = pool.getResource();
|
||||||
|
jpsh = new JedisPubSubHandler();
|
||||||
|
rsc.subscribe(jpsh, "redisbungee-" + serverId, "redisbungee-allservers");
|
||||||
|
} catch (JedisException | ClassCastException ignored) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void poison() {
|
||||||
|
jpsh.unsubscribe();
|
||||||
|
pool.returnResource(rsc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private class JedisPubSubHandler extends JedisPubSub {
|
||||||
|
@Override
|
||||||
|
public void onMessage(String s, String s2) {
|
||||||
|
String cmd;
|
||||||
|
if (s2.startsWith("/")) {
|
||||||
|
cmd = s2.substring(1);
|
||||||
|
} else {
|
||||||
|
cmd = s2;
|
||||||
|
}
|
||||||
|
getProxy().getPluginManager().dispatchCommand(commandSender, cmd);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPMessage(String s, String s2, String s3) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onSubscribe(String s, int i) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onUnsubscribe(String s, int i) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPUnsubscribe(String s, int i) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPSubscribe(String s, int i) {
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,67 @@
|
|||||||
|
/**
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
package com.imaginarycode.minecraft.redisbungee;
|
||||||
|
|
||||||
|
import net.md_5.bungee.api.config.ServerInfo;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class exposes some internal RedisBungee functions. You obtain an instance of this object by invoking {@link RedisBungee#getApi()}.
|
||||||
|
*
|
||||||
|
* @author tuxed
|
||||||
|
* @since 0.2.3
|
||||||
|
*/
|
||||||
|
public class RedisBungeeAPI {
|
||||||
|
private RedisBungee plugin;
|
||||||
|
|
||||||
|
protected RedisBungeeAPI(RedisBungee plugin) {
|
||||||
|
this.plugin = plugin;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a combined count of all players on this network.
|
||||||
|
*
|
||||||
|
* @return a count of all players found
|
||||||
|
*/
|
||||||
|
public int getPlayerCount() {
|
||||||
|
return plugin.getCount();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the last time a player was on. If the player is currently online, this will return 0. If the player has not been recorded,
|
||||||
|
* this will return -1. Otherwise it will return a value in seconds.
|
||||||
|
*
|
||||||
|
* @param player a player name
|
||||||
|
* @return the last time a player was on, if online returns a 0
|
||||||
|
*/
|
||||||
|
public long getLastOnline(String player) {
|
||||||
|
return plugin.getLastOnline(player);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the server where the specified player is playing. This function also deals with the case of local players
|
||||||
|
* as well, and will return local information on them.
|
||||||
|
*
|
||||||
|
* @param player a player name
|
||||||
|
* @return a {@link net.md_5.bungee.api.config.ServerInfo} for the server the player is on.
|
||||||
|
*/
|
||||||
|
public ServerInfo getServerFor(String player) {
|
||||||
|
return plugin.getServerFor(player);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a combined list of players on this network.
|
||||||
|
* <p/>
|
||||||
|
* Note that this function returns an immutable {@link java.util.Set}.
|
||||||
|
*
|
||||||
|
* @return a Set with all players found
|
||||||
|
*/
|
||||||
|
public Set<String> getPlayersOnline() {
|
||||||
|
return plugin.getPlayers();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,62 @@
|
|||||||
|
/**
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
package com.imaginarycode.minecraft.redisbungee;
|
||||||
|
|
||||||
|
import net.md_5.bungee.api.CommandSender;
|
||||||
|
import net.md_5.bungee.api.ProxyServer;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class is the CommandSender that RedisBungee uses to dispatch commands to BungeeCord.
|
||||||
|
*
|
||||||
|
* It inherits all permissions of the console command sender. Sending messages and modifying permissions are no-ops.
|
||||||
|
*
|
||||||
|
* @author tuxed
|
||||||
|
* @since 0.2.3
|
||||||
|
*/
|
||||||
|
public class RedisBungeeCommandSender implements CommandSender {
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return "RedisBungee";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void sendMessage(String s) {
|
||||||
|
// no-op
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void sendMessages(String... strings) {
|
||||||
|
// no-op
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Collection<String> getGroups() {
|
||||||
|
return ProxyServer.getInstance().getConsole().getGroups();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addGroups(String... strings) {
|
||||||
|
// no-op
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void removeGroups(String... strings) {
|
||||||
|
// no-op
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean hasPermission(String s) {
|
||||||
|
return ProxyServer.getInstance().getConsole().hasPermission(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setPermission(String s, boolean b) {
|
||||||
|
// no-op
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user