Skip to content

[NEXT] 编写新功能

Zack Zhou edited this page Sep 25, 2020 · 3 revisions

在老帕[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函数,每个函数处理后返回内容,适用于非关键字类的功能处理。

Preprocessors - 预处理

预处理函数会获得当前上报的json作为参数,需要返回处理后的json和是否停止处理的布尔值,一个简单的预处理函数示例如下:

def preprocessor(j):
    j['Lizard'] = 'Rakaloah'
    return j, False

这个预处理函数会在每条信息上报后,在上报内容里附加一个Lizard条目,内容是Rakaloah

程序将继续处理接下来的过程,因此返回了False。返回 True 的话,老帕会直接返回 HTTP 204,即不再处理这条信息。

注意:请尽量把上报的json返回来,否则之后的流程无法继续。别自蛳!

Plugins - 插件

以前的Bot命令而已,给每个命令设定一个关键字,符合关键字的时候,触发这个命令,然后返回内容。

Bot命令不一定非得需要参数,这些设定可以在之后进行设置。

Postprocessors - 后处理

当前面的流程都跑了一遍还没有结束的时候,进入后处理流程。

后处理函数会获得当前的回复用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 用于存储插件的 MetadataMetadata 用于告诉老帕这个插件当中有什么功能。

一个基础的 __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还是怎么的……