情迁QQ机器人 Lua机器人插件开发教程

说明

目前支持机器人lua插件在2018年11月17日发布了,各位记得先情迁下载QQ机器人哈

本文章会慢慢补充,lua机器人插件能力将在情迁QQ机器人 1.8.8以及以上版本体现.

安装目录

新建lua文件 也即是.lua后缀名的文件拷贝到/sdcard/qssq666/robot_plugin_lua文件夹

LUA语法介绍

不懂lua语法的可以百度一下, 这里大概介绍一下基本的lua语法也就是和其它语言不相同的地方。
字符串拼接用.. 数字转文本用tostring(要转换的变量)
方法定义
参数名 没有类型,这是脚本语言的特点,简单的不能再简单,如js,python php

function 方法名(参数名)

end

有返回值的方法

function 方法名(参数名)
return true;
end

调用对象方法
obj:value() 这里使用:而java是用.
访问对象字段
输入log(robot.name)) 这是本机器人支持的访问举例.
注释
lua的注释是用 -- 而java是用// 易语言则用 或者某些语言用# bat 批处理用 ::

类型转换
字符串转number

str="333"
value=tonumber(str)
value=value+1  -- lua似乎不能自增,只能这么写

其他类型转字符串

obj=333
value=tostring(obj)

变量定义

global_var = 1 --全局变量
local temp_var = 2 --局部变量

循环

while (temp < 5) do
    temp = temp + 1
    print("result:" .. tostring(temp)) --这里体现了类型转换的语法。
end
for i = 1, 3 do
    print("从1 到 3,当前:" .. tostring(i))
end
for i = 1, 6, 2 do
    print("高级用法 当前:" .. tostring(i) .. ",我每下次执行将跳动2次,如果当前为1那么为1,下次则为3,i>6跳出循环")
end

逻辑分支

if (value1 > 10) then
    print("值大于10")
    if (value1 == 80) then
        print("内循环,等于80")
    else
        print("不是80,但是肯定>10")
    end
elseif (value1 == 100) then
    print("等于100")
else
    print("不知道等于夺嫂了")
end

控制台输出

print("ffff") --lua本身的语法,这个需要打开adb.exe查看过滤
System.out日志类型

情迁QQ机器人SDK独有api参数

第一步/必须导包
如果不导包,将无法正常使用下面这些方法。
require "cn.qssq666.robot.sdk"

日志提示

