9 Commits

Author SHA1 Message Date
8b05c9aa10 Fixed an issue(#5) caused by renaming CommandResponseEvent to ReceiveCommandFeedbackEvent
Update version to v1.2.2
2022-06-20 20:11:18 +08:00
d5c29b61ff Update README_en-US.md 2022-05-23 20:03:33 +08:00
f719ba97ad Merge remote-tracking branch 'origin/master' 2022-05-23 20:00:57 +08:00
9a15414f3c Add README_en-US.md 2022-05-23 20:00:44 +08:00
95f688e970 Update README.md 2022-05-19 21:35:23 +08:00
d291d2a8d8 Update version to v1.2.1 2022-05-18 10:06:30 +08:00
ff04a5f107 Update version to v1.3.0
Support Listen Console Command Response
2022-05-18 10:02:39 +08:00
d9b09e48ce Merge remote-tracking branch 'origin/master'
# Conflicts:
#	.gitignore
2022-05-18 09:19:17 +08:00
8cdfcf3dc3 Add .gitignore 2022-05-13 09:38:40 +08:00
7 changed files with 178 additions and 29 deletions

View File

@@ -1,24 +1,32 @@
# gc-opencommand-plugin # gc-opencommand-plugin
中文 | [English](README_en-US.md)
一个为第三方客户端开放GC命令执行接口的插件 一个为第三方客户端开放GC命令执行接口的插件
# 服务端安装 ## 服务端安装
1. 在 [Release](https://github.com/jie65535/gc-opencommand-plugin/releases) 下载 `jar` 1. 在 [Release](https://github.com/jie65535/gc-opencommand-plugin/releases) 下载 `jar`
2. 放入 `plugins` 文件夹即可 2. 放入 `plugins` 文件夹即可
# 构建说明 ## 控制台连接
1. 首次启动时,会在 `plugins` 目录下生成一个 `opencommand-plugin` 目录,打开并编辑 `config.json`
2. 设置 `consoleToken` 的值为你的连接秘钥建议使用至少32字符的长随机字符串。
3. 重新启动服务端即可生效配置
4. 在客户端中选择控制台身份,并填写你的 `consoleToken` 即可以控制台身份运行指令
## 构建说明
1. 克隆仓库 1. 克隆仓库
2. 在目录下新建 `lib` 目录 2. 在目录下新建 `lib` 目录
3.`grasscutter-1.1.x-dev.jar` 放入 `lib` 目录 3.`grasscutter-1.1.x-dev.jar` 放入 `lib` 目录
4. `gradle build` 4. `gradle build`
# 玩家使用流程 ## 玩家使用流程
1. 在客户端中填写服务地址,确认是否支持 1. 在客户端中填写服务地址,确认是否支持
2. 填写UID发送验证码 2. 填写UID发送验证码
3. 将游戏内收到的**4位整数验证码**填入客户端校验 3. 将游戏内收到的**4位整数验证码**填入客户端校验
4. 享受便利! 4. 享受便利!
# 客户端请求流程 ## 客户端请求流程
1. `ping` 确认是否支持 `opencommand` 插件 1. `ping` 确认是否支持 `opencommand` 插件
2. `sendCode` 向指定玩家发送验证码1分钟内不允许重发保存返回的 `token` 2. `sendCode` 向指定玩家发送验证码1分钟内不允许重发保存返回的 `token`
3. 使用 `token` 和**4位整数验证码**发送 `verify` 校验 3. 使用 `token` 和**4位整数验证码**发送 `verify` 校验
@@ -26,13 +34,28 @@
--- ---
# API `/opencommand/api` ## `config.json`
```json
{
// 控制台连接令牌
"consoleToken": "",
// 验证码过期时间(秒)
"codeExpirationTime_S": 60,
// 临时令牌过期时间(秒)
"tempTokenExpirationTime_S": 300,
// 授权令牌最后使用过期时间(小时)
"tokenLastUseExpirationTime_H": 48
}
```
## API `/opencommand/api`
示例 示例
``` ```
https://127.0.0.1/opencommand/api https://127.0.0.1/opencommand/api
``` ```
# Request 请求 ### Request 请求
```java ```java
public final class JsonRequest { public final class JsonRequest {
public String token = ""; public String token = "";
@@ -41,7 +64,7 @@ public final class JsonRequest {
} }
``` ```
# Response 响应 ### Response 响应
```java ```java
public final class JsonResponse { public final class JsonResponse {
public int retcode = 200; public int retcode = 200;
@@ -50,27 +73,27 @@ public final class JsonResponse {
} }
``` ```
# Actions 动作 ### Actions 动作
## `ping` #### `ping`
data = null data = null
## `sendCode` #### `sendCode`
### Request ##### Request
data = uid (int) data = uid (int)
### Response ##### Response
data = token (string) data = token (string)
## `verify` 要求 `token` #### `verify` 要求 `token`
### Request ##### Request
data = code (int) data = code (int)
### Response ##### Response
#### Success: ###### Success:
code = 200 code = 200
#### Verification failed: ###### Verification failed:
code = 400 code = 400
## `command` 要求 `token` #### `command` 要求 `token`
### Request ##### Request
data = command (string) data = command (string)
### Response ##### Response
data = message (string) data = message (string)

96
README_en-US.md Normal file
View File

@@ -0,0 +1,96 @@
# gc-opencommand-plugin
[中文](README.md) | English
A plugin that opens the GC command execution interface for third-party clients
## Server installation
1. Download the `jar` in [Release](https://github.com/jie65535/gc-opencommand-plugin/releases)
2. Put it in the `plugins` folder
## Console connection
1. When starting for the first time, a `opencommand-plugin` directory will be generated under the `plugins` directory, open and edit `config.json`
2. Set the value of `consoleToken` to your connection key. It is recommended to use a long random string of at least 32 characters.
3. Restart the server to take effect
4. Select the console identity in the client, and fill in your `consoleToken` to run the command as the console identity
## Build
1. `git clone https://github.com/jie65535/gc-opencommand-plugin`
2. `cd gc-opencommand-plugin`
3. `mkdir lib`
4. `mv path/to/grasscutter-1.x.x-dev.jar ./lib`
5. `gradle build`
## Player
1. Fill in the service address in the client to confirm whether it supports
2. Fill in the UID and send the verification code
3. Fill in the **4-digit integer verification code** received in the game into the client verification
4. Enjoy the convenience!
## Client request
1. `ping` to confirm whether the `opencommand` plugin is supported
2. `sendCode` sends a verification code to the specified player (re-send is not allowed within 1 minute), and save the returned `token`
3. Send `verify` check using `token` and **4-digit integer verification code**
4. If the verification is passed, you can use the `token` to execute the `command` action
---
## `config.json`
```json
{
"consoleToken": "",
"codeExpirationTime_S": 60,
"tempTokenExpirationTime_S": 300,
"tokenLastUseExpirationTime_H": 48
}
```
## API `/opencommand/api`
Example
```
https://127.0.0.1/opencommand/api
```
## Request
```java
public final class JsonRequest {
public String token = "";
public String action = "";
public Object data = null;
}
```
## Response
```java
public final class JsonResponse {
public int retcode = 200;
public String message = "success";
public Object data;
}
```
## Actions
### `ping`
data = null
### `sendCode`
#### Request
data = uid (int)
#### Response
data = token (string)
### `verify`: Requires `token`
#### Request
data = code (int)
#### Response
##### Success:
code = 200
##### Verification failed:
code = 400
### `command`: Requires `token`
#### Request
data = command (string)
#### Response
data = message (string)

View File

@@ -4,7 +4,7 @@ plugins {
} }
group 'com.github.jie65535.opencommand' group 'com.github.jie65535.opencommand'
version 'dev-1.2.0' version 'dev-1.2.2'
sourceCompatibility = 17 sourceCompatibility = 17
targetCompatibility = 17 targetCompatibility = 17

View File

@@ -0,0 +1,17 @@
package com.github.jie65535.opencommand;
import emu.grasscutter.server.event.game.ReceiveCommandFeedbackEvent;
import emu.grasscutter.utils.MessageHandler;
public final class EventListeners {
private static MessageHandler consoleMessageHandler;
public static void setConsoleMessageHandler(MessageHandler handler) {
consoleMessageHandler = handler;
}
public static void onCommandResponse(ReceiveCommandFeedbackEvent event) {
if (consoleMessageHandler != null && event.getPlayer() == null) {
consoleMessageHandler.setMessage(event.getMessage());
}
}
}

View File

@@ -103,13 +103,19 @@ public final class OpenCommandHandler implements Router {
response.json(new JsonResponse()); response.json(new JsonResponse());
return; return;
} else if (req.action.equals("command")) { } else if (req.action.equals("command")) {
try { //noinspection SynchronizationOnLocalVariableOrMethodParameter
plugin.getLogger().info(String.format("IP: %s run command in console > %s", request.ip(), req.data)); synchronized (plugin) {
CommandMap.getInstance().invoke(null, null, req.data.toString()); try {
response.json(new JsonResponse()); plugin.getLogger().info(String.format("IP: %s run command in console > %s", request.ip(), req.data));
} catch (Exception e) { var resultCollector = new MessageHandler();
plugin.getLogger().warn("Run command failed.", e); EventListeners.setConsoleMessageHandler(resultCollector);
response.json(new JsonResponse(500, "error", e.getLocalizedMessage())); CommandMap.getInstance().invoke(null, null, req.data.toString());
response.json(new JsonResponse(resultCollector.getMessage()));
} catch (Exception e) {
plugin.getLogger().warn("Run command failed.", e);
EventListeners.setConsoleMessageHandler(null);
response.json(new JsonResponse(500, "error", e.getLocalizedMessage()));
}
} }
return; return;
} }

View File

@@ -19,6 +19,9 @@ package com.github.jie65535.opencommand;
import emu.grasscutter.Grasscutter; import emu.grasscutter.Grasscutter;
import emu.grasscutter.plugin.Plugin; import emu.grasscutter.plugin.Plugin;
import emu.grasscutter.server.event.EventHandler;
import emu.grasscutter.server.event.HandlerPriority;
import emu.grasscutter.server.event.game.ReceiveCommandFeedbackEvent;
import java.io.File; import java.io.File;
import java.io.FileReader; import java.io.FileReader;
@@ -40,6 +43,10 @@ public final class OpenCommandPlugin extends Plugin {
@Override @Override
public void onEnable() { public void onEnable() {
new EventHandler<>(ReceiveCommandFeedbackEvent.class)
.priority(HandlerPriority.HIGH)
.listener(EventListeners::onCommandResponse)
.register();
getHandle().addRouter(OpenCommandHandler.class); getHandle().addRouter(OpenCommandHandler.class);
getLogger().info("[OpenCommand] Enabled"); getLogger().info("[OpenCommand] Enabled");
} }

View File

@@ -1,7 +1,7 @@
{ {
"name": "opencommand-plugin", "name": "opencommand-plugin",
"description": "Open command interface for third-party clients", "description": "Open command interface for third-party clients",
"version": "dev-1.2.0", "version": "dev-1.2.2",
"mainClass": "com.github.jie65535.opencommand.OpenCommandPlugin", "mainClass": "com.github.jie65535.opencommand.OpenCommandPlugin",
"authors": ["jie65535"] "authors": ["jie65535"]
} }