+ if {[ischan $dest]} {
+ set target $dest
+ set onchan 1
+ } else {
+ set target [ta_word]
+ set onchan 0
+ }
+ set ltarget [irctolower $target]
+ if {![ischan $target]} { error "$target is not a channel" }
+ if {![info exists chan_nicks($ltarget)]} {
+ usererror "I am not on $target."
+ }
+ set ui [chandb_get $ltarget userinvite]
+ if {[catch {
+ if {"$ui" == "pub" && !$onchan} {
+ usererror "Invitations to $target must be made there with !invite."
+ }
+ if {"$ui" != "all"} {
+ if {[lsearch -exact $chan_nicks($ltarget) [irctolower $n]] < 0} {
+ usererror "Invitations to $target may only be made\
+ by a user on the channel."
+ }
+ }
+ if {"$ui" == "none"} {
+ usererror "Sorry, I've not been authorised\
+ to invite people to $target."
+ }
+ } emsg]} {
+ if {"$errorCode" == "BLIGHT USER" && [channel_ismanager $target $n]} {
+ if {[catch {
+ nick_securitycheck 1
+ } emsg2]} {
+ if {"$errorCode" == "BLIGHT USER"} {
+ usererror "$emsg2 Therefore you can't use your\
+ channel manager privilege. $emsg"
+ } else {
+ error $error $errorInfo $errorCode
+ }
+ }
+ } else {
+ error $emsg $errorInfo $errorCode
+ }
+ }
+ if {![ta_anymore]} {
+ usererror "You have to say who to invite."
+ }
+ set invitees {}
+ while {[ta_anymore]} {
+ set invitee [ta_word]
+ check_nick $invitee
+ lappend invitees $invitee
+ }
+ foreach invitee $invitees {
+ sendout INVITE $invitee $ltarget
+ }
+ set who [lindex $invitees 0]
+ switch -exact llength $invitees {
+ 0 { error "zero invitees" }
+ 1 { }
+ 2 { append who " and [lindex $invitees 1]" }
+ * {
+ set who [join [lreplace $invitees end end] ", "]
+ append who " and [lindex $invitees [llength $invitees]]"
+ }
+ }
+ ucmdr {} {} {} "invites $who to $target."
+}
+
+def_ucmd channel {
+ if {[ischan $dest]} { set target $dest }
+ if {![ta_anymore]} {
+ set subcmd show
+ } else {
+ set subcmd [ta_word]
+ }
+ if {[ischan $subcmd]} {
+ set target $subcmd
+ if {![ta_anymore]} {
+ set subcmd show
+ } else {
+ set subcmd [ta_word]
+ }
+ }
+ if {![info exists target]} { error "privately, you must specify a channel" }
+ set procname channel/$subcmd
+ if {"$subcmd" != "show"} {
+ if {[catch { info body $procname }]} {
+ usererror "unknown channel setting $subcmd."
+ }
+ prefix_nick
+ if {[chandb_exists $target]} {
+ channel_securitycheck $target
+ } else {
+ nick_securitycheck 1
+ upvar #0 chan_initialop([irctolower $target]) io
+ upvar #0 nick_unique([irctolower $n]) u
+ if {![info exists io]} {
+ usererror "$target is not a managed channel."
+ }
+ if {"$io" != "$u"} {
+ usererror "You are not the interim manager of $target."
+ }
+ if {"$subcmd" != "manager"} {
+ usererror "Please use `channel manager' first."
+ }
+ }
+ }
+ channel/$subcmd
+}
+
+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" }
+ }
+}
+
+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]]