From 15958d6bfa904aaa1f0d0ead9943e59d83b8913a Mon Sep 17 00:00:00 2001 From: milimoe Date: Thu, 20 Nov 2025 01:38:04 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=88=B7=E5=B1=8F=E7=A6=81?= =?UTF-8?q?=E8=A8=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ListeningTask/GroupMessageTask.cs | 11 ++++- src/Main.cs | 11 +++++ src/Settings/NoSpamming.cs | 60 +++++++++++++++++++++++++++ 3 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 src/Settings/NoSpamming.cs diff --git a/src/ListeningTask/GroupMessageTask.cs b/src/ListeningTask/GroupMessageTask.cs index 129aba2..274a2f1 100644 --- a/src/ListeningTask/GroupMessageTask.cs +++ b/src/ListeningTask/GroupMessageTask.cs @@ -40,6 +40,15 @@ namespace Milimoe.RainBOT.ListeningTask if (MuteRecall.Muted.TryGetValue(e.group_id, out Dictionary? mute_group) && mute_group != null) mute_group.Remove(e.user_id); + if (NoSpamming.NoSpammingData.TryGetValue(e.group_id, out NoSpamming? value) && value != null) + { + if (await value.Check(e.user_id)) + { + await Bot.SendGroupMessage(e.group_id, "刷屏检测", "喜欢刷屏?吔屎啦你!"); + return quick_reply; + } + } + bool onOSMCore = GeneralSettings.OSMCoreGroup.Contains(e.group_id); // OSM指令 if (e.detail.Length >= 4 && e.detail[..4] == ".osm") @@ -376,7 +385,7 @@ namespace Milimoe.RainBOT.ListeningTask { if (long.TryParse(str_qq.Trim().Replace("@", ""), out long qq)) { - string msg = await Bot.HttpPost($"https://{GeneralSettings.FunGameServer}/userdaily/remove/" + e.user_id, "") ?? ""; + string msg = await Bot.HttpPost($"https://{GeneralSettings.FunGameServer}/userdaily/remove/" + qq, "") ?? ""; if (msg != "") { await Bot.SendGroupMessage(e.group_id, "重置运势", "已重置" + Bot.GetMemberNickName(e.group_id, qq) + "(" + qq + ")的今日运势。"); diff --git a/src/Main.cs b/src/Main.cs index da10baf..2804406 100644 --- a/src/Main.cs +++ b/src/Main.cs @@ -110,6 +110,7 @@ try SayNo.InitSayNo(); Ignore.InitIgnore(); QQOpenID.LoadConfig(); + NoSpamming.Init(Bot.Groups); Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine("初始化完毕!"); @@ -212,6 +213,16 @@ try } // 重置AI状态 AI.CD = false; + // 刷屏检测重置 + foreach (NoSpamming ns in NoSpamming.NoSpammingData.Values) + { + ns.Times.Clear(); + if (NoSpamming.Refresh++ > 4) + { + ns.History.Clear(); + NoSpamming.Refresh = 0; + } + } } catch (Exception e) { diff --git a/src/Settings/NoSpamming.cs b/src/Settings/NoSpamming.cs new file mode 100644 index 0000000..b909622 --- /dev/null +++ b/src/Settings/NoSpamming.cs @@ -0,0 +1,60 @@ +using System.Collections.Concurrent; +using Milimoe.OneBot.Framework; +using Milimoe.OneBot.Model.Content; +using Milimoe.OneBot.Model.Other; + +namespace Milimoe.RainBOT.Settings +{ + public class NoSpamming(long groupId) + { + public static int Refresh { get; set; } = 0; + public static ConcurrentDictionary NoSpammingData { get; } = []; + + public List History { get; } = []; + public long GroupId { get; set; } = groupId; + public Dictionary Times { get; } = []; + + public static void Init(IEnumerable groups) + { + foreach (Group group in groups) + { + if (!GeneralSettings.OSMCoreGroup.Contains(group.group_id)) + { + continue; + } + NoSpammingData.TryAdd(group.group_id, new(group.group_id)); + } + } + + public async Task Check(long qq) + { + if (!Bot.BotIsAdmin(GroupId)) + { + return false; + } + History.Add(qq); + if (Times.TryGetValue(qq, out int times)) + { + Times[qq] = ++times; + int total = Times.Values.Sum(); + double check = total > 8 ? times / total : 0; + if (qq != GeneralSettings.Master && (check > 0.9 || (History.Count > 8 && History.TakeLast(8).All(q => q == qq)))) + { + Times.Remove(qq); + await Bot.SendMessage(SupportedAPI.set_group_ban, GroupId, "禁言", new SetGroupBanContent(GroupId, qq, 120), true); + await OshimaController.Instance.SCAdd(qq, GroupId, "刷屏惩罚", -5); + return true; + } + } + else + { + Times[qq] = 1; + } + if (History.Count > 200) + { + History.Clear(); + } + return false; + } + } +}