Fix JsonUtils compatibility issue

Fix locking player object when executing command issue
This commit is contained in:
2023-02-25 16:33:42 +08:00
parent 4b8eb490f5
commit ded44804d4
2 changed files with 19 additions and 8 deletions

View File

@ -46,6 +46,8 @@ public final class OpenCommandHandler implements Router {
private static final Map<String, Integer> codes = new HashMap<>(); private static final Map<String, Integer> codes = new HashMap<>();
private static final Int2ObjectMap<Date> codeExpireTime = new Int2ObjectOpenHashMap<>(); private static final Int2ObjectMap<Date> codeExpireTime = new Int2ObjectOpenHashMap<>();
private static final Int2ObjectMap<MessageHandler> playerMessageHandlers = new Int2ObjectOpenHashMap<>();
public static void handle(Context context) { public static void handle(Context context) {
var plugin = OpenCommandPlugin.getInstance(); var plugin = OpenCommandPlugin.getInstance();
var config = plugin.getConfig(); var config = plugin.getConfig();
@ -152,13 +154,18 @@ public final class OpenCommandHandler implements Router {
return; return;
} }
// Player MessageHandler do not support concurrency // Player MessageHandler do not support concurrency
var handler = playerMessageHandlers.get(player.getUid());
if (handler == null) {
handler = new MessageHandler();
playerMessageHandlers.put(player.getUid(), handler);
}
//noinspection SynchronizationOnLocalVariableOrMethodParameter //noinspection SynchronizationOnLocalVariableOrMethodParameter
synchronized (player) { synchronized (handler) {
try { try {
var resultCollector = new MessageHandler(); handler.setMessage("");
player.setMessageHandler(resultCollector); player.setMessageHandler(handler);
CommandMap.getInstance().invoke(player, player, command); CommandMap.getInstance().invoke(player, player, command);
context.json(new JsonResponse(resultCollector.getMessage())); context.json(new JsonResponse(handler.getMessage()));
} catch (Exception e) { } catch (Exception e) {
plugin.getLogger().warn("Run command failed.", e); plugin.getLogger().warn("Run command failed.", e);
context.json(new JsonResponse(500, "error", e.getLocalizedMessage())); context.json(new JsonResponse(500, "error", e.getLocalizedMessage()));

View File

@ -29,6 +29,8 @@ import emu.grasscutter.server.event.player.PlayerQuitEvent;
import emu.grasscutter.utils.JsonUtils; import emu.grasscutter.utils.JsonUtils;
import java.io.*; import java.io.*;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
public final class OpenCommandPlugin extends Plugin { public final class OpenCommandPlugin extends Plugin {
@ -105,8 +107,9 @@ public final class OpenCommandPlugin extends Plugin {
getLogger().error("[OpenCommand] Unable to save config file."); getLogger().error("[OpenCommand] Unable to save config file.");
} }
} else { } else {
try (var fileReader = new InputStreamReader(new FileInputStream(configFile))) { try {
config = JsonUtils.loadToClass(fileReader, OpenCommandConfig.class); config = JsonUtils.decode(Files.readString(configFile.toPath(), StandardCharsets.UTF_8),
OpenCommandConfig.class);
} catch (Exception exception) { } catch (Exception exception) {
config = new OpenCommandConfig(); config = new OpenCommandConfig();
getLogger().error("[OpenCommand] There was an error while trying to load the configuration from config.json. Please make sure that there are no syntax errors. If you want to start with a default configuration, delete your existing config.json."); getLogger().error("[OpenCommand] There was an error while trying to load the configuration from config.json. Please make sure that there are no syntax errors. If you want to start with a default configuration, delete your existing config.json.");
@ -125,8 +128,9 @@ public final class OpenCommandPlugin extends Plugin {
data = new OpenCommandData(); data = new OpenCommandData();
saveData(); saveData();
} else { } else {
try (var fileReader = new InputStreamReader(new FileInputStream(dataFile))) { try {
data = JsonUtils.loadToClass(fileReader, OpenCommandData.class); data = JsonUtils.decode(Files.readString(dataFile.toPath(), StandardCharsets.UTF_8),
OpenCommandData.class);
} catch (Exception exception) { } catch (Exception exception) {
data = new OpenCommandData(); data = new OpenCommandData();
getLogger().error("[OpenCommand] There was an error while trying to load the data from data.json. Please make sure that there are no syntax errors. If you want to start with a default data, delete your existing data.json."); getLogger().error("[OpenCommand] There was an error while trying to load the data from data.json. Please make sure that there are no syntax errors. If you want to start with a default data, delete your existing data.json.");