From: Ian Jackson Date: Wed, 6 Feb 2002 18:47:15 +0000 (+0000) Subject: Working on telling_event X-Git-Tag: merge-2001-10-09-tell~23 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/ircbot/commitdiff_plain/fdf998c1ca67464556c85786ca30e13d76395089 Working on telling_event --- diff --git a/bot.tcl b/bot.tcl index 0111363..98a3e61 100755 --- a/bot.tcl +++ b/bot.tcl @@ -145,31 +145,37 @@ proc looking_whenwhere {when where} { return $str } -proc check_telling {nl event} { - # for all except `talk' we delay 750ms +proc telling_event {nl event} { + # For `act' we *haven't* yet done the 750ms delay; we implement + # that here. Also, here we turn `talk' into `talk' now and `act' + # later. We also support the psuedo-event `none'. The del msg + # and new msg events are handled by the command procedures, not here. switch -exact $event { - none { - } + none { } talk { - check_telling_core $nl talk - check_telling_core $nl act + telling_event_core $nl talk + telling_event $nl act } act { - after 750 [list check_telling_core $nl $event] + after 750 [list telling_event_core $nl $event] + } + ident { + telling_event_core $nl $event } default { - error "check_telling $nl $event" + error "telling_event $nl $event" } } } -proc check_telling_core {nl event} { - # event is `talk' or `act' +proc telling_event_core {nl event} { + # event is `talk', `act' or `ident' # When user talks we actually get talk now and act later -FIXME - make it be called with come +FIXME - fix calls to check_telling to telling_event FIXME - implement all cmds FIXME - implement tells_deliver set stt [list $u passed $now] FIXME - implement tells_delete catch { unset stt } ? +FIXME - document the extra param to recordlastseen set iml [msgdb_get $nl inbound] if {![llength $iml]} return @@ -177,8 +183,8 @@ FIXME - implement tells_delete catch { unset stt } ? upvar #0 nick_unique($nl) u if {[info exists telling]} { - manyset $telling u2 stt telling_when - if {"$u2" != "$u"} { unset telling; unset stt; unset telling_when } + manyset $telling u_last stt telling_when + if {"$u_last" != "$u"} { unset telling; unset stt; unset telling_when } } if {![info exists stt]} { @@ -188,41 +194,55 @@ FIXME - implement tells_delete catch { unset stt } ? set ago [expr {$now - $telling_when}] + # Now we have the components of a telling state + # u - nick_unique + # stt - state: norecord, mentioned, passede + # ago - how long ago since we did anything + + # We compute an evstate to dispatch on as follows: + # evstate is string of letters + # current state + # n NORECORD + # m MENTIONED + # p PASSED # event # t talk # a act - # c come + # i ident # security level and timing # ii Insecure # ss Secure and soon (before interval) # sl Secure and late (after interval) - # current state - # n NORECORD - # m MENTIONED - # p PASSED + # current identification + # i Identified + # u Unidentified # reliability and timing # uu Unreliable # rv Remind, very soon (before within-interval) # rs Remind, soon (between) - # rl Remind, late (aftr every-interval) + # rl Remind, late (after every-interval) # ps Pester, soon (before interval) # pl Pester, late (after interval) - # current identification - # i Identified - # u Unidentified - # current visibility - # v Visible - # h Hidden (invisible, no unique) + + set evstate {} + + append evstate [string range $stt 0 0] + append evstate [string range $event 0 0] manyset [nickdb_get $n tellsec] sec secwhen switch -exact $sec { - insecure { set evstate ii } - secure { set evstate [expr {$ago<$secwhen ? "sl" : "ss"}] } - default { set evstate "#$sec#" } + insecure { append evstate ii } + secure { append evstate [expr {$ago<$secwhen ? "sl" : "ss"}] } + default { append evstate "#$sec#" } } - append evstate [string range $stt 0 0] + upvar #0 nick_username($nl) nu + if {[info exists nu] && "$nu" == "[nickdb_get $nl username]"} { + append evstate i + } else { + append evstate u + } manyset [nickdb_set $n tellrel] rel relint relwithin switch -exact $rel { @@ -234,25 +254,35 @@ FIXME - implement tells_delete catch { unset stt } ? default { append evstate "#$rel#" } } - upvar #0 nick_username($nl) nu - if {[info exists nu] && "$nu" == "[nickdb_get $nl username]"} { - append evstate i - } else { - append evstate u - } - - append evstate [expr {[info exists u] ? "v" : "h"}] - switch -glob $evstate { - t??prv?v { + pt???rv { # consider delivered: # (very recently passed, and the user talks) - tells_delete {} $nl + telling_delete_msgs {} $nl + return } - t??????? { - # ignore - # (any other `talk's) + ?t????? { + # ignore (any other `talk's) - act handles these + return + } + ni???uu - naii?uu - nas?iuu - mi???uu { + # pass, but unreliable + telling_pass $nl + telling_delete_msgs {} $nl + return } + ni????? - naii??? - nas?i?? - mi????? { + # pass, reliable + telling_pass $nl + set stt passed + } + UP TO HERE + FIXME print out state diagram and tick off traces + + + + set telling [list $u passed + ?iin???? - ?iip?l?? - ?ii????? - ?s?n??iv - ?s?m??iv - ?s?p?liv { # pass messages @@ -277,6 +307,12 @@ FIXME - implement tells_delete catch { unset stt } ? error "check_telling_core nl=$nl evstate=$evstate ?" } } + + # current visibility + # v Visible + # h Hidden (invisible, no unique) + go back to norecord if invisible + } proc recordlastseen_n {n how here} { @@ -1557,6 +1593,7 @@ def_ucmd identpass { upvar #0 nick_username($luser) rec_username set rec_username $username ucmdr "Pleased to see you, $username." {} + telling_event $luser ident } def_ucmd summon {