Beats, but not displayed properly.
[ircbot] / bot.tcl
diff --git a/bot.tcl b/bot.tcl
index 3da92b3..eb65a0e 100755 (executable)
--- a/bot.tcl
+++ b/bot.tcl
@@ -23,6 +23,10 @@ proc showintervalsecs {howlong abbrev} {
     return [showintervalsecs/[opt timeformat] $howlong $abbrev]
 }
 
+proc showintervalsecs/beat {howlong abbrev} {
+    return [format "%g B" [expr {$howlong/86.4}]]
+}
+
 proc showintervalsecs/ks {howlong abbrev} {
     if {$howlong < 1000} {
        return "${howlong}s"
@@ -376,9 +380,10 @@ proc nick_case {user} {
 }
 
 proc msg_NICK {p c newnick} {
-    global nick_arys nick_case
+    global nick_arys nick_case calling_nick
     prefix_nick
     recordlastseen_n $n "changing nicks to $newnick" 0
+    set calling_nick $newnick
     recordlastseen_n $newnick "changing nicks from $n" 1
     set luser [irctolower $n]
     lnick_marktime_cancel $luser
@@ -421,9 +426,14 @@ proc msg_JOIN {p c chan} {
     lappend nlist $nl
     nick_ishere $n
 }
-proc msg_PART {p c chan} {
+proc msg_PART {p c chan args} {
     prefix_nick
-    recordlastseen_n $n "leaving $chan" 1
+    set msg "leaving $chan"
+    if {[llength $args]} {
+       set why [lindex $args 0]
+       if {"[irctolower $why]" != "[irctolower $n]"} { append msg " ($why)" }
+    }
+    recordlastseen_n $n $msg 1
     process_kickpart $chan $n
 }
 proc msg_QUIT {p c why} {
@@ -1036,6 +1046,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" }
     }
 }
@@ -1092,11 +1103,13 @@ def_setting marktime {
            s { set u 1 }
            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 "marktime interval too large" }
-       set mt [expr {$value*$u}]
+       set mt [expr {round($value*$u)}]
        if {$mt < $marktime_min} { error "marktime interval too small" }
     } else {
        error "invalid syntax for marktime"
@@ -1278,7 +1291,7 @@ proc lnick_pingstring {why oc apstring} {
     catch { exec uptime } uptime
     set nnicks [llength [array names nick_onchans]]
     if {[regexp \
- {^ *([0-9:apm]+) +up.*, +(\d+) users, +load average: +([0-9., ]+) *$} \
+ {^ *([0-9:apm]+) +up.*, +(\d+) users?, +load average: +([0-9., ]+) *$} \
             $uptime dummy time users load]} {
        regsub -all , $load {} load
         set uptime "$time  $nnicks/$users  $load"