using Furion.Logging;
using System.Globalization;
namespace NapCatRobotClient.Service.Group.TextProcess
{
///
/// 秘境通知
///
public class MiJingNotifyProcess
{
public static async Task ProcessGroupRequest(string groupId, string message)
{
try
{
JObject json = JObject.Parse(message);
string userId = json["user_id"]?.ToString();
string robotId = App.Configuration["QQConfig:XiaoXiaoRobotQQ"];
if (userId != robotId)
return false;
if (json["message"] is not JArray messageArray || messageArray.Count == 0)
return false;
string[] keywords = { "进入秘境", "道友已踏入", "道友已破界", "道友已遁入", "道友已降临" };
JToken textMsg = messageArray
.FirstOrDefault(o =>
{
string type = o["type"]?.ToString();
string text = o["data"]?["text"]?.ToString();
return type == "text"
&& !string.IsNullOrWhiteSpace(text)
&& keywords.Any(k => text.Contains(k));
});
string groupMsg = textMsg?["data"]?["text"]?.ToString();
if (string.IsNullOrWhiteSpace(groupMsg))
return false;
var minutes = ParseMinutes(groupMsg);
if (minutes <= 0)
return true;
JToken atData = messageArray.FirstOrDefault(o => o["type"]?.ToString() == "at");
string targetQQ = null;
if (atData != null)
{
targetQQ = atData["data"]?["qq"]?.ToString();
}
else
{
string markdown = messageArray
.FirstOrDefault(o => o["type"]?.ToString() == "markdown")
?["data"]?["content"]?.ToString();
if (!string.IsNullOrWhiteSpace(markdown))
{
var match = Regex.Match(markdown, @"at_tinyid=(\d+)");
if (match.Success)
{
targetQQ = match.Groups[1].Value;
}
}
}
if (!string.IsNullOrWhiteSpace(targetQQ))
{
ScheduleReminder(groupId, targetQQ, minutes);
}
return true;
}
catch (Exception ex)
{
Log.Error(
$"{DateTime.Now:yyyy-MM-dd HH:mm:ss} 秘境结束通知 发生异常:{ex.Message}\n{ex.StackTrace}",
true);
return false;
}
}
private static void ScheduleReminder(string groupId, string userId, double minutes)
{
DateTime now = DateTime.Now.AddMinutes(minutes);
Log.Information($@"{now:yyyy-MM-dd HH:mm:ss} {userId} 触发秘境通知 {minutes}分钟 结束时间: {now:yyyy-MM-dd HH:mm:ss}");
RedisHelper.Client.Set($"{RedisPrefix.MiJingKey}{groupId}:{userId}", new TaskDetailInfo()
{
GroupId = groupId,
Minutes = minutes,
UserId = userId,
TriggerTime = now
}, Convert.ToInt32((minutes + 3) * 60));
}
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;
}
}
}