Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

maa-cli 前后端分离 #322

Open
wangl-cc opened this issue Sep 9, 2024 · 4 comments
Open

maa-cli 前后端分离 #322

wangl-cc opened this issue Sep 9, 2024 · 4 comments
Labels
enhancement New feature or request
Milestone

Comments

@wangl-cc
Copy link
Member

wangl-cc commented Sep 9, 2024

现状

当前,maa-cli 执行任务主要包括以下步骤:

  1. 解析 MaaCore 相关配置 (profile/*.toml);
  2. 解析任务:对于自定义任务读取任务定义文件,对于预定义任务处理命令行参数;
  3. 根据任务修改部分配置;
  4. 加载 MaaCore 并根据配置进行初始化;
  5. 向 MaaCore 添加解析任务,并启动;
  6. 等待任务完成并推出程序。

问题

上述实现比较简单直接,但是存在以下几个问题:

  • 每次执行任务都需要加载并配置 MaaCore,这需要耗费一定时间(约几秒)。这在执行比较长的任务可以忽略,但是对于执行简单的任务,尤其是通过命令行连续执行多个任务时,这个开销是不能忽略。
  • 目前 maa-cli 启动后没有任何外部干预途径。MaaCore 部分选项允许运行时更改,而 maa-cli 当前实现方式无法做到。
  • 未来 maa-cli 可以作为一个后端,给供其他前端调用。这样其他前端就可以避免相对复杂的 MaaCore FFI,同时也可以基于此开发 WebUI。

解决办法

为 maa-cli 引入一个 Server 模式,通过 maa serve 启动。启动后 maa-cli 将作为一个 RPC Server, 并监听某一个 Unix 或者 TCP Socket。maa runmaa startup 等命令将解析任务后向服务器发送请求。maa-cli 在运行任务时如果 server 未启动,将自行启动一个 server,并将其作为守护程序在后台活跃一段时间,然后通过相应的

具体实施

  • RPC 框架:JSON-RPC (crate jsonrpsee)。简单,易于调试,浏览器原生支持,易于和已有代码集成。RPC 协议相关的结构体,通过一个单独的 Crate 实现。
  • 传输:WebSocket or WS+TLS。WS 相比 HTTP 更高效,全双工,同时和 HTTP 一样受到浏览器原生支持。

RPC API 列表

添加任务

方法名称: AppendTask

请求:

任务类型以及序列化为 JSON 的字符串。

{
  "taskType": "StartUp",
  "taskParams": \"{}\",
}

响应:

{
  "taskId": "1"
}

其中 0 表示添加失败。

修改任务参数

方法名称: SetParams

请求:

{
  "taskId": "1",
  "newParams": {
	"client_type": "Txwy"
  }
}

响应:

{
  "success": true
}

启动任务

方法名称: Start

请求:

{}

响应:

{
  "success": true
}

停止任务

方法名称: Stop

请求:

{}

响应:

{
  "success": true
}

检查任务是否正在进行

方法名称: Running

请求:

{}

响应:

{
  "running": false
}

关闭 Server

方法名称: Terminate

请求:

{}

响应:

{
  "success": true
}
@wangl-cc wangl-cc changed the title maa-cli server 实现细节 maa-cli server 实现 Sep 9, 2024
@wangl-cc wangl-cc changed the title maa-cli server 实现 maa-cli server, client 分离实现 Sep 9, 2024
@wangl-cc wangl-cc changed the title maa-cli server, client 分离实现 maa-cli server, client 分离实现文档 Sep 9, 2024
@wangl-cc
Copy link
Member Author

wangl-cc commented Sep 9, 2024

@BoredTape 你可以在这个 issue 写一下你的想法,我其实还没有完全确定要怎么做,我也不是专业的开发,所以欢迎提出任何意见。

@BoredTape
Copy link

BoredTape commented Sep 10, 2024

@BoredTape 你可以在这个 issue 写一下你的想法,我其实还没有完全确定要怎么做,我也不是专业的开发,所以欢迎提出任何意见。

首先,我这边的想法不是普通用户的想法,可以不用太在意,对于普通用户来说,我的想法是比较离谱的。

1.分开client和server的话,我比较关心server端,server如果可以做成一个crate的话,我这边比较方便嵌入到maabo(实话实说,我觉得我这想法是很离谱的)。
2.server端希望可以提供一个优雅的退出方式。(目前的Terminate应该足够了)
3.希望client和server之间的通信方式是流的,server端在执行一个任务时,会不断输出信息,如:目前的战斗,干员识别等。这个时候希望作为client端可以持续接收到server端的输出信息。grpc的流模式或者是websocket是可以做到的。
4.如果3可以实现,那么持续收到的server输出信息中,可以明确一个任务状态,如:DONEERRORRUNNINGPENDING

目前想到的就这些

@wangl-cc
Copy link
Member Author

wangl-cc commented Sep 10, 2024

我觉得的话,client 不一定要负责启动客户端。走 RPC 的话,我觉得如果有可能,能让 MaaBo 支持非自己启动的 server 吗?这样就可以复用 cli 和 core,以及理论上可能的连接远程 server。

@BoredTape
Copy link

我觉得的话,client 不一定要负责启动客户端。走 RPC 的话,我觉得如果有可能,能让 MaaBo 支持非自己启动的 server 吗?这样就可以复用 cli 和 core,以及理论上可能的连接远程 server。

理论上是可以连接远程server的,不过task信息就要做相关的接口获取,现在MaaBo为了跟官方的体验一直,是写死了一份task配置包含:startup、flight等等的任务,这个看你server怎么定,我再适配。至于MaaBo启动server这个,是因为我日后想适配安卓端

@wangl-cc wangl-cc added the enhancement New feature or request label Oct 16, 2024
@wangl-cc wangl-cc changed the title maa-cli server, client 分离实现文档 maa-cli 前后端分离 Oct 16, 2024
@wangl-cc wangl-cc added this to the v0.6 milestone Oct 22, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

2 participants