using Lagrange.Core.Message; using Lagrange.Core.Message.Entity; using RoBot.Start.Global; using RoBot.Start.LogConfig; using RoBot.Start.Message; using System.Globalization; using System.Text.RegularExpressions; namespace RoBot.Start.Cmd { /// /// 秘境结束通知 /// public class MiJingNotify { public static async Task Execute(MessageChain chain) { try { MarkdownEntity miJingEntity = chain.Where(o => o is MarkdownEntity) .Cast() .Where(o => o.Data.Content.Contains("进入秘境:") || o.Data.Content.Contains("道友已踏入:")) .FirstOrDefault(); if (miJingEntity is not null) { MentionEntity callQQMember = chain.Where(o => o is MentionEntity).Cast().FirstOrDefault(); if (callQQMember is not null) { string miJingContent = miJingEntity.Data.Content; var minutes = ParseMinutes(miJingContent); if (minutes > 0) { uint qqNumber = callQQMember.Uin; ScheduleReminder(qqNumber, minutes); } } } } catch (Exception ex) { Logs.Write($@"{DateTime.Now:yyyy-MM-dd HH:mm:ss} 秘境结束通知 发生异常,异常信息:{ex.Message},异常堆栈:{ex.StackTrace}", true); } return await Task.FromResult(true); } private static void ScheduleReminder(uint userId, double minutes) { DateTime now = DateTime.Now; TimeSpan delay = TimeSpan.FromMinutes(minutes); Logs.Write($@"{now:yyyy-MM-dd HH:mm:ss} {userId} 触发秘境通知 {minutes}分钟 结束时间: {now.AddMinutes(minutes):yyyy-MM-dd HH:mm:ss}"); _ = Task.Run(async () => { await Task.Delay(delay); Dto.ConfigDto.ConfigSetting systemConfig = GlobalConfig.ConfigSetting; Lagrange.Core.BotContext bot = GlobalConfig.BotContext; await bot.SendMentionMsg((uint)systemConfig.GroupQQ, userId, $"【秘境结算通知】\r\n探索已完成,该结算奖励了!({minutes} 分钟)"); }); } private static double ParseMinutes(string content) { if (string.IsNullOrWhiteSpace(content)) return 0; var match = Regex.Match(content, @"(花费时间|探索耗时)[::]\s*(\d+(?:\.\d+)?)", RegexOptions.Compiled); if (!match.Success) { match = Regex.Match(content, @"(\d+(?:\.\d+)?)", RegexOptions.Compiled); } if (match.Success) { if (double.TryParse(match.Groups[2].Value, NumberStyles.Float, CultureInfo.InvariantCulture, out double val)) { return (double)val; } } return 0; } } }