+ prefix_nick
+ set target [ta_word]
+ if {![string length $text]} { error "tell them what?" }
+
+ set ltarget [irctolower $target]
+ set ctarget $target
+ if {[info exists nick_case($ltarget)]} { set ctarget $nick_case($ltarget) }
+
+ manyset [nickdb_get $target tellsec] sec mailtoint mailwhy
+ manyset [nickdb_get $target tellrel] rel relint relwithin
+ switch -exact $sec {
+ insecure - secure {
+ set now [clock seconds]
+ set inbound [msgsdb_get $ltarget inbound]
+ lappend inbound $n $now $text
+ msgsdb_set $ltarget inbound $inbound
+
+ set outbound [msgsdb_get $n outbound]
+ set noutbound {}
+ set found 0
+ foreach {recip time count} $outbound {
+ if {"[irctolower $recip]" == "$ltarget"} {
+ incr count
+ set recip $ctarget
+ set found 1
+ }
+ lappend noutbound $recip $time $count
+ }
+ if {!$found} {
+ lappend noutbound $ctarget $now 1
+ }
+ msgsdb_set $n outbound $noutbound
+ set msg "OK, I'll tell $ctarget"
+ if {$found} { append msg " that too" }
+ append msg ", "
+ if {"$sec" != "secure"} {
+ switch -exact $rel {
+ unreliable { append msg "neither reliably nor securely" }
+ remind { append msg "pretty reliably, but not securely" }
+ pester { append msg "reliably but not securely" }
+ }
+ } else {
+ switch -exact $rel {
+ unreliable { append msg "securely but not reliably" }
+ remind { append msg "securely and pretty reliably" }
+ pester { append msg "reliably and securely" }
+ }
+ }
+ append msg .
+ ucmdr $msg {}
+ }
+ mailto {
+ set fmtmsg [exec fmt << " $text"]
+ exec /usr/sbin/sendmail -odb -oi -t -oee -f $mailwhy \
+ > /dev/null << \
+ "From: $ownmailaddr ($ownfullname)
+To: $mailtoint
+Subject: IRC tell from $n
+
+$n asked me[expr {[ischan $dest] ? " on $dest" : ""}] to tell you:
+[exec fmt << " $text"]
+
+(This message was for your nick $ctarget; your account $mailwhy
+ arranged for it to be forwarded to $mailtoint.)
+"
+ ucmdr \
+ "I've mailed $ctarget, which is what they prefer." \
+ {}
+ }
+ refuse {
+ usererror "Sorry, $ctarget does not want me to take messages."
+ }
+ default {
+ error "bad tellsec $sec"
+ }
+ }
+}
+
+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." }
+ default { error "invalid timeformat: $v" }
+ }
+}
+
+set settings {}
+proc def_setting {opt show_body set_body} {
+ global settings
+ lappend settings $opt
+ 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"
+}
+
+proc tellme_sec_desc {v} {
+ manyset $v sec mailtoint
+ switch -exact $sec {
+ insecure {
+ return "I'll tell you your messages whenever I see you."
+ }
+ secure {
+ return \
+ "I'll keep the bodies of your messages private until you identify yourself, reminding you every [showintervalsecs $mailtoint 1]."
+ }
+ refuse {
+ return "I shan't accept messages for you."
+ }
+ mailto {
+ return "I'll forward your messages by email to $mailtoint."
+ }
+ default {
+ error "bad tellsec $sec"
+ }
+ }
+}
+
+proc tellme_rel_desc {v} {
+ manyset $v rel every within
+ switch -exact $rel {
+ unreliable {
+ return "As soon as I've told you, I'll forget the message - note that this means messages can get lost !"
+ }
+ pester {
+ set u {}
+ }
+ remind {
+ set u ", or talk on channel within [showintervalsecs $within 1] of me having told you"
+ }
+ default {
+ error "bad tellrel $rel"
+ }
+ }
+ return "I'll remind you every [showintervalsecs $every 1] until you say delmsg$u."
+}
+
+def_setting timeformat {
+ set tf [nickdb_get $n timeformat]
+ return "$tf: [timeformat_desc $tf]"
+} {
+ set tf [string tolower [ta_word]]