refactor(chess): 重构象棋程序基础结构,使用Nullable重构核心代码
- 更新了多个文件的代码结构和类型定义,提高了代码的健壮性和可维护性 - 优化了事件处理、棋子管理和移动逻辑,为后续功能扩展打下坚实基础 - 修复了一些潜在的空指针异常问题,提高了程序的稳定性 - 修复部分bug
This commit is contained in:
@ -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);
|
||||
};
|
||||
}
|
||||
|
@ -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)
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
Reference in New Issue
Block a user