mirror of
https://github.com/lucko/LuckPerms.git
synced 2025-08-25 15:30:45 +02:00
Add Nats messenger (#3525)
This commit is contained in:
@@ -34,6 +34,7 @@ shadowJar {
|
|||||||
relocate 'com.mongodb', 'me.lucko.luckperms.lib.mongodb'
|
relocate 'com.mongodb', 'me.lucko.luckperms.lib.mongodb'
|
||||||
relocate 'org.bson', 'me.lucko.luckperms.lib.bson'
|
relocate 'org.bson', 'me.lucko.luckperms.lib.bson'
|
||||||
relocate 'redis.clients.jedis', 'me.lucko.luckperms.lib.jedis'
|
relocate 'redis.clients.jedis', 'me.lucko.luckperms.lib.jedis'
|
||||||
|
relocate 'io.nats.client', 'me.lucko.luckperms.lib.nats'
|
||||||
relocate 'com.rabbitmq', 'me.lucko.luckperms.lib.rabbitmq'
|
relocate 'com.rabbitmq', 'me.lucko.luckperms.lib.rabbitmq'
|
||||||
relocate 'org.apache.commons.pool2', 'me.lucko.luckperms.lib.commonspool2'
|
relocate 'org.apache.commons.pool2', 'me.lucko.luckperms.lib.commonspool2'
|
||||||
relocate 'ninja.leaping.configurate', 'me.lucko.luckperms.lib.configurate'
|
relocate 'ninja.leaping.configurate', 'me.lucko.luckperms.lib.configurate'
|
||||||
|
@@ -44,6 +44,7 @@ shadowJar {
|
|||||||
relocate 'com.mongodb', 'me.lucko.luckperms.lib.mongodb'
|
relocate 'com.mongodb', 'me.lucko.luckperms.lib.mongodb'
|
||||||
relocate 'org.bson', 'me.lucko.luckperms.lib.bson'
|
relocate 'org.bson', 'me.lucko.luckperms.lib.bson'
|
||||||
relocate 'redis.clients.jedis', 'me.lucko.luckperms.lib.jedis'
|
relocate 'redis.clients.jedis', 'me.lucko.luckperms.lib.jedis'
|
||||||
|
relocate 'io.nats.client', 'me.lucko.luckperms.lib.nats'
|
||||||
relocate 'com.rabbitmq', 'me.lucko.luckperms.lib.rabbitmq'
|
relocate 'com.rabbitmq', 'me.lucko.luckperms.lib.rabbitmq'
|
||||||
relocate 'org.apache.commons.pool2', 'me.lucko.luckperms.lib.commonspool2'
|
relocate 'org.apache.commons.pool2', 'me.lucko.luckperms.lib.commonspool2'
|
||||||
relocate 'ninja.leaping.configurate', 'me.lucko.luckperms.lib.configurate'
|
relocate 'ninja.leaping.configurate', 'me.lucko.luckperms.lib.configurate'
|
||||||
|
@@ -241,6 +241,8 @@ watch-files: true
|
|||||||
# below.
|
# below.
|
||||||
# => rabbitmq Uses RabbitMQ pub-sub to push changes. Your server connection info must be
|
# => rabbitmq Uses RabbitMQ pub-sub to push changes. Your server connection info must be
|
||||||
# configured below.
|
# configured below.
|
||||||
|
# => nats Uses Nats pub-sub to push changes. Your server connection info must be
|
||||||
|
# configured below.
|
||||||
# => custom Uses a messaging service provided using the LuckPerms API.
|
# => custom Uses a messaging service provided using the LuckPerms API.
|
||||||
# => auto Attempts to automatically setup a messaging service using redis or sql.
|
# => auto Attempts to automatically setup a messaging service using redis or sql.
|
||||||
messaging-service: auto
|
messaging-service: auto
|
||||||
@@ -266,6 +268,14 @@ redis:
|
|||||||
username: ''
|
username: ''
|
||||||
password: ''
|
password: ''
|
||||||
|
|
||||||
|
# Settings for Nats.
|
||||||
|
# Port 4222 is used by default; set address to "host:port" if differs
|
||||||
|
nats:
|
||||||
|
enabled: false
|
||||||
|
address: localhost
|
||||||
|
username: ''
|
||||||
|
password: ''
|
||||||
|
|
||||||
# Settings for RabbitMQ.
|
# Settings for RabbitMQ.
|
||||||
# Port 5672 is used by default; set address to "host:port" if differs
|
# Port 5672 is used by default; set address to "host:port" if differs
|
||||||
rabbitmq:
|
rabbitmq:
|
||||||
|
@@ -36,6 +36,7 @@ shadowJar {
|
|||||||
relocate 'com.mongodb', 'me.lucko.luckperms.lib.mongodb'
|
relocate 'com.mongodb', 'me.lucko.luckperms.lib.mongodb'
|
||||||
relocate 'org.bson', 'me.lucko.luckperms.lib.bson'
|
relocate 'org.bson', 'me.lucko.luckperms.lib.bson'
|
||||||
relocate 'redis.clients.jedis', 'me.lucko.luckperms.lib.jedis'
|
relocate 'redis.clients.jedis', 'me.lucko.luckperms.lib.jedis'
|
||||||
|
relocate 'io.nats.client', 'me.lucko.luckperms.lib.nats'
|
||||||
relocate 'com.rabbitmq', 'me.lucko.luckperms.lib.rabbitmq'
|
relocate 'com.rabbitmq', 'me.lucko.luckperms.lib.rabbitmq'
|
||||||
relocate 'org.apache.commons.pool2', 'me.lucko.luckperms.lib.commonspool2'
|
relocate 'org.apache.commons.pool2', 'me.lucko.luckperms.lib.commonspool2'
|
||||||
relocate 'ninja.leaping.configurate', 'me.lucko.luckperms.lib.configurate'
|
relocate 'ninja.leaping.configurate', 'me.lucko.luckperms.lib.configurate'
|
||||||
|
@@ -239,6 +239,8 @@ watch-files: true
|
|||||||
# the RedisBungee plugin installed.
|
# the RedisBungee plugin installed.
|
||||||
# => rabbitmq Uses RabbitMQ pub-sub to push changes. Your server connection info must be
|
# => rabbitmq Uses RabbitMQ pub-sub to push changes. Your server connection info must be
|
||||||
# configured below.
|
# configured below.
|
||||||
|
# => nats Uses Nats pub-sub to push changes. Your server connection info must be
|
||||||
|
# configured below.
|
||||||
# => custom Uses a messaging service provided using the LuckPerms API.
|
# => custom Uses a messaging service provided using the LuckPerms API.
|
||||||
# => auto Attempts to automatically setup a messaging service using redis or sql.
|
# => auto Attempts to automatically setup a messaging service using redis or sql.
|
||||||
messaging-service: auto
|
messaging-service: auto
|
||||||
@@ -264,6 +266,14 @@ redis:
|
|||||||
username: ''
|
username: ''
|
||||||
password: ''
|
password: ''
|
||||||
|
|
||||||
|
# Settings for Nats.
|
||||||
|
# Port 4222 is used by default; set address to "host:port" if differs
|
||||||
|
nats:
|
||||||
|
enabled: false
|
||||||
|
address: localhost
|
||||||
|
username: ''
|
||||||
|
password: ''
|
||||||
|
|
||||||
# Settings for RabbitMQ.
|
# Settings for RabbitMQ.
|
||||||
# Port 5672 is used by default; set address to "host:port" if differs
|
# Port 5672 is used by default; set address to "host:port" if differs
|
||||||
rabbitmq:
|
rabbitmq:
|
||||||
|
@@ -72,6 +72,7 @@ dependencies {
|
|||||||
}
|
}
|
||||||
api 'com.zaxxer:HikariCP:4.0.3'
|
api 'com.zaxxer:HikariCP:4.0.3'
|
||||||
api 'redis.clients:jedis:3.5.2'
|
api 'redis.clients:jedis:3.5.2'
|
||||||
|
api 'io.nats:jnats:2.16.4'
|
||||||
api 'com.rabbitmq:amqp-client:5.12.0'
|
api 'com.rabbitmq:amqp-client:5.12.0'
|
||||||
api 'org.mongodb:mongodb-driver-legacy:4.5.0'
|
api 'org.mongodb:mongodb-driver-legacy:4.5.0'
|
||||||
api 'org.yaml:snakeyaml:1.28'
|
api 'org.yaml:snakeyaml:1.28'
|
||||||
|
@@ -651,6 +651,31 @@ public final class ConfigKeys {
|
|||||||
*/
|
*/
|
||||||
public static final ConfigKey<Boolean> REDIS_SSL = notReloadable(booleanKey("redis.ssl", false));
|
public static final ConfigKey<Boolean> REDIS_SSL = notReloadable(booleanKey("redis.ssl", false));
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If nats messaging is enabled
|
||||||
|
*/
|
||||||
|
public static final ConfigKey<Boolean> NATS_ENABLED = notReloadable(booleanKey("nats.enabled", false));
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The address of the nats server
|
||||||
|
*/
|
||||||
|
public static final ConfigKey<String> NATS_ADDRESS = notReloadable(stringKey("nats.address", null));
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The username to connect with, or an empty string if it should use default
|
||||||
|
*/
|
||||||
|
public static final ConfigKey<String> NATS_USERNAME = notReloadable(stringKey("nats.username", ""));
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The password in use by the nats server, or an empty string if there is no password
|
||||||
|
*/
|
||||||
|
public static final ConfigKey<String> NATS_PASSWORD = notReloadable(stringKey("nats.password", ""));
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If the nats connection should use SSL
|
||||||
|
*/
|
||||||
|
public static final ConfigKey<Boolean> NATS_SSL = notReloadable(booleanKey("nats.ssl", false));
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* If rabbitmq messaging is enabled
|
* If rabbitmq messaging is enabled
|
||||||
*/
|
*/
|
||||||
|
@@ -245,6 +245,13 @@ public enum Dependency {
|
|||||||
Relocation.of("jedis", "redis{}clients{}jedis"),
|
Relocation.of("jedis", "redis{}clients{}jedis"),
|
||||||
Relocation.of("commonspool2", "org{}apache{}commons{}pool2")
|
Relocation.of("commonspool2", "org{}apache{}commons{}pool2")
|
||||||
),
|
),
|
||||||
|
NATS(
|
||||||
|
"io.nats",
|
||||||
|
"jnats",
|
||||||
|
"2.16.4",
|
||||||
|
"/WZgFi9iJToRGIiGoShlwE5aHwstOuNGZyr4UaBRilM=",
|
||||||
|
Relocation.of("nats", "io{}nats{}client")
|
||||||
|
),
|
||||||
RABBITMQ(
|
RABBITMQ(
|
||||||
"com{}rabbitmq",
|
"com{}rabbitmq",
|
||||||
"amqp-client",
|
"amqp-client",
|
||||||
|
@@ -128,8 +128,8 @@ public class DependencyManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void loadStorageDependencies(Set<StorageType> storageTypes, boolean redis, boolean rabbitmq) {
|
public void loadStorageDependencies(Set<StorageType> storageTypes, boolean redis, boolean rabbitmq, boolean nats) {
|
||||||
loadDependencies(this.registry.resolveStorageDependencies(storageTypes, redis, rabbitmq));
|
loadDependencies(this.registry.resolveStorageDependencies(storageTypes, redis, rabbitmq, nats));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void loadDependencies(Set<Dependency> dependencies) {
|
public void loadDependencies(Set<Dependency> dependencies) {
|
||||||
|
@@ -72,7 +72,7 @@ public class DependencyRegistry {
|
|||||||
this.platformType = platformType;
|
this.platformType = platformType;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Set<Dependency> resolveStorageDependencies(Set<StorageType> storageTypes, boolean redis, boolean rabbitmq) {
|
public Set<Dependency> resolveStorageDependencies(Set<StorageType> storageTypes, boolean redis, boolean rabbitmq, boolean nats) {
|
||||||
Set<Dependency> dependencies = new LinkedHashSet<>();
|
Set<Dependency> dependencies = new LinkedHashSet<>();
|
||||||
for (StorageType storageType : storageTypes) {
|
for (StorageType storageType : storageTypes) {
|
||||||
dependencies.addAll(STORAGE_DEPENDENCIES.get(storageType));
|
dependencies.addAll(STORAGE_DEPENDENCIES.get(storageType));
|
||||||
@@ -85,6 +85,10 @@ public class DependencyRegistry {
|
|||||||
dependencies.add(Dependency.SLF4J_SIMPLE);
|
dependencies.add(Dependency.SLF4J_SIMPLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (nats) {
|
||||||
|
dependencies.add(Dependency.NATS);
|
||||||
|
}
|
||||||
|
|
||||||
if (rabbitmq) {
|
if (rabbitmq) {
|
||||||
dependencies.add(Dependency.RABBITMQ);
|
dependencies.add(Dependency.RABBITMQ);
|
||||||
}
|
}
|
||||||
|
@@ -27,6 +27,7 @@ package me.lucko.luckperms.common.messaging;
|
|||||||
|
|
||||||
import me.lucko.luckperms.common.config.ConfigKeys;
|
import me.lucko.luckperms.common.config.ConfigKeys;
|
||||||
import me.lucko.luckperms.common.config.LuckPermsConfiguration;
|
import me.lucko.luckperms.common.config.LuckPermsConfiguration;
|
||||||
|
import me.lucko.luckperms.common.messaging.nats.NatsMessenger;
|
||||||
import me.lucko.luckperms.common.messaging.rabbitmq.RabbitMQMessenger;
|
import me.lucko.luckperms.common.messaging.rabbitmq.RabbitMQMessenger;
|
||||||
import me.lucko.luckperms.common.messaging.redis.RedisMessenger;
|
import me.lucko.luckperms.common.messaging.redis.RedisMessenger;
|
||||||
import me.lucko.luckperms.common.messaging.sql.SqlMessenger;
|
import me.lucko.luckperms.common.messaging.sql.SqlMessenger;
|
||||||
@@ -67,6 +68,8 @@ public class MessagingFactory<P extends LuckPermsPlugin> {
|
|||||||
messagingType = "redis";
|
messagingType = "redis";
|
||||||
} else if (this.plugin.getConfiguration().get(ConfigKeys.RABBITMQ_ENABLED)) {
|
} else if (this.plugin.getConfiguration().get(ConfigKeys.RABBITMQ_ENABLED)) {
|
||||||
messagingType = "rabbitmq";
|
messagingType = "rabbitmq";
|
||||||
|
} else if (this.plugin.getConfiguration().get(ConfigKeys.NATS_ENABLED)) {
|
||||||
|
messagingType = "nats";
|
||||||
} else {
|
} else {
|
||||||
for (StorageImplementation implementation : this.plugin.getStorage().getImplementations()) {
|
for (StorageImplementation implementation : this.plugin.getStorage().getImplementations()) {
|
||||||
if (implementation instanceof SqlStorage) {
|
if (implementation instanceof SqlStorage) {
|
||||||
@@ -84,13 +87,16 @@ public class MessagingFactory<P extends LuckPermsPlugin> {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.plugin.getLogger().info("Loading messaging service... [" + messagingType.toUpperCase(Locale.ROOT) + "]");
|
if (messagingType.equals("custom")) {
|
||||||
|
this.plugin.getLogger().info("Messaging service is set to custom. No service is initialized at this stage yet.");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.plugin.getLogger().info("Loading messaging service... [" + messagingType.toUpperCase(Locale.ROOT) + "]");
|
||||||
InternalMessagingService service = getServiceFor(messagingType);
|
InternalMessagingService service = getServiceFor(messagingType);
|
||||||
if (service != null) {
|
if (service != null) {
|
||||||
return service;
|
return service;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.plugin.getLogger().warn("Messaging service '" + messagingType + "' not recognised.");
|
this.plugin.getLogger().warn("Messaging service '" + messagingType + "' not recognised.");
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@@ -106,6 +112,16 @@ public class MessagingFactory<P extends LuckPermsPlugin> {
|
|||||||
} else {
|
} else {
|
||||||
this.plugin.getLogger().warn("Messaging Service was set to redis, but redis is not enabled!");
|
this.plugin.getLogger().warn("Messaging Service was set to redis, but redis is not enabled!");
|
||||||
}
|
}
|
||||||
|
} else if (messagingType.equals("nats")) {
|
||||||
|
if (this.plugin.getConfiguration().get(ConfigKeys.NATS_ENABLED)) {
|
||||||
|
try {
|
||||||
|
return new LuckPermsMessagingService(this.plugin, new NatsMesengerProvider());
|
||||||
|
} catch (Exception e) {
|
||||||
|
getPlugin().getLogger().severe("Exception occurred whilst enabling Nats messaging service", e);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
this.plugin.getLogger().warn("Messaging Service was set to nats, but nats is not enabled!");
|
||||||
|
}
|
||||||
} else if (messagingType.equals("rabbitmq")) {
|
} else if (messagingType.equals("rabbitmq")) {
|
||||||
if (this.plugin.getConfiguration().get(ConfigKeys.RABBITMQ_ENABLED)) {
|
if (this.plugin.getConfiguration().get(ConfigKeys.RABBITMQ_ENABLED)) {
|
||||||
try {
|
try {
|
||||||
@@ -127,6 +143,34 @@ public class MessagingFactory<P extends LuckPermsPlugin> {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private class NatsMesengerProvider implements MessengerProvider {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NonNull String getName() {
|
||||||
|
return "Nats";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NonNull Messenger obtain(@NonNull IncomingMessageConsumer incomingMessageConsumer) {
|
||||||
|
NatsMessenger natsMessenger = new NatsMessenger(getPlugin(), incomingMessageConsumer);
|
||||||
|
|
||||||
|
LuckPermsConfiguration configuration = getPlugin().getConfiguration();
|
||||||
|
String address = configuration.get(ConfigKeys.NATS_ADDRESS);
|
||||||
|
String username = configuration.get(ConfigKeys.NATS_USERNAME);
|
||||||
|
String password = configuration.get(ConfigKeys.NATS_PASSWORD);
|
||||||
|
if (password.isEmpty()) {
|
||||||
|
password = null;
|
||||||
|
}
|
||||||
|
if (username.isEmpty()) {
|
||||||
|
username = null;
|
||||||
|
}
|
||||||
|
boolean ssl = configuration.get(ConfigKeys.NATS_SSL);
|
||||||
|
|
||||||
|
natsMessenger.init(address, username, password, ssl);
|
||||||
|
return natsMessenger;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private class RedisMessengerProvider implements MessengerProvider {
|
private class RedisMessengerProvider implements MessengerProvider {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@@ -0,0 +1,128 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of LuckPerms, licensed under the MIT License.
|
||||||
|
*
|
||||||
|
* Copyright (c) lucko (Luck) <luck@lucko.me>
|
||||||
|
* Copyright (c) contributors
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in all
|
||||||
|
* copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
* SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package me.lucko.luckperms.common.messaging.nats;
|
||||||
|
|
||||||
|
import com.google.common.io.ByteArrayDataInput;
|
||||||
|
import com.google.common.io.ByteArrayDataOutput;
|
||||||
|
import com.google.common.io.ByteStreams;
|
||||||
|
|
||||||
|
import me.lucko.luckperms.common.plugin.LuckPermsPlugin;
|
||||||
|
import me.lucko.luckperms.common.util.Throwing;
|
||||||
|
|
||||||
|
import net.luckperms.api.messenger.IncomingMessageConsumer;
|
||||||
|
import net.luckperms.api.messenger.Messenger;
|
||||||
|
import net.luckperms.api.messenger.message.OutgoingMessage;
|
||||||
|
|
||||||
|
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||||
|
|
||||||
|
import io.nats.client.Connection;
|
||||||
|
import io.nats.client.Dispatcher;
|
||||||
|
import io.nats.client.Message;
|
||||||
|
import io.nats.client.MessageHandler;
|
||||||
|
import io.nats.client.Nats;
|
||||||
|
import io.nats.client.Options;
|
||||||
|
import io.nats.client.Options.Builder;
|
||||||
|
|
||||||
|
import java.time.Duration;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An implementation of Messenger for Nats messaging client.
|
||||||
|
*/
|
||||||
|
public class NatsMessenger implements Messenger {
|
||||||
|
|
||||||
|
private static final String CHANNEL = "luckperms:update";
|
||||||
|
|
||||||
|
private final LuckPermsPlugin plugin;
|
||||||
|
private final IncomingMessageConsumer consumer;
|
||||||
|
private Connection connection;
|
||||||
|
private Dispatcher messageDispatcher;
|
||||||
|
|
||||||
|
public NatsMessenger(LuckPermsPlugin plugin, IncomingMessageConsumer consumer) {
|
||||||
|
this.plugin = plugin;
|
||||||
|
this.consumer = consumer;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void sendOutgoingMessage(@NonNull OutgoingMessage outgoingMessage) {
|
||||||
|
ByteArrayDataOutput output = ByteStreams.newDataOutput();
|
||||||
|
output.writeUTF(outgoingMessage.asEncodedString());
|
||||||
|
this.connection.publish(CHANNEL, output.toByteArray());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void init(String address, String username, String password, boolean ssl) {
|
||||||
|
String[] addressSplit = address.split(":");
|
||||||
|
String host = addressSplit[0];
|
||||||
|
int port = addressSplit.length > 1 ? Integer.parseInt(addressSplit[1]) : Options.DEFAULT_PORT;
|
||||||
|
|
||||||
|
this.connection = createConnection(builder -> {
|
||||||
|
builder.server("nats://" + host + ":" + port)
|
||||||
|
.reconnectWait(Duration.ofSeconds(5))
|
||||||
|
.maxReconnects(Integer.MAX_VALUE)
|
||||||
|
.connectionName("LuckPerms");
|
||||||
|
|
||||||
|
if (username != null && password != null) {
|
||||||
|
builder.userInfo(username, password);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ssl) {
|
||||||
|
builder.secure();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
this.messageDispatcher = this.connection.createDispatcher(new Handler()).subscribe(CHANNEL);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Connection createConnection(Throwing.Consumer<Builder> config) {
|
||||||
|
try {
|
||||||
|
Builder builder = new Builder();
|
||||||
|
config.accept(builder);
|
||||||
|
return Nats.connect(builder.build());
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void close() {
|
||||||
|
try {
|
||||||
|
this.connection.closeDispatcher(this.messageDispatcher);
|
||||||
|
this.connection.close();
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
this.plugin.getLogger().warn("An error occurred during closing messenger.", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private class Handler implements MessageHandler {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onMessage(Message message) {
|
||||||
|
byte[] data = message.getData();
|
||||||
|
ByteArrayDataInput input = ByteStreams.newDataInput(data);
|
||||||
|
String messageAsString = input.readUTF();
|
||||||
|
|
||||||
|
NatsMessenger.this.consumer.consumeIncomingMessageAsString(messageAsString);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -162,7 +162,8 @@ public abstract class AbstractLuckPermsPlugin implements LuckPermsPlugin {
|
|||||||
this.dependencyManager.loadStorageDependencies(
|
this.dependencyManager.loadStorageDependencies(
|
||||||
storageFactory.getRequiredTypes(),
|
storageFactory.getRequiredTypes(),
|
||||||
getConfiguration().get(ConfigKeys.REDIS_ENABLED),
|
getConfiguration().get(ConfigKeys.REDIS_ENABLED),
|
||||||
getConfiguration().get(ConfigKeys.RABBITMQ_ENABLED)
|
getConfiguration().get(ConfigKeys.RABBITMQ_ENABLED),
|
||||||
|
getConfiguration().get(ConfigKeys.NATS_ENABLED)
|
||||||
);
|
);
|
||||||
|
|
||||||
// register listeners
|
// register listeners
|
||||||
|
@@ -66,6 +66,7 @@ shadowJar {
|
|||||||
relocate 'com.mongodb', 'me.lucko.luckperms.lib.mongodb'
|
relocate 'com.mongodb', 'me.lucko.luckperms.lib.mongodb'
|
||||||
relocate 'org.bson', 'me.lucko.luckperms.lib.bson'
|
relocate 'org.bson', 'me.lucko.luckperms.lib.bson'
|
||||||
relocate 'redis.clients.jedis', 'me.lucko.luckperms.lib.jedis'
|
relocate 'redis.clients.jedis', 'me.lucko.luckperms.lib.jedis'
|
||||||
|
relocate 'io.nats.client', 'me.lucko.luckperms.lib.nats'
|
||||||
relocate 'com.rabbitmq', 'me.lucko.luckperms.lib.rabbitmq'
|
relocate 'com.rabbitmq', 'me.lucko.luckperms.lib.rabbitmq'
|
||||||
relocate 'org.apache.commons.pool2', 'me.lucko.luckperms.lib.commonspool2'
|
relocate 'org.apache.commons.pool2', 'me.lucko.luckperms.lib.commonspool2'
|
||||||
relocate 'ninja.leaping.configurate', 'me.lucko.luckperms.lib.configurate'
|
relocate 'ninja.leaping.configurate', 'me.lucko.luckperms.lib.configurate'
|
||||||
|
@@ -244,6 +244,8 @@ watch-files = true
|
|||||||
# below.
|
# below.
|
||||||
# => rabbitmq Uses RabbitMQ pub-sub to push changes. Your server connection info must be
|
# => rabbitmq Uses RabbitMQ pub-sub to push changes. Your server connection info must be
|
||||||
# configured below.
|
# configured below.
|
||||||
|
# => nats Uses Nats pub-sub to push changes. Your server connection info must be
|
||||||
|
# configured below.
|
||||||
# => custom Uses a messaging service provided using the LuckPerms API.
|
# => custom Uses a messaging service provided using the LuckPerms API.
|
||||||
# => auto Attempts to automatically setup a messaging service using redis or sql.
|
# => auto Attempts to automatically setup a messaging service using redis or sql.
|
||||||
messaging-service = "auto"
|
messaging-service = "auto"
|
||||||
@@ -270,6 +272,15 @@ redis {
|
|||||||
password = ""
|
password = ""
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Settings for nats.
|
||||||
|
# Port 4222 is used by default; set address to "host:port" if differs
|
||||||
|
nats {
|
||||||
|
enabled = false
|
||||||
|
address = "localhost"
|
||||||
|
username = ""
|
||||||
|
password = ""
|
||||||
|
}
|
||||||
|
|
||||||
# Settings for RabbitMQ.
|
# Settings for RabbitMQ.
|
||||||
# Port 5672 is used by default; set address to "host:port" if differs
|
# Port 5672 is used by default; set address to "host:port" if differs
|
||||||
rabbitmq {
|
rabbitmq {
|
||||||
|
@@ -65,6 +65,7 @@ shadowJar {
|
|||||||
relocate 'com.mongodb', 'me.lucko.luckperms.lib.mongodb'
|
relocate 'com.mongodb', 'me.lucko.luckperms.lib.mongodb'
|
||||||
relocate 'org.bson', 'me.lucko.luckperms.lib.bson'
|
relocate 'org.bson', 'me.lucko.luckperms.lib.bson'
|
||||||
relocate 'redis.clients.jedis', 'me.lucko.luckperms.lib.jedis'
|
relocate 'redis.clients.jedis', 'me.lucko.luckperms.lib.jedis'
|
||||||
|
relocate 'io.nats.client', 'me.lucko.luckperms.lib.nats'
|
||||||
relocate 'com.rabbitmq', 'me.lucko.luckperms.lib.rabbitmq'
|
relocate 'com.rabbitmq', 'me.lucko.luckperms.lib.rabbitmq'
|
||||||
relocate 'org.apache.commons.pool2', 'me.lucko.luckperms.lib.commonspool2'
|
relocate 'org.apache.commons.pool2', 'me.lucko.luckperms.lib.commonspool2'
|
||||||
relocate 'ninja.leaping.configurate', 'me.lucko.luckperms.lib.configurate'
|
relocate 'ninja.leaping.configurate', 'me.lucko.luckperms.lib.configurate'
|
||||||
|
@@ -35,6 +35,7 @@ shadowJar {
|
|||||||
relocate 'com.mongodb', 'me.lucko.luckperms.lib.mongodb'
|
relocate 'com.mongodb', 'me.lucko.luckperms.lib.mongodb'
|
||||||
relocate 'org.bson', 'me.lucko.luckperms.lib.bson'
|
relocate 'org.bson', 'me.lucko.luckperms.lib.bson'
|
||||||
relocate 'redis.clients.jedis', 'me.lucko.luckperms.lib.jedis'
|
relocate 'redis.clients.jedis', 'me.lucko.luckperms.lib.jedis'
|
||||||
|
relocate 'io.nats.client', 'me.lucko.luckperms.lib.nats'
|
||||||
relocate 'com.rabbitmq', 'me.lucko.luckperms.lib.rabbitmq'
|
relocate 'com.rabbitmq', 'me.lucko.luckperms.lib.rabbitmq'
|
||||||
relocate 'org.apache.commons.pool2', 'me.lucko.luckperms.lib.commonspool2'
|
relocate 'org.apache.commons.pool2', 'me.lucko.luckperms.lib.commonspool2'
|
||||||
relocate 'ninja.leaping.configurate', 'me.lucko.luckperms.lib.configurate'
|
relocate 'ninja.leaping.configurate', 'me.lucko.luckperms.lib.configurate'
|
||||||
|
@@ -236,6 +236,8 @@ watch-files: true
|
|||||||
# below.
|
# below.
|
||||||
# => rabbitmq Uses RabbitMQ pub-sub to push changes. Your server connection info must be
|
# => rabbitmq Uses RabbitMQ pub-sub to push changes. Your server connection info must be
|
||||||
# configured below.
|
# configured below.
|
||||||
|
# => nats Uses Nats pub-sub to push changes. Your server connection info must be
|
||||||
|
# configured below.
|
||||||
# => custom Uses a messaging service provided using the LuckPerms API.
|
# => custom Uses a messaging service provided using the LuckPerms API.
|
||||||
# => auto Attempts to automatically setup a messaging service using redis or sql.
|
# => auto Attempts to automatically setup a messaging service using redis or sql.
|
||||||
messaging-service: auto
|
messaging-service: auto
|
||||||
@@ -261,6 +263,14 @@ redis:
|
|||||||
username: ''
|
username: ''
|
||||||
password: ''
|
password: ''
|
||||||
|
|
||||||
|
# Settings for Nats.
|
||||||
|
# Port 4222 is used by default; set address to "host:port" if differs
|
||||||
|
nats:
|
||||||
|
enabled: false
|
||||||
|
address: localhost
|
||||||
|
username: ''
|
||||||
|
password: ''
|
||||||
|
|
||||||
# Settings for RabbitMQ.
|
# Settings for RabbitMQ.
|
||||||
# Port 5672 is used by default; set address to "host:port" if differs
|
# Port 5672 is used by default; set address to "host:port" if differs
|
||||||
rabbitmq:
|
rabbitmq:
|
||||||
|
@@ -47,6 +47,7 @@ shadowJar {
|
|||||||
relocate 'com.mongodb', 'me.lucko.luckperms.lib.mongodb'
|
relocate 'com.mongodb', 'me.lucko.luckperms.lib.mongodb'
|
||||||
relocate 'org.bson', 'me.lucko.luckperms.lib.bson'
|
relocate 'org.bson', 'me.lucko.luckperms.lib.bson'
|
||||||
relocate 'redis.clients.jedis', 'me.lucko.luckperms.lib.jedis'
|
relocate 'redis.clients.jedis', 'me.lucko.luckperms.lib.jedis'
|
||||||
|
relocate 'io.nats.client', 'me.lucko.luckperms.lib.nats'
|
||||||
relocate 'com.rabbitmq', 'me.lucko.luckperms.lib.rabbitmq'
|
relocate 'com.rabbitmq', 'me.lucko.luckperms.lib.rabbitmq'
|
||||||
relocate 'org.apache.commons.pool2', 'me.lucko.luckperms.lib.commonspool2'
|
relocate 'org.apache.commons.pool2', 'me.lucko.luckperms.lib.commonspool2'
|
||||||
relocate 'ninja.leaping.configurate', 'me.lucko.luckperms.lib.configurate'
|
relocate 'ninja.leaping.configurate', 'me.lucko.luckperms.lib.configurate'
|
||||||
|
@@ -244,6 +244,8 @@ watch-files = true
|
|||||||
# below.
|
# below.
|
||||||
# => rabbitmq Uses RabbitMQ pub-sub to push changes. Your server connection info must be
|
# => rabbitmq Uses RabbitMQ pub-sub to push changes. Your server connection info must be
|
||||||
# configured below.
|
# configured below.
|
||||||
|
# => nats Uses Nats pub-sub to push changes. Your server connection info must be
|
||||||
|
# configured below.
|
||||||
# => custom Uses a messaging service provided using the LuckPerms API.
|
# => custom Uses a messaging service provided using the LuckPerms API.
|
||||||
# => auto Attempts to automatically setup a messaging service using redis or sql.
|
# => auto Attempts to automatically setup a messaging service using redis or sql.
|
||||||
messaging-service = "auto"
|
messaging-service = "auto"
|
||||||
@@ -270,6 +272,15 @@ redis {
|
|||||||
password = ""
|
password = ""
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Settings for nats.
|
||||||
|
# Port 4222 is used by default; set address to "host:port" if differs
|
||||||
|
nats {
|
||||||
|
enabled = false
|
||||||
|
address = "localhost"
|
||||||
|
username = ""
|
||||||
|
password = ""
|
||||||
|
}
|
||||||
|
|
||||||
# Settings for RabbitMQ.
|
# Settings for RabbitMQ.
|
||||||
# Port 5672 is used by default; set address to "host:port" if differs
|
# Port 5672 is used by default; set address to "host:port" if differs
|
||||||
rabbitmq {
|
rabbitmq {
|
||||||
|
@@ -30,6 +30,7 @@ shadowJar {
|
|||||||
relocate 'com.mongodb', 'me.lucko.luckperms.lib.mongodb'
|
relocate 'com.mongodb', 'me.lucko.luckperms.lib.mongodb'
|
||||||
relocate 'org.bson', 'me.lucko.luckperms.lib.bson'
|
relocate 'org.bson', 'me.lucko.luckperms.lib.bson'
|
||||||
relocate 'redis.clients.jedis', 'me.lucko.luckperms.lib.jedis'
|
relocate 'redis.clients.jedis', 'me.lucko.luckperms.lib.jedis'
|
||||||
|
relocate 'io.nats.client', 'me.lucko.luckperms.lib.nats'
|
||||||
relocate 'com.rabbitmq', 'me.lucko.luckperms.lib.rabbitmq'
|
relocate 'com.rabbitmq', 'me.lucko.luckperms.lib.rabbitmq'
|
||||||
relocate 'org.apache.commons.pool2', 'me.lucko.luckperms.lib.commonspool2'
|
relocate 'org.apache.commons.pool2', 'me.lucko.luckperms.lib.commonspool2'
|
||||||
relocate 'ninja.leaping.configurate', 'me.lucko.luckperms.lib.configurate'
|
relocate 'ninja.leaping.configurate', 'me.lucko.luckperms.lib.configurate'
|
||||||
|
@@ -226,6 +226,8 @@ watch-files: true
|
|||||||
# below.
|
# below.
|
||||||
# => rabbitmq Uses RabbitMQ pub-sub to push changes. Your server connection info must be
|
# => rabbitmq Uses RabbitMQ pub-sub to push changes. Your server connection info must be
|
||||||
# configured below.
|
# configured below.
|
||||||
|
# => nats Uses Nats pub-sub to push changes. Your server connection info must be
|
||||||
|
# configured below.
|
||||||
# => custom Uses a messaging service provided using the LuckPerms API.
|
# => custom Uses a messaging service provided using the LuckPerms API.
|
||||||
# => auto Attempts to automatically setup a messaging service using redis or sql.
|
# => auto Attempts to automatically setup a messaging service using redis or sql.
|
||||||
messaging-service: auto
|
messaging-service: auto
|
||||||
@@ -251,6 +253,14 @@ redis:
|
|||||||
username: ''
|
username: ''
|
||||||
password: ''
|
password: ''
|
||||||
|
|
||||||
|
# Settings for Nats.
|
||||||
|
# Port 4222 is used by default; set address to "host:port" if differs
|
||||||
|
nats:
|
||||||
|
enabled: false
|
||||||
|
address: localhost
|
||||||
|
username: ''
|
||||||
|
password: ''
|
||||||
|
|
||||||
# Settings for RabbitMQ.
|
# Settings for RabbitMQ.
|
||||||
# Port 5672 is used by default; set address to "host:port" if differs
|
# Port 5672 is used by default; set address to "host:port" if differs
|
||||||
rabbitmq:
|
rabbitmq:
|
||||||
|
@@ -41,6 +41,7 @@ shadowJar {
|
|||||||
relocate 'com.mongodb', 'me.lucko.luckperms.lib.mongodb'
|
relocate 'com.mongodb', 'me.lucko.luckperms.lib.mongodb'
|
||||||
relocate 'org.bson', 'me.lucko.luckperms.lib.bson'
|
relocate 'org.bson', 'me.lucko.luckperms.lib.bson'
|
||||||
relocate 'redis.clients.jedis', 'me.lucko.luckperms.lib.jedis'
|
relocate 'redis.clients.jedis', 'me.lucko.luckperms.lib.jedis'
|
||||||
|
relocate 'io.nats.client', 'me.lucko.luckperms.lib.nats'
|
||||||
relocate 'com.rabbitmq', 'me.lucko.luckperms.lib.rabbitmq'
|
relocate 'com.rabbitmq', 'me.lucko.luckperms.lib.rabbitmq'
|
||||||
relocate 'org.apache.commons.pool2', 'me.lucko.luckperms.lib.commonspool2'
|
relocate 'org.apache.commons.pool2', 'me.lucko.luckperms.lib.commonspool2'
|
||||||
relocate 'ninja.leaping.configurate', 'me.lucko.luckperms.lib.configurate'
|
relocate 'ninja.leaping.configurate', 'me.lucko.luckperms.lib.configurate'
|
||||||
|
@@ -230,6 +230,8 @@ watch-files: true
|
|||||||
# configured below.
|
# configured below.
|
||||||
# => rabbitmq Uses RabbitMQ pub-sub to push changes. Your server connection info must be
|
# => rabbitmq Uses RabbitMQ pub-sub to push changes. Your server connection info must be
|
||||||
# configured below.
|
# configured below.
|
||||||
|
# => nats Uses Nats pub-sub to push changes. Your server connection info must be
|
||||||
|
# configured below.
|
||||||
# => custom Uses a messaging service provided using the LuckPerms API.
|
# => custom Uses a messaging service provided using the LuckPerms API.
|
||||||
# => auto Attempts to automatically setup a messaging service using redis or sql.
|
# => auto Attempts to automatically setup a messaging service using redis or sql.
|
||||||
messaging-service: auto
|
messaging-service: auto
|
||||||
@@ -255,6 +257,14 @@ redis:
|
|||||||
username: ''
|
username: ''
|
||||||
password: ''
|
password: ''
|
||||||
|
|
||||||
|
# Settings for Nats.
|
||||||
|
# Port 4222 is used by default; set address to "host:port" if differs
|
||||||
|
nats:
|
||||||
|
enabled: false
|
||||||
|
address: localhost
|
||||||
|
username: ''
|
||||||
|
password: ''
|
||||||
|
|
||||||
# Settings for RabbitMQ.
|
# Settings for RabbitMQ.
|
||||||
# Port 5672 is used by default; set address to "host:port" if differs
|
# Port 5672 is used by default; set address to "host:port" if differs
|
||||||
rabbitmq:
|
rabbitmq:
|
||||||
|
Reference in New Issue
Block a user