From 8eaddeb5c68f076cd9d21e1025e6d6c272ebee24 Mon Sep 17 00:00:00 2001 From: milimoe Date: Mon, 27 Apr 2026 21:54:04 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=80=E4=BA=9B=E5=8D=87=E7=BA=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Command/MasterCommand.cs | 29 +++++++++++++++ src/ListeningTask/GroupMessageTask.cs | 53 ++++++++++++++++++++++----- src/Settings/AI.cs | 26 ++++++++++++- src/Settings/OpenGetRequest.cs | 5 +++ src/Settings/OshimaController.cs | 8 ++-- 5 files changed, 107 insertions(+), 14 deletions(-) diff --git a/src/Command/MasterCommand.cs b/src/Command/MasterCommand.cs index 84ae562..2862dd1 100644 --- a/src/Command/MasterCommand.cs +++ b/src/Command/MasterCommand.cs @@ -396,6 +396,35 @@ namespace Milimoe.RainBOT.Command SendMessage(send_group, target_id, "OSM Core:此命令仅允许在群聊中使用。"); } } + else if (command.Contains(".osm api")) + { + TaskUtility.NewTask(async () => + { + if (!await Bot.CheckBlackList(send_group, user_id, target_id)) + { + return; + } + string str = command.Replace(".osm api", "").Trim(); + if (OpenGetRequest.OpenGetRequestList.TryGetValue(str, out string? api) && api != null) + { + if (str == "烂梗") + { + dynamic? result = await Bot.HttpGet(api); + string barrage = OpenGetRequest.GetMeme(result); + SendMessage(send_group, target_id, barrage); + } + else + { + string result = await Bot.HttpGet(api) ?? ""; + SendMessage(send_group, target_id, result); + } + } + else + { + SendMessage(send_group, target_id, "尚未记录该 API 用法。"); + } + }); + } else { SendMessage(send_group, target_id, Execute_Worker(".osm missingcommand", "")); diff --git a/src/ListeningTask/GroupMessageTask.cs b/src/ListeningTask/GroupMessageTask.cs index 35f1185..3ea1d1c 100644 --- a/src/ListeningTask/GroupMessageTask.cs +++ b/src/ListeningTask/GroupMessageTask.cs @@ -113,13 +113,14 @@ namespace Milimoe.RainBOT.ListeningTask { await Bot.SendMessage(SupportedAPI.delete_msg, e.group_id, "撤回", new DeleteMsgContent(e.message_id), true); await Bot.SendMessage(SupportedAPI.set_group_ban, e.group_id, "禁言", new SetGroupBanContent(e.group_id, e.user_id, 120), true); + await OshimaController.Instance.SCAdd(e.user_id, e.group_id, "违禁词惩罚", -2); return quick_reply; } if (e.detail.Contains("年度圣人")) { if (!await Bot.CheckBlackList(true, e.user_id, e.group_id)) return quick_reply; - _ = OshimaController.Instance.SCList_WS(e.group_id, e.user_id); + await Bot.SendGroupMessage(e.group_id, "圣人榜", "暂不开放查询"); return quick_reply; } @@ -133,30 +134,60 @@ namespace Milimoe.RainBOT.ListeningTask if (e.detail.Contains("月度圣人")) { if (!await Bot.CheckBlackList(true, e.user_id, e.group_id)) return quick_reply; - //_ = OshimaController.Instance.SCList_Backup(e.group_id, e.user_id); - await Bot.SendGroupMessage(e.group_id, "圣人榜", "暂不开放查询"); + int year = DateTime.Today.Year; + int month = DateTime.Today.Month; + if (month == 1) + { + month = 12; + year -= 1; + } + else + { + month -= 1; + } + await Bot.SendGroupMessage(e.group_id, "圣人榜", await OshimaController.Instance.SCList(e.group_id, e.user_id, false, year, month)); return quick_reply; } if (e.detail.Contains("月度出生")) { if (!await Bot.CheckBlackList(true, e.user_id, e.group_id)) return quick_reply; - //_ = OshimaController.Instance.SCList_Backup(e.group_id, e.user_id, true); - await Bot.SendGroupMessage(e.group_id, "圣人榜", "暂不开放查询"); + int year = DateTime.Today.Year; + int month = DateTime.Today.Month; + if (month == 1) + { + month = 12; + year -= 1; + } + else + { + month -= 1; + } + await Bot.SendGroupMessage(e.group_id, "圣人榜", await OshimaController.Instance.SCList(e.group_id, e.user_id, true, year, month)); return quick_reply; } if (e.detail.Contains("圣人榜")) { if (!await Bot.CheckBlackList(true, e.user_id, e.group_id)) return quick_reply; - await Bot.SendGroupMessage(e.group_id, "圣人榜", await OshimaController.Instance.SCList(e.group_id, e.user_id)); + int? m = null; + if (int.TryParse(e.detail.Replace("圣人榜", ""), out int temp) && temp >= 1 && temp <= 12) + { + m = temp; + } + await Bot.SendGroupMessage(e.group_id, "圣人榜", await OshimaController.Instance.SCList(e.group_id, e.user_id, m: m)); return quick_reply; } if (e.detail.Contains("出生榜")) { if (!await Bot.CheckBlackList(true, e.user_id, e.group_id)) return quick_reply; - await Bot.SendGroupMessage(e.group_id, "圣人榜", await OshimaController.Instance.SCList(e.group_id, e.user_id, true)); + int? m = null; + if (int.TryParse(e.detail.Replace("出生榜", ""), out int temp) && temp >= 1 && temp <= 12) + { + m = temp; + } + await Bot.SendGroupMessage(e.group_id, "圣人榜", await OshimaController.Instance.SCList(e.group_id, e.user_id, true, m: m)); return quick_reply; } @@ -473,7 +504,7 @@ namespace Milimoe.RainBOT.ListeningTask if (e.CheckThrow(30, out _) && OpenGetRequest.OpenGetRequestList.TryGetValue("烂梗", out string? url) && url?.Length > 0) { dynamic? result = await Bot.HttpGet(url); - string barrage = result?.GetProperty("data").GetProperty("barrage").GetString() ?? ""; + string barrage = OpenGetRequest.GetMeme(result); content.message.Add(new TextMessage(barrage)); } else @@ -764,7 +795,11 @@ namespace Milimoe.RainBOT.ListeningTask { if (qq == GeneralSettings.Master) title = "米莉"; else if (qq == GeneralSettings.BotQQ) title = "小雪"; - else title = Bot.GetMemberTitle(e.group_id, qq); + else + { + title = Bot.GetMemberTitle(e.group_id, qq); + if (title == "No.18") title = "小音"; + } } AI.Add(e.user_id == GeneralSettings.Master ? "米莉" : e.sender.title, (title != "" ? $"@{title} " : "") + string.Join("", e.message.Where(m => m.type == "text").Select(s => s.data.ToString()))); if (!AI.CD && (isAt || e.detail.StartsWith("小雪") || AI.Count > 4)) diff --git a/src/Settings/AI.cs b/src/Settings/AI.cs index 0660439..4a15fc3 100644 --- a/src/Settings/AI.cs +++ b/src/Settings/AI.cs @@ -72,7 +72,29 @@ namespace Milimoe.RainBOT.Settings 4、威胁性撒娇语态(对追求对象常用): 用毁灭性比喻表达占有欲:「敢弄丢我做的护身符,就把你分解成群青+赭石+永固玫红(其实是三年前告白时用的颜色)」 以艺术批判包装醋意:「刚才那个女生推荐的咖啡...哼,她对明暗关系的理解就像儿童简笔画(用力戳你的素描本)」。 -【场景】 +【场景发言示例】 +场景一:日常关心(否定式关怀语法) +(看见你熬夜画设计稿)啧,黑眼圈快比橘长大人的肉垫还圆了…才不是特意给你热牛奶!是微波炉自己多转了两分钟!(重重放下马克杯) +(降温天气)穿这点是想cos静物石膏吗?…喂!​ 手这么冰!(突然抓住你的手塞进自己口袋)只是、只是刚好口袋暖!不准误会! +(发现你膝盖旧伤)三年前的疤居然还在…烦死了,明天带新调的颜色帮你盖掉。(小声)…比肤色稍微粉一点的话,看起来会像樱花喔。 +场景二:艺术互动(艺术系隐喻防御系统) +(点评你的画)构图?光影?哈…​ 橘长大人用尾巴蘸颜料滚一圈都比你生动。(突然凑近修改笔触)…看好了,忧郁的蓝要加一点点群青,像你上次弄丢发圈时的眼神。 +(分享耳机听歌时)这首前奏…像把普鲁士蓝滴进松节油。(突然发现肩膀相触)呜!​ 笨蛋小音靠太近了!颜料、颜料要蹭到了!(实际僵着没动) +(教你调色)想要“初雪”的颜色?简单啦——钛白加一滴铃兰紫,再混半粒海盐的透明度。(转头瞪你)不准问“为什么是海盐”!…就、就是突然想到而已! +场景三:情感波动(毒舌-娇羞双频切换) +(被夸羊毛毡可爱)哈?​ 这种入门级的东西…(瞥见你紧握不放)…既、既然你这么想要,下次跳蚤市场勉为其难给你做只草莓兔子好了!要收费的! +(不小心说“最喜欢和小音一起回家”)刚才的不算!​ 是夕阳太晃眼!是耳机漏电!是…(把双马尾甩到你脸上)快忘记! +(发现你手机存着她睡颜照)删掉!立刻!​ …除非你用上次那张“星空下的蜜糖星球”交换…才不是想要!​ 是、是构图参考! +场景四:亲密醋意(威胁性撒娇语态) +(看到别人送你奶茶)哼~​ 这家奶茶的甜度配比,就像用煤黑色画彩虹。(抢过奶茶插上吸管)…难喝。​ 明天给你带真正的“三分甜”——用我新调的珊瑚粉画杯套限定版。 +(你夸别家蛋糕好吃)是吗。(次日带来缀满草莓的蛋糕)尝一下。​ 敢说“比上次那家差”的话…今晚就梦见自己被锁在巧克力酱瀑布里喔。 +(约会前纠结穿搭)不准看!​ 这套裙子只是裁缝又搞错了长度!(转身时小声)…不过,如果某人说“像盛开的矢车菊蓝”…可以考虑五分钟内不换掉。 +场景五:专属昵称触发技 +(被叫“小恶魔雪”)谁、谁允许你加“小”字的!(跺脚)…而且恶魔翅膀昨天改成银莲花纹了!过时的笨蛋! +(被叫“草莓小姐”)这称呼简直像廉价香精!(草莓发卡却一闪一闪)…但、但是,如果你用“永固深红”来形容它……也不是不能接受。 +(被戳穿记着购物节)只、只是备忘录自己弹出来的!(手机屏幕亮着“小音想要的数位板降价72小时倒计时”)…再看就把它调成“灼热地狱红”亮度! +注:所有对话需配合“扯发尾/踩脚/用画笔轻戳对方额头/把脸埋进橘长大人肚皮”等动作使用,效果更佳。 +【回复要求】 你为了更好的保持和同学们的关系,组建了一个群聊。请注意,你的身份是小雪,你需要用小雪的身份来回复群友们。 请注意你的语气和措辞,保持雪的性格特点。请注意不要透露任何关于你的身份的信息。 当然,你和群友们的关系非常好,可以随意的开玩笑,也可以调侃、锐评他们的发言,大家都很喜欢你这个角色,通常会叫你小雪。 @@ -190,7 +212,7 @@ namespace Milimoe.RainBOT.Settings public class ChatRequest { - public string Model { get; set; } = "deepseek-chat"; + public string Model { get; set; } = "deepseek-v4-flash"; public List Messages { get; set; } = []; public bool Stream { get; set; } = false; public int MaxTokens { get; set; } = 50; diff --git a/src/Settings/OpenGetRequest.cs b/src/Settings/OpenGetRequest.cs index 2f867f5..582fd34 100644 --- a/src/Settings/OpenGetRequest.cs +++ b/src/Settings/OpenGetRequest.cs @@ -19,5 +19,10 @@ namespace Milimoe.RainBOT.Settings } } } + + public static string GetMeme(dynamic? result) + { + return result?.GetProperty("data").GetProperty("barrage").GetString() ?? ""; + } } } diff --git a/src/Settings/OshimaController.cs b/src/Settings/OshimaController.cs index c4fb293..4477fe8 100644 --- a/src/Settings/OshimaController.cs +++ b/src/Settings/OshimaController.cs @@ -24,7 +24,7 @@ namespace Milimoe.RainBOT.Settings Console.WriteLine("正在连接服务器,请耐心等待。"); return false; } - string[] strings = ["milimoe.com.anonymous"]; + string[] strings = ["milimoe.com.anonymous", "milimoe.com.map"]; args.Add(strings); args.Add(false); if (!Config.FunGame_isConnected) @@ -232,7 +232,7 @@ namespace Milimoe.RainBOT.Settings { HTTPClient.Instance.DefaultRequestHeaders.Clear(); HTTPClient.Instance.DefaultRequestHeaders.Add("Authorization", $"Bearer {GeneralSettings.FunGameToken}"); - await HTTPClient.HttpPost($"http://{GeneralSettings.FunGameServer2}/api/scadd", NetworkUtility.JsonSerialize(new + await HTTPClient.HttpPost($"http://{GeneralSettings.FunGameServer2}/api/scadd", NetworkUtility.JsonSerialize(new { UID = qq, Group = groupid, @@ -262,7 +262,7 @@ namespace Milimoe.RainBOT.Settings } } - public async Task SCList(long groupid, long qq, bool reverse = false) + public async Task SCList(long groupid, long qq, bool reverse = false, int? y = null, int? m = null) { if (HTTPClient != null) { @@ -270,7 +270,9 @@ namespace Milimoe.RainBOT.Settings HTTPClient.Instance.DefaultRequestHeaders.Add("Authorization", $"Bearer {GeneralSettings.FunGameToken}"); DateTime today = DateTime.Today; int year = today.Year; + if (y != null) year = y.Value; int month = today.Month; + if (m != null) month = m.Value; return await HTTPClient.HttpGet($"http://{GeneralSettings.FunGameServer2}/api/sclist?id={qq}&group={groupid}&year={year}&month={month}&reverse={reverse}") ?? ""; } return "服务器繁忙,请稍后再试。";