如何为脚本添加用户定义的计时器?
How do i add a user-defined timer for a script?
我想向我的机器人添加一个命令,该命令将接受用户定义的触发器时间量。触发器的默认值为 60 秒。但我希望用户能够通过命令手动设置它。
示例:
[nick] @cmd 5s
[bot] command initiating in 5 seconds
或
[nick] @cmd 2m
[bot] command initiating in 2 minutes
proc weed:pack {nick uhost hand chan text} {
if {[utimerexists delay] == ""} {
putserv "PRIVMSG $chan [=10=]303Pack your [=10=]309bowls[=10=]303! Chan-wide [=10=]304Toke[=10=]311-[=10=]304out[=10=]303 in[=10=]308 1 [=10=]303Minute![=10=]3"
global wchan
set wchan $chan
utimer 60 weed:pack:go
utimer 60 delay
}
}
和
proc weed:pack:go {} {
global wchan
putserv "PRIVMSG $wchan :[=11=]303::[=11=]3045[=11=]303:";
putserv "PRIVMSG $wchan :[=11=]303::[=11=]3044[=11=]303:";
putserv "PRIVMSG $wchan :[=11=]303::[=11=]3043[=11=]303:";
putserv "PRIVMSG $wchan :[=11=]303::[=11=]3042[=11=]303:";
putserv "PRIVMSG $wchan :[=11=]303::[=11=]3041[=11=]303:";
putserv "PRIVMSG $wchan :[=11=]303::[=11=]311[=11=]2SYNCRONIZED![=11=]2 [=11=]304FIRE THEM BOWLS UP!!!"; return
}
嗯,这主要是关于理解 utimer
。该命令有两个参数,一个等待秒数的计数,以及一个在计时器触发时执行的命令(包括参数,如果相关的话)。
您需要做的就是弄清楚如何解析用户提供的时间。我们可以为此使用 scan
。
scan $text "%d%1s" count type
最好检查一下结果,看看你是否成功了;成功时,将返回 2(对于两个字段)。现在你已经把东西分开了,你必须把它转换成秒数:
if {[scan $text "%d%1s" count type] != 2} {
# Do an error message; don't just silently fail! Don't know eggdrop enough to do that properly
return
}
switch -- $type {
"s" { set delay $count }
"m" { set delay [expr {$count * 60}] }
"h" { set delay [expr {$count * 60 * 60}] }
default {
# Again, you ought to send a complaining message to the user here
return
}
}
utimer $delay weed:pack:go
将所有内容与您需要的任何其他内容一起粘贴在您的 proc
中,您应该可以开始了。如果您有多个地方需要解析,您甚至可以将该代码转换为它自己的过程;这就是我真正想要的,因为“解析持续时间描述”是这类事情的一个很好的候选者。
我想向我的机器人添加一个命令,该命令将接受用户定义的触发器时间量。触发器的默认值为 60 秒。但我希望用户能够通过命令手动设置它。
示例:
[nick] @cmd 5s
[bot] command initiating in 5 seconds
或
[nick] @cmd 2m
[bot] command initiating in 2 minutes
proc weed:pack {nick uhost hand chan text} {
if {[utimerexists delay] == ""} {
putserv "PRIVMSG $chan [=10=]303Pack your [=10=]309bowls[=10=]303! Chan-wide [=10=]304Toke[=10=]311-[=10=]304out[=10=]303 in[=10=]308 1 [=10=]303Minute![=10=]3"
global wchan
set wchan $chan
utimer 60 weed:pack:go
utimer 60 delay
}
}
和
proc weed:pack:go {} {
global wchan
putserv "PRIVMSG $wchan :[=11=]303::[=11=]3045[=11=]303:";
putserv "PRIVMSG $wchan :[=11=]303::[=11=]3044[=11=]303:";
putserv "PRIVMSG $wchan :[=11=]303::[=11=]3043[=11=]303:";
putserv "PRIVMSG $wchan :[=11=]303::[=11=]3042[=11=]303:";
putserv "PRIVMSG $wchan :[=11=]303::[=11=]3041[=11=]303:";
putserv "PRIVMSG $wchan :[=11=]303::[=11=]311[=11=]2SYNCRONIZED![=11=]2 [=11=]304FIRE THEM BOWLS UP!!!"; return
}
嗯,这主要是关于理解 utimer
。该命令有两个参数,一个等待秒数的计数,以及一个在计时器触发时执行的命令(包括参数,如果相关的话)。
您需要做的就是弄清楚如何解析用户提供的时间。我们可以为此使用 scan
。
scan $text "%d%1s" count type
最好检查一下结果,看看你是否成功了;成功时,将返回 2(对于两个字段)。现在你已经把东西分开了,你必须把它转换成秒数:
if {[scan $text "%d%1s" count type] != 2} {
# Do an error message; don't just silently fail! Don't know eggdrop enough to do that properly
return
}
switch -- $type {
"s" { set delay $count }
"m" { set delay [expr {$count * 60}] }
"h" { set delay [expr {$count * 60 * 60}] }
default {
# Again, you ought to send a complaining message to the user here
return
}
}
utimer $delay weed:pack:go
将所有内容与您需要的任何其他内容一起粘贴在您的 proc
中,您应该可以开始了。如果您有多个地方需要解析,您甚至可以将该代码转换为它自己的过程;这就是我真正想要的,因为“解析持续时间描述”是这类事情的一个很好的候选者。