log(""警告日志")--输出警告日志
info("info日志")
debug("debug日志")
error("红色错误日志")
toast("toast提示日志")``这个运行后直接弹出气泡提示

lua掌握这一点点你就完全可以操作机器人大部分功能了 关于api方面呢其实和java doc api一样的,所以呢本文没有说明的方法完全可以举一反三的 从java 插件开发文档里面找到

收到消息的回调

function onReceiveMsgIsNeedIntercept(msgitem, aiteList, hasAite, hasAiteMe)

end

发送消息给指定人
这里的item是必须的,这个函数应该在onReceiveMsgIsNeedIntercept方法里面写,也就是item这个参数直接用这个函数的item就行了

api. sendPrivateMsg(item, qq,message);

更多api,完全可以参考java api推算出来,我有空会写一个完整的demo,现在还在架构机器人中....

举例

require "cn.qssq666.robot.sdk"

--  msgitem 消息体
-- aitelist 艾特的用户列表(不会包含自己)
-- hasAite 是否艾特了用户
-- hasAiteMe  是否艾特了机器人

function onReceiveMsgIsNeedIntercept(msgitem, aiteList, hasAite, hasAiteMe)
    log("call onReceiveMsgIsNeedIntercept")
    text = msgitem:getMessage() --获取收到的消息内容
    log("receiveMsg:" .. text)
    qq = msgitem:getSenderuin() -- 哪个qq发的消息
    log("print toString[" .. msgitem:toString()) --这个方法可以打印昵称,qq,消息内容,发送时间,等等。

    info = ",aiteUser=," .. tostring(hasAite) .. ",aiteRobot:" .. tostring(hasAiteMe)
     --见名知意
    log("state:" .. info)
    return true
end

--下面的代码无关紧要,自己酌情修改------------------------------
function onCreate(obj)
    log("onCreate call arg type: " .. type(obj))
end

function getPluginName()
    return "test plugin"
end

function onDestory()
    log("destory call")
end

再来一个能用的,发送消息LUA就会自动回复的机器人插件
复制下面的内容另存为 任意名.lua文件然后放到内部存储的qssq666/robot_plugin_lua文件夹中,然后运行情迁QQ机器人1.9.0
然后进入LUA插件管理就可以看到机器人了,记得进入机器人设置勾选启用机器人插件哦,不然发送消息LUA没有任何反应的哈
还可以长按编辑这个插件修改逻辑,也可以点击模拟测试一些机器人方法是否定义的情况。


-- 编写时间 2018.11
-- 文件编码 必须是UTF-8 must UTF-8
-- LUA插件的方法不受执行流程控制,因此测试这些代码的时候只能发送消息然后测试这些方法。
--或者可以不写在主流程中,比如如下代码的测试专用可以解除注释,当机器人加载的时候会气泡提示的toast调试,


require "cn.qssq666.robot.sdk" --必须调用,否则无法使用api,等方法,以及toast等,只能使用print了。
--测试专用代码区开始 

--可以直接运行 本文件放到内部存储 qssq666/robot_plugin_lua文件夹改后缀名 为.lua 然后在lua插件管理列表刷新然后长按运行或者编辑再运行。
-- 直接输入 adb push plugin.lua /sdcard/qssq666/robot_plugin_lua/ 推送到手机上。




--toast("插件被加载,插件名:"..getPluginName())
--下面的调试代码需要通过日志查看软件或者电脑ADBConsole.exe查看。
--info("插件加载了,")
--warn("这是警告日志")
--error("红色错误日志")
--log("也是警告日志语法糖")
--debug("调试信息,")

--测试专用代码区结束

--  ---------------------机器人插件加载区
--  msgitem 消息体
-- aitelist 艾特的用户列表(不会包含自己)
-- hasAite 是否艾特了用户
-- hasAiteMe  是否艾特了机器人
--收到一条消息调用此方法,返回true表示 消息由插件处理
--,否则交给机器人自身的逻辑,比如自身有点歌系统之类的。
--本方法不定义将毫无意义。
function onReceiveMsgIsNeedIntercept(msgitem, aiteList, hasAite, hasAiteMe)
    log("call onReceiveMsgIsNeedIntercept")
   local text = msgitem:getMessage() --获取收到的消息内容
    log("receiveMsg:" .. text)
    local qq = msgitem:getSenderuin() -- 哪个qq发的消息
    log("print toString[" .. msgitem:toString()) --这个方法可以打印昵称,qq,消息内容,发送时间,等等。
    if (text == "LUA") then
        -- chunkname:41 attempt to index ? (a nil value) zhaobu
        local str="Wellcome Use Lua Plugin! The is QssqRobot"
        msgitem:setMessage(str)
        print("item is nil?="..tostring(msgitem:getClass()==nil)..",className:"..tostring(msgitem:getClass()))
        print("api obj is nil?="..tostring(msgitem:getClass()==nil)..",className:"..tostring(api:getClass()))
        print(api:toString())
        api:showDebugToast("欢迎使用LUA机器人插件");
        -- print();
        -- print(msgitem:toString())
        api:sendMsg(msgitem) --是啥子消息我就回复啥消息 ,操作起来比较简单。
        return true
     --插件自身处理消息
    else
    end
    info = ",aiteUser=," .. tostring(hasAite) .. ",aiteRobot:" .. tostring(hasAiteMe)
    --见名知意
    log("state:" .. info)
    return false
end

--下面的代码无关紧要,自己酌情修改 ,可以不定义,------------------------------
--插件被加载的时候出发
function onCreate(obj)
    print("onCreate....[print]")
    log("onCreate call arg type: " .. type(obj))
end
--表示机器人最终处理的消息,即将发送的消息,是否拦截
function onReceiveRobotFinalCallMsgIsNeedIntercept(item, list, aite, haisaiteme)
    debug("call onReceiveRobotFinalCallMsgIsNeedIntercept..");
    return false
end
--插件作者名字 
function getAuthorName()
    return "情迁2018"
end
--返回插件名称,再插件管理列表可以显示
function getPluginName()
    return "test plugin"
end

--返回本插件的版本号 
function getVersionName()
    return "1.0" --返回机器人的版本号
end
--返回本插件的版本号 数字标识 整数
function getVersionCode()
    return 1;
end
--返回编译时间字符串
function getBuildTime( )
    -- body
    return "无"
end


--返回插件的描述信息
function getDescript()
    return "这是一个DEMO"
end
-- 返回插件demo包名
function getPackageName()
    return "cn.qssq666.lua.plugindemo"
end
--即将被销毁调用的方法。
function onDestory()
    log("destory call")
end

高级语法 lua创建java对象已经创建java实现类的模板diamante


frame = luajava.newInstance("java.awt.Frame", "Lua Java Console")
console = luajava.newInstance("java.awt.TextArea")
buttons_pn = luajava.newInstance("java.awt.Panel")
execute_bt = luajava.newInstance("java.awt.Button", "Execute")
clear_bt = luajava.newInstance("java.awt.Button", "Clear")
exit_bt = luajava.newInstance("java.awt.Button", "Exit")

frame:setSize(600,300)

buttons_pn:add(execute_bt)
buttons_pn:add(clear_bt)
buttons_pn:add(exit_bt)

BorderLayout = luajava.bindClass("java.awt.BorderLayout")

frame:add(BorderLayout.NORTH, console)
frame:add(BorderLayout.SOUTH, buttons_pn)
frame:pack()
frame:show()

--
-- Listeners
--

execute_cb = { 
actionPerformed = function(ev)
print("execute")
pcall(loadstring(console:getText()))
end
}

jproxy = luajava.createProxy("java.awt.event.ActionListener",execute_cb)

execute_bt:addActionListener(jproxy)


clear_cb = {actionPerformed= function (ev)
print("clear");
console:setText("");
end
}

jproxy = luajava.createProxy("java.awt.event.ActionListener" ,clear_cb)
clear_bt:addActionListener(jproxy)

exit_cb = { actionPerformed=function (ev)
print("exit")
frame:setVisible(false)
frame:dispose()
end
}


jproxyb = luajava.createProxy("java.awt.event.ActionListener" ,exit_cb)

exit_bt:addActionListener(jproxyb)

close_cb = { }
function close_cb.windowClosing(ev)
print("close")
frame:setVisible(false)
frame:dispose()
end

function close_cb.windowActivated(ev)
print("act")
end

jproxy = luajava.createProxy("java.awt.event.WindowListener", close_cb)
frame:addWindowListener(jproxy)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,558评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,002评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,024评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,144评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,255评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,295评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,068评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,478评论 1 305
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,789评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,965评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,649评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,267评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,982评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,800评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,847评论 2 351

推荐阅读更多精彩内容