hasea 发表于 2013-12-10 07:18:39

Mushclient中wait.lua模块的扩展(更新版)

本帖最后由 hasea 于 2014-1-20 08:38 PM 编辑

内容为上次(http://pkuxkx.net/forum/thread-36660-1-1.html)发出的模块更新版本。

这几天在写脚本,感到一些不方便的地方。昨晚在论坛讨论多行触发时,发现当多行触发和单行触发同时存在,会存在一些问题,虽然可以解决,但看起来很丑且复杂。比如下面这个:


在匹配单行的时候,一定要等下一行出现数据才会返回。这个是很让人难受的。当然你可以用好几行代码来避免这个问题!

我决定重新构建一种更简便的方法。

对于脚本来说,简洁优雅是我们一向的追求。


1、增加一个等待多个触发器返回的函数。用法如下:
   


以上函数将创建一个单行触发器,一个2行的多行触发器,一个定时器,一个协程对象。
这个与上例的比较好像差别不太,看起来还更多代码。但注意上面那个是有bug的,除非你能忍受。
这个函数的作用是不会再尝试对一行的正则匹配取两行数据。

注意上个版本在wait.regexp中使用table,只是为了看代码更加清晰。会把几个正则字符串合并为(字符串1|字符串2|字符串3)这种样式。这有很多限制。


2、把协程包装为一种更加简单的暂停机制使用。以便在需要的时候能够中断函数中的流程。用法如下:



这在mud遇到图片或是什么特殊情况,想来还是很好用的!!
注意在子线程中不能使用此函数来暂停,这样将会产生严重的错误。由于子线程一般没有需要暂停的情况,这好像是不实用的。所以没有为子线程增加暂停和唤醒函数了。


3、下面对模块中的所有函数做一下说明。

wait.time(seconds)旧模块函数
wait.regexp (regexp, timeout, flags,multi, multi_lines)旧模块函数,修改支持多行
wait.match (match, timeout, flags)旧模块函数
wait.make (f)旧模块函数
wait.mulregexp (regexps, timeout, flags)新增加函数。允许多行多触发器
wait.pause (sign)新增加函数。暂停函数进程
wait.wake (sign,text)新增加函数。恢复暂停的函数进程
以下为模拟子线程的触发函数
wait.subwait:new ()新增加函数。新建子线程
wait.subwait:close ()新增加函数。关闭子线程
wait.subwait:time (seconds)新增加函数。子线程中定时等待
wait.subwait:regexp (regexp, timeout,flags, multi, multi_lines)新增加函数。子线程中的正则触发
wait.subwait:mulregexp (regexps,timeout, flags)新增加函数。子线程中的多触发器等待函数

Fix:修正2个bug。 2014.1.20

附件:


北大侠客行MUD,中国最好的MUD

emyt 发表于 2013-12-10 19:58:31

mush因你会更精彩!!

hasea 发表于 2013-12-10 20:53:56

多谢两位北侠前辈的支持。yct6
可惜看起来用的人不多。

hijacker 发表于 2013-12-11 11:15:30

我是进来顶楼主的~
虽然我对单纯的机器人编写的热情已经褪得七七八八了,但楼主解决的正是曾经的我苦思而不得其的问题。我有一种可以瞑目了的赶脚,呵呵
希望时间能检验这些代码的稳定性(楼上小白鼠加油啊:)
期待楼主的更多创意

qdz 发表于 2013-12-14 00:18:12

mush因你会更精彩!!
emyt 发表于 2013-12-10 11:58 AM http://pkuxkx.net/forum/images/common/back.gif


    静静真是爱学习呀。

qdz 发表于 2013-12-18 17:48:30

请教flags,multi, multi_lines 的意思和用法呀。

hasea 发表于 2013-12-18 19:45:26

本帖最后由 hasea 于 2013-12-18 07:47 PM 编辑

回复 10# qdz

flags:和原来wait.regexp函数第3个参数一样的参数。用来表示触发器的功能特性的一个标识组合。具体应该看mushclient文档。和mushclient中的AddTriggerEx函数第三个参数的取值是相同的。一般默认为nil即可。

multi:是否启用多行触发。默认为false。

multi_lines: 多行触发的行数。

qdz 发表于 2013-12-18 23:14:47

回复 11# hasea


    收到,谢谢。

kaillera 发表于 2014-8-28 23:30:02

本帖最后由 kaillera 于 2014-8-28 11:36 PM 编辑

为啥我按照例子代码执行的时候会提示“attempt to index field 'subwait' (a nil value)”这样的错误,已经require "wait"了,mush版本4.90function subthread()
      local st=wait.subwait:new()
      wait.make(function()
                while true do
                        print("-----sub-----")
                        st:time(2)
                end
      end)
      return st
end


function mainfun()
      wait.make(function()
                local st=subthread()
                for i = 1,5 do
                        print("-----main----")
                        wait.time(2)
                end--for
                st:close()
                print("-----close-----")
      end)
end

killunix 发表于 2014-12-28 21:50:34

试了一下用这个替代系统的wait会导致奔溃
页: [1] 2
查看完整版本: Mushclient中wait.lua模块的扩展(更新版)