public static void SendForgeMessage(GreenOnionsMessages originMsg, long qqId, Action <GreenOnionsMessages> SendMessage) { if (!BotInfo.ForgeMessageAdminOnly || BotInfo.AdminQQ.Contains(qqId)) { if (originMsg.Count > 2 && (originMsg[1] is GreenOnionsAtMessage atMsg)) { if (!BotInfo.AdminQQ.Contains(qqId) && BotInfo.AdminQQ.Contains(atMsg.AtId)) { SendMessage(BotInfo.RefuseForgeAdminReply.ReplaceGreenOnionsTags()); } if (!BotInfo.AdminQQ.Contains(qqId) && atMsg.AtId == BotInfo.QQId) { SendMessage(BotInfo.RefuseForgeBotReply.ReplaceGreenOnionsTags()); } GreenOnionsForwardMessage forwardMessage = new GreenOnionsForwardMessage(); for (int i = 2; i < originMsg.Count; i++) { if (originMsg[i] is GreenOnionsTextMessage textMsg) { string[] plainMsgs = textMsg.ToString().Trim().Split(BotInfo.ForgeMessageCmdNewLine); for (int j = 0; j < plainMsgs.Length; j++) { if (!string.IsNullOrEmpty(plainMsgs[j])) { forwardMessage.Add(atMsg.AtId, atMsg.NickName, new GreenOnionsMessages(plainMsgs[j])); } } } else if (originMsg[i] is GreenOnionsImageMessage imageMsg) { forwardMessage.Add(atMsg.AtId, atMsg.NickName, new GreenOnionsMessages(imageMsg)); } else { continue; } } if (BotInfo.ForgeMessageAppendBotMessageEnabled) { if (!BotInfo.ForgeMessageAdminDontAppend || !BotInfo.AdminQQ.Contains(qqId)) { forwardMessage.Add(BotInfo.QQId, BotInfo.BotName, new GreenOnionsMessages(BotInfo.ForgeMessageAppendMessage.ReplaceGreenOnionsTags())); } } SendMessage(forwardMessage); } } }
public static void StartRssTask(Action <GreenOnionsMessages, long, long> SendMessage) { if (BotInfo.RssEnabled && BotInfo.IsLogin) { if (_RssWorker != null && !_RssWorker.IsCompleted && !_RssWorker.IsCanceled && !_RssWorker.IsFaulted) { return; } _source = new CancellationTokenSource(); _RssWorker = Task.Run(async() => { LogHelper.WriteInfoLog("启动RSS抓取线程"); while (BotInfo.RssEnabled && BotInfo.IsLogin) { if (_source.IsCancellationRequested) { return; } foreach (RssSubscriptionItem item in BotInfo.RssSubscription) //若干条订阅地址 { //如果在调试模式并且转发的QQ和群组均不在管理员和调试群组集合中时不去请求 if (BotInfo.DebugMode && ((BotInfo.DebugReplyAdminOnly && item.ForwardQQs.Intersect(BotInfo.AdminQQ).Count() == 0) || (BotInfo.OnlyReplyDebugGroup && item.ForwardGroups.Intersect(BotInfo.DebugGroups).Count() == 0))) { LogHelper.WriteWarningLog("没有为订阅源设置转发目标或当前处于调试模式, 不进行转发"); continue; } try { if (item.ForwardGroups.Length == 0 && item.ForwardQQs.Length == 0) { continue; } if (!Cache.LastOneSendRssTime.ContainsKey(item.Url)) //如果不存在上次发送的日期记录 { LogHelper.WriteInfoLog($"首次抓取到{item.Url}内容, 只保存不发送, 防止内容太多刷屏"); Cache.LastOneSendRssTime.TryAdd(item.Url, DateTime.Now); //添加现在作为起始日期(避免把所有历史信息全都抓过来发送) Cache.LastOneSendRssTime = Cache.LastOneSendRssTime; JsonHelper.SaveCacheFile(); continue; } foreach (var rss in ReadRss(item.Url)) //每条订阅地址可能获取到若干条更新 { if (rss.pubDate > Cache.LastOneSendRssTime[item.Url]) { LogHelper.WriteInfoLog($"更新时间晚于记录时间, 需要推送消息"); string titleMsg = $"{rss.title}更新啦:\r\n{rss.description}"; string translateMsg = null; if (item.Translate) { LogHelper.WriteInfoLog($"本条RSS订阅启用了翻译"); string translatedText; if (item.TranslateFromTo) { translatedText = await(BotInfo.TranslateEngineType == TranslateEngine.Google ? GoogleTranslateHelper.TranslateFromTo(rss.description, item.TranslateFrom, item.TranslateTo) : YouDaoTranslateHelper.TranslateFromTo(rss.description, item.TranslateFrom, item.TranslateTo)); } else { translatedText = await(BotInfo.TranslateEngineType == TranslateEngine.Google ? GoogleTranslateHelper.TranslateToChinese(rss.description) : YouDaoTranslateHelper.TranslateToChinese(rss.description)); } translateMsg = $"\r\n以下为翻译内容:\r\n{ translatedText }"; LogHelper.WriteInfoLog($"翻译成功"); } LogHelper.WriteInfoLog($"需要转发的组:{item.ForwardGroups.Length}个"); if (item.ForwardGroups.Length > 0) { GreenOnionsMessages groupResultMsg = new GreenOnionsMessages(); if (item.AtAll) { groupResultMsg.Add(new GreenOnionsAtMessage(-1, "全体成员")); groupResultMsg.Add("\r\n"); } groupResultMsg.Add(titleMsg); if (translateMsg != null) { groupResultMsg.Add(translateMsg); } for (int i = 0; i < rss.imgsSrc.Length; i++) { groupResultMsg.Add(new GreenOnionsImageMessage(rss.imgsSrc[i])); } groupResultMsg.Add($"\r\n更新时间:{rss.pubDate}"); groupResultMsg.Add($"\r\n原文地址:{rss.link}"); LogHelper.WriteInfoLog($"组合群消息完成"); if (item.SendByForward) { LogHelper.WriteInfoLog($"发送模式为合并转发"); GreenOnionsForwardMessage greenOnionsForwardMessage = new GreenOnionsForwardMessage(BotInfo.QQId, BotInfo.BotName, groupResultMsg); for (int i = 0; i < item.ForwardGroups.Length; i++) { if (_source.IsCancellationRequested) { return; } SendMessage(greenOnionsForwardMessage, -1, item.ForwardGroups[i]); } } else { LogHelper.WriteInfoLog($"发送模式为直接发送"); for (int i = 0; i < item.ForwardGroups.Length; i++) { if (_source.IsCancellationRequested) { return; } SendMessage(groupResultMsg, -1, item.ForwardGroups[i]); } } LogHelper.WriteInfoLog($"全部群消息发送完毕"); } LogHelper.WriteInfoLog($"需要转发的好友:{item.ForwardQQs.Length}个"); if (item.ForwardQQs.Length > 0) { GreenOnionsMessages friendResultMsg = new GreenOnionsMessages(); friendResultMsg.Add(titleMsg); if (translateMsg != null) { friendResultMsg.Add(translateMsg); } for (int i = 0; i < rss.imgsSrc.Length; i++) { friendResultMsg.Add(new GreenOnionsImageMessage(rss.imgsSrc[i])); } friendResultMsg.Add($"\r\n更新时间:{rss.pubDate}"); friendResultMsg.Add($"\r\n原文地址:{rss.link}"); LogHelper.WriteInfoLog($"组合好友消息完成"); if (item.SendByForward) { LogHelper.WriteInfoLog($"发送模式为合并转发"); GreenOnionsForwardMessage greenOnionsForwardMessage = new GreenOnionsForwardMessage(BotInfo.QQId, BotInfo.BotName, friendResultMsg); for (int i = 0; i < item.ForwardQQs.Length; i++) { if (_source.IsCancellationRequested) { return; } SendMessage(friendResultMsg, item.ForwardQQs[i], -1); } } else { LogHelper.WriteInfoLog($"发送模式为直接发送"); for (int i = 0; i < item.ForwardQQs.Length; i++) { if (_source.IsCancellationRequested) { return; } SendMessage(friendResultMsg, item.ForwardQQs[i], -1); } } LogHelper.WriteInfoLog($"全部好友消息发送完毕"); } if (Cache.LastOneSendRssTime.ContainsKey(item.Url)) { Cache.LastOneSendRssTime[item.Url] = rss.pubDate; } else { Cache.LastOneSendRssTime.TryAdd(item.Url, rss.pubDate); //群和好友均推送完毕后记录此地址的最后更新时间 } Cache.LastOneSendRssTime = Cache.LastOneSendRssTime; JsonHelper.SaveCacheFile(); LogHelper.WriteInfoLog($"记录{item.Url}最后更新时间完毕"); //if (rss.iframseSrc.Length > 0) //视频或内嵌网页没想好怎么处理 //{ //} } } } catch (Exception ex) { LogHelper.WriteErrorLogWithUserMessage("获取RSS错误", ex, $"请求地址为:{item.Url}"); } } await Task.Delay((int)Math.Round(BotInfo.ReadRssInterval * 1000 * 60)); } }, _source.Token); } }