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 extends NotifyEvent> clazz;
NotifySubType(Class extends NotifyEvent> 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());