Fixed player instance concurrency issue

This commit is contained in:
2022-05-14 13:52:38 +08:00
parent e5a6aa22aa
commit 1df94e613e

View File

@ -109,19 +109,27 @@ public final class OpenCommandHandler implements Router {
} else { } else {
if (req.action.equals("command")) { if (req.action.equals("command")) {
// update token expire time // update token expire time
tokenExpireTime.put(req.token, new Date(now.getTime() + 24 * 60 * 60 * 1000)); tokenExpireTime.put(req.token, new Date(now.getTime() + 4 * 60 * 60 * 1000));
var playerId = clients.get(req.token); var playerId = clients.get(req.token);
var player = Grasscutter.getGameServer().getPlayerByUid(playerId); var player = Grasscutter.getGameServer().getPlayerByUid(playerId);
var command = req.data.toString(); var command = req.data.toString();
try { if (player == null) {
var resultCollector = new MessageHandler(); response.json(new JsonResponse(404, "Player not found"));
player.setMessageHandler(resultCollector); return;
CommandMap.getInstance().invoke(player, player, command); }
response.json(new JsonResponse(resultCollector.getMessage())); // Player MessageHandler do not support concurrency
} catch (Exception e) { //noinspection SynchronizationOnLocalVariableOrMethodParameter
response.json(new JsonResponse(500, "error", e.getLocalizedMessage())); synchronized (player) {
} finally { try {
player.setMessageHandler(null); var resultCollector = new MessageHandler();
player.setMessageHandler(resultCollector);
CommandMap.getInstance().invoke(player, player, command);
response.json(new JsonResponse(resultCollector.getMessage()));
} catch (Exception e) {
response.json(new JsonResponse(500, "error", e.getLocalizedMessage()));
} finally {
player.setMessageHandler(null);
}
} }
return; return;
} }