2012-04-20 92 views
1

我在网上找到了这个脚本。这有点旧了,开发者页面早已消失。代码起作用,但我试图清理它一点点。例如:如果周= 0,则不显示它。我从控制台收到有关额外令牌的错误。我试图谷歌这个错误,但没有坚实的未来。寻找一些见解。Eggdrop TCL正常运行时间脚本

评论部分是我的“清理”的尝试。这是我收到的错误。

Tcl错误[正常运行时间]:在表达 “$ ::时间(周)= 0” 语法错误:在表达的端

随着部评论额外的令牌,它工作正常。只是试图清理东西,所以它不会返回“我已经在线0周0天0小时1分钟”。

bind pub "-|-" !uptime uptime 
proc uptime { nick host handle channel text } { 

putquick "PRIVMSG $channel :I have been online for [eggtime]." 

} 

proc eggtime {} { 
    set ::time(uptime) [expr [clock seconds]-$::uptime] 
    set ::time(week) [expr $::time(uptime)/604800] 
    set ::time(uptime) [expr $::time(uptime)-$::time(week)*604800] 
    set ::time(days) [expr $::time(uptime)/86400] 
    set ::time(uptime) [expr $::time(uptime)-$::time(days)*86400] 
    set ::time(hour) [expr $::time(uptime)/3600] 
    set ::time(uptime) [expr $::time(uptime)-$::time(hour)*3600] 
    set ::time(mins) [expr $::time(uptime)/60] 
    set ::time(uptime) [expr $::time(uptime)-$::time(mins)*60] 
    set ::time(secs) $::time(uptime) 


#if {$::time(week) = 0} { 
# set ::time(return) "$::time(days) day\(s\), $::time(hour) hour\(s\), $::time(mins) minute\(s\) and $::time(secs) second\(s\)" 
#} else if {$::time(days) = 0} { 
# set ::time(return) "$::time(hour) hour\(s\), $::time(mins) minute\(s\) and $::time(secs) second\(s\)" 
#} { 
# set ::time(return) "$::time(week) week\(s\), $::time(days) day\(s\), $::time(hour) hour\(s\), $::time(mins) minute\(s\) and $::time(secs) second\(s\)" 
#} 

    set ::time(return) "$::time(week) week\(s\), $::time(days) day\(s\), $::time(hour) hour\(s\), $::time(mins) minute\(s\) and $::time(secs) second\(s\)" 

    return $::time(return) 
} 

回答

3

等号运算符是==。 您在注释块的最后部分缺少else。您还应该使用elseif而不是else if。这不是C.

但是,这里是我以前写的一个需要经过间隔并返回一个英文字符串。它大致上是你所瞄准的。

# paste::delta -- 
# 
#  Returns the time difference between the given and current time 
#  as an english string. 
# 
proc ::paste::delta {time} { 
    set r $time 
    catch { 
     set delta [expr {[clock seconds] - $time}] 
     if {$delta < 60} { 
      set r "$delta secs ago" 
     } elseif {$delta < 3600} { 
      set r "[expr {$delta/60}] mins ago" 
     } elseif {$delta < 86400} { 
      set r "[expr {$delta/3600}] hours ago" 
     } else { 
      set r "[expr {$delta/86400}] days ago" 
     } 
    } 
    return $r 
} 

所以你得到的东西就像是“2小时前”的[paste :: delta 7260]或者310给出了“5分钟前”。

另一件事 - 与expr声明,总是用花括号括住表达的主体。否则,解析器必须再次解析主体,并且可能会产生显着的性能成本。

+0

夫妇失误。感谢您为我清理。我有时会弄糊涂我的代码语言。我能够让周消失,因为他们是0,但0天仍然回来。有什么想法吗? – Pat 2012-04-20 20:11:04

+0

划痕 - 发现我的问题。需要将我的if语句逻辑向后工作。现在全部设置。 – Pat 2012-04-20 20:16:03