![]() |
![]() ![]() |
![]() |
|
2010-05-27, 07:18
Post
#1
|
|||
比非主流还非主流的Lua原教旨主义机械师 ![]() ![]()
Group: Avatar Posts: 415 Joined: 2007-07-25 Member No.: 14794 ![]() |
出于qq群的群众需要,我编写了一个qq机器人,用于投骰等目的。
现在已经到了第4个主版本。 项目主页: http://code.google.com/p/qqdicebot/ svn链接:(未稳定,随时更新) https://qqdicebot.googlecode.com/svn/branches/qqdicebot4_xp 代码基于小虾的myqq,使用GPLv3协议。 向下翻到第3点,直接开始有意思的部分。 开发者注意!最近更新:这里 ------------------------------------------------- 待完成的内容: dnd的骰属性功能 wod骰 各种投骰结果的细节显示 This post has been edited by bx_bob: 2010-09-07, 11:16 |
|||
|
2010-05-27, 20:48
Post
#2
|
|||
比非主流还非主流的Lua原教旨主义机械师 ![]() ![]()
Group: Avatar Posts: 415 Joined: 2007-07-25 Member No.: 14794 ![]() |
1.机器人的形式
一开始计划做这个机器人的时候,是想做一个qq的插件,抓取内容然后自动说话什么的。可惜腾讯不断加强qq的抗木马/病毒能力,又不开放任何api。 后来想到可以用一个独立开源的qq客户端(最初想的是gaim(pidgin)),在接受/发送消息函数后插入函数对内容进行分析。经过搜索,找到了小虾的myqq: http://xiaoxia.org/home/read.do?id=1222 经过测试可以使用后就决定用它了。 这样做的优点是开发容易(原作者用的是gnu c呢……),缺点是需要单独占用一个qq号,而且随着qq更新,不知道哪一天就会用不了。 ------------------------------------------------- This post has been edited by bx_bob: 2010-05-31, 18:51 |
|||
|
2010-05-31, 18:49
Post
#3
|
|||
比非主流还非主流的Lua原教旨主义机械师 ![]() ![]()
Group: Avatar Posts: 415 Joined: 2007-07-25 Member No.: 14794 ![]() |
2.机器人的结构
一开始各种投骰的函数是直接写在myqq.c中的,后来因为维护麻烦,引入了lua脚本。 再后来因为代码异常混乱,下定决心重写一遍,将更多的功能塞进lua里,就有了现在的第4版。 基本的结构如下 qq客户端宿主(myqq.exe)--lua脚本宿主(lua51.dll,lua5.1.dll)--lua脚本(main.lua……以及很多) 由myqq.exe加载main.lua,并且向这个脚本暴露say_qun(消息内容,群号),say_buddy(消息内容,qq号),to_gb(内容)三个函数。 具体代码如下 r90:myqq.c:699: CODEBOX L=lua_open(); 而main.lua则起了重要的承接作用,它首先会载入其他的lua文件(都在luascript文件夹下),luaL_openlibs(L); luaL_dofile(L,"main.lua"); lua_pushcfunction(L, lua_say_qun); lua_setglobal(L, "say_qun"); lua_pushcfunction(L, lua_say_buddy); lua_setglobal(L, "say_buddy"); lua_pushcfunction(L, lua_to_gb_force); lua_setglobal(L, "to_gb"); CODEBOX loadfile("luascript\\dnddice.lua")() 然后通过两个函数将来自myqq.exe的参数传递过去:loadfile("luascript\\woddice.lua")() loadfile("luascript\\roll.lua")() loadfile("luascript\\getlink.lua")() loadfile("luascript\\dictionary.lua")() loadfile("luascript\\wiki.lua")() loadfile("luascript\\knight.lua")() loadfile("luascript\\godmachine.lua")() CODEBOX function main(msg,msg_time,buddy_name,buddy_num,qun_name,qun_num) 唔,我觉得这已经足够清晰了。if msg==nil then return end getlink(msg,msg_time,buddy_name,buddy_num,qun_name,qun_num) roll(msg,msg_time,buddy_name,buddy_num,qun_name,qun_num) dnddice(msg,msg_time,buddy_name,buddy_num,qun_name,qun_num) woddice(msg,msg_time,buddy_name,buddy_num,qun_name,qun_num) dictionary(msg,msg_time,buddy_name,buddy_num,qun_name,qun_num) wiki(msg,msg_time,buddy_name,buddy_num,qun_name,qun_num) knight(msg,msg_time,buddy_name,buddy_num,qun_name,qun_num) godmachine(msg,msg_time,buddy_name,buddy_num,qun_name,qun_num) end function main_buddy(msg,msg_time,buddy_name,buddy_num) dnddice(msg,msg_time,buddy_name,buddy_num) wiki(msg,msg_time,buddy_name,buddy_num) getlink(msg,msg_time,buddy_name,buddy_num) dictionary(msg,msg_time,buddy_name,buddy_num) end 然后,具体的功能都在各自的lua文件里了。 This post has been edited by bx_bob: 2010-05-31, 18:52 |
|||
|
2010-05-31, 18:49
Post
#4
|
|||
比非主流还非主流的Lua原教旨主义机械师 ![]() ![]()
Group: Avatar Posts: 415 Joined: 2007-07-25 Member No.: 14794 ![]() |
3.机器人各功能的实现
这里举一个例子。 r90:roll.lua: CODEBOX n=1 function roll(msg,msg_time,buddy_name,buddy_num,qun_name,qun_num) if string.match(msg, "^%.roll")==nil then return end math.randomseed(os.time()+n) math.random() if n<10000 then n=n+1 end max=string.match(msg, "^%.roll (%d+)") if max==nil then return end if tonumber(max)>10000 then return end result=msg_time.."\n"..buddy_name.."进行投掷(最大"..max.."点):"..math.random(1,max) say_qun(result,qun_num) end msg里放着一条消息的正文,msg_time是这个消息发出的时间。buddy_name和buddy_num对应发送者的名称和qq号。qun_name和qun_num对应所在的群和群号。 接下来就很容易了,对msg进行正则表达式匹配,并且进行相应的运算。 在这里要重点讲讲随机的问题。lua的随机其实是封装的c的math库里的随机,但是lua的时间却没有封装c的毫秒计时,只有一个以秒为单位的os.time()。这个时候就有一个问题,一般来说,作为随机数种子的都是系统时间,但是以秒为单位的话,可能会出现两人在同一秒内投骰的情况。于是只好加入一个全局变量n,每次投骰之后加一,让随机数种子不一样。 lua的随机还有一个……莫名的问题,就是第一个随出来的数字会有规律。所以这里加了一个math.random()但是没有获取,就是为了跳过第一个随机数。 ------------------------------------------------- ------------------------------------------------- 最近更新,开发者注意 ------------------------------------------------- 某月某日(忘了) ------------------------------------------------- 在自己编写的新模块开头要记得加上这么一句: table.insert(main_help_table,".wiki 查询内容 查询维基") 后面引号内的内容就是这个模块的功能介绍。 这是因为新加入了.help功能,提供所有功能的列表。 ------------------------------------------------- 6月10日 ------------------------------------------------- 引入了luaJIT,据说能提升效率,有兴趣的人重新获取一下新版本吧。 ------------------------------------------------- 9月1日 ------------------------------------------------- 更新到luaJIT 2.0.0 beta 5! This post has been edited by bx_bob: 2010-09-07, 11:17 |
|||
|
2010-05-31, 18:51
Post
#5
|
|||
比非主流还非主流的Lua原教旨主义机械师 ![]() ![]()
Group: Avatar Posts: 415 Joined: 2007-07-25 Member No.: 14794 ![]() |
附:
----------------------------------------- qqdicebot编译指引 首先,你需要一个svn,从svn链接下载最新版本的程序和源代码。在本项目中,一些必须的库和dll文件已经包含在里面了。 获取程序和源代码的命令是(如果你使用的是命令行工具的话) svn checkout https://qqdicebot.googlecode.com/svn/branches/qqdicebot4_xp 这里可以用http协议代替 如果是gui工具,点checkout然后填入链接即可。 然后,必须得有一个mingw c编译环境。这里我推荐下载codeblocks,这是一个IDE,官方网站上有带了编译环境的版本下载。链接: http://www.codeblocks.org/downloads/5 选这个:codeblocks-8.02mingw-setup.exe 如果你正常地获得了源代码,应该有一个.cbp文件,用codeblocks打开即可。 接着就可以修改源代码并编译啦。 如果想修改lua脚本部分,用记事本工具打开对应的.lua文件,修改后保存即可。记得重启机器人哦。 ----------------------------------------- qqdicebot运行指引 首先,你需要一个qq号(和它的密码)。在这里,邮箱形式的qq号是不行的,必须得是数字。 然后,打开setting.lua文件,修改里面对应的参数,填入账号密码。 最后运行myqq.exe,最小化并等待一会儿。 ----------------------------------------- |
|||
|
2010-06-01, 06:21
Post
#6
|
|||
主物质者 ![]() ![]()
Group: Primer Posts: 8 Joined: 2010-04-17 Member No.: 37630 ![]() |
那个,我们也有个qq的bot,已经用过一段时间了~~
晚上我把做bot的家伙拉过来~~~ http://ddodnd.uueasy.com/read-htm-tid-85.html 这是最早的一个版本,最近那个家伙重新写了一个,有时间你们可以交流一下~ |
|||
|
2010-06-01, 14:30
Post
#7
|
|||
主物质者 ![]()
Group: Primer Posts: 2 Joined: 2010-05-07 Member No.: 38118 ![]() |
-.- 于是奉命前来报到-.-
|
|||
|
2010-06-01, 18:49
Post
#8
|
|||
比非主流还非主流的Lua原教旨主义机械师 ![]() ![]()
Group: Avatar Posts: 415 Joined: 2007-07-25 Member No.: 14794 ![]() |
可以先下载一个玩玩?这个贴子没事总会更新一下。
写好的脚本可以以论坛附件的形式上传上来分享。 或者留下意见(我觉得最好能自己动手啦)。 如果想提交代码的话,留下一个google的账号,我会加进google code的开发者。 其实各种开源的聊天软件应该都能用上这个机器人的lua接口,只要把接口写好,嵌入一个luai就行了。这样的话各个机器人之间的脚本也能共享呢。真是一个好想法。 This post has been edited by bx_bob: 2010-06-01, 18:51 |
|||
|
2010-06-04, 11:57
Post
#9
|
|||
主物质者 ![]()
Group: Primer Posts: 2 Joined: 2010-05-07 Member No.: 38118 ![]() |
|
|||
|
2010-06-06, 09:44
Post
#10
|
|||
比非主流还非主流的Lua原教旨主义机械师 ![]() ![]()
Group: Avatar Posts: 415 Joined: 2007-07-25 Member No.: 14794 ![]() |
唔,插件dll的话我还不会……不如你添加了之后提交一个吧。不过那样的接口会不会太混乱? 已经把你加入代码提交者了。 This post has been edited by bx_bob: 2010-06-06, 09:45 |
|||
|
2010-06-07, 16:03
Post
#11
|
|||
主物质者 ![]()
Group: Primer Posts: 1 Joined: 2010-06-07 Member No.: 38824 ![]() |
很好的东西,而且还很适合我这种初学者学习,太感谢了 (IMG:style_emoticons/default/cool.gif)
|
|||
|
2010-09-07, 08:12
Post
#12
|
|||
主物质者 ![]()
Group: Primer Posts: 1 Joined: 2010-09-06 Member No.: 40592 ![]() |
蛮有趣的 一定要学过来
|
|||
|
2010-10-18, 22:47
Post
#13
|
|||
主物质者 ![]()
Group: Primer Posts: 2 Joined: 2008-07-19 Member No.: 23013 ![]() |
好东西!第一次发现这里有这个分区…… 灰常感谢!
---------------------------------------------------------------------------- 我的机器人 http://ellesime.anetcity.com/ellesime/bbs/?topic=32961.0 |
|||
|
2011-02-15, 00:02
Post
#14
|
|||
主物质者 ![]()
Group: Primer Posts: 2 Joined: 2011-01-14 Member No.: 42404 ![]() |
话说我觉得lua脚本还是不要总重启机器人比较好……注册小号当机器人……调试几次就要激活一下……
于是试着做了个重读lua的东西(但是没有技术不会测试,不知道有没有造成内存泄漏 |
|||
|
2011-02-15, 12:11
Post
#15
|
|||
比非主流还非主流的Lua原教旨主义机械师 ![]() ![]()
Group: Avatar Posts: 415 Joined: 2007-07-25 Member No.: 14794 ![]() |
理论上来说只要把L析构就不会有泄露问题,调用lua_close()估计就行了。
|
|||
![]() ![]() ![]() |
Copyright © 2005-2021 The Ring of Wonder | Time is now: 2021-04-23, 04:52 |