refactor(chess): 重构象棋程序基础结构,使用Nullable重构核心代码

- 更新了多个文件的代码结构和类型定义,提高了代码的健壮性和可维护性
- 优化了事件处理、棋子管理和移动逻辑,为后续功能扩展打下坚实基础
- 修复了一些潜在的空指针异常问题,提高了程序的稳定性
- 修复部分bug
This commit is contained in:
ZZY
2024-11-22 23:51:32 +08:00
parent 9c619784af
commit 327c2df94d
19 changed files with 307 additions and 117 deletions

View File

@ -4,21 +4,26 @@ using Godot.Collections;
namespace RPPackage {
public partial class RPClientBaseEDWS : EventDrivenWebSocket {
public delegate void RPClientEventHandler(string cmd, Dictionary data);
public delegate void RPClientEventHandler(string cmd, Dictionary? data);
public delegate void RPClientErrorHandler(string errCode, string type, string cmd, string errMsg);
public event RPClientEventHandler OnRPCUser;
public event RPClientEventHandler OnRPCRegion;
public event RPClientEventHandler OnRPCSession;
public event RPClientEventHandler OnRPCMsg;
public event RPClientErrorHandler OnRPCError;
public event RPClientEventHandler? OnRPCUser;
public event RPClientEventHandler? OnRPCRegion;
public event RPClientEventHandler? OnRPCSession;
public event RPClientEventHandler? OnRPCMsg;
public event RPClientErrorHandler? OnRPCError;
public RPClientBaseEDWS() : base() {
OnText += (text) => {
// GD.Print($"response: {text}");
RPMessage msg = RPHelper.HandleIncomingMessage(text);
RPMessage? msg = RPHelper.HandleIncomingMessage(text);
if (msg == null) {
MakeRPCError("9999", "Unknown Msg", "Error", null);
return;
}
if (msg.Code != "0000") {
OnRPCError?.Invoke(msg.Code, msg.Type, msg.Cmd, msg.Data.ToString());
OnRPCError?.Invoke(msg.Code ?? "9999", msg.Type, msg.Cmd,
msg.Data?.ToString() ?? "");
return;
}
switch (msg.Type) {
@ -35,32 +40,36 @@ public partial class RPClientBaseEDWS : EventDrivenWebSocket {
OnRPCMsg?.Invoke(msg.Cmd, msg.Data);
break;
default:
OnRPCError?.Invoke(msg.Code, "unknown", msg.Cmd, msg.Data.ToString());
MakeRPCError(msg.Code, "unknown", msg.Cmd, msg.Data?.ToString());
break;
}
};
}
protected void MakeRPCError(string errCode, string type, string cmd, string errMsg) {
this.OnRPCError?.Invoke(errCode, type, cmd, errMsg ?? "null");
protected void MakeRPCError(string errCode, string type, string cmd, string? errMsg) {
OnRPCError?.Invoke(errCode, type, cmd, errMsg ?? "null");
}
}
public partial class RPClientEDWS : RPClientBaseEDWS {
string userName;
string userId;
string userToken;
string regionId;
string? userName;
string? userId;
string? userToken;
string? regionId;
public string GetUserId() { return userId; }
public string? GetUserId() { return userId; }
public delegate void SessionRecvHandle(Dictionary msg);
public event SessionRecvHandle OnPRCSessionRecv;
public delegate void SessionRecvHandle(Dictionary? msg);
public event SessionRecvHandle? OnPRCSessionRecv;
public event RPClientEventHandler OnPRCSessionExit;
public event RPClientEventHandler? OnPRCSessionExit;
public RPClientEDWS() : base() {
OnRPCUser += (cmd, msg) => {
if (msg == null) {
MakeRPCError("0000", "User", "unknown", "unknown");
return;
}
switch (cmd) {
case "init":
userId = msg["userId"].AsString();
@ -113,7 +122,7 @@ public partial class RPClientEDWS : RPClientBaseEDWS {
OnRPCMsg += (cmd, msg) => {
switch(cmd) {
case "echo":
GD.Print(msg["_"].AsString());
GD.Print(msg?["_"].AsString());
break;
default:
break;
@ -148,7 +157,7 @@ public partial class RPClientEDWS : RPClientBaseEDWS {
}
public delegate bool UserInitCallback();
private UserInitCallback _userInitCallback;
private UserInitCallback? _userInitCallback;
public bool UserInit(string userName, string fingerPrint, UserInitCallback callback) {
if (this.GetIsConnected() == false) {
return false;
@ -201,14 +210,14 @@ public partial class RPClientEDWS : RPClientBaseEDWS {
public delegate bool RegionInspectCallback(
Array<Dictionary<string, string>> _
);
private RPClientEventHandler _regionRecvCallback;
private RPClientEventHandler? _regionRecvCallback;
public bool RegionInspect(string regionId, RegionInspectCallback callback) {
if (this.GetIsConnected() == false || this.userId == null) {
return false;
}
_regionRecvCallback = null;
_regionRecvCallback += (cmd, msg) => {
if (cmd != "inspect") {
if (cmd != "inspect" || msg == null) {
return;
}
callback(msg["_"].AsGodotArray<Dictionary<string, string>>());
@ -228,17 +237,18 @@ public partial class RPClientEDWS : RPClientBaseEDWS {
public delegate bool SessionAckCreateCallback(
string sessionId,
bool res,
string reqUserId,
string reqUserName
string? reqUserId,
string? reqUserName
);
private RPClientEventHandler _sessionAckCreateCallback;
private RPClientEventHandler? _sessionAckCreateCallback;
public void RegSessionAckCreateCallback(SessionAckCreateCallback recvCallback) {
_sessionAckCreateCallback = null;
_sessionAckCreateCallback += (cmd, msg) => {
if (msg == null) return;
string sessionId = msg["sessionId"].AsString();
bool res = msg.ContainsKey("res") && msg["res"].AsBool();
string reqUserId = msg.ContainsKey("reqUserId") ? msg["reqUserId"].AsString() : null;
string reqUserName = msg.ContainsKey("reqUserName") ? msg["reqUserName"].AsString() : null;
string? reqUserId = msg.ContainsKey("reqUserId") ? msg["reqUserId"].AsString() : null;
string? reqUserName = msg.ContainsKey("reqUserName") ? msg["reqUserName"].AsString() : null;
recvCallback(sessionId, res, reqUserId, reqUserName);
};
}

View File

@ -9,12 +9,14 @@ public static class RPHelper
return message.ToDictionary();
}
public static RPMessage DeserializeRPMessage(Dictionary data)
public static RPMessage? DeserializeRPMessage(Dictionary data)
{
return new RPMessage
{
Type = data.ContainsKey("type") ? (string)data["type"] : null,
Cmd = data.ContainsKey("cmd") ? (string)data["cmd"] : null,
if (!data.ContainsKey("type") || !data.ContainsKey("cmd")) {
return null;
}
return new RPMessage {
Type = (string)data["type"],
Cmd = (string)data["cmd"],
Code = data.ContainsKey("code") ? (string)data["code"] : null,
Uid = data.ContainsKey("uid") ? (string)data["uid"] : null,
Token = data.ContainsKey("token") ? (string)data["token"] : null,
@ -28,7 +30,7 @@ public static class RPHelper
ws.SendJsonEx(RPHelper.SerializeRPMessage(message));
}
public static RPMessage HandleIncomingMessage(string jsonMessage)
public static RPMessage? HandleIncomingMessage(string jsonMessage)
{
var dataDict = Json.ParseString(jsonMessage).AsGodotDictionary();
if (dataDict != null)

View File

@ -4,20 +4,21 @@ using Godot.Collections;
namespace RPPackage {
public class RPMessage
{
public string Type { get; set; }
public string Cmd { get; set; }
public Dictionary Data { get; set; }
public string Type { get; set; } = string.Empty;
public string Cmd { get; set; } = string.Empty;
public Dictionary? Data { get; set; }
public string Uid { get; set; }
public string Token { get; set; }
public string Code { get; set; }
public string? Uid { get; set; }
public string? Token { get; set; }
public string? Code { get; set; }
public Dictionary ToDictionary()
{
var dict = new Dictionary();
if (Type != null)
dict.Add("type", Type);
if (Cmd != null)
dict.Add("cmd", Cmd);
var dict = new Dictionary {
// if (Type != null)
{ "type", Type },
// if (Cmd != null)
{ "cmd", Cmd }
};
if (Data != null)
dict.Add("data", Data);

View File

@ -2,16 +2,16 @@ using Godot;
using Godot.Collections;
public partial class EventDrivenWebSocket : WebSocketPeer {
public delegate void WebSocketEventHandler(string eventName, params object[] args);
public delegate void WebSocketEventHandler(string eventName, params object[]? args);
public delegate void WSBinMsgEventHandler(byte[] args);
public delegate void WSMsgEventHandler(string args);
public event WebSocketEventHandler OnOpen;
public event WSBinMsgEventHandler OnMessage;
public event WSMsgEventHandler OnText;
public event WSBinMsgEventHandler OnBinary;
public event WebSocketEventHandler OnClose;
public event WebSocketEventHandler OnError;
public event WebSocketEventHandler? OnOpen;
public event WSBinMsgEventHandler? OnMessage;
public event WSMsgEventHandler? OnText;
public event WSBinMsgEventHandler? OnBinary;
public event WebSocketEventHandler? OnClose;
public event WebSocketEventHandler? OnError;
private bool isConnected = false;
private bool isCloseEventFired = false;
@ -32,7 +32,7 @@ public partial class EventDrivenWebSocket : WebSocketPeer {
}
public void ConnectToUrlEx(string url, double delayTime = 3,
TlsOptions tlsClientOptions = null) {
TlsOptions? tlsClientOptions = null) {
if (connectingTime >= 0) {
return;
}