Skip to content

Commit 9b92774

Browse files
authored
Update README.md
1 parent 7f3f114 commit 9b92774

File tree

1 file changed

+66
-19
lines changed

1 file changed

+66
-19
lines changed

README.md

Lines changed: 66 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,33 +2,41 @@
22

33
> 为shell脚本、mc指令、mcdr指令提供了一些触发器和接口,让mcdr自动根据某些条件触发脚本,更方便的使用全自动化管理脚本去做各种事情
44
5+
**_目前此插件部分功能无法在Windows上使用!如果在非posix操作系统上使用此插件,会在加载插件时收到警告。_**
6+
57
## 目的
68

79
有时,我们想要使用shell脚本管理服务器,但是不方便去让mc服务器全自动触发这些shell脚本,这个插件就是为了能更方便的使用各种脚本全自动维护/管理服务器
810

911
他可以为shell脚本提供一系列的“钩子”(也就是hooks),还有许多接口,让脚本的可定制化程度更高
1012

11-
举一个不太恰当的例子,我的服务器磁盘空间少,我想每次服务器回档之后,都把qb自动生成的那个overwrite给删除掉,怎么办?(假设overwrite文件夹位于`~/server/qb_multi/overwrite`
13+
## 使用方法
1214

13-
1.在`~/scripts/`下创建一个shell脚本`clean_overwrite.sh`
15+
### 几个概念
1416

15-
2.脚本里面写上
16-
```
17-
rm -rf ~/server/qb_multi/overwrite
18-
echo 成功删除overwrite!
19-
```
17+
1.`Task`(任务)
18+
\
19+
Task就是一个任务,任务是可执行的(可被手动执行也可以被自动执行)。目前支持三个任务类型(task_type)`shell_command`(shell指令) `server_command`(mc指令) `mcdr_command`(mcdr命令)
2020

21-
3.安装此插件
21+
2.`Hooks`(钩子)
22+
\
23+
插件内置了很多“钩子”,Hook是可以被触发的,一个Task可以被挂载(mount)到一个或多个Hooks下,也可以从一个hook中卸载(unmount)。一旦一个hook被触发,其下被挂载的所有Task全部会被执行(异步)。例如`on_server_started`会在mc服务端完全启动成功时被触发,其下挂载的所有任务会被异步执行
2224

23-
4.创建一个Task 名称:`clean_overwrite` 类型:`shell_command` 执行的命令:`~/scripts/clean_overwrite.sh`
24-
`!!hooks create clean_overwrite shell_command ~/scripts/clean_overwrite.sh`
25+
3.`Script`(脚本)
26+
\
27+
这里说的脚本是这个插件可以识别的yaml格式的脚本文件,脚本应放在`config/hooks/scripts`文件夹中。在插件被加载时或`!!hooks reload`指令被执行时,那个文件夹及子文件夹里面的所有脚本文件全部会被加载(注意是加载不是应用)
2528

26-
5.将`clean_overwrite`任务 挂载到`on_server_starting`(也就是服务器启动时执行的钩子)(每当一个“钩子”(也就是hooks)被触发时,其下挂载的所有任务将被依次执行,执行顺序不能保证;一个任务可以被挂载到多个hooks,也可以不挂载(也就是不自动运行))
27-
`!!hooks mount clean_overwrite on_server_starting`
29+
4.`Apply`(应用)
30+
\
31+
Apply和加载有区别,Apply是指:**插件创建Task、挂载Task的操作**,加载在前,应用在后
2832

29-
6.下次启动服务器时你就会发现,脚本被运行了!控制台显示:`成功清除overwrite!`(如果不出意外的话)
33+
手动应用就是你自己打指令`!!hooks create ...`之类的,脚本自动应用就是插件加载脚本后自动解析脚本,然后根据脚本内容自动创建task,挂载之类的
3034

31-
## 使用方法
35+
### 应用方式
36+
37+
分为两种:手动应用和脚本自动应用,先介绍手动应用
38+
39+
#### 手动应用
3240

3341
`!!hooks create <name> <task_type> <command>`
3442

@@ -62,24 +70,54 @@ echo 成功删除overwrite!
6270
on_user_info(就是有玩家或者控制台发送了消息或mcdr指令)(这俩具体去看mcdr文档)
6371
```
6472

73+
`!!hooks unmount <task> <hook>`
74+
75+
- 从一个hook卸载一个task
76+
77+
#### 脚本自动应用
78+
79+
首先要编写脚本,示例:
80+
``````
81+
tasks:
82+
motd: # 声明一个task(其实这个你可以随便写,task的名字取决于name)
83+
name: motd # 声明task的名字,别有空格
84+
task_type: shell_command # 任务类型
85+
command: date # 要执行的指令
86+
hooks: # 要挂载到的hook,必须是数组
87+
- on_server_started
88+
``````
89+
90+
### 其他指令
91+
92+
`!!hooks list mount`
93+
- 显示挂载情况
94+
95+
`!!hooks list task`
96+
- 显示所有被创建的task
97+
98+
`!!hooks run <task> <env>`
99+
- 手动执行任务(跟挂没挂载没关系)
100+
- `<task>` 任务名
101+
- `<env>` 参数列表(具体用法往下看),必须用`json`格式
102+
65103
## 高级用法
66104

67105
### 获取“参数”
68106

69-
有时,光有触发器还不够,我想在执行脚本时获取一些服务器的信息,怎么获取? ~~怎么感觉越来越像github actions了~~
107+
有时,光有hook还不够,我想在执行脚本时获取服务器的信息,怎么获取? ~~怎么感觉越来越像github actions了~~
70108

71109
插件在触发这些脚本时,自己是知道一些包含着服务器信息的对象的,关键是如何将对象中的信息传递给脚本,不同的task_type有不同的传递方式
72110

73-
shell_command:
111+
`shell_command`
74112
- 插件会把想要传递的信息放到环境变量中,假设你想执行`echo abababab`,实际上插件执行的命令是:`export xxx=xxx && export xxxx=xxxx && ... && echo abababab`
75113
- 注意:不同的hook传递不同类型的对象,比如`on_server_stopped`传递`server``return_code`两个对象,on_info传递`server``info`两个对象。插件会把每一个对象里面的每一个属性(函数除外)都放到各个环境变量中(除非这个对象是个基本类型,例如`on_server_stopped``return_code`对象),即使这个属性是一个非基本类型也会被转成str放进环境变量
76114
- 假设你想要访问`server`中的`mcdr`属性,那么在shell脚本中,你应该使用`$server_mcdr`访问这个属性,即`$对象名_属性名`,注意:通过这种方式无法访问函数,就算这个函数是一个无参且返回基本类型的函数也不行
77115

78-
server_command:
116+
`server_command`
79117
- 注意:不同的hook传递不同类型的对象,不同的对象有不同的属性
80118
- 插件在执行你指定的命令前,会对指令进行处理,例如`{$server_mcdr}`会被替换为`True`,跟shell的访问方法类似,仍然是`$对象名_属性名`访问属性,只不过多了个大括号
81119

82-
mcdr_command:
120+
`mcdr_command`
83121
- 注意:不同的hook传递不同类型的对象
84122
-`server_command`访问方法完全一样 ~~连代码都一样~~
85123

@@ -95,4 +133,13 @@ mcdr_command:
95133

96134
### 所有可以在脚本中访问的属性列表
97135

98-
TODO
136+
**_TODO_** ~~(其实就是懒)~~
137+
138+
粗略判定方法:
139+
140+
看插件源码,找到__init__.py,翻到最后,你会看到类似
141+
``````
142+
def on_mcdr_start(server: PluginServerInterface):
143+
trigger_hooks(Hooks.on_mcdr_started, server, {'server': process_arg_server(server)})
144+
``````
145+
这样的代码,先看函数名`on_mcdr_start`,就能大致判断这块代码负责触发`on_mcdr_started`,再看`trigger_hooks(...)`,括号里面的最后一个参数是一个`dict`,只有一个`server`键对值,说明最终脚本可以访问到的参数全都在`PluginServerInterface`类中,然后看就完了((((逃

0 commit comments

Comments
 (0)