From a7b8e2a4479909ae793f2945605eb159f01d341e Mon Sep 17 00:00:00 2001 From: Cyl18 Date: Tue, 8 May 2018 21:41:52 +0800 Subject: [PATCH] add scoreboard --- CardSharp/GameComponents/PlayerConfig.cs | 17 ++++++++++++++--- CardSharp/GameSteps/StandardParser.cs | 18 ++++++++++++++++++ 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/CardSharp/GameComponents/PlayerConfig.cs b/CardSharp/GameComponents/PlayerConfig.cs index c8cd337..1d80bc7 100644 --- a/CardSharp/GameComponents/PlayerConfig.cs +++ b/CardSharp/GameComponents/PlayerConfig.cs @@ -10,7 +10,7 @@ static PlayerConfig() if (!Directory.Exists(Constants.ConfigDir)) Directory.CreateDirectory(Constants.ConfigDir); } - public PlayerConfig(string playerid, long point = default, DateTime lastTime = default, bool isAdmin = default ) + public PlayerConfig(string playerid, long point = default, DateTime lastTime = default, bool isAdmin = default) { PlayerID = playerid ?? throw new ArgumentNullException(nameof(playerid)); Point = point; @@ -23,6 +23,7 @@ static PlayerConfig() public DateTime LastTime { get; set; } private bool _isAdmin = false; + public bool IsAdmin { get => PlayerID == "775942303" || _isAdmin; @@ -33,13 +34,21 @@ public static PlayerConfig GetConfig(Player player) { var path = GetConfigPath(player.PlayerId); return File.Exists(path) - ? File.ReadAllText(path).JsonDeserialize() + ? FromJson(File.ReadAllText(path)) : new PlayerConfig(player.PlayerId); } public void Save() { - File.WriteAllText(GetConfigPath(PlayerID), this.ToJsonString()); + if (uint.TryParse(PlayerID, out var _)) // e.g. 机器人233 + { + File.WriteAllText(GetConfigPath(PlayerID), this.ToJsonString()); + } + } + + public string ToAtCode() + { + return $"[CQ:at,qq={PlayerID}]"; } public void AddPoint() @@ -49,6 +58,8 @@ public void AddPoint() Save(); } + public static PlayerConfig FromJson(string json) => json.JsonDeserialize(); + private static string GetConfigPath(string playerid) { return Path.Combine(Constants.ConfigDir, $"{playerid}.json"); diff --git a/CardSharp/GameSteps/StandardParser.cs b/CardSharp/GameSteps/StandardParser.cs index 627acf6..c9d6afa 100644 --- a/CardSharp/GameSteps/StandardParser.cs +++ b/CardSharp/GameSteps/StandardParser.cs @@ -1,6 +1,9 @@ using System; +using System.Collections.Generic; using System.Globalization; +using System.IO; using System.Linq; +using System.Text; using CardSharp.GameComponents; using Humanizer; using Humanizer.Localisation; @@ -119,6 +122,21 @@ 带有[R]的命令 是正式功能,'一般'不会做更改 player.AutoPass = false; desk.AddMessage("Done."); break; + + case "排行榜": + var configs = Directory.GetFiles(Constants.ConfigDir) + .Select(File.ReadAllText) + .Select(PlayerConfig.FromJson) + .OrderByDescending(conf => conf.Point) + .Take(10); + var sb = new StringBuilder(); + sb.AppendLine("积分排行榜: "); + foreach (var config in configs) + sb.AppendLine($"{(config.IsAdmin ? "**" : "")}{config.PlayerID}-{config.ToAtCode()}: {config.Point}"); + + desk.AddMessage(sb.ToString()); + + break; } if (pconfig.IsAdmin)