+def_ucmd who {
+ if {[ta_anymore]} {
+ set target [ta_word]; ta_nomore
+ set myself 1
+ } else {
+ prefix_nick
+ set target $n
+ set myself [expr {"$target" != "$n"}]
+ }
+ set ltarget [irctolower $target]
+ upvar #0 nick_case($ltarget) ctarget
+ set nshow $target
+ if {[info exists ctarget]} {
+ upvar #0 nick_onchans($ltarget) oc
+ upvar #0 nick_username($ltarget) nu
+ if {[info exists oc]} { set nshow $ctarget }
+ }
+ if {![nickdb_exists $ltarget]} {
+ set ol "$nshow is not a registered nick."
+ } elseif {[string length [set username [nickdb_get $target username]]]} {
+ set ol "The nick $nshow belongs to the user $username."
+ } else {
+ set ol "The nick $nshow is registered (but not to a username)."
+ }
+ if {![info exists ctarget] || ![info exists oc]} {
+ if {$myself} {
+ append ol "\nI can't see $nshow on anywhere."
+ } else {
+ append ol "\nYou aren't on any channels with me."
+ }
+ } elseif {![info exists nu]} {
+ append ol "\n$nshow has not identified themselves."
+ } elseif {![info exists username]} {
+ append ol "\n$nshow has identified themselves as the user $nu."
+ } elseif {"$nu" != "$username"} {
+ append ol "\nHowever, $nshow is being used by the user $nu."
+ } else {
+ append ol "\n$nshow has identified themselves to me."
+ }
+ ucmdr {} $ol
+}
+
+def_ucmd register {
+ prefix_nick
+ check_notonchan
+ set old [nickdb_exists $n]
+ if {$old} { nick_securitycheck 0 }
+ set luser [irctolower $n]
+ switch -exact [string tolower [string trim $text]] {
+ {} {
+ upvar #0 nick_username($luser) nu
+ if {![info exists nu]} {
+ ucmdr {} \
+ "You must identify yourself before using `register'. See `help identify', or use `register insecure'."
+ }
+ nickdb_set $n username $nu
+ ucmdr {} {} "makes a note of your username." {}
+ }
+ delete {
+ nickdb_delete $n
+ ucmdr {} {} "forgets your nickname." {}
+ }
+ insecure {
+ nickdb_set $n username {}
+ if {$old} {
+ ucmdr {} "Security is now disabled for your nickname !"
+ } else {
+ ucmdr {} "This is fine, but bear in mind that people will be able to mess with your settings. Channel management features need a secure registration." "makes an insecure registration for your nick."
+ }
+ }
+ default {
+ error "you mean register / register delete / register insecure"
+ }
+ }
+}
+
+proc timeformat_desc {tf} {
+ switch -exact $tf {
+ ks { return "Times will be displayed in seconds or kiloseconds." }
+ hms { return "Times will be displayed in hours, minutes, etc." }
+ beat { return "Times will be displayed in beats (1000B = 1d)." }
+ default { error "invalid timeformat: $v" }
+ }
+}
+
+proc def_setting {opt show_body set_body} {
+ proc set_show/$opt {} "
+ upvar 1 n n
+ set opt $opt
+ $show_body"
+ if {![string length $set_body]} return
+ proc set_set/$opt {} "
+ upvar 1 n n
+ upvar 1 text text
+ set opt $opt
+ $set_body"
+}
+
+def_setting timeformat {
+ set tf [nickdb_get $n timeformat]
+ return "$tf: [timeformat_desc $tf]"
+} {
+ set tf [string tolower [ta_word]]
+ ta_nomore
+ set desc [timeformat_desc $tf]
+ nickdb_set $n timeformat $tf
+ ucmdr {} $desc
+}
+
+proc marktime_desc {mt} {
+ if {"$mt" == "off"} {
+ return "I will not send you periodic messages."
+ } elseif {"$mt" == "once"} {
+ return "I will send you one informational message when I see you."
+ } else {
+ return "I'll send you a message every [showintervalsecs $mt 0]."
+ }
+}
+
+def_setting marktime {
+ set mt [nickdb_get $n marktime]
+ set p $mt
+ if {[string match {[0-9]*} $mt]} { append p s }
+ append p ": "
+ append p [marktime_desc $mt]
+ return $p
+} {
+ global marktime_min
+ set mt [string tolower [ta_word]]
+ ta_nomore
+
+ if {"$mt" == "off" || "$mt" == "once"} {
+ } elseif {[regexp {^([0-9]+)([a-z]+)$} $mt dummy value unit]} {
+ switch -exact $unit {
+ s { set u 1 }
+ ks { set u 1000 }
+ m { set u 60 }
+ mb { set u 0.0864 }
+ b { set u 86.4 }
+ kb { set u 86400 }
+ default { error "unknown unit of time $unit" }
+ }
+ if {$value > 86400*21/$u} { error "marktime interval too large" }
+ set mt [expr {round($value*$u)}]
+ if {$mt < $marktime_min} { error "marktime interval too small" }
+ } else {
+ error "invalid syntax for marktime"
+ }
+ nickdb_set $n marktime $mt
+ lnick_marktime_start [irctolower $n] "So:" 500
+ ucmdr {} [marktime_desc $mt]
+}
+
+def_setting security {
+ set s [nickdb_get $n username]
+ if {[string length $s]} {
+ return "Your nick, $n, is controlled by the user $s."
+ } else {
+ return "Your nick, $n, is not secure."
+ }
+} {}
+
+def_ucmd set {
+ prefix_nick
+ check_notonchan
+ if {![nickdb_exists $n]} {
+ ucmdr {} "You are unknown to me and so have no settings. (Use `register'.)"
+ }
+ if {![ta_anymore]} {
+ set ol {}
+ foreach proc [lsort [info procs]] {
+ if {![regexp {^set_show/(.*)$} $proc dummy opt]} continue
+ lappend ol [format "%-10s %s" $opt [set_show/$opt]]
+ }
+ ucmdr {} [join $ol "\n"]
+ } else {
+ set opt [ta_word]
+ if {[catch { info body set_show/$opt }]} {
+ error "no setting $opt"
+ }
+ if {![ta_anymore]} {
+ ucmdr {} "$opt [set_show/$opt]"
+ } else {
+ nick_securitycheck 0
+ if {[catch { info body set_set/$opt }]} {
+ error "setting $opt cannot be set with `set'"
+ }
+ set_set/$opt
+ }
+ }
+}
+
+def_ucmd identpass {
+ set username [ta_word]
+ set passmd5 [md5sum "[ta_word]\n"]
+ ta_nomore
+ prefix_nick
+ check_notonchan
+ set luser [irctolower $n]
+ upvar #0 nick_onchans($luser) onchans
+ if {![info exists onchans] || ![llength $onchans]} {
+ ucmdr "You must be on a channel with me to identify yourself." {}
+ }
+ check_username $username
+ exec userv --timeout 3 $username << "$passmd5\n" > /dev/null \
+ irc-identpass $n
+ upvar #0 nick_username($luser) rec_username
+ set rec_username $username
+ ucmdr "Pleased to see you, $username." {}
+}