mirror of
https://github.com/jie65535/gc-opencommand-plugin.git
synced 2025-06-02 17:49:12 +08:00
Update player command response handler
This commit is contained in:
parent
1c8d448a7b
commit
5019b6548a
@ -24,24 +24,54 @@ import emu.grasscutter.game.player.Player;
|
|||||||
import emu.grasscutter.server.event.game.ReceiveCommandFeedbackEvent;
|
import emu.grasscutter.server.event.game.ReceiveCommandFeedbackEvent;
|
||||||
import emu.grasscutter.server.event.player.PlayerJoinEvent;
|
import emu.grasscutter.server.event.player.PlayerJoinEvent;
|
||||||
import emu.grasscutter.server.event.player.PlayerQuitEvent;
|
import emu.grasscutter.server.event.player.PlayerQuitEvent;
|
||||||
|
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
|
||||||
|
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
||||||
public final class EventListeners {
|
public final class EventListeners {
|
||||||
|
|
||||||
private static StringBuilder consoleMessageHandler;
|
private static StringBuilder consoleMessageHandler;
|
||||||
|
private static final Int2ObjectMap<StringBuilder> playerMessageHandlers = new Int2ObjectOpenHashMap<>();
|
||||||
|
|
||||||
public static void setConsoleMessageHandler(StringBuilder handler) {
|
public static void setConsoleMessageHandler(StringBuilder handler) {
|
||||||
consoleMessageHandler = handler;
|
consoleMessageHandler = handler;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取新的玩家消息处理类
|
||||||
|
* 获取时将创建或清空消息处理器并返回实例,**在执行命令前获取!**
|
||||||
|
* @param uid 玩家uid
|
||||||
|
* @return 新的玩家消息处理类
|
||||||
|
*/
|
||||||
|
public static StringBuilder getPlayerNewMessageHandler(int uid) {
|
||||||
|
var handler = playerMessageHandlers.get(uid);
|
||||||
|
if (handler == null) {
|
||||||
|
handler = new StringBuilder();
|
||||||
|
playerMessageHandlers.put(uid, handler);
|
||||||
|
} else {
|
||||||
|
handler.setLength(0);
|
||||||
|
}
|
||||||
|
return handler;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 命令执行反馈事件处理
|
||||||
|
*/
|
||||||
public static void onCommandResponse(ReceiveCommandFeedbackEvent event) {
|
public static void onCommandResponse(ReceiveCommandFeedbackEvent event) {
|
||||||
if (consoleMessageHandler != null && event.getPlayer() == null) {
|
StringBuilder handler;
|
||||||
if (!consoleMessageHandler.isEmpty()) {
|
if (event.getPlayer() == null) {
|
||||||
|
handler = consoleMessageHandler;
|
||||||
|
} else {
|
||||||
|
handler = playerMessageHandlers.get(event.getPlayer().getUid());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (handler != null) {
|
||||||
|
if (!handler.isEmpty()) {
|
||||||
// New line
|
// New line
|
||||||
consoleMessageHandler.append(System.lineSeparator());
|
handler.append(System.lineSeparator());
|
||||||
}
|
}
|
||||||
consoleMessageHandler.append(event.getMessage());
|
handler.append(event.getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -60,6 +90,10 @@ public final class EventListeners {
|
|||||||
SocketClient.sendPacket(playerList);
|
SocketClient.sendPacket(playerList);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 仅游戏模式下玩家离开事件处理方法
|
||||||
|
* 用于更新玩家列表
|
||||||
|
*/
|
||||||
public static void onPlayerQuit(PlayerQuitEvent playerQuitEvent) {
|
public static void onPlayerQuit(PlayerQuitEvent playerQuitEvent) {
|
||||||
PlayerList playerList = new PlayerList();
|
PlayerList playerList = new PlayerList();
|
||||||
playerList.player = Grasscutter.getGameServer().getPlayers().size();
|
playerList.player = Grasscutter.getGameServer().getPlayers().size();
|
||||||
@ -73,4 +107,15 @@ public final class EventListeners {
|
|||||||
playerList.playerList = playerNames;
|
playerList.playerList = playerNames;
|
||||||
SocketClient.sendPacket(playerList);
|
SocketClient.sendPacket(playerList);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 玩家离开事件处理 2
|
||||||
|
* 用于清理内存
|
||||||
|
*/
|
||||||
|
public static void onPlayerQuit2(PlayerQuitEvent playerQuitEvent) {
|
||||||
|
var uid = playerQuitEvent.getPlayer().getUid();
|
||||||
|
if (playerMessageHandlers.containsKey(uid)) {
|
||||||
|
playerMessageHandlers.remove(uid);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -24,7 +24,6 @@ import com.github.jie65535.opencommand.socket.SocketData;
|
|||||||
import emu.grasscutter.command.CommandMap;
|
import emu.grasscutter.command.CommandMap;
|
||||||
import emu.grasscutter.server.http.Router;
|
import emu.grasscutter.server.http.Router;
|
||||||
import emu.grasscutter.utils.Crypto;
|
import emu.grasscutter.utils.Crypto;
|
||||||
import emu.grasscutter.utils.MessageHandler;
|
|
||||||
import emu.grasscutter.utils.Utils;
|
import emu.grasscutter.utils.Utils;
|
||||||
import io.javalin.Javalin;
|
import io.javalin.Javalin;
|
||||||
import io.javalin.http.Context;
|
import io.javalin.http.Context;
|
||||||
@ -46,7 +45,6 @@ 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();
|
||||||
@ -154,24 +152,16 @@ public final class OpenCommandHandler implements Router {
|
|||||||
context.json(new JsonResponse(404, "Player not found"));
|
context.json(new JsonResponse(404, "Player not found"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// 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 (handler) {
|
synchronized (player) {
|
||||||
|
// Player MessageHandler do not support concurrency
|
||||||
|
var handler = EventListeners.getPlayerNewMessageHandler(player.getUid());
|
||||||
try {
|
try {
|
||||||
handler.setMessage("");
|
|
||||||
player.setMessageHandler(handler);
|
|
||||||
CommandMap.getInstance().invoke(player, player, command);
|
CommandMap.getInstance().invoke(player, player, command);
|
||||||
context.json(new JsonResponse(handler.getMessage()));
|
context.json(new JsonResponse(handler.toString()));
|
||||||
} 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()));
|
||||||
} finally {
|
|
||||||
player.setMessageHandler(null);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
|
@ -59,10 +59,16 @@ public final class OpenCommandPlugin extends Plugin {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onEnable() {
|
public void onEnable() {
|
||||||
|
// 监听命令执行反馈
|
||||||
new EventHandler<>(ReceiveCommandFeedbackEvent.class)
|
new EventHandler<>(ReceiveCommandFeedbackEvent.class)
|
||||||
.priority(HandlerPriority.HIGH)
|
.priority(HandlerPriority.HIGH)
|
||||||
.listener(EventListeners::onCommandResponse)
|
.listener(EventListeners::onCommandResponse)
|
||||||
.register(this);
|
.register(this);
|
||||||
|
// 监听玩家离开事件
|
||||||
|
new EventHandler<>(PlayerQuitEvent.class)
|
||||||
|
.priority(HandlerPriority.NORMAL)
|
||||||
|
.listener(EventListeners::onPlayerQuit2)
|
||||||
|
.register(this);
|
||||||
if (runMode == Grasscutter.ServerRunMode.GAME_ONLY) {
|
if (runMode == Grasscutter.ServerRunMode.GAME_ONLY) {
|
||||||
// 仅运行游戏服务器时注册玩家加入和离开事件
|
// 仅运行游戏服务器时注册玩家加入和离开事件
|
||||||
new EventHandler<>(PlayerJoinEvent.class)
|
new EventHandler<>(PlayerJoinEvent.class)
|
||||||
|
@ -26,7 +26,6 @@ import com.github.jie65535.opencommand.socket.packet.player.PlayerList;
|
|||||||
import emu.grasscutter.Grasscutter;
|
import emu.grasscutter.Grasscutter;
|
||||||
import emu.grasscutter.command.CommandMap;
|
import emu.grasscutter.command.CommandMap;
|
||||||
import emu.grasscutter.utils.JsonUtils;
|
import emu.grasscutter.utils.JsonUtils;
|
||||||
import emu.grasscutter.utils.MessageHandler;
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
@ -160,19 +159,16 @@ public class SocketClient {
|
|||||||
sendPacket(new HttpPacket(404, "Player not found."), packet.packetID);
|
sendPacket(new HttpPacket(404, "Player not found."), packet.packetID);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// Player MessageHandler do not support concurrency
|
|
||||||
//noinspection SynchronizationOnLocalVariableOrMethodParameter
|
//noinspection SynchronizationOnLocalVariableOrMethodParameter
|
||||||
synchronized (playerData) {
|
synchronized (playerData) {
|
||||||
|
// Player MessageHandler do not support concurrency
|
||||||
|
var handler = EventListeners.getPlayerNewMessageHandler(playerData.getUid());
|
||||||
try {
|
try {
|
||||||
var resultCollector = new MessageHandler();
|
|
||||||
playerData.setMessageHandler(resultCollector);
|
|
||||||
CommandMap.getInstance().invoke(playerData, playerData, command);
|
CommandMap.getInstance().invoke(playerData, playerData, command);
|
||||||
sendPacket(new HttpPacket(200, resultCollector.getMessage()), packet.packetID);
|
sendPacket(new HttpPacket(200, handler.toString()), packet.packetID);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
OpenCommandPlugin.getInstance().getLogger().warn("[OpenCommand] Run command failed.", e);
|
OpenCommandPlugin.getInstance().getLogger().warn("[OpenCommand] Run command failed.", e);
|
||||||
sendPacket(new HttpPacket(500, "error", e.getLocalizedMessage()), packet.packetID);
|
sendPacket(new HttpPacket(500, "error", e.getLocalizedMessage()), packet.packetID);
|
||||||
} finally {
|
|
||||||
playerData.setMessageHandler(null);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user