+proc lnick_marktime_cancel {luser} {
+ upvar #0 nick_markid($luser) mi
+ if {![info exists mi]} return
+ catch { after cancel $mi }
+ catch { unset mi }
+}
+
+proc lnick_marktime_doafter {luser why ms} {
+ lnick_marktime_cancel $luser
+ upvar #0 nick_markid($luser) mi
+ set mi [after $ms [list lnick_marktime_now $luser $why]]
+}
+
+proc lnick_marktime_reset {luser} {
+ set mt [nickdb_get $luser marktime]
+ if {"$mt" == "off" || "$mt" == "once"} return
+ lnick_marktime_doafter $luser "Time passes." [expr {$mt*1000}]
+}
+
+proc lnick_marktime_start {luser why ms} {
+ set mt [nickdb_get $luser marktime]
+ if {"$mt" == "off"} {
+ lnick_marktime_cancel $luser
+ } else {
+ lnick_marktime_doafter $luser $why $ms
+ }
+}
+
+proc lnick_marktime_now {luser why} {
+ upvar #0 nick_onchans($luser) oc
+ sendprivmsg $luser [lnick_pingstring $why $oc ""]
+ lnick_marktime_reset $luser
+}
+
+proc lnick_pingstring {why oc apstring} {
+ global nick_onchans
+ catch { exec uptime } uptime
+ set nnicks [llength [array names nick_onchans]]
+ if {[regexp \
+ {^ *([0-9:apm]+) +up.*, +(\d+) users, +load average: +([0-9., ]+) *$} \
+ $uptime dummy time users load]} {
+ regsub , $load {} load
+ set uptime "$time $nnicks/$users $load"
+ } else {
+ append uptime ", $nnicks nicks"
+ }
+ if {[llength $oc]} {
+ set best_la 0
+ set activity quiet
+ foreach ch $oc {
+ upvar #0 chan_lastactivity($ch) la
+ if {![info exists la]} continue
+ if {$la <= $best_la} continue
+ set activity "$ch [showintervalsecs [expr {[clock seconds]-$la}]]"
+ set best_la $la
+ }
+ } else {
+ set activity unseen
+ }
+ set str $why
+ append str " " $uptime " " $activity
+ if {[string length $apstring]} { append str " " $apstring }
+ return $str
+}
+
+def_ucmd ping {
+ if {[ischan $dest]} {
+ set oc [irctolower $dest]
+ } else {
+ global nick_onchans
+ prefix_nick
+ set ln [irctolower $n]
+ if {[info exists nick_onchans($ln)]} {
+ set oc $nick_onchans($ln)
+ } else {
+ set oc {}
+ }
+ if {[llength $oc]} { lnick_marktime_reset $ln }
+ }
+ ucmdr {} [lnick_pingstring "Pong!" $oc $text]
+}
+