diff --git a/Configs/DataBaseConfig.cs b/Configs/DataBaseConfig.cs new file mode 100644 index 0000000..8f5aeca --- /dev/null +++ b/Configs/DataBaseConfig.cs @@ -0,0 +1,19 @@ +using LabApi.Loader.Features.Paths; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace EasyTools.Configs +{ + public class DataBaseConfig + { + [Description("是否启用玩家数据储存系统")] + public bool database_enable { get; set; } = true; + [Description("数据库存储路径")] + public string database_path { get; set; } = Path.Combine(PathManager.Configs.FullName ?? Environment.CurrentDirectory, @"EasyTools.db"); + } +} diff --git a/DataBase/DataAPI.cs b/DataBase/DataAPI.cs new file mode 100644 index 0000000..42552c5 --- /dev/null +++ b/DataBase/DataAPI.cs @@ -0,0 +1,34 @@ +using EasyTools.DataBase.Serialization; +using EasyTools.Events; +using LiteDB; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using UnityEngine.LowLevel; + +namespace EasyTools.DataBase +{ + public static class DataAPI + { + public static List TimerHidden { get; } = []; + public static Dictionary PlayerDataDic = []; + + public static bool TryGetData(string id, out PlayerData data) + { + if (PlayerDataDic.TryGetValue(id, out data)) + { + return true; + } + using LiteDatabase database = new(CustomEventHandler.DataBaseConfig.database_path); + + if ((data = database.GetCollection("Players")?.FindById(id)) != null) + { + PlayerDataDic.Add(id, data); + return true; + } + return false; + } + } +} diff --git a/DataBase/InfoExtension.cs b/DataBase/InfoExtension.cs new file mode 100644 index 0000000..d4d3f48 --- /dev/null +++ b/DataBase/InfoExtension.cs @@ -0,0 +1,106 @@ +using System.Collections.Generic; +using EasyTools.DataBase.Serialization; +using EasyTools.Events; +using LabApi.Features.Wrappers; +using LiteDB; +using MEC; +using System; + +namespace EasyTools.DataBase +{ + public static class InfoExtension + { + + /// + /// 玩家列表 + /// 不用 Player.ReadyList 是因为它包含Dummy + /// + public static List PlayerList = []; + + public static PlayerData GetData(this Player ply) + { + PlayerData toInsert = null; + if (!DataAPI.TryGetData(ply.UserId, out PlayerData data)) + { + toInsert = new PlayerData() + { + ID = ply.UserId, + NickName = "", + LastJoinedTime = DateTime.Now, + LastLeftTime = DateTime.Now, + PlayedTimes = 0, + PlayerKills = 0, + PlayerDeath = 0, + PlayerSCPKills = 0, + PlayerDamage = 0, + RolePlayed = 0, + PlayerShot = 0, + }; + using LiteDatabase database = new(CustomEventHandler.DataBaseConfig.database_path); + database.GetCollection("Players").Insert(toInsert); + } + + if (data is null) + return toInsert; + return data; + } + + public static PlayerData GetData(this ReferenceHub ply) + { + PlayerData toInsert = null; + if (string.IsNullOrWhiteSpace(ply.authManager.UserId)) + throw new ArgumentNullException(nameof(ply)); + if (!DataAPI.TryGetData(ply.authManager.UserId, out PlayerData data)) + { + toInsert = new PlayerData() + { + ID = ply.authManager.UserId, + NickName = "", + LastJoinedTime = DateTime.Now, + LastLeftTime = DateTime.Now, + PlayedTimes = 0, + PlayerKills = 0, + PlayerDeath = 0, + PlayerSCPKills = 0, + PlayerDamage = 0, + RolePlayed = 0, + PlayerShot = 0, + }; + using LiteDatabase database = new(CustomEventHandler.DataBaseConfig.database_path); + database.GetCollection("Players").Insert(toInsert); + } + + if (data is null) + return toInsert; + return data; + } + + public static void UpdateData(this PlayerData data) + { + using LiteDatabase database = new(CustomEventHandler.DataBaseConfig.database_path); + database.GetCollection("Players").Update(data); + } + + public static IEnumerator CollectInfo() + { + while (true) + { + yield return Timing.WaitForSeconds(60f); + + foreach (Player Player in PlayerList) + { + if (Player != null && !Player.DoNotTrack) + { + var pLog = Player.GetData(); + pLog.PlayedTimes += 60; + pLog.UpdateData(); + } + } + if (Round.IsRoundEnded) + { + yield break; + } + } + } + } +} diff --git a/DataBase/Serialization/PlayerData.cs b/DataBase/Serialization/PlayerData.cs new file mode 100644 index 0000000..5933e59 --- /dev/null +++ b/DataBase/Serialization/PlayerData.cs @@ -0,0 +1,22 @@ +using LiteDB; +using System; + +namespace EasyTools.DataBase.Serialization +{ + [Serializable] + public class PlayerData + { + public string NickName { get; set; } + public DateTime LastJoinedTime { get; set; } + public DateTime LastLeftTime { get; set; } + public int PlayedTimes { get; set; } + public int PlayerKills { get; set; } + public int PlayerDeath { get; set; } + public int PlayerSCPKills { get; set; } + public float PlayerDamage { get; set; } + public int RolePlayed { get; set; } + public int PlayerShot { get; set; } + [BsonId] + public string ID { get; set; } + } +} diff --git a/EasyTools.csproj b/EasyTools.csproj index 78140f9..59bad3f 100644 --- a/EasyTools.csproj +++ b/EasyTools.csproj @@ -124,6 +124,7 @@ + diff --git a/Events/CustomEventHandler.cs b/Events/CustomEventHandler.cs index 66973a5..dff2900 100644 --- a/Events/CustomEventHandler.cs +++ b/Events/CustomEventHandler.cs @@ -40,6 +40,8 @@ namespace EasyTools.Events public static CustomRoleConfig CustomRoleConfig; + public static DataBaseConfig DataBaseConfig; + public static CoroutineHandle Badge_Coroutine; public override void OnServerWaitingForPlayers() diff --git a/Plugins.cs b/Plugins.cs index eeb8b74..593a7cf 100644 --- a/Plugins.cs +++ b/Plugins.cs @@ -26,6 +26,7 @@ namespace EasyTools CustomEventHandler.TranslateConfig = this.LoadConfig("translateConfig.yml"); CustomEventHandler.BadgeConfig = this.LoadConfig("badgeConfig.yml"); CustomEventHandler.CustomRoleConfig = this.LoadConfig("customRoleConfig.yml"); + CustomEventHandler.DataBaseConfig = this.LoadConfig("dataBaseConfig.yml"); if (!Directory.Exists(CustomEventHandler.BadgeConfig.Pach)) {