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

51 Commits
0.6.1 ... 0.6.5

Author SHA1 Message Date
mohammed jasem alaajel
5caabc8aa4 prepare for a release 2021-07-31 18:15:02 +04:00
mohammed jasem alaajel
9b4a49f66a don't display exception when can't replace the executor service 2021-07-31 17:07:42 +04:00
mohammed jasem alaajel
785b23ecfb fix java docs issue 2021-07-30 02:20:39 +04:00
mohammed jasem alaajel
d8e0ea71a2 oops 2021-07-30 02:13:39 +04:00
mohammed jasem alaajel
ac66899f98 new api functions 2021-07-30 02:12:01 +04:00
mohammed jasem alaajel
a8673c563b change version 2021-07-30 02:09:53 +04:00
mohammed jasem alaajel
8a4dd53e58 bump depends versions in pom.xml 2021-07-30 02:00:32 +04:00
mohammed jasem alaajel
85711c5688 changed ReadMe 2021-07-22 02:22:11 +04:00
mohammed jasem alaajel
86ebc9c0d2 Fix: Player being added into the Redis database if LoginEvent was cancelled..... (#16) 2021-07-22 02:06:36 +04:00
mohammed jasem alaajel
49ac1ba9ef bump jedis version 2021-07-21 20:50:42 +04:00
mohammed jasem alaajel
d29e51b4a6 Update README.md 2021-07-21 16:33:06 +04:00
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
mohammed jasem alaajel
39b3c03604 fixed the placeholder api problem 2021-05-21 03:34:37 +04:00
weihao
373e1c16d4 Persistent random server id generation (#5)
* Allow random server id

* Assign and save random server id

* Add logging for server id

* Remove unused

* Update notes

* updated readme

* fixed bug from last update

* updated config

* fixed typo of in one of the authors name

Co-authored-by: mohammed jasem alaajel <34905970+ham1255@users.noreply.github.com>
2021-05-21 01:06:34 +04:00
mohammed jasem alaajel
56042af4eb Update README.md 2021-05-19 16:58:45 +04:00
mohammed jasem alaajel
8df8d96ced add random ids! 2021-05-17 22:42:57 +04:00
mohammed jasem alaajel
4c1ffa2b01 changed this to warn instead of severe 2021-05-17 04:11:09 +04:00
mohammed jasem alaajel
02caf2da5e Removed Limework maven server 2021-05-17 00:53:42 +04:00
mohammed jasem alaajel
a005b46467 Update README.md 2021-05-16 21:59:04 +04:00
mohammed jasem alaajel
65abb29558 Update README.md 2021-05-16 21:56:55 +04:00
mohammed jasem alaajel
5169d873a8 Update maven.yml 2021-05-16 21:54:14 +04:00
mohammed jasem alaajel
f0fbaab0b1 Changed default config redirection 2021-05-14 15:55:33 +04:00
mohammed jasem alaajel
4091da2ed8 Update README.md 2021-05-14 15:15:45 +04:00
mohammed jasem alaajel
86bef752de Update README.md 2021-05-14 15:12:07 +04:00
Govindas
17e203d7be small mistake 2021-05-14 10:53:00 +00:00
Govindas
ab8db5570c Update README.md 2021-05-14 10:52:12 +00:00
Govindas
571a318969 Update README.md 2021-05-14 10:51:41 +00:00
mohammed jasem alaajel
f07eed220d Update README.md 2021-05-13 23:12:40 +04:00
13 changed files with 291 additions and 154 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,7 +1,7 @@
# This workflow will build a Java project with Maven
# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-maven
name: Java CI with Maven
name: RedisBungee Build
on:
push:

View File

@@ -1,39 +1,77 @@
# 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)
Spigot link: [click](https://www.spigotmc.org/resources/redisbungee.87700/)
this fork was made due the maintainer of redisBungee became inactive, so we took the place to develop it!
The maintainer of RedisBungee has became inactive, so we have taken the development of the plugin.
RedisBungee bridges [Redis](http://redis.io) and BungeeCord together.
RedisBungee uses [Redis](https://redis.io) to Synchronize data between [BungeeCord](https://github.com/SpigotMC/BungeeCord) proxies
RedisBungee was used on thechunk server which we think was shutdown due website not loading...
~~This is the solution deployed on [The Chunk](http://thechunk.net) to make sure our multi-Bungee setup flows smoothly together.~~
## Notice: about older versions of redis than redis 6.0
this will be deployed soon on [Govindas limework!](https://Limework.net)
As of now Version 0.6.4 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](http://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.5-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.4</version>
</dependency>
## Javadocs
The current version is 0.6-snapshot! will be updated every version number change!
Hosted on limework website. Version 0.6.0 ~~(note: any version 0.6.* will not have API changes.)~~
https://limework.net/JavaDocs/RedisBungee/
Note: we might add more api into RedisBungeeApi Class but we wont remove the old ones to
keep old plugins working....
## Configuration
**REDISBUNGEE REQUIRES A REDIS SERVER**, preferably with reasonably low latency. The default [config](https://github.com/minecrafter/RedisBungee/blob/master/src/main/resources/example_config.yml) is saved when the plugin first starts.
**REDISBUNGEE REQUIRES A REDIS SERVER**, preferably with reasonably low latency. The default [config](https://github.com/limework/RedisBungee/blob/master/src/main/resources/example_config.yml) is saved when the plugin first starts.
## License!
This project is distributed under Eclipse Public License 1.0
which 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)

21
pom.xml
View File

@@ -6,14 +6,7 @@
<groupId>com.imaginarycode.minecraft</groupId>
<artifactId>RedisBungee</artifactId>
<version>0.6.1</version>
<distributionManagement>
<repository>
<id>Limework-Maven-Public</id>
<url>http://mc.limework.net:8081/repository/public-maven/</url>
</repository>
</distributionManagement>
<version>0.6.5</version>
<repositories>
@@ -87,7 +80,7 @@
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>2.9.1</version>
<version>3.3.0</version>
<configuration>
<source>8</source>
</configuration>
@@ -99,26 +92,26 @@
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.4.1</version>
<version>3.6.3</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.6.2</version>
<version>2.10.0</version>
<scope>compile</scope>
</dependency>
<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>
@@ -130,7 +123,7 @@
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.1</version>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
</dependencies>

View File

@@ -37,7 +37,13 @@ import static com.google.common.base.Preconditions.checkArgument;
/**
* The RedisBungee plugin.
* <p>
* The only function of interest is {@link #getApi()}, which exposes some functions in this class.
* The only function of interest is {@link #getApi()}, which deprecated now,
* Please check {@link RedisBungeeAPI#getRedisBungeeApi()},
*
* which exposes some functions in this class.
* but if you want old version support,
* then you can use old method {@link #getApi()}
*
*/
public final class RedisBungee extends Plugin {
@Getter
@@ -72,8 +78,11 @@ public final class RedisBungee extends Plugin {
/**
* Fetch the {@link RedisBungeeAPI} object created on plugin start.
*
* @return the {@link RedisBungeeAPI} object
* @deprecated Please use {@link RedisBungeeAPI#getRedisBungeeApi()}
*
* @return the {@link RedisBungeeAPI} object instance.
*/
@Deprecated
public static RedisBungeeAPI getApi() {
return api;
}
@@ -104,8 +113,8 @@ public final class RedisBungee extends Plugin {
if (lagged ? time >= stamp + 30 : time <= stamp + 30)
servers.add(entry.getKey());
else if (nag && nagTime <= 0) {
getLogger().severe(entry.getKey() + " is " + (time - stamp) + " seconds behind! (Time not synchronized or server down?) and was removed from heartbeat.");
jedis.hdel("heartbeats", entry.getKey());
getLogger().warning(entry.getKey() + " is " + (time - stamp) + " seconds behind! (Time not synchronized or server down?) and was removed from heartbeat.");
jedis.hdel("heartbeats", entry.getKey());
}
} catch (NumberFormatException ignored) {
}
@@ -223,14 +232,16 @@ 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));
} catch (Exception e) {
throw new RuntimeException("Can't replace BungeeCord thread pool with our own", e);
ExecutorService builtinService = (ExecutorService) field.get(this);
field.set(this, service);
builtinService.shutdownNow();
} catch (IllegalAccessException | NoSuchFieldException e) {
getLogger().log(Level.WARNING, "Can't replace BungeeCord thread pool with our own");
getLogger().log(Level.INFO, "skipping replacement.....");
}
try {
loadConfig();
@@ -246,8 +257,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);
@@ -416,6 +428,7 @@ public final class RedisBungee extends Plugin {
final boolean useSSL = configuration.getBoolean("useSSL");
String redisPassword = configuration.getString("redis-password");
String serverId = configuration.getString("server-id");
final String randomUUID = UUID.randomUUID().toString();
if (redisPassword != null && (redisPassword.isEmpty() || redisPassword.equals("none"))) {
redisPassword = null;
@@ -423,7 +436,20 @@ public final class RedisBungee extends Plugin {
// Configuration sanity checks.
if (serverId == null || serverId.isEmpty()) {
throw new RuntimeException("server-id is not specified in the configuration or is empty");
/*
* this check causes the config comments to disappear somehow
* I think due snake yaml limitations so as todo: write our own yaml parser?
*/
String genId = UUID.randomUUID().toString();
getLogger().info("Generated server id " + genId + " and saving it to config.");
configuration.set("server-id", genId);
ConfigurationProvider.getProvider(YamlConfiguration.class).save(configuration, new File(getDataFolder(), "config.yml"));
} else {
getLogger().info("Loaded server id " + serverId + '.');
}
if (configuration.getBoolean("use-random-id-string", false)) {
serverId = configuration.getString("server-id") + "-" + randomUUID;
}
if (redisServer != null && !redisServer.isEmpty()) {
@@ -475,7 +501,7 @@ public final class RedisBungee extends Plugin {
httpClient.setDispatcher(dispatcher);
NameFetcher.setHttpClient(httpClient);
UUIDFetcher.setHttpClient(httpClient);
RedisBungee.configuration = new RedisBungeeConfiguration(RedisBungee.this.getPool(), configuration);
RedisBungee.configuration = new RedisBungeeConfiguration(RedisBungee.this.getPool(), configuration, randomUUID);
return null;
}
});

View File

@@ -6,6 +6,7 @@ import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Multimap;
import lombok.NonNull;
import net.md_5.bungee.api.config.ServerInfo;
import redis.clients.jedis.JedisPool;
import java.net.InetAddress;
import java.util.*;
@@ -19,9 +20,11 @@ import java.util.*;
public class RedisBungeeAPI {
private final RedisBungee plugin;
private final List<String> reservedChannels;
private static RedisBungeeAPI redisBungeeApi;
RedisBungeeAPI(RedisBungee plugin) {
this.plugin = plugin;
redisBungeeApi = this;
this.reservedChannels = ImmutableList.of(
"redisbungee-allservers",
"redisbungee-" + RedisBungee.getConfiguration().getServerId(),
@@ -296,4 +299,26 @@ public class RedisBungeeAPI {
public final UUID getUuidFromName(@NonNull String name, boolean expensiveLookups) {
return plugin.getUuidTranslator().getTranslatedUuid(name, expensiveLookups);
}
/**
* This gets Redis Bungee Jedis pool
*
* @return {@link JedisPool}
* @since 0.6.5
*/
public JedisPool getJedisPool() {
return this.plugin.getPool();
}
/**
* This alternative to {@link RedisBungee#getApi()}
* which now deprecated. but to maintain old plugins compatibility it won't be removed.
*
* @return the API instance.
* @since 0.6.5
*/
public static RedisBungeeAPI getRedisBungeeApi() {
return redisBungeeApi;
}
}

View File

@@ -8,6 +8,7 @@ import redis.clients.jedis.JedisPool;
import java.net.InetAddress;
import java.util.List;
import java.util.UUID;
public class RedisBungeeConfiguration {
@Getter
@@ -19,9 +20,15 @@ public class RedisBungeeConfiguration {
@Getter
private final List<InetAddress> exemptAddresses;
public RedisBungeeConfiguration(JedisPool pool, Configuration configuration) {
public RedisBungeeConfiguration(JedisPool pool, Configuration configuration, String randomUUID) {
this.pool = pool;
this.serverId = configuration.getString("server-id");
if (configuration.getBoolean("use-random-id-string", false)) {
this.serverId = configuration.getString("server-id") + "-" + randomUUID;
} else {
this.serverId = configuration.getString("server-id");
}
this.registerBungeeCommands = configuration.getBoolean("register-bungee-commands", true);
List<String> stringified = configuration.getStringList("exempt-ip-addresses");
@@ -33,4 +40,5 @@ public class RedisBungeeConfiguration {
this.exemptAddresses = addressBuilder.build();
}
}

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.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,17 +70,10 @@ 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;
}
}
Pipeline pipeline = jedis.pipelined();
plugin.getUuidTranslator().persistInfo(event.getConnection().getName(), event.getConnection().getUniqueId(), pipeline);
RedisUtil.createPlayer(event.getConnection(), pipeline, false);
// We're not publishing, the API says we only publish at PostLoginEvent time.
pipeline.sync();
return null;
} finally {
event.completeIntent(plugin);
@@ -95,6 +87,15 @@ public class RedisBungeeListener implements Listener {
plugin.getProxy().getScheduler().runAsync(plugin, new RedisCallable<Void>(plugin) {
@Override
protected Void call(Jedis jedis) {
// this code was moved out from login event due being async..
// and it can be cancelled but it will show as false in redis-bungee
// which will register the player into the redis database.
Pipeline pipeline = jedis.pipelined();
plugin.getUuidTranslator().persistInfo(event.getPlayer().getName(), event.getPlayer().getUniqueId(), pipeline);
RedisUtil.createPlayer(event.getPlayer(), pipeline, false);
pipeline.sync();
// the end of moved code.
jedis.publish("redisbungee-data", RedisBungee.getGson().toJson(new DataManager.DataManagerMessage<>(
event.getPlayer().getUniqueId(), DataManager.DataManagerMessage.Action.JOIN,
new DataManager.LoginPayload(event.getPlayer().getAddress().getAddress()))));
@@ -146,107 +147,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) {
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 +258,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()) {

View File

@@ -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;
}
}

View File

@@ -16,8 +16,13 @@ max-redis-connections: 8
# you must disable this if redis version is under 6 you must disable this or connection wont work!!!
useSSL: false
# An identifier for this BungeeCord instance.
server-id: test1
# An identifier for this BungeeCord instance. Will randomly generate if leaving it blank.
server-id: "test1"
# Should use random string? if this is enabled the proxy id will be like this if server-id is test1: "test1-66cd2aeb-91f3-43a7-a106-e0307b098652"
# or if id is limework-bungee it will be "limework-bungee-66cd2aeb-91f3-43a7-a106-e0307b098652"
# this great for servers who run replicas in Kubernetes or any auto deploying replica service
# and used for if proxy died in a kubernetes network and deleted then new proxy setup itself.
use-random-id-string: false
# Whether or not RedisBungee should install its version of regular BungeeCord commands.
# Often, the RedisBungee commands are desired, but in some cases someone may wish to

View File

@@ -1,7 +1,7 @@
name: ${project.name}
main: com.imaginarycode.minecraft.redisbungee.RedisBungee
version: ${project.version}
author: Chunker and Govindas limework
author: Chunkr and Govindas limework
authors:
- chunkr
- Govindas Limework

View File

@@ -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"));
}
}