mirror of
https://github.com/proxiodev/RedisBungee.git
synced 2026-05-03 03:30:26 +00:00
Compare commits
24 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1620df961b | ||
|
|
ede9a7cba9 | ||
|
|
701c87db02 | ||
|
|
0ac5a5eebb | ||
|
|
0758afeba1 | ||
|
|
9227224248 | ||
|
|
ba9ca03e1b | ||
|
|
6c35f23e16 | ||
|
|
16720487f0 | ||
|
|
6391d8d92c | ||
|
|
51115746c7 | ||
|
|
f53829481a | ||
|
|
9441624c09 | ||
|
|
4fa152b65f | ||
|
|
0e9388568a | ||
|
|
f5a2362b68 | ||
|
|
513c1ae2ea | ||
|
|
2a8ab73c2b | ||
|
|
02a117228a | ||
|
|
3d1fd57c89 | ||
|
|
334c17d0d8 | ||
|
|
5ec5b7af9e | ||
|
|
ad18d168a8 | ||
|
|
96793e81c5 |
32
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
32
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
@@ -0,0 +1,32 @@
|
||||
---
|
||||
name: Bug report
|
||||
about: if you find a bug please report it here...
|
||||
title: ''
|
||||
labels: waiting.....
|
||||
assignees: ham1255
|
||||
|
||||
---
|
||||
|
||||
**Describe the bug**
|
||||
|
||||
|
||||
**To Reproduce**
|
||||
Steps to reproduce the behavior:
|
||||
1. Go to '...'
|
||||
2. Click on '....'
|
||||
3. Scroll down to '....'
|
||||
4. See error
|
||||
|
||||
**Expected behavior**
|
||||
A clear and concise description of what you expected to happen.
|
||||
|
||||
**Screenshots**
|
||||
If applicable, add screenshots to help explain your problem.
|
||||
|
||||
**Redis version? it should be at least 6 and above.**
|
||||
|
||||
**Bungeecord version or (the bungee fork name eg: waterfall) and your plugins**
|
||||
|
||||
|
||||
**console logs?**
|
||||
please provide any errors if there any.
|
||||
10
.github/ISSUE_TEMPLATE/question.md
vendored
Normal file
10
.github/ISSUE_TEMPLATE/question.md
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
---
|
||||
name: Question
|
||||
about: ask your questions here
|
||||
title: ''
|
||||
labels: question
|
||||
assignees: GovindasOM, ham1255
|
||||
|
||||
---
|
||||
|
||||
## What is your question?
|
||||
52
README.md
52
README.md
@@ -1,35 +1,63 @@
|
||||
# Limework fork of RedisBungee
|
||||
|
||||
[](https://github.com/Limework/RedisBungee/actions/workflows/maven.yml)
|
||||
[](https://github.com/Limework/RedisBungee/actions/workflows/maven.yml) [](https://jitpack.io/#limework/redisbungee)
|
||||
|
||||
Spigot link: [click](https://www.spigotmc.org/resources/redisbungee.87700/)
|
||||
|
||||
The maintainer of RedisBungee has became inactive, so we have taken the development of the plugin.
|
||||
|
||||
RedisBungee bridges [Redis](https://redis.io) and [BungeeCord](https://github.com/SpigotMC/BungeeCord) together.
|
||||
RedisBungee uses [Redis](https://redis.io) to Synchronize data between [BungeeCord](https://github.com/SpigotMC/BungeeCord) proxies
|
||||
|
||||
# 0.7 API BREAKING CHANGE:
|
||||
we do not advice using version (0.7) till we finish making it stable ,
|
||||
but if you plan to use redis-bungee 0.7 the api has breaking change.
|
||||
JedisPool was changed to Pool<Jedis> to support Redis Sentinel
|
||||
If ANYONE found a good way to fix this api breaking change
|
||||
pull requests are welcomed :)
|
||||
## Notice: about older versions of redis than redis 6.0
|
||||
|
||||
This is currently deployed on [Govindas Limework!](https://Limework.net)
|
||||
As of now Version 0.6.4-SNAPSHOT is only supporting redis 6.0 and above!
|
||||
|
||||
## Compiling
|
||||
|
||||
Now you can use maven without installing it using Maven wrapper [github?](https://github.com/takari/maven-wrapper) :)
|
||||
Now you can use Maven without installing it using [Maven wrappe](https://github.com/takari/maven-wrapper) :)
|
||||
|
||||
RedisBungee is distributed as a [maven](https://maven.apache.org) project. To compile it and install it in your local Maven repository:
|
||||
RedisBungee is distributed as a [maven](https://maven.apache.org) project.
|
||||
|
||||
git clone https://github.com/Limework/RedisBungee.git
|
||||
cd RedisBungee
|
||||
To compile and installing to in your local Maven repository:
|
||||
|
||||
git clone https://github.com/Limework/RedisBungee.git .
|
||||
mvnw clean install
|
||||
mvnw package
|
||||
|
||||
If you have deb maven installed, you can use the `mvn` command instead.
|
||||
|
||||
And use it in your pom file.
|
||||
|
||||
<dependency>
|
||||
<groupId>com.imaginarycode.minecraft</groupId>
|
||||
<artifactId>RedisBungee</artifactId>
|
||||
<version>0.6.3</version>
|
||||
<version>0.6.4-SNAPSHOT</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
|
||||
Or if you want to use the jitpack maven server
|
||||
|
||||
<repositories>
|
||||
<repository>
|
||||
<id>jitpack.io</id>
|
||||
<url>https://jitpack.io</url>
|
||||
</repository>
|
||||
</repositories>
|
||||
|
||||
And use it in your pom file.
|
||||
|
||||
<dependency>
|
||||
<groupId>com.github.limework</groupId>
|
||||
<artifactId>redisbungee</artifactId>
|
||||
<version>0.6.3</version>
|
||||
</dependency>
|
||||
|
||||
|
||||
## Javadocs
|
||||
Hosted on limework website. Version 0.6.0 (note: any version 0.6.* will not have API changes.)
|
||||
https://limework.net/JavaDocs/RedisBungee/
|
||||
@@ -45,3 +73,9 @@ This project is distributed under Eclipse Public License 1.0
|
||||
You can find it [here](https://github.com/Limework/RedisBungee/blob/master/LICENSE)
|
||||
|
||||
You can find the original RedisBungee by minecrafter [here](https://github.com/minecrafter/RedisBungee) or spigot page [here](https://www.spigotmc.org/resources/redisbungee.13494/)
|
||||
|
||||
## YourKit
|
||||
|
||||
YourKit supports open source projects with innovative and intelligent tools for monitoring and profiling Java and .NET applications. YourKit is the creator of [YourKit Java Profiler](https://www.yourkit.com/java/profiler/), [YourKit .NET Profiler](https://www.yourkit.com/.net/profiler/) and [YourKit YouMonitor](https://www.yourkit.com/youmonitor/).
|
||||
|
||||

|
||||
|
||||
8
pom.xml
8
pom.xml
@@ -6,7 +6,7 @@
|
||||
|
||||
<groupId>com.imaginarycode.minecraft</groupId>
|
||||
<artifactId>RedisBungee</artifactId>
|
||||
<version>0.6.3</version>
|
||||
<version>0.6.4</version>
|
||||
|
||||
|
||||
<repositories>
|
||||
@@ -92,7 +92,7 @@
|
||||
<dependency>
|
||||
<groupId>redis.clients</groupId>
|
||||
<artifactId>jedis</artifactId>
|
||||
<version>3.4.1</version>
|
||||
<version>3.6.1</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
@@ -104,14 +104,14 @@
|
||||
<dependency>
|
||||
<groupId>net.md-5</groupId>
|
||||
<artifactId>bungeecord-api</artifactId>
|
||||
<version>1.16-R0.5-SNAPSHOT</version>
|
||||
<version>1.17-R0.1-SNAPSHOT</version>
|
||||
<type>jar</type>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
<version>1.18.16</version>
|
||||
<version>1.18.20</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
|
||||
@@ -223,14 +223,15 @@ public final class RedisBungee extends Plugin {
|
||||
@Override
|
||||
public void onEnable() {
|
||||
ThreadFactory factory = ((ThreadPoolExecutor) getExecutorService()).getThreadFactory();
|
||||
getExecutorService().shutdownNow();
|
||||
ScheduledExecutorService service;
|
||||
ScheduledExecutorService service = Executors.newScheduledThreadPool(24, factory);
|
||||
try {
|
||||
Field field = Plugin.class.getDeclaredField("service");
|
||||
field.setAccessible(true);
|
||||
field.set(this, service = Executors.newScheduledThreadPool(24, factory));
|
||||
ExecutorService builtinService = (ExecutorService) field.get(this);
|
||||
field.set(this, service);
|
||||
builtinService.shutdownNow();
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("Can't replace BungeeCord thread pool with our own", e);
|
||||
getLogger().log(Level.WARNING, "Can't replace BungeeCord thread pool with our own", e);
|
||||
}
|
||||
try {
|
||||
loadConfig();
|
||||
@@ -246,8 +247,9 @@ public final class RedisBungee extends Plugin {
|
||||
for (String s : info.split("\r\n")) {
|
||||
if (s.startsWith("redis_version:")) {
|
||||
String version = s.split(":")[1];
|
||||
getLogger().info(version + " <- redis version");
|
||||
if (!(usingLua = RedisUtil.canUseLua(version))) {
|
||||
getLogger().warning("Your version of Redis (" + version + ") is not at least version 2.6. RedisBungee requires a newer version of Redis.");
|
||||
getLogger().warning("Your version of Redis (" + version + ") is not at least version 6.0 RedisBungee requires a newer version of Redis.");
|
||||
throw new RuntimeException("Unsupported Redis version detected");
|
||||
} else {
|
||||
LuaManager manager = new LuaManager(this);
|
||||
|
||||
@@ -14,7 +14,6 @@ import net.md_5.bungee.api.AbstractReconnectHandler;
|
||||
import net.md_5.bungee.api.ChatColor;
|
||||
import net.md_5.bungee.api.chat.BaseComponent;
|
||||
import net.md_5.bungee.api.chat.ComponentBuilder;
|
||||
import net.md_5.bungee.api.chat.TextComponent;
|
||||
import net.md_5.bungee.api.config.ServerInfo;
|
||||
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
||||
import net.md_5.bungee.api.connection.Server;
|
||||
@@ -62,7 +61,7 @@ public class RedisBungeeListener implements Listener {
|
||||
if (player != null) {
|
||||
event.setCancelled(true);
|
||||
// TODO: Make it accept a BaseComponent[] like everything else.
|
||||
event.setCancelReason(TextComponent.toLegacyText(ONLINE_MODE_RECONNECT));
|
||||
event.setCancelReason(ONLINE_MODE_RECONNECT);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -71,7 +70,7 @@ public class RedisBungeeListener implements Listener {
|
||||
if (jedis.sismember("proxy:" + s + ":usersOnline", event.getConnection().getUniqueId().toString())) {
|
||||
event.setCancelled(true);
|
||||
// TODO: Make it accept a BaseComponent[] like everything else.
|
||||
event.setCancelReason(TextComponent.toLegacyText(ALREADY_LOGGED_IN));
|
||||
event.setCancelReason(ALREADY_LOGGED_IN);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -146,107 +145,105 @@ public class RedisBungeeListener implements Listener {
|
||||
event.getResponse().getPlayers().setOnline(plugin.getCount());
|
||||
}
|
||||
|
||||
@SuppressWarnings("UnstableApiUsage")
|
||||
@EventHandler
|
||||
public void onPluginMessage(final PluginMessageEvent event) {
|
||||
if ((event.getTag().equals("legacy:redisbungee") || event.getTag().equals("RedisBungee")) && event.getSender() instanceof Server) {
|
||||
final String currentChannel = event.getTag();
|
||||
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);
|
||||
plugin.getProxy().getScheduler().runAsync(plugin, () -> {
|
||||
ByteArrayDataInput in = ByteStreams.newDataInput(data);
|
||||
|
||||
String subchannel = in.readUTF();
|
||||
ByteArrayDataOutput out = ByteStreams.newDataOutput();
|
||||
String type;
|
||||
String subchannel = in.readUTF();
|
||||
ByteArrayDataOutput out = ByteStreams.newDataOutput();
|
||||
String type;
|
||||
|
||||
switch (subchannel) {
|
||||
case "PlayerList":
|
||||
out.writeUTF("PlayerList");
|
||||
Set<UUID> original = Collections.emptySet();
|
||||
type = in.readUTF();
|
||||
if (type.equals("ALL")) {
|
||||
out.writeUTF("ALL");
|
||||
original = plugin.getPlayers();
|
||||
} else {
|
||||
try {
|
||||
original = RedisBungee.getApi().getPlayersOnServer(type);
|
||||
} catch (IllegalArgumentException ignored) {
|
||||
}
|
||||
switch (subchannel) {
|
||||
case "PlayerList":
|
||||
out.writeUTF("PlayerList");
|
||||
Set<UUID> original = Collections.emptySet();
|
||||
type = in.readUTF();
|
||||
if (type.equals("ALL")) {
|
||||
out.writeUTF("ALL");
|
||||
original = plugin.getPlayers();
|
||||
} else {
|
||||
try {
|
||||
original = RedisBungee.getApi().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(RedisBungee.getApi().getPlayersOnServer(type).size());
|
||||
} catch (IllegalArgumentException e) {
|
||||
out.writeInt(0);
|
||||
}
|
||||
}
|
||||
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(RedisBungee.getApi().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;
|
||||
case "ServerPlayers":
|
||||
String type1 = in.readUTF();
|
||||
out.writeUTF("ServerPlayers");
|
||||
Multimap<String, UUID> multimap = RedisBungee.getApi().getServerToPlayers();
|
||||
}
|
||||
break;
|
||||
case "LastOnline":
|
||||
String user = in.readUTF();
|
||||
out.writeUTF("LastOnline");
|
||||
out.writeUTF(user);
|
||||
out.writeLong(RedisBungee.getApi().getLastOnline(plugin.getUuidTranslator().getTranslatedUuid(user, true)));
|
||||
break;
|
||||
case "ServerPlayers":
|
||||
String type1 = in.readUTF();
|
||||
out.writeUTF("ServerPlayers");
|
||||
Multimap<String, UUID> multimap = RedisBungee.getApi().getServerToPlayers();
|
||||
|
||||
boolean includesUsers;
|
||||
boolean includesUsers;
|
||||
|
||||
switch (type1) {
|
||||
case "COUNT":
|
||||
includesUsers = false;
|
||||
break;
|
||||
case "PLAYERS":
|
||||
includesUsers = true;
|
||||
break;
|
||||
default:
|
||||
// TODO: Should I raise an error?
|
||||
return;
|
||||
switch (type1) {
|
||||
case "COUNT":
|
||||
includesUsers = false;
|
||||
break;
|
||||
case "PLAYERS":
|
||||
includesUsers = true;
|
||||
break;
|
||||
default:
|
||||
// TODO: Should I raise an error?
|
||||
return;
|
||||
}
|
||||
|
||||
out.writeUTF(type1);
|
||||
|
||||
if (includesUsers) {
|
||||
Multimap<String, String> human = HashMultimap.create();
|
||||
for (Map.Entry<String, UUID> entry : multimap.entries()) {
|
||||
human.put(entry.getKey(), plugin.getUuidTranslator().getNameFromUuid(entry.getValue(), false));
|
||||
}
|
||||
|
||||
out.writeUTF(type1);
|
||||
|
||||
if (includesUsers) {
|
||||
Multimap<String, String> human = HashMultimap.create();
|
||||
for (Map.Entry<String, UUID> entry : multimap.entries()) {
|
||||
human.put(entry.getKey(), plugin.getUuidTranslator().getNameFromUuid(entry.getValue(), false));
|
||||
}
|
||||
serializeMultimap(human, true, out);
|
||||
} else {
|
||||
serializeMultiset(multimap.keys(), out);
|
||||
}
|
||||
break;
|
||||
case "Proxy":
|
||||
out.writeUTF("Proxy");
|
||||
out.writeUTF(RedisBungee.getConfiguration().getServerId());
|
||||
break;
|
||||
case "PlayerProxy":
|
||||
String username = in.readUTF();
|
||||
out.writeUTF("PlayerProxy");
|
||||
out.writeUTF(username);
|
||||
out.writeUTF(RedisBungee.getApi().getProxy(plugin.getUuidTranslator().getTranslatedUuid(username, true)));
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
((Server) event.getSender()).sendData(currentChannel, out.toByteArray());
|
||||
serializeMultimap(human, true, out);
|
||||
} else {
|
||||
serializeMultiset(multimap.keys(), out);
|
||||
}
|
||||
break;
|
||||
case "Proxy":
|
||||
out.writeUTF("Proxy");
|
||||
out.writeUTF(RedisBungee.getConfiguration().getServerId());
|
||||
break;
|
||||
case "PlayerProxy":
|
||||
String username = in.readUTF();
|
||||
out.writeUTF("PlayerProxy");
|
||||
out.writeUTF(username);
|
||||
out.writeUTF(RedisBungee.getApi().getProxy(plugin.getUuidTranslator().getTranslatedUuid(username, true)));
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
((Server) event.getSender()).sendData(currentChannel, out.toByteArray());
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -259,6 +256,7 @@ public class RedisBungeeListener implements Listener {
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("SameParameterValue")
|
||||
private void serializeMultimap(Multimap<String, String> collection, boolean includeNames, ByteArrayDataOutput output) {
|
||||
output.writeInt(collection.keySet().size());
|
||||
for (Map.Entry<String, Collection<String>> entry : collection.asMap().entrySet()) {
|
||||
|
||||
@@ -58,16 +58,13 @@ public class RedisUtil {
|
||||
}
|
||||
|
||||
public static boolean canUseLua(String redisVersion) {
|
||||
// Need to use >=2.6 to use Lua optimizations.
|
||||
// Need to use >=6.2 to use Lua optimizations.
|
||||
String[] args = redisVersion.split("\\.");
|
||||
|
||||
if (args.length < 2) {
|
||||
return false;
|
||||
}
|
||||
|
||||
int major = Integer.parseInt(args[0]);
|
||||
int minor = Integer.parseInt(args[1]);
|
||||
|
||||
return major >= 3 || (major == 2 && minor >= 6);
|
||||
return major >= 6 && minor >= 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,11 +7,14 @@ import org.junit.Test;
|
||||
public class RedisUtilTest {
|
||||
@Test
|
||||
public void testRedisLuaCheck() {
|
||||
Assert.assertTrue(RedisUtil.canUseLua("2.6.0"));
|
||||
Assert.assertTrue(RedisUtil.canUseLua("6.2.0"));
|
||||
Assert.assertTrue(RedisUtil.canUseLua("6.1.0"));
|
||||
Assert.assertTrue(RedisUtil.canUseLua("6.0.0"));
|
||||
Assert.assertFalse(RedisUtil.canUseLua("2.6.0"));
|
||||
Assert.assertFalse(RedisUtil.canUseLua("2.2.12"));
|
||||
Assert.assertFalse(RedisUtil.canUseLua("1.2.4"));
|
||||
Assert.assertTrue(RedisUtil.canUseLua("2.8.4"));
|
||||
Assert.assertTrue(RedisUtil.canUseLua("3.0.0"));
|
||||
Assert.assertTrue(RedisUtil.canUseLua("3.2.1"));
|
||||
Assert.assertFalse(RedisUtil.canUseLua("2.8.4"));
|
||||
Assert.assertFalse(RedisUtil.canUseLua("3.0.0"));
|
||||
Assert.assertFalse(RedisUtil.canUseLua("3.2.1"));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user