chiark / gitweb /
Merge up from trunk. cvs up -j branchpoint-2001-10-09-tell -j mergeup-1-2001-10...
[ircbot] / bot.tcl
diff --git a/bot.tcl b/bot.tcl
index ac5714b3d4de991892eaad3b7e343aa2d7056008..b5abdda4a8798fda7988c81127fb120934c50abd 100755 (executable)
--- a/bot.tcl
+++ b/bot.tcl
@@ -26,22 +26,47 @@ proc showintervalsecs {howlong abbrev} {
     return [showintervalsecs/[opt timeformat] $howlong $abbrev]
 }
 
+proc formatsf {pfx value} {
+   foreach {min format} { 100 %.0f 10 %.1f 0 %.2f} {
+       set fval [format $format $value]
+       if {$fval < $min} continue
+       return [format "$fval${pfx}" $value]
+   }
+}
+
+proc showintervalsecs/beat {howlong abbrev} {
+    # We split in two to avoid overflow problems.
+    if {$howlong < 86 } {
+       # mB's
+       set pfx mB
+       return [format "%.0fmB" [expr {round($howlong * 1.157)*10} ]]
+    } else {
+       if {$howlong < 86400 } {
+           # B's
+           set pfx B
+           set value [expr {$howlong / 86.4}]
+       } else {
+           # kB's
+           set pfx kB
+           set value [expr {$howlong / 86400.0}]
+       }
+    }
+    return [formatsf $pfx $value]
+}
+
 proc showintervalsecs/ks {howlong abbrev} {
     if {$howlong < 1000} {
        return "${howlong}s"
     } else {
        if {$howlong < 1000000} {
-           set pfx k
+           set pfx ks
            set scale 1000
        } else {
-           set pfx M
+           set pfx Ms
            set scale 1000000
        }
        set value [expr "$howlong.0 / $scale"]
-       foreach {min format} {100 %.0f 10 %.1f 1 %.2f} {
-           if {$value < $min} continue
-           return [format "$format${pfx}s" $value]
-       }
+       return [formatsf $pfx $value]
     }
 }
 
@@ -95,10 +120,13 @@ proc parse_interval {specified min} {
        ks { set u 1000 }
        m { set u 60 }
        h { set u 3600 }
+       mb { set u 0.0864 }
+       b { set u 86.4 }
+       kb { set u 86400 }
        default { error "unknown unit of time $unit" }
     }
     if {$value > 86400*21/$u} { error "interval too large" }
-    set result [expr {$value*$u}]
+    set result [expr {round($value*$u)}]
     if {$result < $min} { error "interval too small (<${min}s)" }
     return $result
 }
@@ -1539,6 +1567,7 @@ proc timeformat_desc {tf} {
     switch -exact $tf {
        ks { return "Times will be displayed in seconds or kiloseconds." }
        hms { return "Times will be displayed in hours, minutes, etc." }
+       beat { return "Times will be displayed in beats (1000B = 1d)." }
        default { error "invalid timeformat: $v" }
     }
 }
@@ -1831,9 +1860,27 @@ def_ucmd identpass {
     ucmdr "Pleased to see you, $username." {}
 }
 
+def_ucmd kill {
+    global nick
+    prefix_nick
+    set target [ta_nick]
+    if {![nickdb_exists $target]} { error "$target is not a registered nick." }
+    set wantu [nickdb_get $target username]
+    if {![string length $wantu]} { error "$target is insecurely registred." }
+    upvar #0 nick_username([irctolower $n]) nu
+    if {![info exists nu]} { error "You must identify yourself first." }
+    if {"$wantu" != "$nu"} {
+       error "You are the wrong user, $nu - $target belongs to $wantu."
+    }
+    set reason "at request of user $nu"
+    if {[ta_anymore]} { append reason "; $text" }
+    sendout KILL $target $reason
+}
+
 def_ucmd summon {
     set target [ta_word]
     ta_nomore
+    # fixme would be nice if the rest of the text was passed on instead
     check_username $target
     prefix_nick
 
@@ -2005,6 +2052,10 @@ proc ensure_globalsecret {} {
 }
 
 proc connected {} {
+    global operuserpass
+    if {[info exists operuserpass]} {
+       eval sendout OPER $operuserpass
+    }
     foreach chan [chandb_list] {
        if {[chandb_get $chan autojoin]} { dojoin $chan }
     }