2
0
mirror of https://github.com/proxiodev/RedisBungee.git synced 2026-05-03 03:30:26 +00:00

24 Commits
0.6.3 ... 0.6.4

Author SHA1 Message Date
mohammed jasem alaajel
1620df961b bumped version 2021-07-21 16:20:48 +04:00
foss-mc
ede9a7cba9 Allow unsuccessful replacement of BungeeCord thread pool (#15)
* Allow unsuccessful replacement of BungeeCord thread pool

Port https://github.com/minecrafter/RedisBungee/pull/76

Some BungeeCord forks have different implementation of thread pool and RedisBungee won't load in such case

* Update RedisBungee.java
2021-07-21 16:13:25 +04:00
mohammed jasem alaajel
701c87db02 add another warning 2021-07-20 17:11:13 +04:00
mohammed jasem alaajel
0ac5a5eebb add warning 2021-07-20 17:08:17 +04:00
mohammed jasem alaajel
0758afeba1 update README.md 2021-07-20 14:55:54 +04:00
mohammed jasem alaajel
9227224248 fix the test checks 2021-07-20 14:52:03 +04:00
mohammed jasem alaajel
ba9ca03e1b oops its should be redis 6.0 not 6.2 2021-07-20 14:49:45 +04:00
williamd5
6c35f23e16 readme.md git clone in current dir, fix link formatting (#13)
* git clone in current dir, fix link formatting

No need to make the user clone into a new dir, then move into this new dir. They will most likely already have an empty dir already created or one with this name might already exist, e.g. a fork repository.

* Update README.md
2021-07-04 17:07:45 +04:00
mohammed jasem alaajel
16720487f0 Update issue templates 2021-06-24 03:58:50 +04:00
mohammed jasem alaajel
6391d8d92c Update issue templates 2021-06-24 03:57:52 +04:00
mohammed jasem alaajel
51115746c7 older versions or redis than (6.2) is no longer supported 2021-06-24 03:54:44 +04:00
mohammed jasem alaajel
f53829481a updated the notice 2021-06-24 03:54:06 +04:00
mohammed jasem alaajel
9441624c09 added java 16 support 2021-06-24 03:35:05 +04:00
mohammed jasem alaajel
4fa152b65f Update README.md 2021-06-22 04:07:02 +04:00
mohammed jasem alaajel
0e9388568a Update README.md 2021-06-22 04:04:53 +04:00
mohammed jasem alaajel
f5a2362b68 Update issue templates 2021-06-22 04:03:30 +04:00
mohammed jasem alaajel
513c1ae2ea Forgotten a word 2021-06-22 02:45:27 +04:00
mohammed jasem alaajel
2a8ab73c2b Update README.md 2021-06-22 01:33:33 +04:00
mohammed jasem alaajel
02a117228a Update README.md 2021-06-12 14:49:29 +04:00
mohammed jasem alaajel
3d1fd57c89 Update README.md 2021-05-31 05:33:00 +04:00
mohammed jasem alaajel
334c17d0d8 Update README.md 2021-05-24 00:45:13 +04:00
mohammed jasem alaajel
5ec5b7af9e Update README.md 2021-05-22 18:17:28 +04:00
mohammed jasem alaajel
ad18d168a8 Update README.md 2021-05-22 18:15:32 +04:00
mohammed jasem alaajel
96793e81c5 code clean up and lambda etc 2021-05-21 16:51:44 +04:00
8 changed files with 194 additions and 118 deletions

32
.github/ISSUE_TEMPLATE/bug_report.md vendored Normal file
View 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
View File

@@ -0,0 +1,10 @@
---
name: Question
about: ask your questions here
title: ''
labels: question
assignees: GovindasOM, ham1255
---
## What is your question?

View File

@@ -1,35 +1,63 @@
# Limework fork of RedisBungee # Limework fork of RedisBungee
[![RedisBungee Build](https://github.com/Limework/RedisBungee/actions/workflows/maven.yml/badge.svg)](https://github.com/Limework/RedisBungee/actions/workflows/maven.yml) [![](https://jitpack.io/v/limework/redisbungee.svg)](https://jitpack.io/#limework/redisbungee)
[![RedisBungee Build](https://github.com/Limework/RedisBungee/actions/workflows/maven.yml/badge.svg)](https://github.com/Limework/RedisBungee/actions/workflows/maven.yml)
Spigot link: [click](https://www.spigotmc.org/resources/redisbungee.87700/) 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. 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 ## 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 To compile and installing to in your local Maven repository:
cd RedisBungee
git clone https://github.com/Limework/RedisBungee.git .
mvnw clean install 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. And use it in your pom file.
<dependency> <dependency>
<groupId>com.imaginarycode.minecraft</groupId> <groupId>com.imaginarycode.minecraft</groupId>
<artifactId>RedisBungee</artifactId> <artifactId>RedisBungee</artifactId>
<version>0.6.3</version> <version>0.6.4-SNAPSHOT</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </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 ## Javadocs
Hosted on limework website. Version 0.6.0 (note: any version 0.6.* will not have API changes.) Hosted on limework website. Version 0.6.0 (note: any version 0.6.* will not have API changes.)
https://limework.net/JavaDocs/RedisBungee/ 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 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/) 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/).
![YourKit](https://www.yourkit.com/images/yklogo.png)

View File

@@ -6,7 +6,7 @@
<groupId>com.imaginarycode.minecraft</groupId> <groupId>com.imaginarycode.minecraft</groupId>
<artifactId>RedisBungee</artifactId> <artifactId>RedisBungee</artifactId>
<version>0.6.3</version> <version>0.6.4</version>
<repositories> <repositories>
@@ -92,7 +92,7 @@
<dependency> <dependency>
<groupId>redis.clients</groupId> <groupId>redis.clients</groupId>
<artifactId>jedis</artifactId> <artifactId>jedis</artifactId>
<version>3.4.1</version> <version>3.6.1</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<dependency> <dependency>
@@ -104,14 +104,14 @@
<dependency> <dependency>
<groupId>net.md-5</groupId> <groupId>net.md-5</groupId>
<artifactId>bungeecord-api</artifactId> <artifactId>bungeecord-api</artifactId>
<version>1.16-R0.5-SNAPSHOT</version> <version>1.17-R0.1-SNAPSHOT</version>
<type>jar</type> <type>jar</type>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.projectlombok</groupId> <groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId> <artifactId>lombok</artifactId>
<version>1.18.16</version> <version>1.18.20</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency> <dependency>

View File

@@ -223,14 +223,15 @@ public final class RedisBungee extends Plugin {
@Override @Override
public void onEnable() { public void onEnable() {
ThreadFactory factory = ((ThreadPoolExecutor) getExecutorService()).getThreadFactory(); ThreadFactory factory = ((ThreadPoolExecutor) getExecutorService()).getThreadFactory();
getExecutorService().shutdownNow(); ScheduledExecutorService service = Executors.newScheduledThreadPool(24, factory);
ScheduledExecutorService service;
try { try {
Field field = Plugin.class.getDeclaredField("service"); Field field = Plugin.class.getDeclaredField("service");
field.setAccessible(true); 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) { } 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 { try {
loadConfig(); loadConfig();
@@ -246,8 +247,9 @@ public final class RedisBungee extends Plugin {
for (String s : info.split("\r\n")) { for (String s : info.split("\r\n")) {
if (s.startsWith("redis_version:")) { if (s.startsWith("redis_version:")) {
String version = s.split(":")[1]; String version = s.split(":")[1];
getLogger().info(version + " <- redis version");
if (!(usingLua = RedisUtil.canUseLua(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"); throw new RuntimeException("Unsupported Redis version detected");
} else { } else {
LuaManager manager = new LuaManager(this); LuaManager manager = new LuaManager(this);

View File

@@ -14,7 +14,6 @@ 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.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;
import net.md_5.bungee.api.chat.TextComponent;
import net.md_5.bungee.api.config.ServerInfo; import net.md_5.bungee.api.config.ServerInfo;
import net.md_5.bungee.api.connection.ProxiedPlayer; import net.md_5.bungee.api.connection.ProxiedPlayer;
import net.md_5.bungee.api.connection.Server; import net.md_5.bungee.api.connection.Server;
@@ -62,7 +61,7 @@ public class RedisBungeeListener implements Listener {
if (player != null) { if (player != null) {
event.setCancelled(true); event.setCancelled(true);
// TODO: Make it accept a BaseComponent[] like everything else. // TODO: Make it accept a BaseComponent[] like everything else.
event.setCancelReason(TextComponent.toLegacyText(ONLINE_MODE_RECONNECT)); event.setCancelReason(ONLINE_MODE_RECONNECT);
return null; return null;
} }
} }
@@ -71,7 +70,7 @@ public class RedisBungeeListener implements Listener {
if (jedis.sismember("proxy:" + s + ":usersOnline", event.getConnection().getUniqueId().toString())) { if (jedis.sismember("proxy:" + s + ":usersOnline", event.getConnection().getUniqueId().toString())) {
event.setCancelled(true); event.setCancelled(true);
// TODO: Make it accept a BaseComponent[] like everything else. // TODO: Make it accept a BaseComponent[] like everything else.
event.setCancelReason(TextComponent.toLegacyText(ALREADY_LOGGED_IN)); event.setCancelReason(ALREADY_LOGGED_IN);
return null; return null;
} }
} }
@@ -146,107 +145,105 @@ public class RedisBungeeListener implements Listener {
event.getResponse().getPlayers().setOnline(plugin.getCount()); event.getResponse().getPlayers().setOnline(plugin.getCount());
} }
@SuppressWarnings("UnstableApiUsage")
@EventHandler @EventHandler
public void onPluginMessage(final PluginMessageEvent event) { public void onPluginMessage(final PluginMessageEvent event) {
if ((event.getTag().equals("legacy:redisbungee") || event.getTag().equals("RedisBungee")) && event.getSender() instanceof Server) { if ((event.getTag().equals("legacy:redisbungee") || event.getTag().equals("RedisBungee")) && event.getSender() instanceof Server) {
final String currentChannel = event.getTag(); final String currentChannel = event.getTag();
final byte[] data = Arrays.copyOf(event.getData(), event.getData().length); final byte[] data = Arrays.copyOf(event.getData(), event.getData().length);
plugin.getProxy().getScheduler().runAsync(plugin, new Runnable() { plugin.getProxy().getScheduler().runAsync(plugin, () -> {
@Override ByteArrayDataInput in = ByteStreams.newDataInput(data);
public void run() {
ByteArrayDataInput in = ByteStreams.newDataInput(data);
String subchannel = in.readUTF(); String subchannel = in.readUTF();
ByteArrayDataOutput out = ByteStreams.newDataOutput(); ByteArrayDataOutput out = ByteStreams.newDataOutput();
String type; String type;
switch (subchannel) { switch (subchannel) {
case "PlayerList": case "PlayerList":
out.writeUTF("PlayerList"); out.writeUTF("PlayerList");
Set<UUID> original = Collections.emptySet(); Set<UUID> original = Collections.emptySet();
type = in.readUTF(); type = in.readUTF();
if (type.equals("ALL")) { if (type.equals("ALL")) {
out.writeUTF("ALL"); out.writeUTF("ALL");
original = plugin.getPlayers(); original = plugin.getPlayers();
} else { } else {
try { try {
original = RedisBungee.getApi().getPlayersOnServer(type); original = RedisBungee.getApi().getPlayersOnServer(type);
} catch (IllegalArgumentException ignored) { } catch (IllegalArgumentException ignored) {
}
} }
Set<String> players = new HashSet<>(); }
for (UUID uuid : original) Set<String> players = new HashSet<>();
players.add(plugin.getUuidTranslator().getNameFromUuid(uuid, false)); for (UUID uuid : original)
out.writeUTF(Joiner.on(',').join(players)); players.add(plugin.getUuidTranslator().getNameFromUuid(uuid, false));
break; out.writeUTF(Joiner.on(',').join(players));
case "PlayerCount": break;
out.writeUTF("PlayerCount"); case "PlayerCount":
type = in.readUTF(); out.writeUTF("PlayerCount");
if (type.equals("ALL")) { type = in.readUTF();
out.writeUTF("ALL"); if (type.equals("ALL")) {
out.writeInt(plugin.getCount()); out.writeUTF("ALL");
} else { out.writeInt(plugin.getCount());
out.writeUTF(type); } else {
try { out.writeUTF(type);
out.writeInt(RedisBungee.getApi().getPlayersOnServer(type).size()); try {
} catch (IllegalArgumentException e) { out.writeInt(RedisBungee.getApi().getPlayersOnServer(type).size());
out.writeInt(0); } catch (IllegalArgumentException e) {
} out.writeInt(0);
} }
break; }
case "LastOnline": break;
String user = in.readUTF(); case "LastOnline":
out.writeUTF("LastOnline"); String user = in.readUTF();
out.writeUTF(user); out.writeUTF("LastOnline");
out.writeLong(RedisBungee.getApi().getLastOnline(plugin.getUuidTranslator().getTranslatedUuid(user, true))); out.writeUTF(user);
break; out.writeLong(RedisBungee.getApi().getLastOnline(plugin.getUuidTranslator().getTranslatedUuid(user, true)));
case "ServerPlayers": break;
String type1 = in.readUTF(); case "ServerPlayers":
out.writeUTF("ServerPlayers"); String type1 = in.readUTF();
Multimap<String, UUID> multimap = RedisBungee.getApi().getServerToPlayers(); out.writeUTF("ServerPlayers");
Multimap<String, UUID> multimap = RedisBungee.getApi().getServerToPlayers();
boolean includesUsers; boolean includesUsers;
switch (type1) { switch (type1) {
case "COUNT": case "COUNT":
includesUsers = false; includesUsers = false;
break; break;
case "PLAYERS": case "PLAYERS":
includesUsers = true; includesUsers = true;
break; break;
default: default:
// TODO: Should I raise an error? // TODO: Should I raise an error?
return; 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));
} }
serializeMultimap(human, true, out);
out.writeUTF(type1); } else {
serializeMultiset(multimap.keys(), out);
if (includesUsers) { }
Multimap<String, String> human = HashMultimap.create(); break;
for (Map.Entry<String, UUID> entry : multimap.entries()) { case "Proxy":
human.put(entry.getKey(), plugin.getUuidTranslator().getNameFromUuid(entry.getValue(), false)); out.writeUTF("Proxy");
} out.writeUTF(RedisBungee.getConfiguration().getServerId());
serializeMultimap(human, true, out); break;
} else { case "PlayerProxy":
serializeMultiset(multimap.keys(), out); String username = in.readUTF();
} out.writeUTF("PlayerProxy");
break; out.writeUTF(username);
case "Proxy": out.writeUTF(RedisBungee.getApi().getProxy(plugin.getUuidTranslator().getTranslatedUuid(username, true)));
out.writeUTF("Proxy"); break;
out.writeUTF(RedisBungee.getConfiguration().getServerId()); default:
break; return;
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());
} }
((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) { private void serializeMultimap(Multimap<String, String> collection, boolean includeNames, ByteArrayDataOutput output) {
output.writeInt(collection.keySet().size()); output.writeInt(collection.keySet().size());
for (Map.Entry<String, Collection<String>> entry : collection.asMap().entrySet()) { for (Map.Entry<String, Collection<String>> entry : collection.asMap().entrySet()) {

View File

@@ -58,16 +58,13 @@ public class RedisUtil {
} }
public static boolean canUseLua(String redisVersion) { 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("\\."); String[] args = redisVersion.split("\\.");
if (args.length < 2) { if (args.length < 2) {
return false; return false;
} }
int major = Integer.parseInt(args[0]); int major = Integer.parseInt(args[0]);
int minor = Integer.parseInt(args[1]); int minor = Integer.parseInt(args[1]);
return major >= 6 && minor >= 0;
return major >= 3 || (major == 2 && minor >= 6);
} }
} }

View File

@@ -7,11 +7,14 @@ import org.junit.Test;
public class RedisUtilTest { public class RedisUtilTest {
@Test @Test
public void testRedisLuaCheck() { 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("2.2.12"));
Assert.assertFalse(RedisUtil.canUseLua("1.2.4")); Assert.assertFalse(RedisUtil.canUseLua("1.2.4"));
Assert.assertTrue(RedisUtil.canUseLua("2.8.4")); Assert.assertFalse(RedisUtil.canUseLua("2.8.4"));
Assert.assertTrue(RedisUtil.canUseLua("3.0.0")); Assert.assertFalse(RedisUtil.canUseLua("3.0.0"));
Assert.assertTrue(RedisUtil.canUseLua("3.2.1")); Assert.assertFalse(RedisUtil.canUseLua("3.2.1"));
} }
} }