X-Git-Url: https://git.distorted.org.uk/~mdw/ircbot/blobdiff_plain/7ce72032518e164fbcef80ed0c3b20b91a1a9d26..a69f7d2cdd3d10cded90b734f0557dc8e4d323c7:/bot.tcl diff --git a/bot.tcl b/bot.tcl index 54cda63..8d8d0c2 100755 --- 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 ask after someone (I'll tell them you asked) -summon invite a logged-on user onto IRC} {} + help get this list of commands + seen ask after someone (I'll tell them you asked) + summon 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 }