X-Git-Url: https://git.distorted.org.uk/~mdw/ircbot/blobdiff_plain/8b6ee6268b33f1788f5898c5ed5a253f43497a51..ba7cc780277e0d2aa12d3c9f3051d25f46507979:/bot.tcl diff --git a/bot.tcl b/bot.tcl index bbee0a0..f9dcda8 100755 --- a/bot.tcl +++ b/bot.tcl @@ -90,7 +90,7 @@ proc out_runqueue {now} { set out_queue [lrange $out_queue 1 end] if {[llength $out_queue]} { append orgwhen "+[expr {$now - $orgwhen}]" - append orgwhen ([llength $out_queue])" + append orgwhen "([llength $out_queue])" } puts "$orgwhen -> $msg" puts $sock $msg @@ -200,7 +200,7 @@ proc onread {args} { } if {"$command" == "PRIVMSG" && [regexp {^[&#+!]} [lindex $params 0]] && - ![regexp {^!} [lindex $params 1]]} { + ![regexp {^![a-z][-a-z]*[a-z]( .*)?$} [lindex $params 1]]} { # on-channel message, ignore catch { recordlastseen_p $prefix "talking on [lindex $params 0]" 1 @@ -415,11 +415,7 @@ proc recordlastseen_n {n how here} { } proc note_topic {showoff whoby topic} { - if {[string length $whoby]} { - set msg "FYI, $whoby has changed the topic on $showoff" - } else { - set msg "FYI, I have reset the topic on $showoff" - } + set msg "FYI, $whoby has changed the topic on $showoff" if {[string length $topic] < 160} { append msg " to $topic" } else { @@ -432,10 +428,8 @@ proc note_topic {showoff whoby topic} { } else { set tryspies $tell } -puts "NT>showoff $showoff|whoby $whoby|topic $topic|tell $tell|tryspies $tryspies|msg $msg<" foreach spy $tryspies { set see [chandb_get $spy topicsee] -puts "NT>spy $spy|see $see<" if {[lsearch -exact $see $showoff] >= 0 || \ ([lsearch -exact $see *] >= 0 && \ [lsearch -exact $tell $spy] >= 0)} { @@ -518,6 +512,11 @@ proc leaving {lchan} { unset nlist } +proc doleave {lchan} { + sendout PART $lchan + leaving $lchan +} + proc dojoin {lchan} { global chan_nicks sendout JOIN $lchan @@ -528,7 +527,7 @@ proc check_justme {lchan} { global nick upvar #0 chan_nicks($lchan) nlist if {[llength $nlist] != 1} return - if {"[lindex $nlist 0]" != "$nick"} return + if {"[lindex $nlist 0]" != "[irctolower $nick]"} return if {[chandb_exists $lchan]} { set mode [chandb_get $lchan mode] if {"$mode" != "*"} { @@ -537,11 +536,9 @@ proc check_justme {lchan} { set topic [chandb_get $lchan topicset] if {[string length $topic]} { sendout TOPIC $lchan $topic - note_topic $lchan {} $topic } } else { - sendout PART $lchan - leaving $lchan + doleave $lchan } } @@ -626,15 +623,15 @@ proc msg_NICK {p c newnick} { prefix_nick recordlastseen_n $n "changing nicks to $newnick" 0 recordlastseen_n $newnick "changing nicks from $n" 1 + set luser [irctolower $n] + set lusernew [irctolower $newnick] foreach ary $nick_arys { - upvar #0 nick_${ary}($n) old - upvar #0 nick_${ary}($newnick) new + upvar #0 nick_${ary}($luser) old + upvar #0 nick_${ary}($lusernew) new if {[info exists new]} { error "nick collision ?! $ary $n $newnick" } if {[info exists old]} { set new $old; unset old } } - upvar #0 nick_onchans($new) - set luser [irctolower $n] - set lusernew [irctolower $newnick] + upvar #0 nick_onchans($lusernew) oc foreach ch $oc { upvar #0 chan_nicks($ch) nlist set nlist [grep tn {"$tn" != "$luser"} $nlist] @@ -653,8 +650,12 @@ proc nick_ishere {n} { proc msg_JOIN {p c chan} { prefix_nick recordlastseen_n $n "joining $chan" 1 - upvar #0 nick_onchans([irctolower $n]) oc - lappend oc [irctolower $chan] + set nl [irctolower $n] + set lchan [irctolower $chan] + upvar #0 nick_onchans($nl) oc + upvar #0 chan_nicks($lchan) nlist + lappend oc $lchan + lappend nlist $nl nick_ishere $n } proc msg_PART {p c chan} { @@ -831,20 +832,28 @@ proc loadhelp {} { } def_ucmd help { + upvar 1 n n + + set topic [irctolower [string trim $text]] + if {[string length $topic]} { + set ontopic " on `$topic'" + } else { + set ontopic "" + } if {[set lag [out_lagged]]} { if {[ischan $dest]} { set replyto $dest } else { set replyto $n } if {$lag > 1} { sendaction_priority 1 $replyto \ - "is very lagged. Please ask for help again later." + "is very lagged. Please ask for help$ontopic again later." ucmdr {} {} } else { sendaction_priority 1 $replyto \ - "is lagged. Your help will arrive shortly ..." + "is lagged. Your help$ontopic will arrive shortly ..." } } - upvar #0 help_topics([irctolower [string trim $text]]) info - if {![info exists info]} { ucmdr "No help on $text, sorry." {} } + upvar #0 help_topics($topic) info + if {![info exists info]} { ucmdr "No help on $topic, sorry." {} } ucmdr $info {} } @@ -1150,19 +1159,42 @@ def_chancmd show { } } -def_ucmd op { +proc channelmgr_monoop {} { + upvar 1 dest dest + upvar 1 text text + upvar 1 n n + upvar 1 p p + upvar 1 target target + global chan_nicks + + prefix_nick + if {[ischan $dest]} { set target $dest } if {[ta_anymore]} { set target [ta_word] } ta_nomore - if {![info exists target]} { error "you must specify, or !... on, the channel" } + if {![info exists target]} { + error "you must specify, or invoke me on, the relevant channel" + } + if {![info exists chan_nicks([irctolower $target])]} { + error "I am not on $target." + } if {![ischan $target]} { error "not a valid channel" } + if {![chandb_exists $target]} { error "$target is not a managed channel." } - prefix_nick nick_securitycheck 1 channel_securitycheck $target $n +} + +def_ucmd op { + channelmgr_monoop sendout MODE $target +o $n } +def_ucmd leave { + channelmgr_monoop + doleave $target +} + def_ucmd invite { global chan_nicks @@ -1512,11 +1544,11 @@ proc fail {msg} { } proc ensure_connecting {} { - global sock ownfullname host port nick + global sock ownfullname host port nick socketargs global musthaveping_ms musthaveping_after if {[info exists sock]} return - set sock [socket $host $port] + set sock [eval socket $socketargs [list $host $port]] fconfigure $sock -buffering line fconfigure $sock -translation crlf