-
Notifications
You must be signed in to change notification settings - Fork 3
[NEXT] 编写新功能
在老帕[NEXT]版本中,添加新功能有了船新的写法,不再像以前那样写个.py文件然后到config.py里再倒腾一番,而是写个.py文件然后到settings.json里倒腾一番。
总之倒腾是不变的,只是换了个位置。
[NEXT]版本的消息处理流程和之前不同,总共分成了三个步骤:
- Preprocessors(预处理):当平台上报数据时(备注:目前老帕没有鉴权功能,我也懒得写),原始的json会被附加三个额外的条目(
at_sender
:指at发送人的一个CQ码;base_url
:当前的平台接收端URL;suffix
:之前的“帮助”信息,默认值和以前一样可在config.py中修改),修改后的json会整个传送给所有的Preprocessor函数,每个函数处理后把json返回。 - Bot commands(plugins,bot命令/插件):同以前的bot命令处理流程,符合命令关键字即回复相关内容。
- Postprocessors(后处理):对于bot命令处理完成后未触发任何命令的数据,回复用的json和当前接收到的json会一并传递给Postprocessors函数,每个函数处理后返回内容,适用于非关键字类的功能处理。
预处理函数会获得当前上报的json作为参数,需要返回处理后的json和是否停止处理的布尔值,一个简单的预处理函数示例如下:
def preprocessor(j):
j['Lizard'] = 'Rakaloah'
return j, False
这个预处理函数会在每条信息上报后,在上报内容里附加一个Lizard
条目,内容是Rakaloah
。
程序将继续处理接下来的过程,因此返回了False
。返回 True
的话,老帕会直接返回 HTTP 204
,即不再处理这条信息。
注意:请尽量把上报的json返回来,否则之后的流程无法继续。别自蛳!
以前的Bot命令而已,给每个命令设定一个关键字,符合关键字的时候,触发这个命令,然后返回内容。
Bot命令不一定非得需要参数,这些设定可以在之后进行设置。
当前面的流程都跑了一遍还没有结束的时候,进入后处理流程。
后处理函数会获得当前的回复用json,以及上报的(经过预处理后的)json。它需要返回处理后的回复用json以及状态码。一个简单的后处理函数示意如下:
def postprocessor(j, resp):
if 'Lizard' in j:
resp['reply'] = '此条信息已由大蜥蜴审阅'
return resp, 200
else:
return resp, 204
# 等效于 return '', 204
这个后处理函数会检查上报的json有没有被附加一条 Lizard
条目,如果有,则会让bot回复 此条信息已由大蜥蜴审阅
,如果没有,则继续之后的处理流程。
注意:虽然在不需要做任何处理时返回 resp, 204
看起来很棒,但是 '', 204
也能达到相同的效果,为了防止搞混,特意让两种写法都🆗。
插件统一放在 Paarthurnax/plugins
文件夹中,且具有比较固定的格式:
Paarthurnax
|- plugins
| |- your_plugin
| | |- __init__.py
| | |- logic.py
插件是一个单独的文件夹,且当中至少包含一个 __init__.py
用于存储插件的 Metadata
。 Metadata
用于告诉老帕这个插件当中有什么功能。
一个基础的 __init__.py
包括以下内容:
import Paarthurnax.plugins.your_plugin.logic as logic
Metadata = {
'alert_functions': {
logic.alert: '00',
},
'bot_commands': {
'命令': [logic.bot_command, 0, [], 0, False, False, False],
},
'preprocessors': [
[logic.preprocessor, 0, []],
],
'postprocessors': [
[logic.postprocessor, 0, []],
],
}
很容易理解,就是告诉老帕这个插件里对于的几类功能是哪些。
需要注意的是 import
路径是从顶层路径 Paarthurnax
开始的。
几类功能如下:
- alert_functions:警报,每分钟都会执行一次的函数,后面的参数是在每分钟的第几秒执行。
- bot_commands:命令,格式和以前的
config.py
一样。后面都是默认参数值。 - preprocessors/postprocessors:上面解释过了,后面的两个参数是黑名单/白名单和对应的群号,和bot命令的格式一样。
如果你按照这个格式写好了,重启老帕之后它们就会自动被载入。
就这。没了。
每个命令的设置都会被存到 Paarthurnax/settings/settings.json
中,因为是个json而且老帕本身就是个HTTP服务器,所以可以通过浏览器访问 http://base_url/admin
来直接修改,这样就省去了我写跨平台UI的过程。
虽然做成RESTful前后端分离看起来很棒,但是何必呢……炫耀你会用vue.js还是怎么的……