From 448167d021f7d57baa9cbdab5efa963684977444 Mon Sep 17 00:00:00 2001 From: wzp Date: Fri, 30 Aug 2024 00:33:09 +0800 Subject: [PATCH] feat: adding list command and send command fix: fix NotifySubType Error --- .idea/misc.xml | 5 +- build.gradle.kts | 2 +- .../src/main/java/cn/wzpmc/api/IMainApi.java | 17 ++++ .../message/get/GetFriendListAction.java | 1 - .../notice/notify/InputStatusNotifyEvent.java | 24 ++++++ .../events/notice/notify/NotifySubType.java | 9 +- .../java/cn/wzpmc/user/CommandSender.java | 11 +++ .../wzpmc/user/group/GroupCommandSender.java | 9 +- src/main/java/cn/wzpmc/Main.java | 19 ++--- .../wzpmc/builtin/commands/HelpCommand.java | 81 +++++++++++++----- .../wzpmc/builtin/commands/ListCommand.java | 84 +++++++++++++++++++ .../wzpmc/builtin/commands/SendCommand.java | 62 ++++++++++++++ .../wzpmc/builtin/commands/StopCommand.java | 3 + 13 files changed, 289 insertions(+), 38 deletions(-) create mode 100644 mybot-api/src/main/java/cn/wzpmc/events/notice/notify/InputStatusNotifyEvent.java create mode 100644 src/main/java/cn/wzpmc/builtin/commands/ListCommand.java create mode 100644 src/main/java/cn/wzpmc/builtin/commands/SendCommand.java diff --git a/.idea/misc.xml b/.idea/misc.xml index cdd1e91..a9b4218 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -5,9 +5,10 @@ - + - + + diff --git a/build.gradle.kts b/build.gradle.kts index 93c9844..c50c7a3 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -14,7 +14,7 @@ allprojects { apply(plugin = "java") val groupName by extra("cn.wzpmc") val projectArtifactId by extra("my-bot") - val projectVersion by extra("1.0.1") + val projectVersion by extra("1.0.2") repositories { mavenCentral() maven("https://libraries.minecraft.net") diff --git a/mybot-api/src/main/java/cn/wzpmc/api/IMainApi.java b/mybot-api/src/main/java/cn/wzpmc/api/IMainApi.java index b209256..02883f0 100644 --- a/mybot-api/src/main/java/cn/wzpmc/api/IMainApi.java +++ b/mybot-api/src/main/java/cn/wzpmc/api/IMainApi.java @@ -1,5 +1,7 @@ package cn.wzpmc.api; +import lombok.SneakyThrows; + /** * 主Api接口 * @@ -20,4 +22,19 @@ public interface IMainApi { * @since 2024/8/23 21:32 v0.0.5-dev */ ActionResponse doApiCall(Action packet) throws InterruptedException; + + /** + * 进行请求操作 + * + * @param packet 请求包 + * @param 请求类型 + * @param 返回类型 + * @return 请求返回包 + * @author wzp + * @since 2024/8/27 15:11 v1.0.2 + */ + @SneakyThrows + default ActionResponse doApiCallSafe(Action packet) { + return doApiCall(packet); + } } diff --git a/mybot-api/src/main/java/cn/wzpmc/api/actions/message/get/GetFriendListAction.java b/mybot-api/src/main/java/cn/wzpmc/api/actions/message/get/GetFriendListAction.java index 3a8dbe9..5f86bed 100644 --- a/mybot-api/src/main/java/cn/wzpmc/api/actions/message/get/GetFriendListAction.java +++ b/mybot-api/src/main/java/cn/wzpmc/api/actions/message/get/GetFriendListAction.java @@ -3,7 +3,6 @@ package cn.wzpmc.api.actions.message.get; import cn.wzpmc.api.Action; import cn.wzpmc.api.Actions; import cn.wzpmc.entities.FriendInformation; -import cn.wzpmc.entities.MessageInformation; import java.util.List; diff --git a/mybot-api/src/main/java/cn/wzpmc/events/notice/notify/InputStatusNotifyEvent.java b/mybot-api/src/main/java/cn/wzpmc/events/notice/notify/InputStatusNotifyEvent.java new file mode 100644 index 0000000..5f26290 --- /dev/null +++ b/mybot-api/src/main/java/cn/wzpmc/events/notice/notify/InputStatusNotifyEvent.java @@ -0,0 +1,24 @@ +package cn.wzpmc.events.notice.notify; + +import com.alibaba.fastjson2.annotation.JSONField; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 用户正在输入事件 + * + * @author wzp + * @version 1.0.2 + * @since 2024/8/29 21:52 + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class InputStatusNotifyEvent extends NotifyEvent { + /** + * 状态文本 + * + * @since 2024/8/29 23:16 v1.0.2 + */ + @JSONField(name = "status_text") + private String statusText; +} diff --git a/mybot-api/src/main/java/cn/wzpmc/events/notice/notify/NotifySubType.java b/mybot-api/src/main/java/cn/wzpmc/events/notice/notify/NotifySubType.java index 80ff308..18a9e28 100644 --- a/mybot-api/src/main/java/cn/wzpmc/events/notice/notify/NotifySubType.java +++ b/mybot-api/src/main/java/cn/wzpmc/events/notice/notify/NotifySubType.java @@ -27,7 +27,14 @@ public enum NotifySubType { * * @since 2024/8/1 下午10:16 v0.0.2-dev */ - HONOR(HonorNotifyEvent.class); + HONOR(HonorNotifyEvent.class), + + /** + * 用户正在输入事件 + * + * @since 2024/8/29 21:52 v1.0.2 + */ + INPUT_STATUS(InputStatusNotifyEvent.class); public final Class clazz; NotifySubType(Class clazz) { diff --git a/mybot-api/src/main/java/cn/wzpmc/user/CommandSender.java b/mybot-api/src/main/java/cn/wzpmc/user/CommandSender.java index 2be5956..102b9b6 100644 --- a/mybot-api/src/main/java/cn/wzpmc/user/CommandSender.java +++ b/mybot-api/src/main/java/cn/wzpmc/user/CommandSender.java @@ -84,4 +84,15 @@ public interface CommandSender { default boolean isAdmin() { return this.getPermissions().isAdmin(); } + + /** + * 检查指令发送者是否为完整权限管理员 + * + * @return 是否为管理员 + * @author wzp + * @since 2024/8/27 15:05 v1.0.2 + */ + default boolean isFullAdmin() { + return this instanceof IBot || IBot.getInstance().isBotOp(this.getId()); + } } diff --git a/mybot-api/src/main/java/cn/wzpmc/user/group/GroupCommandSender.java b/mybot-api/src/main/java/cn/wzpmc/user/group/GroupCommandSender.java index 68c8116..f6582fc 100644 --- a/mybot-api/src/main/java/cn/wzpmc/user/group/GroupCommandSender.java +++ b/mybot-api/src/main/java/cn/wzpmc/user/group/GroupCommandSender.java @@ -72,7 +72,14 @@ public class GroupCommandSender extends GroupUser implements CommandSender { JsonMessage jsonMessage = new JsonMessage(); List messageParts = jsonMessage.getMessageParts(); messageParts.add(new At(this.getId())); - messageParts.add(StringMessage.text(" " + messageComponent.toMessageString())); + messageParts.add(StringMessage.text(" ")); + if (messageComponent instanceof StringMessage) { + messageParts.add((StringMessage) messageComponent); + } + if (messageComponent instanceof JsonMessage) { + List jsonMessageParts = ((JsonMessage) messageComponent).getMessageParts(); + messageParts.addAll(jsonMessageParts); + } SendGroupMessageAction sendGroupMessageAction = new SendGroupMessageAction(this.groupId, jsonMessage); mainApi.doApiCall(sendGroupMessageAction); } diff --git a/src/main/java/cn/wzpmc/Main.java b/src/main/java/cn/wzpmc/Main.java index 2f59ae9..ffdaf53 100644 --- a/src/main/java/cn/wzpmc/Main.java +++ b/src/main/java/cn/wzpmc/Main.java @@ -2,10 +2,7 @@ package cn.wzpmc; import cn.wzpmc.api.IMainApi; import cn.wzpmc.api.actions.message.get.GetLoginInfoAction; -import cn.wzpmc.builtin.commands.DeOpCommand; -import cn.wzpmc.builtin.commands.HelpCommand; -import cn.wzpmc.builtin.commands.OpCommand; -import cn.wzpmc.builtin.commands.StopCommand; +import cn.wzpmc.builtin.commands.*; import cn.wzpmc.builtin.event.CommandEventHandler; import cn.wzpmc.configuration.Configuration; import cn.wzpmc.console.MyBotConsole; @@ -96,12 +93,6 @@ public class Main { } load.onLoad(); } - // 注册内置指令 - CommandManager commandManager = myBot.getCommandManager(); - commandManager.registerCommand(new StopCommand(myBot)); - commandManager.registerCommand(new OpCommand()); - commandManager.registerCommand(new HelpCommand()); - commandManager.registerCommand(new DeOpCommand()); } public static WebSocketConnectionHandler createConnection(MyBot myBot, URI uri) { @@ -137,6 +128,14 @@ public class Main { // 获取Bot消息 mainApi.doApiCall(new GetLoginInfoAction()); myBot.registerEventHandler(new CommandEventHandler()); + // 注册内置指令 + CommandManager commandManager = myBot.getCommandManager(); + commandManager.registerCommand(new StopCommand(myBot)); + commandManager.registerCommand(new OpCommand()); + commandManager.registerCommand(new HelpCommand()); + commandManager.registerCommand(new DeOpCommand()); + commandManager.registerCommand(new ListCommand()); + commandManager.registerCommand(new SendCommand()); startConsole(myBot, webSocketConnectionHandler); } } \ No newline at end of file diff --git a/src/main/java/cn/wzpmc/builtin/commands/HelpCommand.java b/src/main/java/cn/wzpmc/builtin/commands/HelpCommand.java index 86f8468..f99beac 100644 --- a/src/main/java/cn/wzpmc/builtin/commands/HelpCommand.java +++ b/src/main/java/cn/wzpmc/builtin/commands/HelpCommand.java @@ -8,7 +8,9 @@ import cn.wzpmc.plugins.CommandManager; import cn.wzpmc.user.CommandSender; import cn.wzpmc.user.IBot; import com.mojang.brigadier.CommandDispatcher; +import com.mojang.brigadier.arguments.StringArgumentType; import com.mojang.brigadier.builder.LiteralArgumentBuilder; +import com.mojang.brigadier.builder.RequiredArgumentBuilder; import com.mojang.brigadier.tree.CommandNode; import com.mojang.brigadier.tree.RootCommandNode; @@ -22,6 +24,13 @@ import java.util.concurrent.ConcurrentHashMap; * @since 2024/8/25 15:07 */ public class HelpCommand implements BrigadierCommand { + private final CommandManager commandManager; + + public HelpCommand() { + IBot instance = MyBot.getInstance(); + this.commandManager = (CommandManager) instance.getCommandManager(); + } + private static void handlerNode(Collection> node, int tabCount, StringBuilder builder) { for (CommandNode commandSenderCommandNode : node) { builder.append("\t".repeat(Math.max(0, tabCount))); @@ -31,29 +40,57 @@ public class HelpCommand implements BrigadierCommand { } } + private Collection> getRootCommandNode() { + CommandDispatcher dispatcher = this.commandManager.getDispatcher(); + RootCommandNode root = dispatcher.getRoot(); + return root.getChildren(); + } + @Override public LiteralArgumentBuilder getCommandNode() { - return LiteralArgumentBuilder.literal("help").executes(e -> { - IBot instance = MyBot.getInstance(); - CommandManager commandManager = (CommandManager) instance.getCommandManager(); - CommandDispatcher dispatcher = commandManager.getDispatcher(); - RootCommandNode root = dispatcher.getRoot(); - Collection> children = root.getChildren(); - CommandSender source = e.getSource(); - for (CommandNode child : children) { - StringBuilder builder = new StringBuilder(); - builder.append('\n'); - builder.append('/'); - builder.append(child.getUsageText()); - builder.append('\n'); - handlerNode(child.getChildren(), 1, builder); - source.sendMessage(StringMessage.text(builder.toString())); - } - ConcurrentHashMap rawCommands = commandManager.getRawCommands(); - for (Map.Entry stringRawCommandEntry : rawCommands.entrySet()) { - source.sendMessage(StringMessage.text("/" + stringRawCommandEntry.getKey())); - } - return 0; - }); + return LiteralArgumentBuilder.literal("help"). + executes(e -> { + Collection> children = getRootCommandNode(); + CommandSender source = e.getSource(); + for (CommandNode child : children) { + StringBuilder builder = new StringBuilder(); + builder.append('/'); + builder.append(child.getUsageText()); + builder.append('\n'); + handlerNode(child.getChildren(), 1, builder); + builder.deleteCharAt(builder.lastIndexOf("\n")); + source.sendMessage(StringMessage.text(builder.toString())); + } + ConcurrentHashMap rawCommands = this.commandManager.getRawCommands(); + for (Map.Entry stringRawCommandEntry : rawCommands.entrySet()) { + source.sendMessage(StringMessage.text("/" + stringRawCommandEntry.getKey())); + } + return 0; + }). + then(RequiredArgumentBuilder. + argument("root", StringArgumentType.word()). + executes(e -> { + String root = e.getArgument("root", String.class); + Collection> children = getRootCommandNode(); + CommandSender source = e.getSource(); + for (CommandNode child : children) { + if (!child.getName().equals(root)) { + continue; + } + StringBuilder builder = new StringBuilder(); + builder.append('/'); + builder.append(child.getUsageText()); + builder.append('\n'); + handlerNode(child.getChildren(), 1, builder); + builder.deleteCharAt(builder.lastIndexOf("\n")); + source.sendMessage(StringMessage.text(builder.toString())); + } + ConcurrentHashMap rawCommands = this.commandManager.getRawCommands(); + for (Map.Entry stringRawCommandEntry : rawCommands.entrySet()) { + source.sendMessage(StringMessage.text("/" + stringRawCommandEntry.getKey())); + } + return 0; + }) + ); } } diff --git a/src/main/java/cn/wzpmc/builtin/commands/ListCommand.java b/src/main/java/cn/wzpmc/builtin/commands/ListCommand.java new file mode 100644 index 0000000..b746eb1 --- /dev/null +++ b/src/main/java/cn/wzpmc/builtin/commands/ListCommand.java @@ -0,0 +1,84 @@ +package cn.wzpmc.builtin.commands; + +import cn.wzpmc.api.ActionResponse; +import cn.wzpmc.api.IMainApi; +import cn.wzpmc.api.actions.message.get.GetFriendListAction; +import cn.wzpmc.api.actions.message.get.GetGroupListAction; +import cn.wzpmc.commands.BrigadierCommand; +import cn.wzpmc.entities.FriendInformation; +import cn.wzpmc.entities.GroupInformation; +import cn.wzpmc.message.StringMessage; +import cn.wzpmc.user.CommandSender; +import cn.wzpmc.user.IBot; +import com.mojang.brigadier.builder.LiteralArgumentBuilder; + +import java.util.List; +import java.util.Objects; + +/** + * @author wzp + * @version 1.0.2 + * @since 2024/8/27 14:59 + */ +public class ListCommand implements BrigadierCommand { + private final IMainApi api; + + public ListCommand() { + api = IBot.getInstance().getMainApi(); + } + + @Override + public LiteralArgumentBuilder getCommandNode() { + return LiteralArgumentBuilder.literal("list"). + requires(CommandSender::isFullAdmin). + executes(e -> { + StringBuilder builder = new StringBuilder(); + buildFriendList(builder); + buildGroupList(builder); + CommandSender source = e.getSource(); + source.sendMessage(StringMessage.text(builder.toString())); + return 0; + }). + then(LiteralArgumentBuilder.literal("user"). + executes(e -> { + StringBuilder builder = new StringBuilder(); + buildFriendList(builder); + CommandSender source = e.getSource(); + source.sendMessage(StringMessage.text(builder.toString())); + return 0; + }) + ).then(LiteralArgumentBuilder.literal("group"). + executes(e -> { + StringBuilder builder = new StringBuilder(); + buildGroupList(builder); + CommandSender source = e.getSource(); + source.sendMessage(StringMessage.text(builder.toString())); + return 0; + }) + ); + } + + private void buildFriendList(StringBuilder builder) { + ActionResponse> listActionResponse = api.doApiCallSafe(new GetFriendListAction()); + List data = listActionResponse.getData(); + builder.append("好友:").append('\n'); + for (FriendInformation friendInformation : data) { + String name = friendInformation.getName(); + builder.append(name); + String nickname = friendInformation.getNickname(); + if (!Objects.equals(nickname, "") && !Objects.equals(nickname, name)) { + builder.append('[').append(nickname).append(']'); + } + builder.append('(').append(friendInformation.getId()).append(')').append('\n'); + } + } + + private void buildGroupList(StringBuilder builder) { + ActionResponse> groupListResponse = api.doApiCallSafe(new GetGroupListAction()); + List data = groupListResponse.getData(); + builder.append("群聊:").append('\n'); + for (GroupInformation groupInformation : data) { + builder.append(groupInformation.getGroupName()).append('(').append(groupInformation.getGroupId()).append(')').append('\n'); + } + } +} diff --git a/src/main/java/cn/wzpmc/builtin/commands/SendCommand.java b/src/main/java/cn/wzpmc/builtin/commands/SendCommand.java new file mode 100644 index 0000000..f967b54 --- /dev/null +++ b/src/main/java/cn/wzpmc/builtin/commands/SendCommand.java @@ -0,0 +1,62 @@ +package cn.wzpmc.builtin.commands; + +import cn.wzpmc.api.IMainApi; +import cn.wzpmc.api.actions.message.send.SendGroupMessageAction; +import cn.wzpmc.api.actions.message.send.SendPrivateMessageAction; +import cn.wzpmc.commands.BrigadierCommand; +import cn.wzpmc.message.StringMessage; +import cn.wzpmc.user.CommandSender; +import cn.wzpmc.user.IBot; +import com.mojang.brigadier.arguments.LongArgumentType; +import com.mojang.brigadier.arguments.StringArgumentType; +import com.mojang.brigadier.builder.LiteralArgumentBuilder; +import com.mojang.brigadier.builder.RequiredArgumentBuilder; + +/** + * @author wzp + * @version 1.0.2 + * @since 2024/8/27 14:54 + */ +public class SendCommand implements BrigadierCommand { + private final IMainApi api; + + public SendCommand() { + IBot instance = IBot.getInstance(); + this.api = instance.getMainApi(); + } + + @Override + public LiteralArgumentBuilder getCommandNode() { + return LiteralArgumentBuilder.literal("send") + .then(LiteralArgumentBuilder. + literal("group"). + then(RequiredArgumentBuilder.argument("id", LongArgumentType.longArg()). + then(RequiredArgumentBuilder.argument("content", StringArgumentType.greedyString()). + executes(e -> { + CommandSender source = e.getSource(); + Long id = e.getArgument("id", Long.class); + String content = e.getArgument("content", String.class); + api.doApiCallSafe(new SendGroupMessageAction(id, StringMessage.text(content))); + source.sendMessage(StringMessage.text("发送成功!")); + return 0; + }) + ) + ) + ) + .then(LiteralArgumentBuilder. + literal("user"). + then(RequiredArgumentBuilder.argument("id", LongArgumentType.longArg()). + then(RequiredArgumentBuilder.argument("content", StringArgumentType.greedyString()). + executes(e -> { + CommandSender source = e.getSource(); + Long id = e.getArgument("id", Long.class); + String content = e.getArgument("content", String.class); + api.doApiCallSafe(new SendPrivateMessageAction(id, StringMessage.text(content))); + source.sendMessage(StringMessage.text("发送成功!")); + return 0; + }) + ) + ) + ); + } +} diff --git a/src/main/java/cn/wzpmc/builtin/commands/StopCommand.java b/src/main/java/cn/wzpmc/builtin/commands/StopCommand.java index c27ce4f..c80cf59 100644 --- a/src/main/java/cn/wzpmc/builtin/commands/StopCommand.java +++ b/src/main/java/cn/wzpmc/builtin/commands/StopCommand.java @@ -25,6 +25,9 @@ public class StopCommand implements BrigadierCommand { public LiteralArgumentBuilder getCommandNode() { return LiteralArgumentBuilder.literal("stop") .requires(e -> { + if (e instanceof IBot) { + return true; + } Ops ops = bot.getOps(); Set admins = ops.getAdmins(); return admins.contains(e.getId());