From 5d6d1db76c9b2bbc237d6bc038ab98880c220414 Mon Sep 17 00:00:00 2001 Message-Id: <5d6d1db76c9b2bbc237d6bc038ab98880c220414.1715733192.git.mdw@distorted.org.uk> From: Mark Wooding Date: Wed, 13 Feb 2002 19:07:02 +0000 Subject: [PATCH] Bugfixes. tellme cmd Organization: Straylight/Edgeware From: Ian Jackson --- bot.tcl | 136 +++++++++++++++++++++++++++++++++------------------- helpinfos | 2 +- irccore.tcl | 4 ++ 3 files changed, 93 insertions(+), 49 deletions(-) diff --git a/bot.tcl b/bot.tcl index 87f19d4..ad4de2c 100755 --- a/bot.tcl +++ b/bot.tcl @@ -145,6 +145,26 @@ proc looking_whenwhere {when where} { return $str } +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"} { + set stt undelivered + } + } else { + set stt undelivered + set telling_when 0 + } + } +} + proc tell_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' @@ -152,6 +172,7 @@ proc tell_event {nl event} { # and new msg events are handled by the command procedures, not here. global calling_nick if {[info exists calling_nick]} { set save $calling_nick } + set r DELAYED switch -exact $event { none { } talk { @@ -164,46 +185,38 @@ proc tell_event {nl event} { ident - msgsarrive { tell_event_core $nl $event } + tellme { + set r [tell_event_core $nl TELLME] + } default { error "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 - } - } + return $r } proc tell_event_core {nl event} { - catch_logged { tell_event_core1 $nl $event } + global tell_event_teventi errorInfo + set tell_event_teventi "*$event* $nl" + if {[catch { + tell_event_core1 $nl $event + } emsg]} { + log_intern "tell event error" "$emsg >$errorInfo<" + set emsg ERROR + } else { + log_intern "tell event" "done $tell_event_teventi $emsg" + } + return $emsg } proc tell_event_core1 {nl event} { - # event is `talk', `act', `ident' or `msgsarrive' + # event is `talk', `act', `ident', `msgsarrive' or `TELLME' # When user talks we actually get talk now and act later global calling_nick set calling_nick $nl set iml [msgsdb_get $nl inbound] - if {![llength $iml]} return + if {![llength $iml]} { return nomsgs } set now [clock seconds] tell_getcstate @@ -211,14 +224,14 @@ proc tell_event_core1 {nl event} { # Now we have the components of a telling state # u - nick_unique (unset if not visible) - # stt - state: norecord, mentioned, passede + # stt - state: undelivered, 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 (MESSAGES) + # u UNDELIVERED (MESSAGES) # m MENTIONED # p PASSED # event @@ -226,6 +239,7 @@ proc tell_event_core1 {nl event} { # a act # i ident # m msgsarrive + # T tellme (user command) # security level and timing # ii Insecure # ss Secure and soon (before interval) @@ -249,7 +263,7 @@ proc tell_event_core1 {nl event} { manyset [nickdb_get_sec_effective $nl] sec secwhen switch -exact $sec { insecure { append evstate ii } - secure { append evstate [expr {$ago<$secwhen ? "sl" : "ss"}] } + secure { append evstate [expr {$ago<$secwhen ? "ss" : "sl"}] } default { append evstate "#$sec#" } } @@ -270,29 +284,33 @@ proc tell_event_core1 {nl event} { default { append evstate "#$rel#" } } - log "tell_event_core1 core evstate=$evstate (ago=$ago)" + global tell_event_teventi + set tell_event_teventi "$evstate $ago $nl" switch -glob $evstate { pt???rv { # consider delivered: # (very recently passed, and the user talks) tell_delete_msgs {} $nl - return + return delivered } pm????? { # oops, messages passed are now out of date catch_restoreei { unset telling } - return + return reset } ?m????? { # ignore new msgs if we haven't passed yet - return + return ignorenew } - nt????? - mt????? - + ut????? - mt????? - pt???uu - pt???rs - pt???rl - pt???p? { # ignore (any other `talk's) - act handles these - return + return ignoretalk } - ni????? - naii??? - nas?i?? - mi????? - pa????l { + ui????? - + uaii?uu - uaii??l - uas?i?l - + mi????? - pa????l - + ?Tii??? - ?Ts?i?? { # pass and then stuff if {[llength $iml] == 3} { manyset $iml sender sentwhen msg @@ -301,7 +319,7 @@ proc tell_event_core1 {nl event} { to tell you: $msg" } else { sendprivmsg $nl \ - "Here are the [expr {[llength $iml]/3}] messages there are for you:" + "I have [expr {[llength $iml]/3}] messages for you:" while {[llength $iml] >= 3} { manyset [lrange $iml 0 2] sender sentwhen msg set iml [lrange $iml 3 end] @@ -311,33 +329,44 @@ proc tell_event_core1 {nl event} { } if {"$rel" == "unreliable"} { tell_delete_msgs {} $nl - return + return toldunreliable } set stt passed + set re passed } - nas?u?? { + uaslu?? { sendprivmsg $nl {You have messages (so identify yourself please).} set stt mentioned + set re mentioned + } + ?Ts?u?? { + sendprivmsg $nl {You must identify yourself to see your messages.} + return ignoreuitm } masl??? { sendprivmsg $nl {Don't forget about your messages.} + return remind } pi????? { - return + return ignorepi } - mass??? - pa????v - pa????s { + mass??? - pa????v - pa????s - + uaii??v - uaii??s - + uas?i?v - uas?i?s - + uassu?? { # too soon - return + return ignoresoon } * { error "tell_event_core nl=$nl evstate=$evstate ?" } } if {![info exists u]} { - catch_restoreei { unset telling } + set telling [list {} undelivered $now] } else { set telling [list $u $stt $now] } + return $re } proc recordlastseen_n {n how here} { @@ -1240,9 +1269,9 @@ proc msgsdb_set_maydelete {n key l otherkey} { proc tell_delete_msgs {lsenders lrecip} { set ninbound {} set ndel 0 - foreach {s t m} [msgsdb_get $recip inbound] { - if {[llength $senders]} { - if {[lsearch -exact $senders [irctolower $s]] == -1} { + foreach {s t m} [msgsdb_get $lrecip inbound] { + if {[llength $lsenders]} { + if {[lsearch -exact $lsenders [irctolower $s]] == -1} { lappend ninbound $s $t $m continue } @@ -1250,7 +1279,7 @@ proc tell_delete_msgs {lsenders lrecip} { set rsenders($s) 1 incr ndel } - msgsdb_set_maydelete $recip inbound $ninbound outbound + msgsdb_set_maydelete $lrecip inbound $ninbound outbound if {![llength $ninbound]} { upvar #0 nick_telling($lrecip) telling catch { unset telling } @@ -1326,6 +1355,17 @@ def_ucmd delmsg { } } +def_ucmd tellme { + prefix_nick + ta_nomore + check_notonchan + switch -exact [tell_event [irctolower $n] tellme] { + ERROR - INVALID { ucmdr {} {is ill. Help!} } + nomsgs { ucmdr {You have no messages.} {} } + default { } + } +} + def_ucmd tell { global nick_case ownmailaddr ownfullname @@ -1886,7 +1926,7 @@ proc lnick_marktime_now {luser why mentiontold} { global calling_nick set calling_nick $luser sendprivmsg $luser [lnick_pingstring $why $oc ""] - if {$mentiontold} { lnick_checktold $luser } + if {$mentiontold} { after 150 [list lnick_checktold $luser] } lnick_marktime_reset $luser } @@ -1936,7 +1976,7 @@ def_ucmd ping { } if {[llength $oc]} { lnick_marktime_reset $ln } } - lnick_checktold $ln + after 150 [list lnick_checktold $ln] ucmdr {} [lnick_pingstring "Pong!" $oc $text] } diff --git a/helpinfos b/helpinfos index 2cf8e7b..2359e88 100644 --- a/helpinfos +++ b/helpinfos @@ -39,7 +39,7 @@ tell secure, you must !identify yourself to use untell. :tellme -!tellme repeats any messages you have outstanding. +The !tellme command repeats any messages you have outstanding. !set tellme configures how you receive messages sent with !tell: set tellme insecure When I see you. set tellme secure [] Hide body (reminding) until ident. diff --git a/irccore.tcl b/irccore.tcl index d984906..069743e 100644 --- a/irccore.tcl +++ b/irccore.tcl @@ -140,6 +140,10 @@ proc sendout {command args} { eval sendout_priority [list 0 $command] $args } proc log {data} { puts $data } + +proc log_intern {what data} { + puts "[clock seconds] ++ $what $data" +} proc logerror {data} { log $data -- [mdw]