diff --git a/Api/Factory/CharacterFactory.cs b/Api/Factory/CharacterFactory.cs index 2ffa4ef..eb3907e 100644 --- a/Api/Factory/CharacterFactory.cs +++ b/Api/Factory/CharacterFactory.cs @@ -1,7 +1,15 @@ -namespace Milimoe.FunGame.Core.Api.Factory -{ - internal class CharacterFactory - { +using Milimoe.FunGame.Core.Entity; +using Milimoe.FunGame.Core.Interface.Base; +namespace Milimoe.FunGame.Core.Api.Factory +{ + internal class CharacterFactory : IFactory + { + public Type EntityType => typeof(Character); + + public Character Create() + { + return new Character(); + } } } diff --git a/Api/Factory/InventoryFactory.cs b/Api/Factory/InventoryFactory.cs index 72fa95f..a88c1cc 100644 --- a/Api/Factory/InventoryFactory.cs +++ b/Api/Factory/InventoryFactory.cs @@ -1,7 +1,15 @@ -namespace Milimoe.FunGame.Core.Api.Factory +using Milimoe.FunGame.Core.Entity; +using Milimoe.FunGame.Core.Interface.Base; + +namespace Milimoe.FunGame.Core.Api.Factory { - internal class InventoryFactory + internal class InventoryFactory : IFactory { - + public Type EntityType => typeof(Inventory); + + public Inventory Create() + { + return new Inventory(); + } } } diff --git a/Api/Factory/ItemFactory.cs b/Api/Factory/ItemFactory.cs index 00c349d..aad04ca 100644 --- a/Api/Factory/ItemFactory.cs +++ b/Api/Factory/ItemFactory.cs @@ -1,22 +1,32 @@ -using Milimoe.FunGame.Core.Library.Constant; +using Milimoe.FunGame.Core.Entity; +using Milimoe.FunGame.Core.Interface.Base; +using Milimoe.FunGame.Core.Library.Constant; namespace Milimoe.FunGame.Core.Api.Factory { - internal class ItemFactory + internal class ItemFactory : IFactory { - internal static Milimoe.FunGame.Core.Entity.Item? GetInstance(ItemType type, int id, string name) + public Type EntityType => _EntityType; + + private Type _EntityType = typeof(Item); + + public Item Create(ItemType type = ItemType.Passive) { - Milimoe.FunGame.Core.Entity.Item? item = null; switch (type) { - case ItemType.Active: - item = new Milimoe.FunGame.Core.Entity.ActiveItem(id, name); - break; case ItemType.Passive: - item = new Milimoe.FunGame.Core.Entity.PassiveItem(id, name); - break; + _EntityType = typeof(PassiveItem); + return new PassiveItem(); + case ItemType.Active: + default: + _EntityType = typeof(ActiveItem); + return new ActiveItem(); } - return item; + } + + public Item Create() + { + return Create(ItemType.Passive); } } } diff --git a/Api/Factory/RoomFactory.cs b/Api/Factory/RoomFactory.cs index f82f35f..888cdd3 100644 --- a/Api/Factory/RoomFactory.cs +++ b/Api/Factory/RoomFactory.cs @@ -1,13 +1,21 @@ -using System.Data; -using Milimoe.FunGame.Core.Entity; +using Milimoe.FunGame.Core.Entity; +using Milimoe.FunGame.Core.Interface.Base; +using Milimoe.FunGame.Core.Library.Constant; namespace Milimoe.FunGame.Core.Api.Factory { - internal class RoomFactory + internal class RoomFactory : IFactory { - internal static Room GetInstance(DataSet? DsRoom, DataSet? DsUser, int Index = 0) + public Type EntityType => typeof(Room); + + public Room Create() { - return new Room(DsRoom, DsUser, Index); + return RoomFactory.Create(); + } + + public static Room Create(long Id = 0, string Roomid = "-1", DateTime? CreateTime = null, User? RoomMaster = null, RoomType RoomType = RoomType.None, RoomState RoomState = RoomState.Created, string Password = "") + { + return new Room(Id, Roomid, CreateTime, RoomMaster, RoomType, RoomState, Password); } } } diff --git a/Api/Factory/SkillFactory.cs b/Api/Factory/SkillFactory.cs index ad1d761..d530d06 100644 --- a/Api/Factory/SkillFactory.cs +++ b/Api/Factory/SkillFactory.cs @@ -1,19 +1,32 @@ -using System.Data; -using Milimoe.FunGame.Core.Entity; +using Milimoe.FunGame.Core.Entity; +using Milimoe.FunGame.Core.Interface.Base; using Milimoe.FunGame.Core.Library.Constant; namespace Milimoe.FunGame.Core.Api.Factory { - internal class SkillFactory + internal class SkillFactory : IFactory { - internal static Skill GetInstance(DataSet? DataSet, SkillType type = SkillType.Passive, int Index = 0) + public Type EntityType => _EntityType; + + private Type _EntityType = typeof(Skill); + + internal Skill Create(SkillType type = SkillType.Passive) { - Skill skill = type switch + switch (type) { - SkillType.Active => new ActiveSkill(DataSet, Index), - _ => new PassiveSkill(DataSet, Index) - }; - return skill; + case SkillType.Passive: + _EntityType = typeof(PassiveSkill); + return new PassiveSkill(); + case SkillType.Active: + default: + _EntityType = typeof(ActiveSkill); + return new ActiveSkill(); + } + } + + public Skill Create() + { + return Create(SkillType.Passive); } } } diff --git a/Api/Factory/UserFactory.cs b/Api/Factory/UserFactory.cs index 3017219..8520552 100644 --- a/Api/Factory/UserFactory.cs +++ b/Api/Factory/UserFactory.cs @@ -1,13 +1,15 @@ -using System.Data; using Milimoe.FunGame.Core.Entity; +using Milimoe.FunGame.Core.Interface.Base; namespace Milimoe.FunGame.Core.Api.Factory { - internal class UserFactory + internal class UserFactory : IFactory { - internal static User GetInstance(DataSet? DataSet, int Index = 0) + public Type EntityType => typeof(User); + + public User Create() { - return new User(DataSet, Index); + return new User(); } } } diff --git a/Api/Transmittal/SQLHelper.cs b/Api/Transmittal/SQLHelper.cs index 4b8e475..963c221 100644 --- a/Api/Transmittal/SQLHelper.cs +++ b/Api/Transmittal/SQLHelper.cs @@ -24,7 +24,7 @@ namespace Milimoe.FunGame.Core.Api.Transmittal /// /// 执行结果 /// 影响的行数 - public abstract int Execute(out SQLResult Result); + public abstract int Execute(); /// /// 执行一个指定的命令 @@ -32,14 +32,14 @@ namespace Milimoe.FunGame.Core.Api.Transmittal /// 命令 /// 执行结果 /// 影响的行数 - public abstract int Execute(string Script, out SQLResult Result); + public abstract int Execute(string Script); /// /// 查询DataSet /// /// 执行结果 /// 结果集 - public abstract DataSet ExecuteDataSet(out SQLResult Result); + public abstract DataSet ExecuteDataSet(); /// /// 执行指定的命令查询DataSet @@ -47,7 +47,7 @@ namespace Milimoe.FunGame.Core.Api.Transmittal /// 命令 /// 执行结果 /// 结果集 - public abstract DataSet ExecuteDataSet(string Script, out SQLResult Result); + public abstract DataSet ExecuteDataSet(string Script); /// /// 关闭连接 diff --git a/Api/Utility/Factory.cs b/Api/Utility/Factory.cs index f260253..1418bae 100644 --- a/Api/Utility/Factory.cs +++ b/Api/Utility/Factory.cs @@ -1,5 +1,4 @@ -using System.Data; -using Milimoe.FunGame.Core.Api.Factory; +using Milimoe.FunGame.Core.Api.Factory; using Milimoe.FunGame.Core.Entity; using Milimoe.FunGame.Core.Library.Constant; @@ -7,16 +6,73 @@ namespace Milimoe.FunGame.Core.Api.Utility { public class Factory { + private readonly static CharacterFactory CharacterFactory = new(); + private readonly static InventoryFactory InventoryFactory = new(); + private readonly static ItemFactory ItemFactory = new(); + private readonly static RoomFactory RoomFactory = new(); + private readonly static SkillFactory SkillFactory = new(); + private readonly static UserFactory UserFactory = new(); + /// - /// 获取Room实例 + /// 获取角色实例 /// - /// Room - /// User(RoomMaster) - /// 取指定行 /// - public static Room GetRoom(DataSet? DsRoom, DataSet? DsUser, int Index = 0) + public static Character GetCharacter() { - return RoomFactory.GetInstance(DsRoom, DsUser, Index); + return CharacterFactory.Create(); + } + + /// + /// 获取库存实例 + /// + /// + public static Inventory GetInventory() + { + return InventoryFactory.Create(); + } + + /// + /// 获取物品实例,默认返回Passiveitem 被动物品 需要强制转换 + /// + /// Item类型 主动 或 被动 + /// + public static Item GetItem(ItemType type = ItemType.Passive) + { + return ItemFactory.Create(type); + } + + /// + /// 获取主动物品实例 + /// + /// + public static ActiveItem GetActiveItem() + { + return (ActiveItem)ItemFactory.Create(ItemType.Active); + } + + /// + /// 获取被动物品实例 + /// + /// + public static PassiveItem GetPassiveItem() + { + return (PassiveItem)ItemFactory.Create(ItemType.Passive); + } + + /// + /// 获取房间实例 + /// + /// 房间内部序列号 + /// 房间号 + /// 创建时间 + /// 房主 + /// 房间类型 + /// 房间状态 + /// 房间密码 + /// + public static Room GetRoom(long Id = 0, string Roomid = "-1", DateTime? CreateTime = null, User? RoomMaster = null, RoomType RoomType = RoomType.None, RoomState RoomState = RoomState.Created, string Password = "") + { + return RoomFactory.Create(Id, Roomid, CreateTime, RoomMaster, RoomType, RoomState, Password); } /// @@ -25,129 +81,44 @@ namespace Milimoe.FunGame.Core.Api.Utility /// internal static Room GetHall() { - return GetRoom(null, null); + return RoomFactory.Create(); } /// - /// 获取Skill实例,默认返回PassiveSkill + /// 获取技能实例,默认返回PassiveSkill 被动技能 需要强制转换 /// - /// SkillRow - /// Skill类型 - /// 取指定行 + /// Skill类型 主动 或 被动 /// - public static Skill GetSkill(DataSet? DataSet, SkillType SkillType = SkillType.Passive, int Index = 0) + public static Skill GetSkill(SkillType type = SkillType.Passive) { - return SkillFactory.GetInstance(DataSet, SkillType, Index); + return SkillFactory.Create(type); } - + /// - /// 获取User实例 - /// awaa - /// UserRow - /// 取指定行 + /// 获取主动技能实例 + /// /// - public static User GetUser(DataSet? DataSet, int Index = 0) + public static ActiveSkill GetActiveSkill() { - return UserFactory.GetInstance(DataSet, Index); + return (ActiveSkill)SkillFactory.Create(SkillType.Active); + } + + /// + /// 获取被动技能实例 + /// + /// + public static PassiveSkill GetPassiveSkill() + { + return (PassiveSkill)SkillFactory.Create(SkillType.Passive); } /// - /// 获取一个不为NULL的实例 - /// Item默认返回PassiveItem - /// Skill默认返回PassiveSkill - /// 若无法找到T,返回唯一的空对象 + /// 获取用户实例 /// - /// Entity类 - /// 使用DataSets构造对象 - /// T - public static T GetInstance(params DataSet?[] DataSets) + /// + public static User GetUser() { - if (DataSets is null || DataSets.Length == 0) throw new GetInstanceException(); - object instance = General.EntityInstance; - if (typeof(T) == typeof(User)) - { - instance = GetUser(DataSets[0]); - } - else if (typeof(T) == typeof(Skill) || typeof(T) == typeof(PassiveSkill)) - { - instance = GetSkill(DataSets[0]); - } - else if (typeof(T) == typeof(ActiveSkill)) - { - instance = GetSkill(DataSets[0], SkillType.Active); - } - else if (typeof(T) == typeof(Room)) - { - instance = GetRoom(DataSets[0], DataSets[1]); - } - return (T)instance; - } - - /// - /// 获取T的数组 - /// Item默认返回PassiveItem数组 - /// Skill默认返回PassiveSkill数组 - /// 若无法找到T,返回空数组 - /// - /// Entity类 - /// 使用DataSet构造对象数组 - /// List T - public static List GetList(params DataSet?[] DataSets) - { - List list = new(); - if (DataSets is null || DataSets.Length == 0) throw new GetInstanceException(); - if (typeof(T) == typeof(User)) - { - DataSet? ds = DataSets[0]; - if (ds != null && ds.Tables[0].Rows.Count > 0) - { - for (int i = 0; i < ds.Tables[0].Rows.Count; i++) - { - object entity = GetUser(ds, i); - list.Add((T)entity); - } - } - } - else if (typeof(T) == typeof(Skill) || typeof(T) == typeof(PassiveSkill)) - { - DataSet? ds = DataSets[0]; - if (ds != null && ds.Tables[0].Rows.Count > 0) - { - for (int i = 0; i < ds.Tables[0].Rows.Count; i++) - { - object entity = GetSkill(ds, SkillType.Passive, i); - list.Add((T)entity); - } - } - } - else if (typeof(T) == typeof(ActiveSkill)) - { - DataSet? ds = DataSets[0]; - if (ds != null && ds.Tables[0].Rows.Count > 0) - { - for (int i = 0; i < ds.Tables[0].Rows.Count; i++) - { - object entity = GetSkill(ds, SkillType.Active, i); - list.Add((T)entity); - } - } - } - else if (typeof(T) == typeof(Room)) - { - DataSet? DsRoom = DataSets[0]; - DataSet? DsUser = DataSets[1]; - object entity = General.HallInstance; - list.Add((T)entity); - if (DsRoom != null && DsRoom.Tables[0].Rows.Count > 0) - { - for (int i = 0; i < DsRoom.Tables[0].Rows.Count; i++) - { - entity = GetRoom(DsRoom, DsUser, i); - list.Add((T)entity); - } - } - } - return list; + return UserFactory.Create(); } } } diff --git a/Entity/Character/Character.cs b/Entity/Character/Character.cs index 561d6cc..e535a87 100644 --- a/Entity/Character/Character.cs +++ b/Entity/Character/Character.cs @@ -50,7 +50,12 @@ namespace Milimoe.FunGame.Core.Entity public decimal CritRate { get; set; } = 0.05M; // 暴击率 public decimal CritDMG { get; set; } = 1.25M; // 暴击伤害 public decimal EvadeRate { get; set; } = 0.05M; // 闪避率 - public Hashtable? Skills { get; set; } = new Hashtable(); - public Hashtable? Items { get; set; } = new Hashtable(); + public Hashtable Skills { get; set; } = new(); + public Hashtable Items { get; set; } = new(); + + public Character() + { + + } } } diff --git a/Entity/Skill/ActiveSkill.cs b/Entity/Skill/ActiveSkill.cs index 83ff263..ddc1ca6 100644 --- a/Entity/Skill/ActiveSkill.cs +++ b/Entity/Skill/ActiveSkill.cs @@ -1,6 +1,4 @@ -using System.Data; - -namespace Milimoe.FunGame.Core.Entity +namespace Milimoe.FunGame.Core.Entity { public class ActiveSkill : Skill { @@ -17,7 +15,7 @@ namespace Milimoe.FunGame.Core.Entity public decimal Reference9 { get; set; } = 0; public decimal Reference10 { get; set; } = 0; - internal ActiveSkill(DataSet? DataSet, int Index = 0) + internal ActiveSkill() { Active = true; } diff --git a/Entity/Skill/PassiveSkill.cs b/Entity/Skill/PassiveSkill.cs index b6a1d79..cfabe0f 100644 --- a/Entity/Skill/PassiveSkill.cs +++ b/Entity/Skill/PassiveSkill.cs @@ -1,6 +1,4 @@ -using System.Data; - -namespace Milimoe.FunGame.Core.Entity +namespace Milimoe.FunGame.Core.Entity { public class PassiveSkill : Skill { @@ -15,7 +13,7 @@ namespace Milimoe.FunGame.Core.Entity public decimal Reference9 { get; set; } = 0; public decimal Reference10 { get; set; } = 0; - internal PassiveSkill(DataSet? DataSet, int Index = 0) + internal PassiveSkill() { Active = false; } diff --git a/Entity/System/Room.cs b/Entity/System/Room.cs index 05d8789..83b3388 100644 --- a/Entity/System/Room.cs +++ b/Entity/System/Room.cs @@ -1,7 +1,5 @@ -using System.Data; -using Milimoe.FunGame.Core.Interface.Entity; +using Milimoe.FunGame.Core.Interface.Entity; using Milimoe.FunGame.Core.Library.Constant; -using Milimoe.FunGame.Core.Library.SQLScript.Entity; namespace Milimoe.FunGame.Core.Entity { @@ -18,29 +16,15 @@ namespace Milimoe.FunGame.Core.Entity public string Password { get; set; } = ""; public GameStatistics? Statistics { get; set; } = null; - internal Room(DataSet? DsRoom, DataSet? DsUser, int Index = 0) + internal Room(long Id = 0, string Roomid = "-1", DateTime? CreateTime = null, User? RoomMaster = null, RoomType RoomType = RoomType.None, RoomState RoomState = RoomState.Created, string Password = "") { - if (DsRoom != null && DsRoom.Tables[0].Rows.Count > 0) - { - DataRow DrRoom = DsRoom.Tables[0].Rows[Index]; - Id = (long)DrRoom[RoomQuery.Column_ID]; - Roomid = (string)DrRoom[RoomQuery.Column_RoomID]; - CreateTime = (DateTime)DrRoom[RoomQuery.Column_CreateTime]; - RoomMaster = Api.Utility.Factory.GetUser(DsUser, GetUserRowIndex(DsUser, (long)DrRoom[RoomQuery.Column_RoomMaster])); - RoomType = (RoomType)Convert.ToInt32(DrRoom[RoomQuery.Column_RoomType]); - RoomState = (RoomState)Convert.ToInt32(DrRoom[RoomQuery.Column_RoomState]); - Password = (string)DrRoom[RoomQuery.Column_Password]; - } - else - { - Id = 0; - Roomid = "-1"; - CreateTime = DateTime.MinValue; - RoomMaster = null; - RoomType = RoomType.None; - RoomState = RoomState.Created; - Password = ""; - } + this.Id = Id; + this.Roomid = Roomid; + if (CreateTime != null) this.CreateTime = (DateTime)CreateTime; + if (RoomMaster != null) this.RoomMaster = RoomMaster; + this.RoomType = RoomType; + this.RoomState = RoomState; + this.Password = Password; } public bool Equals(Room other) @@ -52,20 +36,5 @@ namespace Milimoe.FunGame.Core.Entity { return other?.Id == Id; } - - private static int GetUserRowIndex(DataSet? DsUser, long UID) - { - if (DsUser != null) - { - for (int i = 0; i < DsUser.Tables[0].Rows.Count; i++) - { - if (DsUser.Tables[0].Rows[i][UserQuery.Column_UID].Equals(UID)) - { - return i; - } - } - } - return 0; - } } } diff --git a/Entity/User/User.cs b/Entity/User/User.cs index 0497a54..6a845c1 100644 --- a/Entity/User/User.cs +++ b/Entity/User/User.cs @@ -21,7 +21,7 @@ namespace Milimoe.FunGame.Core.Entity public decimal GameTime { get; set; } = 0; public string AutoKey { get; set; } = ""; public UserStatistics? Statistics { get; set; } = null; - public Inventory? Stock { get; set; } = null; + public Inventory? Inventory { get; set; } = null; internal User() { diff --git a/Interface/Base/IFactory.cs b/Interface/Base/IFactory.cs new file mode 100644 index 0000000..8c24beb --- /dev/null +++ b/Interface/Base/IFactory.cs @@ -0,0 +1,8 @@ +namespace Milimoe.FunGame.Core.Interface.Base +{ + public interface IFactory + { + public Type EntityType { get; } + public T Create(); + } +} diff --git a/Interface/Base/ISQLHelper.cs b/Interface/Base/ISQLHelper.cs index 7f2dbd6..1703d1b 100644 --- a/Interface/Base/ISQLHelper.cs +++ b/Interface/Base/ISQLHelper.cs @@ -10,12 +10,13 @@ namespace Milimoe.FunGame.Core.Interface.Base public string Script { get; set; } public CommandType CommandType { get; set; } public SQLResult Result { get; } + public bool Success { get; } public SQLServerInfo ServerInfo { get; } public int UpdateRows { get; } public DataSet DataSet { get; } - public int Execute(out SQLResult Result); - public DataSet ExecuteDataSet(out SQLResult Result); + public int Execute(); + public DataSet ExecuteDataSet(); public void Close(); } } diff --git a/Library/Common/JsonConverter/ConverterUtility.cs b/Library/Common/JsonConverter/ConverterUtility.cs new file mode 100644 index 0000000..2808f0f --- /dev/null +++ b/Library/Common/JsonConverter/ConverterUtility.cs @@ -0,0 +1,154 @@ +using System.Data; +using System.Text.Json; +using Milimoe.FunGame.Core.Library.Constant; + +namespace Milimoe.FunGame.Core.Library.Common.JsonConverter +{ + internal class ConverterUtility + { + internal static void ReadColumns(Utf8JsonReader reader, DataTable dataTable) + { + while (reader.Read()) + { + if (reader.TokenType == JsonTokenType.EndArray) + { + break; + } + + if (reader.TokenType == JsonTokenType.StartObject) + { + DataColumn column = new(); + + while (reader.Read()) + { + if (reader.TokenType == JsonTokenType.PropertyName) + { + string propertyName = reader.GetString() ?? ""; + + switch (propertyName) + { + case "ColumnName": + reader.Read(); + column.ColumnName = reader.GetString(); + break; + + case "DataType": + reader.Read(); + Type dataType = Type.GetType(reader.GetString() ?? "") ?? typeof(object); + column.DataType = dataType; + break; + } + } + + if (reader.TokenType == JsonTokenType.EndObject) + { + break; + } + } + + dataTable.Columns.Add(column); + } + } + } + + internal static void ReadRows(Utf8JsonReader reader, DataTable dataTable) + { + object[] values = new object[dataTable.Columns.Count]; + + while (reader.Read()) + { + if (reader.TokenType == JsonTokenType.EndArray) + { + break; + } + + if (reader.TokenType == JsonTokenType.StartArray) + { + int index = 0; + + while (reader.Read()) + { + if (reader.TokenType == JsonTokenType.EndArray) + { + break; + } + + switch (dataTable.Columns[index].DataType.ToString()) + { + case "System.Boolean": + values[index] = reader.GetBoolean(); + break; + + case "System.Byte": + values[index] = reader.GetByte(); + break; + + case "System.Char": + values[index] = (reader.GetString() ?? "")[0]; + break; + + case "System.DateTime": + string dateString = reader.GetString() ?? ""; + if (DateTime.TryParseExact(dateString, General.GeneralDateTimeFormat, null, System.Globalization.DateTimeStyles.None, out DateTime result)) + { + values[index] = result; + } + else values[index] = DateTime.MinValue; + break; + + case "System.Decimal": + values[index] = reader.GetDecimal(); + break; + + case "System.Double": + values[index] = reader.GetDouble(); + break; + + case "System.Guid": + values[index] = Guid.Parse(reader.GetString() ?? Guid.Empty.ToString()); + break; + + case "System.Int16": + values[index] = reader.GetInt16(); + break; + + case "System.Int32": + values[index] = reader.GetInt32(); + break; + + case "System.Int64": + values[index] = reader.GetInt64(); + break; + + case "System.SByte": + values[index] = reader.GetSByte(); + break; + + case "System.Single": + values[index] = reader.GetSingle(); + break; + + case "System.String": + values[index] = reader.GetString() ?? ""; + break; + + case "System.UInt16": + values[index] = reader.GetUInt16(); + break; + + case "System.UInt32": + values[index] = reader.GetUInt32(); + break; + + case "System.UInt64": + values[index] = reader.GetUInt64(); + break; + } + index++; + } + dataTable.Rows.Add(values); + } + } + } + } +} diff --git a/Library/Common/JsonConverter/DataSetConverter.cs b/Library/Common/JsonConverter/DataSetConverter.cs index 8dd94e2..d422643 100644 --- a/Library/Common/JsonConverter/DataSetConverter.cs +++ b/Library/Common/JsonConverter/DataSetConverter.cs @@ -2,7 +2,6 @@ using System.Text.Json; using System.Text.Json.Serialization; using Milimoe.FunGame.Core.Library.Constant; -using Milimoe.FunGame.Core.Service; namespace Milimoe.FunGame.Core.Library.Common.JsonConverter { @@ -30,17 +29,19 @@ namespace Milimoe.FunGame.Core.Library.Common.JsonConverter case "Columns": reader.Read(); - ReadColumns(reader, dt); + ConverterUtility.ReadColumns(reader, dt); break; case "Rows": reader.Read(); - ReadRows(reader, dt); + ConverterUtility.ReadRows(reader, dt); break; } } } + if (ds.Tables.Count == 0) ds.Tables.Add(new DataTable()); + return ds; } @@ -48,257 +49,126 @@ namespace Milimoe.FunGame.Core.Library.Common.JsonConverter { writer.WriteStartObject(); - if (value.Tables.Count == 0) value.Tables.Add(new DataTable()); - - writer.WriteString("TableName", value.Tables[0].TableName); - - writer.WritePropertyName("Columns"); + writer.WritePropertyName("Tables"); writer.WriteStartArray(); - foreach (DataColumn column in value.Tables[0].Columns) + if (value.Tables.Count > 0) writer.WriteStartObject(); + + for (int count = 0; count < value.Tables.Count; count++) { - writer.WriteStartObject(); + writer.WriteString("TableName", value.Tables[count].TableName); - writer.WriteString("ColumnName", column.ColumnName); - writer.WriteString("DataType", column.DataType.FullName); - - writer.WriteEndObject(); - } - - writer.WriteEndArray(); - - writer.WritePropertyName("Rows"); - writer.WriteStartArray(); - - foreach (DataRow row in value.Tables[0].Rows) - { + writer.WritePropertyName("Columns"); writer.WriteStartArray(); - for (int i = 0; i < value.Tables[0].Columns.Count; i++) + foreach (DataColumn column in value.Tables[count].Columns) { - object? rowValue = row[i]; + writer.WriteStartObject(); - switch (value.Tables[0].Columns[i].DataType.FullName) - { - case "System.Boolean": - writer.WriteBooleanValue((bool)rowValue); - break; + writer.WriteString("ColumnName", column.ColumnName); + writer.WriteString("DataType", column.DataType.FullName); - case "System.Byte": - writer.WriteNumberValue((byte)rowValue); - break; - - case "System.Char": - writer.WriteStringValue(value.ToString()); - break; - - case "System.DateTime": - writer.WriteStringValue(((DateTime)rowValue).ToString(General.GeneralDateTimeFormat)); - break; - - case "System.Decimal": - writer.WriteNumberValue((decimal)rowValue); - break; - - case "System.Double": - writer.WriteNumberValue((double)rowValue); - break; - - case "System.Guid": - writer.WriteStringValue(value.ToString()); - break; - - case "System.Int16": - writer.WriteNumberValue((short)rowValue); - break; - - case "System.Int32": - writer.WriteNumberValue((int)rowValue); - break; - - case "System.Int64": - writer.WriteNumberValue((long)rowValue); - break; - - case "System.SByte": - writer.WriteNumberValue((sbyte)rowValue); - break; - - case "System.Single": - writer.WriteNumberValue((float)rowValue); - break; - - case "System.String": - writer.WriteStringValue((string)rowValue); - break; - - case "System.UInt16": - writer.WriteNumberValue((ushort)rowValue); - break; - - case "System.UInt32": - writer.WriteNumberValue((uint)rowValue); - break; - - case "System.UInt64": - writer.WriteNumberValue((ulong)rowValue); - break; - } + writer.WriteEndObject(); } writer.WriteEndArray(); + + writer.WritePropertyName("Rows"); + writer.WriteStartArray(); + + + foreach (DataRow row in value.Tables[count].Rows) + { + writer.WriteStartArray(); + + for (int i = 0; i < value.Tables[count].Columns.Count; i++) + { + var rowValue = row[i]; + + switch (value.Tables[count].Columns[i].DataType.FullName) + { + case "System.Boolean": + writer.WriteBooleanValue((bool)rowValue); + break; + + case "System.Byte": + writer.WriteNumberValue((byte)rowValue); + break; + + case "System.Char": + writer.WriteStringValue(value.ToString()); + break; + + case "System.DateTime": + writer.WriteStringValue(((DateTime)rowValue).ToString(General.GeneralDateTimeFormat)); + break; + + case "System.Decimal": + writer.WriteNumberValue((decimal)rowValue); + break; + + case "System.Double": + writer.WriteNumberValue((double)rowValue); + break; + + case "System.Guid": + writer.WriteStringValue(value.ToString()); + break; + + case "System.Int16": + writer.WriteNumberValue((short)rowValue); + break; + + case "System.Int32": + writer.WriteNumberValue((int)rowValue); + break; + + case "System.Int64": + writer.WriteNumberValue((long)rowValue); + break; + + case "System.SByte": + writer.WriteNumberValue((sbyte)rowValue); + break; + + case "System.Single": + writer.WriteNumberValue((float)rowValue); + break; + + case "System.String": + writer.WriteStringValue((string)rowValue); + break; + + case "System.UInt16": + writer.WriteNumberValue((ushort)rowValue); + break; + + case "System.UInt32": + writer.WriteNumberValue((uint)rowValue); + break; + + case "System.UInt64": + writer.WriteNumberValue((ulong)rowValue); + break; + } + } + + writer.WriteEndArray(); + } + + writer.WriteEndArray(); + + if (count + 1 < value.Tables.Count) + { + writer.WriteEndObject(); + writer.WriteStartObject(); + } + else writer.WriteEndObject(); } writer.WriteEndArray(); writer.WriteEndObject(); } - - #pragma warning disable CA1822 // 不需要设为静态 - private void ReadColumns(Utf8JsonReader reader, DataTable dataTable) - #pragma warning restore CA1822 // 不需要设为静态 - { - while (reader.Read()) - { - if (reader.TokenType == JsonTokenType.EndArray) - { - break; - } - - if (reader.TokenType == JsonTokenType.StartObject) - { - DataColumn column = new(); - - while (reader.Read()) - { - if (reader.TokenType == JsonTokenType.PropertyName) - { - string propertyName = reader.GetString() ?? ""; - - switch (propertyName) - { - case "ColumnName": - reader.Read(); - column.ColumnName = reader.GetString(); - break; - - case "DataType": - reader.Read(); - Type dataType = Type.GetType(reader.GetString() ?? "") ?? typeof(object); - column.DataType = dataType; - break; - } - } - - if (reader.TokenType == JsonTokenType.EndObject) - { - break; - } - } - - dataTable.Columns.Add(column); - } - } - } - - private void ReadRows(Utf8JsonReader reader, DataTable dataTable) - { - object[] values = new object[dataTable.Columns.Count]; - - while (reader.Read()) - { - if (reader.TokenType == JsonTokenType.EndArray) - { - break; - } - - if (reader.TokenType == JsonTokenType.StartArray) - { - int index = 0; - - while (reader.Read()) - { - if (reader.TokenType == JsonTokenType.EndArray) - { - break; - } - - switch (dataTable.Columns[index].DataType.ToString()) - { - case "System.Boolean": - values[index] = reader.GetBoolean(); - break; - - case "System.Byte": - values[index] = reader.GetByte(); - break; - - case "System.Char": - values[index] = (reader.GetString() ?? "")[0]; - break; - - case "System.DateTime": - string dateString = reader.GetString() ?? ""; - if (DateTime.TryParseExact(dateString, General.GeneralDateTimeFormat, null, System.Globalization.DateTimeStyles.None, out DateTime result)) - { - values[index] = result; - } - values[index] = DateTime.MinValue; - break; - - case "System.Decimal": - values[index] = reader.GetDecimal(); - break; - - case "System.Double": - values[index] = reader.GetDouble(); - break; - - case "System.Guid": - values[index] = Guid.Parse(reader.GetString() ?? Guid.Empty.ToString()); - break; - - case "System.Int16": - values[index] = reader.GetInt16(); - break; - - case "System.Int32": - values[index] = reader.GetInt32(); - break; - - case "System.Int64": - values[index] = reader.GetInt64(); - break; - - case "System.SByte": - values[index] = reader.GetSByte(); - break; - - case "System.Single": - values[index] = reader.GetSingle(); - break; - - case "System.String": - values[index] = reader.GetString() ?? ""; - break; - - case "System.UInt16": - values[index] = reader.GetUInt16(); - break; - - case "System.UInt32": - values[index] = reader.GetUInt32(); - break; - - case "System.UInt64": - values[index] = reader.GetUInt64(); - break; - } - index++; - } - dataTable.Rows.Add(values); - } - } - } } } diff --git a/Library/Common/JsonConverter/DataTableConverter.cs b/Library/Common/JsonConverter/DataTableConverter.cs new file mode 100644 index 0000000..c3c1aed --- /dev/null +++ b/Library/Common/JsonConverter/DataTableConverter.cs @@ -0,0 +1,152 @@ +using System.Data; +using System.Text.Json; +using System.Text.Json.Serialization; +using Milimoe.FunGame.Core.Library.Constant; + +namespace Milimoe.FunGame.Core.Library.Common.JsonConverter +{ + public class DataTableConverter : JsonConverter + { + public override DataTable Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + DataTable dt = new(); + + while (reader.Read()) + { + if (reader.TokenType == JsonTokenType.PropertyName) + { + string property = reader.GetString() ?? ""; + + switch (property) + { + case "TableName": + reader.Read(); + string tableName = reader.GetString() ?? ""; + dt = new DataTable(tableName); + break; + + case "Columns": + reader.Read(); + ConverterUtility.ReadColumns(reader, dt); + break; + + case "Rows": + reader.Read(); + ConverterUtility.ReadRows(reader, dt); + break; + } + } + } + + return dt; + } + + public override void Write(Utf8JsonWriter writer, DataTable value, JsonSerializerOptions options) + { + writer.WriteStartObject(); + + writer.WriteString("TableName", value.TableName); + + writer.WritePropertyName("Columns"); + writer.WriteStartArray(); + + foreach (DataColumn column in value.Columns) + { + writer.WriteStartObject(); + + writer.WriteString("ColumnName", column.ColumnName); + writer.WriteString("DataType", column.DataType.FullName); + + writer.WriteEndObject(); + } + + writer.WriteEndArray(); + + writer.WritePropertyName("Rows"); + writer.WriteStartArray(); + + foreach (DataRow row in value.Rows) + { + writer.WriteStartArray(); + + for (int i = 0; i < value.Columns.Count; i++) + { + var rowValue = row[i]; + + switch (value.Columns[i].DataType.FullName) + { + case "System.Boolean": + writer.WriteBooleanValue((bool)rowValue); + break; + + case "System.Byte": + writer.WriteNumberValue((byte)rowValue); + break; + + case "System.Char": + writer.WriteStringValue(value.ToString()); + break; + + case "System.DateTime": + writer.WriteStringValue(((DateTime)rowValue).ToString(General.GeneralDateTimeFormat)); + break; + + case "System.Decimal": + writer.WriteNumberValue((decimal)rowValue); + break; + + case "System.Double": + writer.WriteNumberValue((double)rowValue); + break; + + case "System.Guid": + writer.WriteStringValue(value.ToString()); + break; + + case "System.Int16": + writer.WriteNumberValue((short)rowValue); + break; + + case "System.Int32": + writer.WriteNumberValue((int)rowValue); + break; + + case "System.Int64": + writer.WriteNumberValue((long)rowValue); + break; + + case "System.SByte": + writer.WriteNumberValue((sbyte)rowValue); + break; + + case "System.Single": + writer.WriteNumberValue((float)rowValue); + break; + + case "System.String": + writer.WriteStringValue((string)rowValue); + break; + + case "System.UInt16": + writer.WriteNumberValue((ushort)rowValue); + break; + + case "System.UInt32": + writer.WriteNumberValue((uint)rowValue); + break; + + case "System.UInt64": + writer.WriteNumberValue((ulong)rowValue); + break; + } + } + + writer.WriteEndArray(); + } + + writer.WriteEndArray(); + + writer.WriteEndObject(); + } + } +} \ No newline at end of file diff --git a/Library/Common/JsonConverter/RoomConverter.cs b/Library/Common/JsonConverter/RoomConverter.cs new file mode 100644 index 0000000..4de6fcc --- /dev/null +++ b/Library/Common/JsonConverter/RoomConverter.cs @@ -0,0 +1,84 @@ +using System.Text.Json; +using System.Text.Json.Serialization; +using Milimoe.FunGame.Core.Api.Utility; +using Milimoe.FunGame.Core.Entity; +using Milimoe.FunGame.Core.Library.Constant; +using Milimoe.FunGame.Core.Library.SQLScript.Entity; + +namespace Milimoe.FunGame.Core.Library.Common.JsonConverter +{ + public class RoomConverter : JsonConverter + { + public override Room Read(ref Utf8JsonReader reader, Type type, JsonSerializerOptions options) + { + Room room = Factory.GetRoom(); + + while (reader.Read()) + { + if (reader.TokenType == JsonTokenType.PropertyName) + { + string property = reader.GetString() ?? ""; + + switch (property) + { + case RoomQuery.Column_ID: + reader.Read(); + room.Id = reader.GetInt64(); + break; + + case RoomQuery.Column_RoomID: + reader.Read(); + room.Roomid = reader.GetString() ?? ""; + break; + + case RoomQuery.Column_CreateTime: + reader.Read(); + string dateString = reader.GetString() ?? ""; + if (DateTime.TryParseExact(dateString, General.GeneralDateTimeFormat, null, System.Globalization.DateTimeStyles.None, out DateTime result)) + { + room.CreateTime = result; + } + else room.CreateTime = DateTime.MinValue; + break; + + case RoomQuery.Column_RoomMaster: + reader.Read(); + string master = reader.GetString() ?? ""; + room.RoomMaster = JsonSerializer.Deserialize(master, options); + break; + + case RoomQuery.Column_RoomType: + reader.Read(); + room.RoomType = (RoomType)reader.GetInt64(); + break; + + case RoomQuery.Column_RoomState: + reader.Read(); + room.RoomState = (RoomState)reader.GetInt64(); + break; + + case RoomQuery.Column_Password: + reader.Read(); + room.Password = reader.GetString() ?? ""; + break; + } + } + } + + return room; + } + + public override void Write(Utf8JsonWriter writer, Room value, JsonSerializerOptions options) + { + writer.WriteStartObject(); + writer.WriteNumber(RoomQuery.Column_ID, value.Id); + writer.WriteString(RoomQuery.Column_RoomID, value.Roomid); + writer.WriteString(RoomQuery.Column_CreateTime, value.CreateTime.ToString(General.GeneralDateTimeFormat)); + writer.WriteString(RoomQuery.Column_RoomMaster, JsonSerializer.Serialize(value.RoomMaster, typeof(User), options)); + writer.WriteNumber(RoomQuery.Column_RoomType, (long)value.RoomType); + writer.WriteNumber(RoomQuery.Column_RoomState, (long)value.RoomState); + writer.WriteString(RoomQuery.Column_Password, value.Password); + writer.WriteEndObject(); + } + } +} diff --git a/Library/Common/JsonConverter/UserConverter.cs b/Library/Common/JsonConverter/UserConverter.cs new file mode 100644 index 0000000..3da8f6b --- /dev/null +++ b/Library/Common/JsonConverter/UserConverter.cs @@ -0,0 +1,107 @@ +using System.Text.Json; +using System.Text.Json.Serialization; +using Milimoe.FunGame.Core.Api.Utility; +using Milimoe.FunGame.Core.Entity; +using Milimoe.FunGame.Core.Library.Constant; +using Milimoe.FunGame.Core.Library.SQLScript.Entity; + +namespace Milimoe.FunGame.Core.Library.Common.JsonConverter +{ + public class UserConverter : JsonConverter + { + public override bool CanConvert(Type objectType) + { + return objectType == typeof(User); + } + + public override User Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + User user = Factory.GetUser(); + + while (reader.Read()) + { + if (reader.TokenType == JsonTokenType.PropertyName) + { + string propertyName = reader.GetString() ?? ""; + switch (propertyName) + { + case "Id": + user.Id = reader.GetInt64(); + break; + case "Username": + user.Username = reader.GetString() ?? ""; + break; + case "Password": + user.Password = reader.GetString() ?? ""; + break; + case "RegTime": + string regTime = reader.GetString() ?? ""; + if (DateTime.TryParseExact(regTime, General.GeneralDateTimeFormat, null, System.Globalization.DateTimeStyles.None, out DateTime RegTime)) + { + user.RegTime = RegTime; + } + else user.RegTime = DateTime.MinValue; + break; + case "LastTime": + string lastTime = reader.GetString() ?? ""; + if (DateTime.TryParseExact(lastTime, General.GeneralDateTimeFormat, null, System.Globalization.DateTimeStyles.None, out DateTime LastTime)) + { + user.LastTime = LastTime; + } + else user.LastTime = DateTime.MinValue; + break; + case "Email": + user.Email = reader.GetString() ?? ""; + break; + case "NickName": + user.NickName = reader.GetString() ?? ""; + break; + case "IsAdmin": + user.IsAdmin = reader.GetBoolean(); + break; + case "IsOperator": + user.IsOperator = reader.GetBoolean(); + break; + case "IsEnable": + user.IsEnable = reader.GetBoolean(); + break; + case "Credits": + user.Credits = reader.GetDecimal(); + break; + case "Materials": + user.Materials = reader.GetDecimal(); + break; + case "GameTime": + user.GameTime = reader.GetDecimal(); + break; + case "AutoKey": + user.AutoKey = reader.GetString() ?? ""; + break; + } + } + } + + return user; + } + + public override void Write(Utf8JsonWriter writer, User value, JsonSerializerOptions options) + { + writer.WriteStartObject(); + writer.WriteNumber(UserQuery.Column_UID, value.Id); + writer.WriteString(UserQuery.Column_Username, value.Username); + writer.WriteString(UserQuery.Column_Password, value.Password); + writer.WriteString(UserQuery.Column_RegTime, value.RegTime.ToString(General.GeneralDateTimeFormat)); + writer.WriteString(UserQuery.Column_LastTime, value.LastTime.ToString(General.GeneralDateTimeFormat)); + writer.WriteString(UserQuery.Column_Email, value.Email); + writer.WriteString(UserQuery.Column_Nickname, value.NickName); + writer.WriteBoolean(UserQuery.Column_IsAdmin, value.IsAdmin); + writer.WriteBoolean(UserQuery.Column_IsOperator, value.IsOperator); + writer.WriteBoolean(UserQuery.Column_IsEnable, value.IsEnable); + writer.WriteNumber(UserQuery.Column_Credits, value.Credits); + writer.WriteNumber(UserQuery.Column_Materials, value.Materials); + writer.WriteNumber(UserQuery.Column_GameTime, value.GameTime); + writer.WriteString(UserQuery.Column_AutoKey, value.AutoKey); + writer.WriteEndObject(); + } + } +} diff --git a/Library/Constant/General.cs b/Library/Constant/General.cs index d4d4794..5fd5136 100644 --- a/Library/Constant/General.cs +++ b/Library/Constant/General.cs @@ -8,9 +8,10 @@ namespace Milimoe.FunGame.Core.Library.Constant // Static Variable public static Empty EntityInstance { get; } = new(); public static User UnknownUserInstance { get; } = new(); - public static Room HallInstance => Api.Utility.Factory.GetHall(); + public static Room HallInstance { get; } = Api.Utility.Factory.GetHall(); public static Encoding DefaultEncoding => Encoding.Unicode; public static string GeneralDateTimeFormat => "yyyy-MM-dd HH:mm:ss.fff"; + public static DateTime DefaultTime { get; } = new(1970,1,1,8,0,0); // Const public const int MaxRetryTimes = 20; diff --git a/Service/JsonManager.cs b/Service/JsonManager.cs index 225b9e7..35b1679 100644 --- a/Service/JsonManager.cs +++ b/Service/JsonManager.cs @@ -7,30 +7,15 @@ namespace Milimoe.FunGame.Core.Service { internal class JsonManager { - private static bool _IsFirst = true; - private readonly static JsonSerializerOptions _GeneralOptions = new() + /// + /// 默认的序列化选项 + /// + private readonly static JsonSerializerOptions GeneralOptions = new() { WriteIndented = true, - ReferenceHandler = ReferenceHandler.IgnoreCycles + ReferenceHandler = ReferenceHandler.IgnoreCycles, + Converters = { new DateTimeConverter(), new DataTableConverter(), new DataSetConverter() } }; - - /// - /// 默认的JsonSerializerOptions - /// - internal static JsonSerializerOptions GeneralOptions - { - get - { - if (_IsFirst) - { - // 首次使用时,向其添加自定义转换器 - _IsFirst = false; - AddConverter(new DataSetConverter()); - AddConverter(new DateTimeConverter()); - } - return _GeneralOptions; - } - } /// /// 注册一个自定义转换器 @@ -38,7 +23,7 @@ namespace Milimoe.FunGame.Core.Service /// internal static void AddConverter(JsonConverter converter) { - _GeneralOptions.Converters.Add(converter); + GeneralOptions.Converters.Add(converter); } ///