Various userdb stuff.
[ircbot] / bot.tcl
diff --git a/bot.tcl b/bot.tcl
index 54cda63..8d8d0c2 100755 (executable)
--- a/bot.tcl
+++ b/bot.tcl
@@ -3,6 +3,17 @@
 set host chiark
 set port 6667
 if {![info exists nick]} { set nick Blight }
+if {![info exists ownfullname]} { set ownfullname "here to Help" }
+set ownmailaddr blight@chiark.greenend.org.uk
+
+if {![info exists globalsecret]} {
+    set gsfile [open /dev/urandom r]
+    fconfigure $gsfile -translation binary
+    set globalsecret [read $gsfile 32]
+    binary scan $globalsecret H* globalsecret
+    close $gsfile
+    unset gsfile
+}
 
 proc sendout {command args} {
     global sock
@@ -49,7 +60,6 @@ proc onread {args} {
     global sock
     
     if {[gets $sock line] == -1} { set terminate 1; return }
-binary scan $line H* inhex; puts >$inhex<
     regsub -all "\[^ -\176\240-\376\]" $line ? line
     set org $line
     if {[regexp -nocase {^:([^ ]+) (.*)} $line dummy prefix remain]} {
@@ -375,16 +385,20 @@ proc def_ucmd {cmdname body} {
 proc ucmdr {priv pub args} {
     return -code return [concat [list $priv $pub] $args]
 }
-    
-def_ucmd help {
-    ta_nomore
+
+proc ucmd_sendhelp {} {
     ucmdr \
 {Commands currently understood:
-help              get this list of commands
-seen <nick>       ask after someone (I'll tell them you asked)
-summon <username> invite a logged-on user onto IRC} {}
+ help              get this list of commands
+ seen <nick>       ask after someone (I'll tell them you asked)
+ summon <username> invite a logged-on user onto IRC
+Send commands to be by /msg, or say them in channel with ! in front.} {}
 }
 
+def_ucmd help { ta_nomore; ucmd_sendhelp }
+
+def_ucmd ? { ta_nomore; ucmd_sendhelp }
+
 proc manyset {list args} {
     foreach val $list var $args {
        upvar 1 $var my
@@ -421,7 +435,7 @@ def_ucmd summon {
        error $rv
     }
     if {[regexp {^problem (.*)} $rv dummy problem]} {
-       ucmdr {} "$target $problem."
+       ucmdr {} "The user `$target' $problem."
     } elseif {[regexp {^ok ([^ ]+) ([0-9]+)$} $rv dummy tty idlesince]} {
        set idletime [expr {$now - $idlesince}]
        set ls $now
@@ -435,6 +449,73 @@ def_ucmd summon {
     }
 }
 
+proc userdb_exists {n} {
+    
+    binary scan [irctolower $n] H* nhex
+    return [file exists users/$nhex]
+}
+
+proc md5sum {value} { exec md5sum << $value }
+
+# proc userdb_store {n args} {   }
+
+def_ucmd newuser {
+    global ownmailaddr ownfullname nick globalsecret
+    prefix_nick
+    if {[ischan $dest]} {
+       error "You must register privately."
+    }
+    if {[userdb_exists $n]} {
+       error "You (or someone else) have already registered the nick $n."
+    }
+    set ownermail [ta_word]
+
+    set now [clock seconds]
+    set small 100000
+    set mult 6
+    set ksecs [expr {$now / $small}]
+    set kmod [expr {$ksecs % $mult}]
+
+    if {[string length $text]} {
+       if {![regexp -nocase {^([0-5])[0-9a-f]+\s+(.*)$} $text pass_sup kmod text]} {
+           error ...
+       }
+       set ksecs [expr {(($ksecs - $kmod) / $mult) * 6 + $kmod}]
+    }
+    set hash [md5sum "$ksecs\n$ownermail\n"]
+    set passwd "$kmod[string range $hash 0 15]"
+
+    if {[info exists pass_sup]} {
+       if {"$passwd" != "$pass_sup"} {
+           error "Incorrect registration password."
+       }
+       userdb_store $n \
+               
+       sendaction $n "ignores your ok"
+    } else {
+       set mailmsg \
+"From: $ownmailaddr ($ownfullname)
+Subject: $nick registration
+To: $ownermail
+
+Thanks for starting the registration process.  You must now issue the
+`newuser' command with both the same email address again, and your
+registration password from this mail.
+
+Nick:          $n
+Email address: $ownermail
+Password:      $passwd
+
+This password will be valid for approximately the next 600ks
+(or until I am restarted).
+
+For example,
+ /msg $nick newuser $ownermail $passwd"
+        exec /usr/sbin/sendmail -odi -oee -oi -t << $mailmsg
+        sendaction $n "has sent your registration mail to $ownermail."
+    }
+}
+
 def_ucmd seen {
     global lastseen nick
     prefix_nick
@@ -473,7 +554,7 @@ if {![info exists sock]} {
     #fconfigure $sock -translation binary
     fconfigure $sock -translation crlf
 
-    sendout USER guest 0 * "chiark testing bot"
+    sendout USER guest 0 * $ownfullname
     sendout NICK $nick
     fileevent $sock readable onread
 }