mirror of
https://github.com/LuckPerms/LuckPerms.git
synced 2024-11-24 11:38:40 +01:00
Send a different type of update ping for user changes, and only apply the change if the user is loaded
This commit is contained in:
parent
3d6aa69ca1
commit
3413adf16f
@ -35,8 +35,9 @@ public interface MessagingService {
|
|||||||
/**
|
/**
|
||||||
* Uses the messaging service to inform other servers about changes.
|
* Uses the messaging service to inform other servers about changes.
|
||||||
*
|
*
|
||||||
* <p>This will push the update asynchronously, and this method will return immediately. Calling this method is
|
* <p>This will push the update asynchronously, and this method will return
|
||||||
* equivalent to running "/lp networksync", except will not sync this server.</p>
|
* immediately. Calling this method is equivalent to running "/lp networksync",
|
||||||
|
* except will not sync this server.</p>
|
||||||
*/
|
*/
|
||||||
void pushUpdate();
|
void pushUpdate();
|
||||||
|
|
||||||
|
@ -349,10 +349,10 @@ public class ExtendedLogEntry implements LogEntry {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static JsonObject serializeWithId(UUID id, LogEntry entry) {
|
public static JsonObject serializeWithId(String id, LogEntry entry) {
|
||||||
JsonObject data = new JsonObject();
|
JsonObject data = new JsonObject();
|
||||||
|
|
||||||
data.add("id", new JsonPrimitive(id.toString()));
|
data.add("id", new JsonPrimitive(id));
|
||||||
data.add("actor", new JsonPrimitive(entry.getActor().toString()));
|
data.add("actor", new JsonPrimitive(entry.getActor().toString()));
|
||||||
data.add("actorName", new JsonPrimitive(entry.getActorName()));
|
data.add("actorName", new JsonPrimitive(entry.getActorName()));
|
||||||
data.add("type", new JsonPrimitive(entry.getType().name()));
|
data.add("type", new JsonPrimitive(entry.getType().name()));
|
||||||
@ -365,10 +365,10 @@ public class ExtendedLogEntry implements LogEntry {
|
|||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Map.Entry<UUID, ExtendedLogEntry> deserialize(JsonObject object) {
|
public static Map.Entry<String, ExtendedLogEntry> deserialize(JsonObject object) {
|
||||||
ExtendedLogEntryBuilder builder = build();
|
ExtendedLogEntryBuilder builder = build();
|
||||||
|
|
||||||
UUID id = UUID.fromString(object.get("id").getAsString());
|
String id = object.get("id").getAsString();
|
||||||
|
|
||||||
builder.actor(UUID.fromString(object.get("actor").getAsString()));
|
builder.actor(UUID.fromString(object.get("actor").getAsString()));
|
||||||
builder.actorName(object.get("actorName").getAsString());
|
builder.actorName(object.get("actorName").getAsString());
|
||||||
|
@ -190,7 +190,7 @@ public abstract class SubCommand<T> extends Command<T, Void> {
|
|||||||
if (!sender.isImport()) {
|
if (!sender.isImport()) {
|
||||||
Optional<ExtendedMessagingService> messagingService = plugin.getMessagingService();
|
Optional<ExtendedMessagingService> messagingService = plugin.getMessagingService();
|
||||||
if (messagingService.isPresent() && plugin.getConfiguration().get(ConfigKeys.AUTO_PUSH_UPDATES)) {
|
if (messagingService.isPresent() && plugin.getConfiguration().get(ConfigKeys.AUTO_PUSH_UPDATES)) {
|
||||||
messagingService.get().getUpdateBuffer().request();
|
messagingService.get().pushUserUpdate(user);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -27,6 +27,7 @@ package me.lucko.luckperms.common.messaging;
|
|||||||
|
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
|
|
||||||
|
import com.google.common.collect.Maps;
|
||||||
import com.google.gson.Gson;
|
import com.google.gson.Gson;
|
||||||
import com.google.gson.JsonObject;
|
import com.google.gson.JsonObject;
|
||||||
|
|
||||||
@ -34,8 +35,11 @@ import me.lucko.luckperms.api.LogEntry;
|
|||||||
import me.lucko.luckperms.common.actionlog.ExtendedLogEntry;
|
import me.lucko.luckperms.common.actionlog.ExtendedLogEntry;
|
||||||
import me.lucko.luckperms.common.buffers.BufferedRequest;
|
import me.lucko.luckperms.common.buffers.BufferedRequest;
|
||||||
import me.lucko.luckperms.common.config.ConfigKeys;
|
import me.lucko.luckperms.common.config.ConfigKeys;
|
||||||
|
import me.lucko.luckperms.common.model.User;
|
||||||
import me.lucko.luckperms.common.plugin.LuckPermsPlugin;
|
import me.lucko.luckperms.common.plugin.LuckPermsPlugin;
|
||||||
|
|
||||||
|
import java.nio.ByteBuffer;
|
||||||
|
import java.util.Base64;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@ -49,6 +53,10 @@ import java.util.function.Consumer;
|
|||||||
public abstract class AbstractMessagingService implements ExtendedMessagingService {
|
public abstract class AbstractMessagingService implements ExtendedMessagingService {
|
||||||
protected static final String CHANNEL = "lpuc";
|
protected static final String CHANNEL = "lpuc";
|
||||||
|
|
||||||
|
private static final String UPDATE_HEADER = "update:";
|
||||||
|
private static final String USER_UPDATE_HEADER = "userupdate:";
|
||||||
|
private static final String LOG_HEADER = "log";
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
private final LuckPermsPlugin plugin;
|
private final LuckPermsPlugin plugin;
|
||||||
|
|
||||||
@ -72,19 +80,21 @@ public abstract class AbstractMessagingService implements ExtendedMessagingServi
|
|||||||
protected abstract void sendMessage(String message);
|
protected abstract void sendMessage(String message);
|
||||||
|
|
||||||
protected void onMessage(String msg, Consumer<String> callback) {
|
protected void onMessage(String msg, Consumer<String> callback) {
|
||||||
if (msg.startsWith("update:") && msg.length() > "update:".length()) {
|
if (msg.startsWith(UPDATE_HEADER) && msg.length() > UPDATE_HEADER.length()) {
|
||||||
UUID uuid = parseUpdateMessage(msg);
|
String content = msg.substring(UPDATE_HEADER.length());
|
||||||
if (uuid == null) {
|
|
||||||
|
UUID requestId = uuidFromString(content);
|
||||||
|
if (requestId == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!receivedMessages.add(uuid)) {
|
if (!receivedMessages.add(requestId)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
plugin.getLog().info("[" + name + " Messaging] Received update ping with id: " + uuid.toString());
|
plugin.getLog().info("[" + name + " Messaging] Received update ping with id: " + requestId.toString());
|
||||||
|
|
||||||
if (plugin.getApiProvider().getEventFactory().handleNetworkPreSync(false, uuid)) {
|
if (plugin.getApiProvider().getEventFactory().handleNetworkPreSync(false, requestId)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -94,25 +104,62 @@ public abstract class AbstractMessagingService implements ExtendedMessagingServi
|
|||||||
callback.accept(msg);
|
callback.accept(msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if (msg.startsWith("log:") && msg.length() > "log:".length()) {
|
} else if (msg.startsWith(USER_UPDATE_HEADER) && msg.length() > USER_UPDATE_HEADER.length()) {
|
||||||
String logData = msg.substring("log:".length());
|
String content = msg.substring(USER_UPDATE_HEADER.length());
|
||||||
Map.Entry<UUID, ExtendedLogEntry> entry = null;
|
|
||||||
try {
|
|
||||||
entry = ExtendedLogEntry.deserialize(gson.fromJson(logData, JsonObject.class));
|
|
||||||
} catch (Exception e) {
|
|
||||||
plugin.getLog().warn("Error whilst deserializing log: " + logData);
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
Map.Entry<UUID, UUID> entry = uuidsFromString(content);
|
||||||
if (entry == null) {
|
if (entry == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!receivedMessages.add(entry.getKey())) {
|
UUID requestId = entry.getKey();
|
||||||
|
UUID userUuid = entry.getValue();
|
||||||
|
|
||||||
|
if (!receivedMessages.add(requestId)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
plugin.getApiProvider().getEventFactory().handleLogReceive(entry.getKey(), entry.getValue());
|
User user = plugin.getUserManager().getIfLoaded(userUuid);
|
||||||
|
if (user == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
plugin.getLog().info("[" + name + " Messaging] Received user update ping for '" + user.getFriendlyName() + "' with id: " + requestId.toString());
|
||||||
|
|
||||||
|
if (plugin.getApiProvider().getEventFactory().handleNetworkPreSync(false, requestId)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
plugin.getStorage().loadUser(user.getUuid(), null);
|
||||||
|
|
||||||
|
if (callback != null) {
|
||||||
|
callback.accept(msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
} else if (msg.startsWith(LOG_HEADER) && msg.length() > LOG_HEADER.length()) {
|
||||||
|
String content = msg.substring(LOG_HEADER.length());
|
||||||
|
|
||||||
|
Map.Entry<String, ExtendedLogEntry> entry;
|
||||||
|
try {
|
||||||
|
entry = ExtendedLogEntry.deserialize(gson.fromJson(content, JsonObject.class));
|
||||||
|
} catch (Exception e) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (entry.getKey() == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
UUID requestId = uuidFromString(entry.getKey());
|
||||||
|
if (requestId == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!receivedMessages.add(requestId)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
plugin.getApiProvider().getEventFactory().handleLogReceive(requestId, entry.getValue());
|
||||||
plugin.getLogDispatcher().dispatchFromRemote(entry.getValue());
|
plugin.getLogDispatcher().dispatchFromRemote(entry.getValue());
|
||||||
|
|
||||||
if (callback != null) {
|
if (callback != null) {
|
||||||
@ -122,26 +169,39 @@ public abstract class AbstractMessagingService implements ExtendedMessagingServi
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void pushLog(LogEntry logEntry) {
|
public void pushUpdate() {
|
||||||
plugin.getScheduler().doAsync(() -> {
|
plugin.getScheduler().doAsync(() -> {
|
||||||
UUID id = generatePingId();
|
UUID requestId = generatePingId();
|
||||||
|
String strId = uuidToString(requestId);
|
||||||
|
|
||||||
if (plugin.getApiProvider().getEventFactory().handleLogNetworkPublish(!plugin.getConfiguration().get(ConfigKeys.PUSH_LOG_ENTRIES), id, logEntry)) {
|
plugin.getLog().info("[" + name + " Messaging] Sending ping with id: " + strId);
|
||||||
return;
|
sendMessage("update:" + strId);
|
||||||
}
|
|
||||||
|
|
||||||
plugin.getLog().info("[" + name + " Messaging] Sending log with id: " + id.toString());
|
|
||||||
sendMessage("log:" + gson.toJson(ExtendedLogEntry.serializeWithId(id, logEntry)));
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void pushUpdate() {
|
public void pushUserUpdate(User user) {
|
||||||
plugin.getScheduler().doAsync(() -> {
|
plugin.getScheduler().doAsync(() -> {
|
||||||
UUID id = generatePingId();
|
UUID requestId = generatePingId();
|
||||||
plugin.getLog().info("[" + name + " Messaging] Sending ping with id: " + id.toString());
|
String strId = uuidToString(requestId);
|
||||||
|
|
||||||
sendMessage("update:" + id.toString());
|
plugin.getLog().info("[" + name + " Messaging] Sending user ping for '" + user.getFriendlyName() + "' with id: " + strId);
|
||||||
|
sendMessage("userupdate:" + uuidsToString(requestId, user.getUuid()));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void pushLog(LogEntry logEntry) {
|
||||||
|
plugin.getScheduler().doAsync(() -> {
|
||||||
|
UUID requestId = generatePingId();
|
||||||
|
String strId = uuidToString(requestId);
|
||||||
|
|
||||||
|
if (plugin.getApiProvider().getEventFactory().handleLogNetworkPublish(!plugin.getConfiguration().get(ConfigKeys.PUSH_LOG_ENTRIES), requestId, logEntry)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
plugin.getLog().info("[" + name + " Messaging] Sending log with id: " + strId);
|
||||||
|
sendMessage("log:" + gson.toJson(ExtendedLogEntry.serializeWithId(strId, logEntry)));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -151,10 +211,39 @@ public abstract class AbstractMessagingService implements ExtendedMessagingServi
|
|||||||
return uuid;
|
return uuid;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static UUID parseUpdateMessage(String msg) {
|
private static String uuidToString(UUID uuid) {
|
||||||
String requestId = msg.substring("update:".length());
|
ByteBuffer buf = ByteBuffer.allocate(Long.BYTES * 2);
|
||||||
|
buf.putLong(uuid.getMostSignificantBits());
|
||||||
|
buf.putLong(uuid.getLeastSignificantBits());
|
||||||
|
return Base64.getEncoder().encodeToString(buf.array());
|
||||||
|
}
|
||||||
|
|
||||||
|
private static UUID uuidFromString(String s) {
|
||||||
try {
|
try {
|
||||||
return UUID.fromString(requestId);
|
byte[] bytes = Base64.getDecoder().decode(s);
|
||||||
|
ByteBuffer buf = ByteBuffer.wrap(bytes);
|
||||||
|
return new UUID(buf.getLong(), buf.getLong());
|
||||||
|
} catch (IllegalArgumentException e) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String uuidsToString(UUID uuid1, UUID uuid2) {
|
||||||
|
ByteBuffer buf = ByteBuffer.allocate(Long.BYTES * 4);
|
||||||
|
buf.putLong(uuid1.getMostSignificantBits());
|
||||||
|
buf.putLong(uuid1.getLeastSignificantBits());
|
||||||
|
buf.putLong(uuid2.getMostSignificantBits());
|
||||||
|
buf.putLong(uuid2.getLeastSignificantBits());
|
||||||
|
return Base64.getEncoder().encodeToString(buf.array());
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Map.Entry<UUID, UUID> uuidsFromString(String s) {
|
||||||
|
try {
|
||||||
|
byte[] bytes = Base64.getDecoder().decode(s);
|
||||||
|
ByteBuffer buf = ByteBuffer.wrap(bytes);
|
||||||
|
UUID uuid1 = new UUID(buf.getLong(), buf.getLong());
|
||||||
|
UUID uuid2 = new UUID(buf.getLong(), buf.getLong());
|
||||||
|
return Maps.immutableEntry(uuid1, uuid2);
|
||||||
} catch (IllegalArgumentException e) {
|
} catch (IllegalArgumentException e) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@ -162,7 +251,7 @@ public abstract class AbstractMessagingService implements ExtendedMessagingServi
|
|||||||
|
|
||||||
private final class PushUpdateBuffer extends BufferedRequest<Void> {
|
private final class PushUpdateBuffer extends BufferedRequest<Void> {
|
||||||
public PushUpdateBuffer(LuckPermsPlugin plugin) {
|
public PushUpdateBuffer(LuckPermsPlugin plugin) {
|
||||||
super(3000L, 200L, plugin.getScheduler().async());
|
super(2000L, 200L, plugin.getScheduler().async());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -28,6 +28,7 @@ package me.lucko.luckperms.common.messaging;
|
|||||||
import me.lucko.luckperms.api.LogEntry;
|
import me.lucko.luckperms.api.LogEntry;
|
||||||
import me.lucko.luckperms.api.MessagingService;
|
import me.lucko.luckperms.api.MessagingService;
|
||||||
import me.lucko.luckperms.common.buffers.BufferedRequest;
|
import me.lucko.luckperms.common.buffers.BufferedRequest;
|
||||||
|
import me.lucko.luckperms.common.model.User;
|
||||||
|
|
||||||
public interface ExtendedMessagingService extends MessagingService {
|
public interface ExtendedMessagingService extends MessagingService {
|
||||||
|
|
||||||
@ -50,6 +51,13 @@ public interface ExtendedMessagingService extends MessagingService {
|
|||||||
*/
|
*/
|
||||||
BufferedRequest<Void> getUpdateBuffer();
|
BufferedRequest<Void> getUpdateBuffer();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Pushes an update for a specific user.
|
||||||
|
*
|
||||||
|
* @param user the user
|
||||||
|
*/
|
||||||
|
void pushUserUpdate(User user);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Pushes a log entry to connected servers.
|
* Pushes a log entry to connected servers.
|
||||||
*
|
*
|
||||||
|
Loading…
Reference in New Issue
Block a user