接待喵插件-跑lua的qq机器人插件

缘起

说起这个qq机器人插件,其实这已经算是第二次重新编写这个项目了。

第一次写插件使用的是Flexlive SDK这个框架,主要是因为只会C#

后来这个插件框架的作者去搞了个新框架叫麻花,也就是Newbe.Mahua,不过这个框架说实话,用起来确实有点。。。。。看看下面酷q所有文件的图片就懂了:

各种dll全部需要扔到根目录,然后还附属了一堆其他的文件。。。。这种插件写出来很难直接给其他人使用,毕竟酷q插件都是打包好的cpk文件,拿来就用的

并且在编写插件的过程中,我直接加入了lua虚拟机的环境,导致根目录需要用到的dll更多了

现在使用的框架是Native.SDK,作者用到了Costura.Fody来作为打包工具,效果就是最后生成的文件全部打包进一个dll文件,也就可以直接打包成cpk文件发布了。和其他插件并无区别,看看干净的目录:

(感谢一下华落大佬提供的vps)

插件实现了什么?

插件现阶段实现的是,所有的消息收发逻辑全部使用lua脚本来实现。C#作为底层,把所有复杂的工作全部封装为简单的接口,供给lua层去调用,从而简化开发流程提高效率。

同时也因为收发逻辑都是靠lua脚本的,也使得它天生就可以动态地运行。一旦你改了某个lua文件,那么你的更改就立刻生效,完全不用重启和编译,节约大量时间。

具体可以直接去看插件项目GitHub的readme:
https://github.com/chenxuuu/receiver-meow

为什么要用lua?

lua占用小,同时语法简洁,适合用来做这些事情。毕竟我的时间根本不够用好吗!

某些关键代码实现

我不太喜欢造轮子,能力不够是一个方面,最主要是在有现成轮子的情况下,就没有去造轮子的动力了。所有lua虚拟机我直接使用了nlua框架。

在之前的博文里也解释过这方面的代码,没看过的可以去看看:
在C#里跑lua脚本 – Nlua 的简单使用

然而这里面有几个坑

首先是字符编码方面,由于是涉及到中文处理,那么乱码这种事情是想也不用想的,好在通过搜索nlua的issue,发现已经有人问过这个问题了,只要提前设置编码就不会乱码了:

lua.State.Encoding = Encoding.UTF8;

接下来就是在加上图片接口后,发现内存占用持续走高的问题。解决方案就是套个using,这个纯属是自己完全没有规范地写代码导致的,另外在查看文档时也没看到框架已经支持了这个:

using (var lua = new NLua.Lua())
{
    try
    {
        lua.State.Encoding = Encoding.UTF8;
        lua["handled"] = false;//处理标志
        Initial(lua);
        lua.DoString(code);
        if (file != "")
            lua.DoFile(Common.AppDirectory + "lua/" + file);
        return (bool)lua["handled"];
    }
    catch (Exception e)
    {
        Common.CqApi.AddLoger(Sdk.Cqp.Enum.LogerLevel.Error, "lua脚本错误", e.ToString());
        return false;
    }
}

再往后就是lua里的坑了,require文件提示不存在,这个问题花费了几个小时去寻找原因。

一开始直接使用绝对路径添加到package.path的后面:

--加上需要require的路径
package.path = package.path..
";"..apiGetPath().."data/app/com.papapoi.ReceiverMeow/lua/require/?.lua"

发现这样处理好像没什么用处,依旧报找不到。所以后来我改成了相对路径:

--加上需要require的路径
package.path = package.path..
";./data/app/com.papapoi.ReceiverMeow/lua/require/?.lua"

这个改动在我的环境里都是可以正常运行的(win10和win server 2016)。但是在一个用户那里,依旧一直报错。

最后的解决方案我也挺无语:把所有路径里的中文改成英文就好了。。。

实际使用

使用的时候基本可以把lua的优势都体现出来了,无非就是两点:

  • 占用极低
  • 开发迅速

占用的话一张图就可以表示了:

上面的酷q air使用的是Newbe.Mahua框架,由于就只有一个运行lua脚本的功能,所以我也没怎么更新过,一直在用老框架
下面的酷q pro使用的就是基于Native.SDK框架的了,基本不会增加什么负担

开发的时候也是挺舒服的,基本就是改几行代码,ctrl+s,然后就可以立刻在群里发两条消息测试了:

END

总之这个插件在我印象里貌似依旧改过不知道多少次了,希望这是最后一次重写吧(flag)

项目地址:https://github.com/chenxuuu/receiver-meow

欢迎各位star

2 Comments

发表评论

您的电子邮箱地址不会被公开。