chiark / gitweb /
handle eof on stdin
[ircbot.git] / irccore.tcl
index 22544dff7ecf9bc018828af5de2ad4439f8b7d1d..545446cac3e464c1dd99a4c26d5ca64dc59983e3 100644 (file)
@@ -5,6 +5,7 @@ proc defset {varname val} {
 
 # must set host
 defset port 6667
+defset socketargs {}
 
 defset nick testbot
 defset ident blight
@@ -140,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
@@ -176,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 {}
@@ -197,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
     }
@@ -212,9 +217,17 @@ 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"
+       logerror "error (catch_logged): $emsg\n $errorInfo"
     }
 }
 
@@ -235,6 +248,13 @@ proc check_nick {n} {
     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} {
     return [regexp {^[&#+!]} $dest]
 }
@@ -249,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" }
@@ -260,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" {} {}
     }
 }