X-Git-Url: https://git.distorted.org.uk/~mdw/ircbot/blobdiff_plain/281f2c0e568eb3fac93173a3d0b852259e61245f..ffe52c45029e7e885ffd389191f0e12168ce5e23:/irccore.tcl diff --git a/irccore.tcl b/irccore.tcl index 7a6f157..545446c 100644 --- a/irccore.tcl +++ b/irccore.tcl @@ -5,19 +5,19 @@ proc defset {varname val} { # must set host defset port 6667 +defset socketargs {} defset nick testbot +defset ident blight defset ownfullname "testing bot" defset ownmailaddr test-irc-bot@example.com -defset musthaveping_ms 10000 +defset muststartby_ms 10000 defset out_maxburst 6 defset out_interval 2100 defset out_lag_lag 5000 defset out_lag_very 25000 - -defset marktime_min 300 -defset marktime_join_startdelay 5000 +defset ownping_every 300000 proc manyset {list args} { foreach val $list var $args { @@ -141,6 +141,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 @@ -162,10 +166,12 @@ proc bgerror {msg} { } proc onread {args} { - global sock nick calling_nick errorInfo errorCode line_org_1char + global sock nick calling_nick errorInfo errorCode line_org_endchar - if {[gets $sock line] == -1} { fail "EOF/error on input" } - set line_org_1char [string range $line 0 0] + if {[catch { gets $sock line } rv]} { fail "error on input: $rv" } + if {$rv == -1} { fail "EOF on input" } + + set line_org_endchar [string range $line end end] regsub -all "\[^ -\176\240-\376\]" $line ? line set org $line @@ -175,7 +181,7 @@ proc onread {args} { set line $remain if {[regexp {^([^!]+)!} $prefix dummy maybenick]} { set calling_nick $maybenick - if {"[irctolower $maybenick]" == "[irctolower $nick]"} return + if {![ircnick_compare $maybenick $nick]} return } } else { set prefix {} @@ -196,7 +202,7 @@ proc onread {args} { log "junk at end: $org" return } - if {"$command" == "PRIVMSG" && \ + if {![string compare $command "PRIVMSG"] && \ [privmsg_unlogged $prefix [ischan [lindex $params 0]] $params]} { return } @@ -211,6 +217,20 @@ proc onread {args} { } } +proc catch_restoreei {body} { + global errorInfo errorCode + set l [list $errorInfo $errorCode] + catch { uplevel 1 $body } + manyset $l errorInfo errorCode +} + +proc catch_logged {body} { + global errorInfo + if {[catch { uplevel 1 $body } emsg]} { + logerror "error (catch_logged): $emsg\n $errorInfo" + } +} + proc sendprivmsg {dest l} { foreach v [split $l "\n"] { sendout [expr {[ischan $dest] ? "PRIVMSG" : "NOTICE"}] $dest $v @@ -225,6 +245,14 @@ proc msendprivmsg_delayed {delay dest ll} { after $delay [list msendprivmsg $des proc check_nick {n} { if {[regexp -nocase {[^][\\`_^{|}a-z0-9-]} $n]} { error "bad char in nick" } if {[regexp {^[-0-9]} $n]} { error "bad nick start" } + if {[string length $n] > 18} { error "nick too long" } +} + +proc check_chan {n} { + if {![regsub {^\#} $n {} n]} { error "bad chan start" } + if {[regexp -nocase {[^][\\`_^{|}a-z0-9-]} $n]} { error "bad char in chan" } + if {[regexp {^[-0-9]} $n]} { error "bad chan name start" } + if {[string length $n] > 18} { error "chan name too long" } } proc ischan {dest} { @@ -241,6 +269,10 @@ proc irctolower {v} { return [string tolower $v] } +proc ircnick_compare {a b} { + return [string compare [irctolower $a] [irctolower $b]] +} + proc prefix_none {} { upvar 1 p p if {[string length $p]} { error "prefix specified" } @@ -252,18 +284,28 @@ proc prefix_nick {} { upvar 1 n n if {![regexp {^([^!]+)!} $p dummy n]} { error "not from nick" } check_nick $n - if {"[irctolower $n]" == "[irctolower $nick]"} { + if {![ircnick_compare $n $nick]} { error "from myself" {} {} } } proc msg_PING {p c s1} { - global musthaveping_after prefix_none sendout PONG $s1 - if {[info exists musthaveping_after]} { - after cancel $musthaveping_after - unset musthaveping_after +} + +proc sendownping {} { + global ownping_every nick + sendout ping $nick + after $ownping_every sendownping +} + +proc msg_001 {args} { + global muststartby_after + if {[info exists muststartby_after]} { + after cancel $muststartby_after + unset muststartby_after + sendownping connected } } @@ -284,8 +326,8 @@ proc fail {msg} { } proc ensure_connecting {} { - global sock ownfullname host port nick socketargs - global musthaveping_ms musthaveping_after + global sock ownfullname host port nick ident socketargs + global muststartby_ms muststartby_after ensure_outqueue @@ -294,10 +336,10 @@ proc ensure_connecting {} { fconfigure $sock -buffering line fconfigure $sock -translation crlf - sendout USER blight 0 * $ownfullname + sendout USER $ident 0 * $ownfullname sendout NICK $nick fileevent $sock readable onread - set musthaveping_after [after $musthaveping_ms \ - {fail "no ping within timeout"}] + set muststartby_after [after $muststartby_ms \ + {fail "no successfuly connect within timeout"}] }