X-Git-Url: https://git.distorted.org.uk/~mdw/ircbot/blobdiff_plain/37a9f1adbed3ab89c14bf4c8c4dbac5cd0ca29ed..09c94f5b71689d03f22f54bb7a478b3e8dc1013d:/bot.tcl diff --git a/bot.tcl b/bot.tcl index 81583ee..0111363 100755 --- a/bot.tcl +++ b/bot.tcl @@ -146,8 +146,30 @@ proc looking_whenwhere {when where} { } proc check_telling {nl event} { - # event is `talk', `act' or `come' + # for all except `talk' we delay 750ms + switch -exact $event { + none { + } + talk { + check_telling_core $nl talk + check_telling_core $nl act + } + act { + after 750 [list check_telling_core $nl $event] + } + default { + error "check_telling $nl $event" + } + } +} +proc check_telling_core {nl event} { + # event is `talk' or `act' + # When user talks we actually get talk now and act later +FIXME - make it be called with come +FIXME - implement all cmds +FIXME - implement tells_deliver set stt [list $u passed $now] +FIXME - implement tells_delete catch { unset stt } ? set iml [msgdb_get $nl inbound] if {![llength $iml]} return @@ -171,14 +193,14 @@ proc check_telling {nl event} { # t talk # a act # c come - # current state - # n NORECORD - # m MENTIONED - # p PASSED # 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 # reliability and timing # uu Unreliable # rv Remind, very soon (before within-interval) @@ -193,15 +215,15 @@ proc check_telling {nl event} { # v Visible # h Hidden (invisible, no unique) - set evstate [string range $stt 0 0] - manyset [nickdb_get $n tellsec] sec secwhen switch -exact $sec { - insecure { append evstate ii } - secure { append evstate [expr {$ago<$secwhen ? "sl" : "ss"}] } - default { append evstate "#$sec#" } + insecure { set evstate ii } + secure { set evstate [expr {$ago<$secwhen ? "sl" : "ss"}] } + default { set evstate "#$sec#" } } + append evstate [string range $stt 0 0] + manyset [nickdb_set $n tellrel] rel relint relwithin switch -exact $rel { unreliable { append evstate uu } @@ -222,23 +244,40 @@ proc check_telling {nl event} { append evstate [expr {[info exists u] ? "v" : "h"}] switch -glob $evstate { - - - - - if {[ - set security - - switch -exact - - if {![info exists u]} { catch { unset telling } } - && [info exists telling]} { - - + t??prv?v { + # consider delivered: + # (very recently passed, and the user talks) + tells_delete {} $nl + } + t??????? { + # ignore + # (any other `talk's) + } + ?iin???? - ?iip?l?? - ?ii????? - + ?s?n??iv - ?s?m??iv - ?s?p?liv { + # pass messages + # (insecure and not passed recently, or just arriving; + # secure and not passed recently) + tells_deliver $nl + } + ?ssp???? - ???p?s?? - ???p?v?? { + # ignore + # (recently mentioned or passed + # immediate `talk' thing) + } + ?s?n???? - ?slm???? - cs?????? { + # mention messages + # (secure and not mentioned recently or just arriving, + # and should not pass) + sendprivmsg $nl \ + {You have messages (so identify yourself please).}] + set stt [list $u mentioned $now] + } + * { + error "check_telling_core nl=$nl evstate=$evstate ?" + } } - - if {![info exists telling]} { - +} proc recordlastseen_n {n how here} { global lastseen lookedfor @@ -248,7 +287,7 @@ proc recordlastseen_n {n how here} { if {!$here} return - check_telling $nl [lindex {x act talk} $here] + check_telling $nl [lindex {none act talk} $here] upvar #0 lookedfor($nl) lf if {[info exists lf]} {