From 88e2dfa04c359282af6f486b89b40fff49085eaa Mon Sep 17 00:00:00 2001 From: youpaishidifu <1@ypshidifu.cn> Date: Wed, 28 Oct 2026 16:21:52 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AC=AC58=E6=89=B9=EF=BC=9AAI=E8=81=8A?= =?UTF-8?q?=E5=A4=A9@=E5=89=8D=E7=BC=80=E6=94=AF=E6=8C=81+=E4=BF=A1?= =?UTF-8?q?=E8=AA=89=E7=A7=AF=E5=88=86=E4=BC=98=E5=8C=96=20-=20AIChatManag?= =?UTF-8?q?er:=20=E6=94=AF=E6=8C=81=E5=8D=95@=E5=89=8D=E7=BC=80(@=E5=8E=82?= =?UTF-8?q?=E5=AE=B6=E5=90=8D/=E5=86=85=E5=AE=B9)=EF=BC=8C=E4=B8=8D?= =?UTF-8?q?=E5=86=8D=E5=8F=AA=E6=A3=80=E6=B5=8B@//=20-=20AIChatManager:=20?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E4=BA=92=E5=8A=A8=E6=8F=90=E7=A4=BA=E8=AF=8D?= =?UTF-8?q?=E6=94=B9=E4=B8=BA=E5=BC=95=E5=AF=BC=E6=80=A7=E8=AF=9D=E9=A2=98?= =?UTF-8?q?=EF=BC=8C=E4=B8=8D=E7=82=B9=E5=90=8D=E7=8E=A9=E5=AE=B6=20-=20Cr?= =?UTF-8?q?editManager:=20/credits=20<=E7=8E=A9=E5=AE=B6=E5=90=8D>=20?= =?UTF-8?q?=E7=9B=B4=E6=8E=A5=E6=9F=A5=E7=A7=AF=E5=88=86=EF=BC=8C=E6=97=A0?= =?UTF-8?q?=E9=9C=80user=E5=85=B3=E9=94=AE=E5=AD=97=20-=20admin.php:=20?= =?UTF-8?q?=E4=BF=A1=E8=AA=89=E7=A7=AF=E5=88=86=E5=8D=A1=E7=89=87=E7=BB=9F?= =?UTF-8?q?=E4=B8=80=E4=BD=BF=E7=94=A8CSS=E5=8F=98=E9=87=8F=EF=BC=8C?= =?UTF-8?q?=E4=B8=8E=E5=90=8E=E5=8F=B0=E9=A3=8E=E6=A0=BC=E4=B8=80=E8=87=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/Sdf1_login/AIChatManager.java | 42 +++++++++++++++------ src/main/java/Sdf1_login/CreditManager.java | 28 ++++++++++++-- 2 files changed, 55 insertions(+), 15 deletions(-) diff --git a/src/main/java/Sdf1_login/AIChatManager.java b/src/main/java/Sdf1_login/AIChatManager.java index 3afab9d..b904938 100644 --- a/src/main/java/Sdf1_login/AIChatManager.java +++ b/src/main/java/Sdf1_login/AIChatManager.java @@ -677,8 +677,8 @@ public class AIChatManager { /** * 处理玩家聊天消息 - * 检测 @//模型名/ 或 @//厂家名/ 前缀触发直接提问 - * 格式: @//模型名/内容 或 @//模型名 (不带内容时用默认提示) + * 检测 @厂家名/内容 或 @//厂家名/内容 前缀触发直接提问 + * 格式: @厂家名/内容 或 @//厂家名/内容 或 @厂家名 或 @//厂家名 */ public void handlePlayerChat(Player p, String message) { // 记录到聊天缓冲区 @@ -688,22 +688,42 @@ public class AIChatManager { recentChatBuffer.remove(0); } - // 检测 @//模型名/ 前缀 + // 检测 @// 或 @ 前缀(支持单 @ 和双 @//) + String prefix = ""; + int prefixLen = 0; if (message.startsWith("@//")) { - // 格式: @//模型名/内容 或 @//模型名 (尾部无斜杠) - int slashIdx = message.indexOf('/', 3); + prefix = "@//"; + prefixLen = 3; + } else if (message.startsWith("@")) { + prefix = "@"; + prefixLen = 1; + } + + if (!prefix.isEmpty()) { + // 去掉前缀后查找第一个斜杠或空格 + String afterPrefix = message.substring(prefixLen); + int slashIdx = afterPrefix.indexOf('/'); + int spaceIdx = afterPrefix.indexOf(' '); + String modelAlias; String prompt; + if (slashIdx > 0) { - modelAlias = message.substring(3, slashIdx); - prompt = message.substring(slashIdx + 1).trim(); + // 格式: @厂家名/内容 + modelAlias = afterPrefix.substring(0, slashIdx).trim(); + prompt = afterPrefix.substring(slashIdx + 1).trim(); + } else if (spaceIdx > 0) { + // 格式: @厂家名 内容(空格分隔) + modelAlias = afterPrefix.substring(0, spaceIdx).trim(); + prompt = afterPrefix.substring(spaceIdx + 1).trim(); } else { - // 尾部无斜杠:整段去掉 @// 前缀作为模型名 - modelAlias = message.substring(3).trim(); + // 格式: @厂家名(无内容) + modelAlias = afterPrefix.trim(); prompt = ""; } + if (modelAlias.isEmpty()) { - p.sendMessage("§c[AI聊天] §f格式错误,应为 @//模型名/内容"); + p.sendMessage("§c[AI聊天] §f格式错误,应为 @厂家名/内容"); return; } if (prompt.isEmpty()) { @@ -772,7 +792,7 @@ public class AIChatManager { // 构建自动互动提示词 — 用压缩方法(超阈值时截断旧消息) String recentChat = compressChatBuffer(endpoint.maxToken); - String prompt = "以下是服务器最近的聊天记录:\n" + recentChat + "\n\n请根据聊天内容,自然地参与对话或回答问题。"; + String prompt = "以下是服务器最近的聊天记录:\n" + recentChat + "\n\n请根据聊天内容,自然地抛出一个话题或问题,引导大家参与讨论,带动服务器的活跃气氛。不要直接点名任何玩家,而是抛出一个开放性的话题让大家都能参与。"; plugin.getLogger().info("[AI聊天] 触发自动互动"); // ★ 死循环防护:触发前先更新时间戳,请求挂起/超时/失败都不会被下一秒重复触发 diff --git a/src/main/java/Sdf1_login/CreditManager.java b/src/main/java/Sdf1_login/CreditManager.java index ca04d46..162a9b1 100644 --- a/src/main/java/Sdf1_login/CreditManager.java +++ b/src/main/java/Sdf1_login/CreditManager.java @@ -564,18 +564,38 @@ public class CreditManager { if (sender instanceof Player) { ((Player) sender).openInventory(createMainGUI((Player) sender)); } else { - sender.sendMessage("§c用法: /credits [user <玩家名>]"); + sender.sendMessage("§c用法: /credits [玩家名|审批|approve]"); } return true; } String sub = args[0].toLowerCase(); + // ★ 快捷查积分:/credits <玩家名> 直接查,无需 user 关键字 + // 判断第一个参数是否是已知子命令 + boolean isSubCommand = sub.equals("user") || sub.equals("审批") || sub.equals("approve"); + if (!isSubCommand && args.length >= 1) { + // 直接是玩家名 → 查询积分 + String targetName = args[0]; + int targetScore = getScore(targetName); + sender.sendMessage("§d§l[信誉积分] §f" + targetName + " §7的当前积分: §e" + targetScore + + " §7(初始: " + DEFAULT_INIT_SCORE + ")"); + // 判断是否触发限制 + for (Map rule : getEnabledRules()) { + int minScore = ((Number) rule.get("min_score")).intValue(); + if (targetScore < minScore) { + String desc = (String) rule.get("description"); + sender.sendMessage("§c§l[信誉积分] §f" + targetName + " §7已触发限制: §c" + desc); + } + } + return true; + } + switch (sub) { case "user": - // /credits user <玩家名> — 任何人可查他人积分 + // /credits user <玩家名> — 兼容旧格式 if (args.length < 2) { - sender.sendMessage("§c用法: /credits user <玩家名>"); + sender.sendMessage("§c用法: /credits user <玩家名> 或直接 /credits <玩家名>"); return true; } String targetName = args[1]; @@ -660,7 +680,7 @@ public class CreditManager { default: sender.sendMessage("§c未知子命令: " + sub); - sender.sendMessage("§7用法: /credits [user <玩家名>]"); + sender.sendMessage("§7用法: /credits [玩家名|审批|approve]"); return true; } }