diff --git a/RoBot.Core/Utils.cs b/RoBot.Core/Utils.cs index bab69d5..710aba7 100644 --- a/RoBot.Core/Utils.cs +++ b/RoBot.Core/Utils.cs @@ -2,6 +2,11 @@ { public class Utils { + /// + /// 格式化数字为中文单位 + /// + /// + /// public static string FormatNumberToChineseUnit(decimal number) { if (number >= 100000000) // 亿 @@ -20,6 +25,11 @@ } } + /// + /// 解析中文数字 + /// + /// + /// public static decimal ParseChineseNumber(string chineseNumber) { if (string.IsNullOrWhiteSpace(chineseNumber))return 0; @@ -59,8 +69,5 @@ return amount * rate; } - - - } } diff --git a/XiaoXiaoRoBot/Cmd/QueryGoodsUpShopPriceCmd.cs b/XiaoXiaoRoBot/Cmd/QueryGoodsUpShopPriceCmd.cs index 301ab2b..536ae6a 100644 --- a/XiaoXiaoRoBot/Cmd/QueryGoodsUpShopPriceCmd.cs +++ b/XiaoXiaoRoBot/Cmd/QueryGoodsUpShopPriceCmd.cs @@ -37,7 +37,10 @@ namespace RoBot.Start.Cmd { string desc = convertList[0].Text; - if (desc.Contains("拥有药材") || (desc.Contains("名字") && desc.Contains("拥有数量"))) + if (desc.Contains("拥有药材") || + desc.Contains("的丹药背包") || + (desc.Contains("名字") && desc.Contains("拥有数量")) + ) { _ = Herbal(desc); } diff --git a/XiaoXiaoRoBot/Cmd/WantedPriceCmd.cs b/XiaoXiaoRoBot/Cmd/WantedPriceCmd.cs new file mode 100644 index 0000000..0b2ad1f --- /dev/null +++ b/XiaoXiaoRoBot/Cmd/WantedPriceCmd.cs @@ -0,0 +1,154 @@ +using System.Text.RegularExpressions; +using Lagrange.Core.Message; +using Lagrange.Core.Message.Entity; +using RoBot.Core; +using RoBot.Core.ConstValue; +using RoBot.Core.Helper; +using RoBot.Start.Dto.Wanted; +using RoBot.Start.Global; +using RoBot.Start.Message; +using RoBot.Start.Service.Dto; + +namespace RoBot.Start.Cmd +{ + /// + /// 悬赏令 + /// + public class WantedPriceCmd + { + public static async Task Execute(MessageChain chain) + { + var textEntities = chain.Where(o => o is TextEntity).ToList(); + List convertList = textEntities.Cast().ToList().Where(o => o.Text.Contains("道友的个人悬赏令") || o.Text.Contains("天机悬赏令")).ToList(); + + foreach (var item in convertList) + { + List wantedTasks = new(); + if (item.Text.Contains("个人悬赏令")) + { + wantedTasks = await SingleWanted(item.Text); + } + else if (item.Text.Contains("天机悬赏令")) + { + wantedTasks = await SpecialWanted(item.Text); + } + if (wantedTasks.Count > 0) + { + var systemConfig = GlobalConfig.ConfigSetting; + var bot = GlobalConfig.BotContext; + + string msg = ""; + List<(int Id, decimal Price)> prices = new(); + foreach (var want in wantedTasks) + { + msg += $"✨悬赏令 {want.Id} 奖励:{want.ExtraReward.Item}\r\n"; + msg += $"🎁修为:{Utils.FormatNumberToChineseUnit(want.BaseReward)}\r\n"; + var goodsInfo = RedisHelper.Client.HGet(RedisPrefix.GoodsKey, want.ExtraReward.Item); + if (goodsInfo is not null) + { + msg += $"💵坊市价格:{goodsInfo.ShowPriceDesc}\r\n"; + + prices.Add((want.Id, goodsInfo.Price)); + } + //msg += $"炼金价格:\r\n"; + msg += $"\r\n"; + } + var maxWanted = wantedTasks.MaxBy(o => o.BaseReward); + + msg += "━━━━━━━━━━━━━━━\r\n"; + msg += $"✨最高修为:悬赏令 {maxWanted.Id} ({Utils.FormatNumberToChineseUnit(maxWanted.BaseReward)})\r\n"; + if (prices.Count > 0) + { + var maxPrice = prices.MaxBy(o => o.Price); + msg += $"💰最高价格:悬赏令 {maxPrice.Id} ({Utils.FormatNumberToChineseUnit(maxPrice.Price)})"; + } + await bot.SendMsg((uint)systemConfig.GroupQQ, msg); + } + } + + + return await Task.FromResult(true); + } + + /// + /// 个人悬赏令 + /// + /// + /// + private static async Task> SingleWanted(string message) + { + List result = new(); + + // 解析任务信息 + var taskRegex = new Regex( + @"(?\d+)、(?.*?), + 完成几率(?\d+), + 基础报酬(?\d+)修为, + 预计需(?\d+分钟), + 可能额外获得:(?[^::]+):(?[^!!]+)!?", + RegexOptions.IgnorePatternWhitespace); + + foreach (Match match in taskRegex.Matches(message)) + { + result.Add(new() + { + Id = int.Parse(match.Groups["id"].Value), + Name = match.Groups["name"].Value.Trim(), + SuccessRate = match.Groups["rate"].Value + "%", + BaseReward = long.Parse(match.Groups["reward"].Value), + Duration = match.Groups["duration"].Value, + ExtraReward = new ExtraReward + { + Grade = match.Groups["grade"].Value.Trim(), + Item = match.Groups["item"].Value.Trim() + } + }); + } + return await Task.FromResult(result); + } + + /// + /// 天机悬赏令 + /// + /// + /// + private static async Task> SpecialWanted(string message) + { + List result = new(); + + var blockRegex = new Regex( + @"悬赏(?[壹贰叁肆伍陆柒捌玖拾])·(?[^\n\r]+)\s+" + + @".*?成功率:(?\d+)%\s+" + + @".*?预计耗时:(?[\d一二三四五六七八九十]+分钟)\s+" + + @".*?基础奖励(?\d+)修为\s+" + + @".*?额外机缘:(?[^「」]+)「(?[^」]+)」", + RegexOptions.Multiline); + + foreach (Match match in blockRegex.Matches(message)) + { + string idCN = match.Groups["idCN"].Value; + result.Add(new() + { + Id = ChineseNumberMap.ContainsKey(idCN) ? ChineseNumberMap[idCN] : 0, + Name = match.Groups["name"].Value.Trim(), + SuccessRate = match.Groups["rate"].Value + "%", + Duration = match.Groups["duration"].Value.Trim(), + BaseReward = long.Parse(match.Groups["reward"].Value), + ExtraReward = new ExtraReward + { + Grade = match.Groups["grade"].Value.Trim(), + Item = match.Groups["item"].Value.Trim() + } + }); + } + return await Task.FromResult(result); + } + + private static readonly Dictionary ChineseNumberMap = new() + { + { "壹", 1 }, { "贰", 2 }, { "叁", 3 }, { "肆", 4 }, { "伍", 5 }, + { "陆", 6 }, { "柒", 7 }, { "捌", 8 }, { "玖", 9 }, { "拾", 10 } + }; + + } +} diff --git a/XiaoXiaoRoBot/Dto/ConfigDto/ConfigSetting.cs b/XiaoXiaoRoBot/Dto/ConfigSet/ConfigSetting.cs similarity index 100% rename from XiaoXiaoRoBot/Dto/ConfigDto/ConfigSetting.cs rename to XiaoXiaoRoBot/Dto/ConfigSet/ConfigSetting.cs diff --git a/XiaoXiaoRoBot/Dto/Wanted/WantedInfo.cs b/XiaoXiaoRoBot/Dto/Wanted/WantedInfo.cs new file mode 100644 index 0000000..6bc91ff --- /dev/null +++ b/XiaoXiaoRoBot/Dto/Wanted/WantedInfo.cs @@ -0,0 +1,54 @@ +namespace RoBot.Start.Dto.Wanted +{ + /// + /// 悬赏令信息 + /// + public class WantedTaskInfo + { + /// + /// 序号 + /// + public int Id { get; set; } + + /// + /// 任务名称 + /// + public string Name { get; set; } + + /// + /// 成功几率 + /// + public string SuccessRate { get; set; } + + /// + /// 修为值 + /// + public long BaseReward { get; set; } + + /// + /// 需要时间 + /// + public string Duration { get; set; } + + /// + /// 额外奖励 + /// + public ExtraReward ExtraReward { get; set; } + } + + /// + /// 额外奖励 + /// + public class ExtraReward + { + /// + /// 奖励等级 + /// + public string Grade { get; set; } + + /// + /// 奖励物品 + /// + public string Item { get; set; } + } +} diff --git a/XiaoXiaoRoBot/Program.cs b/XiaoXiaoRoBot/Program.cs index cf9faed..435a468 100644 --- a/XiaoXiaoRoBot/Program.cs +++ b/XiaoXiaoRoBot/Program.cs @@ -53,6 +53,7 @@ bot.Invoker.OnBotLogEvent += (sender, e) => { RecordLog = false; LoginSuccess = true; + Logs.Write($"Login success: {bot.BotUin} {bot.BotName}"); _ = KeystoreConfig.SaveBotKeystore(bot.UpdateKeystore()); LoadLoginConfig(); } @@ -85,6 +86,9 @@ else async Task HandleGroupMessage(MessageChain chain) { + // 悬赏令查价 + await WantedPriceCmd.Execute(chain); + // 坊市生成上架命令 await QueryGoodsUpShopPriceCmd.Execute(chain);