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 } }; } }