chiark / gitweb /
Bugfixes.
authorijackson <ijackson>
Tue, 12 Feb 2002 19:38:44 +0000 (19:38 +0000)
committerijackson <ijackson>
Tue, 12 Feb 2002 19:38:44 +0000 (19:38 +0000)
bot.tcl

diff --git a/bot.tcl b/bot.tcl
index dc8ed93883837fd0be46a44973cf7335a87a882e..105a0a2f1d20f95b45a0223498323e814643b64b 100755 (executable)
--- a/bot.tcl
+++ b/bot.tcl
@@ -161,7 +161,7 @@ proc tell_event {nl event} {
        act {
            after 750 [list tell_event_core $nl $event]
        }
-       ident {
+       ident - msgsarrive {
            tell_event_core $nl $event
        }
        default {
@@ -171,32 +171,36 @@ proc tell_event {nl event} {
     if {[info exists save]} { set calling_nick $save }
 }
 
+proc tell_getcstate {} {
+    # uses nl from caller's context
+    # imports telling (as the nick_telling) and u
+    # sets stt, telling_when
+    uplevel 1 {
+       upvar #0 nick_telling($nl) telling
+       upvar #0 nick_unique($nl) u
+
+       if {[info exists telling]} {
+           manyset $telling u_last stt telling_when
+           if {![info exists u] || "$u_last" != "$u"} {
+               unset telling; unset stt; unset telling_when
+           }
+       }
+
+       if {![info exists stt]} {
+           set stt norecord
+           set telling_when $now
+       }
+    }
+}
+
 proc tell_event_core {nl event} {
-    # event is `talk', `act' or `ident'
+    # event is `talk', `act', `ident' or `msgsarrive'
     # When user talks we actually get talk now and act later
-FIXME - implement all cmds
-FIXME - implement tells_delete_msgs catch { unset stt }   ?
-FIXME - document the extra param to recordlastseen
     global calling_nick
     set calling_nick $nl
     set iml [msgdb_get $nl inbound]
     if {![llength $iml]} return
 
-    upvar #0 nick_telling($nl) telling
-    upvar #0 nick_unique($nl) u
-
-    if {[info exists telling]} {
-       manyset $telling u_last stt telling_when
-       if {![info exists u] || "$u_last" != "$u"} {
-           unset telling; unset stt; unset telling_when
-       }
-    }
-
-    if {![info exists stt]} {
-       set stt norecord
-       set telling_when $now
-    }
-
     set ago [expr {$now - $telling_when}]
 
     # Now we have the components of a telling state
@@ -215,6 +219,7 @@ FIXME - document the extra param to recordlastseen
     #      t   talk
     #      a   act
     #      i   ident
+    #      m   msgsarrive
     #   security level and timing
     #      ii  Insecure
     #      ss  Secure and soon (before interval)
@@ -266,6 +271,15 @@ FIXME - document the extra param to recordlastseen
            tell_delete_msgs {} $nl
            return
        }
+       pm????? {
+           # oops, messages passed are now out of date
+           catch { unset telling }
+           return
+       }
+       ?m????? {
+           # ignore new msgs if we haven't passed yet
+           return
+       }
        nt????? - mt????? -
        pt???uu - pt???rs - pt???rl - pt???p? {
            # ignore (any other `talk's) - act handles these
@@ -320,6 +334,10 @@ FIXME - document the extra param to recordlastseen
 }
 
 proc recordlastseen_n {n how here} {
+    # here is:
+    #   0 - nick was seen leaving (or changing to another nicks or some such)
+    #   1 - nick was seen doing something else
+    #   2 - nick was seen talking on channel
     global lastseen lookedfor
     set nl [irctolower $n]
     set now [clock seconds]
@@ -1200,8 +1218,14 @@ proc tell_peernicks {text} {
     return $senders
 }
 
+proc msgsdb_set_maydelete {n key l otherkey} {
+    msgsdb_set $n $key $l
+    if {[llength $l]} return
+    if {[llength [msgsdb_get $n $otherkey]]} return
+    msgsdb_delete $n
+}
+
 proc tell_delete_msgs {lsenders lrecip} {
-FIXME - check callers pass l* not mixed case
     set ninbound {}
     set ndel 0
     foreach {s t m} [msgsdb_get $recip inbound] {
@@ -1214,14 +1238,18 @@ FIXME - check callers pass l* not mixed case
        set rsenders($s) 1
        incr ndel
     }
-    msgsdb_set $recip inbound $ninbound
+    msgsdb_set_maydelete $recip inbound $ninbound outbound
+    if {![llength $ninbound]} {
+       upvar #0 nick_telling($lrecip) telling
+       catch { unset telling }
+    }
     foreach s [array names rsenders] {
        set noutbound {}
        foreach {r t c} [msgsdb_get $s outbound] {
            if {"[irctolower $r]" == "$lrecip"} continue
            lappend noutbound $r $t $c
        }
-       msgsdb_set $s outbound $noutbound
+       msgsdb_set_maydelete $s outbound $noutbound inbound
     }
     return $ndel
 }
@@ -1236,7 +1264,7 @@ def_ucmd untell {
     }
     set ndel 0
     foreach recip $recipients {
-       incr ndel [tell_delete_msgs $n $recip]
+       incr ndel [tell_delete_msgs [irctolower $n] $recip]
     }
     ucmdr "Removed $ndel as yet undelivered message(s)." {}
 }
@@ -1244,6 +1272,7 @@ def_ucmd untell {
 def_ucmd delmsg {
     global errorInfo errorCode
     prefix_nick
+    set nl [irctolower $n]
     check_notonchan
     manyset [tell_effective_sec $n] sec secwhen
     switch -exact $sec {
@@ -1260,9 +1289,21 @@ def_ucmd delmsg {
            error "delmsg sec $sec"
        }
     }
+    tell_getcstate
+    if {"$stt" != "passed"} {
+       usererror \
+ "There are message(s) you've not yet seen; I'll deliver them to you now.\
+  If you actually want to delete them, just tell me `delmsg' again."
+    }
     set senders [tell_peernicks $text]
     set ndel [tell_delete_msgs [irctolower $senders] [irctolower $n]]
-    if {!$ndel} { ucmdr "No incoming messages deleted." {} }
+    if {!$ndel} {
+       if {[llength $senders]} {
+           ucmdr "No relevant incoming messages to delete." {}
+       } else {
+           ucmdr "No incoming messages to delete." {}
+       }
+    }
     switch -exact [llength $senders] {
        0 { ucmdr {} {} "deletes your $ndel message(s)." }
        1 { ucmdr {} {} "deletes your $ndel message(s) from $senders." }
@@ -1326,6 +1367,7 @@ def_ucmd tell {
                }
            }
            append msg .
+           tell_event $ltarget msgsarrive
            ucmdr $msg {}
        }
        mailto {
@@ -1819,7 +1861,7 @@ proc lnick_marktime_start {luser why ms mentiontold} {
     set mt [nickdb_get $luser marktime]
     if {"$mt" == "off"} {
        lnick_marktime_cancel $luser
-       after $ms [list lnick_checktold $luser]
+       if {$mentiontold} { after $ms [list lnick_checktold $luser] }
     } else {
        lnick_marktime_doafter $luser $why $ms $mentiontold
     }