X-Git-Url: https://git.distorted.org.uk/~mdw/ircbot/blobdiff_plain/30ea02aff1953ac948f6f0412ee352f1a66ac853..aedb69d5a18605a67d8ec4ca23a0a5129d67a0c3:/irccore.tcl diff --git a/irccore.tcl b/irccore.tcl index 1721cec..545446c 100644 --- a/irccore.tcl +++ b/irccore.tcl @@ -5,6 +5,7 @@ proc defset {varname val} { # must set host defset port 6667 +defset socketargs {} defset nick testbot defset ident blight @@ -18,9 +19,6 @@ defset out_lag_lag 5000 defset out_lag_very 25000 defset ownping_every 300000 -defset marktime_min 300 -defset marktime_join_startdelay 5000 - proc manyset {list args} { foreach val $list var $args { upvar 1 $var my @@ -143,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 @@ -179,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 {} @@ -200,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 } @@ -215,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 @@ -229,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} { @@ -245,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" } @@ -256,7 +284,7 @@ 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" {} {} } }