# $eterna: listidle,v 1.5 2006/07/26 02:05:45 mrg Exp $ # # tristan+irc@ethereal.net 31jul2000, 2jul2001, 24jul2006 # # bugs/lacking features: # - only works correctly on servers that support multiple-nick /whois (as # of this writing, most of EFnet does not) -- this could be automatically # detected and worked around # - only works on current channel # - /listidle will eat all whois replies until it's done (so among other # things, you can't use /whois while it's running) # for $notword(), $lformat(), $format(), $sort() load functions if (max_recursions < 100) { # li.fixsend uses recursion, unfortunately set max_recursions 100 } if (novice == [ON]) { # we need this for ON to work set novice off } alias li.fixsend { # Input: nick1[!user@host] [nick2[!user@host] ...] # Output: nick1,nick2,... if ([$1]) { @ function_return = [$left($index(! $0) $0),$li.fixsend($1-)] } { @ function_return = [$left($index(! $0) $0)] } } alias listidle { if (left(2 $0) == [-s]) { @ LI.SORTED = 1 } whois $li.fixsend($chanusers($C)) ^on ^raw_irc "% 311 *" { @ LI.USERHOST[$encode($3)] = [$4@$5] } ^on ^raw_irc "% 319 *" #might want to do something here (channels) ^on ^raw_irc "% 313 *" #might want to do something here (IRCop) ^on ^raw_irc "% 320 *" #might want to do something here ("identified to services") ^on ^raw_irc "% 301 *" { @ LI.AWAY[$encode($3)] = [ (aw)] } ^on ^raw_irc "% 317 *" { @ LI.IDLE[$encode($3)] = [$4] @ LI.SIGNON[$encode($3)] = [$5] } ^on ^raw_irc "% 312 *" { if ([$0]!=[$4]) { @ LI.SERVERS[$encode($4)] = LI.SERVERS[$encode($4)] ## [ $3] } } ^on ^raw_irc "% 318 *" { ^on raw_irc -"% 311 *" ^on raw_irc -"% 319 *" ^on raw_irc -"% 313 *" ^on raw_irc -"% 320 *" ^on raw_irc -"% 301 *" ^on raw_irc -"% 317 *" ^on raw_irc -"% 312 *" ^on raw_irc -"% 318 *" li.rwhois } } alias li.rwhois { @ LI.COUNT = 0 foreach li.servers serv { whois $decode($serv) $li.fixsend($li.servers[$serv]) @ LI.COUNT = LI.COUNT + 1 ^assign -li.servers.$serv } ^assign -serv ^on ^raw_irc "% 311 *" # ^on ^raw_irc "% 319 *" #might want to do something here (channels) ^on ^raw_irc "% 313 *" #might want to do something here (IRCop) ^on ^raw_irc "% 320 *" #might want to do something here ("identified to services") ^on ^raw_irc "% 301 *" { @ LI.AWAY[$encode($3)] = [ (aw)] } ^on ^raw_irc "% 317 *" { @ LI.IDLE[$encode($3)] = [$4] @ LI.SIGNON[$encode($3)] = [$5] } ^on ^raw_irc "% 312 *" # ^on ^raw_irc "% 318 *" { @ LI.COUNT = LI.COUNT - 1 if (!LI.COUNT) { ^on raw_irc -"% 311 *" ^on raw_irc -"% 319 *" ^on raw_irc -"% 313 *" ^on raw_irc -"% 320 *" ^on raw_irc -"% 301 *" ^on raw_irc -"% 317 *" ^on raw_irc -"% 312 *" ^on raw_irc -"% 318 *" if (li.sorted) { li.sortedlist } { li.list } ^assign -li.sorted } } } alias li.vaguetdiff { # This function reduces precision of tdiff a bit when tdiff is large. @ li.args = [$*] if ([$[6]word(${#li.args-1} $*)] == [second] && #li.args != 2) { @ li.args = notword(${#li.args-1} $notword($#li.args $*)) } if (#li.args > 3) { @ function_return = [$word(0 $li.args) $word(1 $li.args) $word(2 $li.args) $word(3 $li.args)] } { @ function_return = [$word(0 $li.args) $word(1 $li.args)] } ^assign -li.args } alias li.abbrtdiff { # This function abbreviates hours to h, minutes to m, etc. if ([$2]) { @ function_return = [$0$left(1 $1)$li.abbrtdiff($2-)] } { @ function_return = [$0$left(1 $1)] } } alias li.list { echo *** Nickname Idle Sign-On Account foreach li.idle li.nick { echo *** $lformat(9 $decode($li.nick)) $format(10 $li.abbrtdiff($li.vaguetdiff($tdiff($li.idle[$li.nick])))) $strftime($li.signon[$li.nick] %b %e %H:%M) $li.userhost[$li.nick]$li.away[$li.nick] ^assign -li.idle[$li.nick] ^assign -li.signon[$li.nick] ^assign -li.userhost[$li.nick] ^assign -li.away[$li.nick] } ^assign -li.nick } alias li.sortedlist { @ li.curtime = time() foreach li.idle nick { @ li.since = li.curtime - li.idle[$nick] while (@li.zeroes < 10 - @li.since) { @ li.zeroes = li.zeroes ## [0] } @ li.tosort = [$encode($li.zeroes$li.since).$nick ] ## li.tosort ^assign -li.zeroes } @ li.sorted = sort($li.tosort) @ li.count = 0 echo *** Nickname Idle Sign-On Account while (word($li.count $li.sorted)) { @ li.code = word($li.count $li.sorted) @ li.nick = mid(21 999 $li.code) echo *** $lformat(9 $decode($li.nick)) $format(10 $li.abbrtdiff($li.vaguetdiff($tdiff(${li.curtime - decode($left(20 $li.code))})))) $strftime($li.signon[$li.nick] %b %e %H:%M) $li.userhost[$li.nick]$li.away[$li.nick] ^assign -li.idle[$li.nick] ^assign -li.signon[$li.nick] ^assign -li.userhost[$li.nick] ^assign -li.away[$li.nick] @ li.count = li.count + 1 } ^assign -li.sorted ^assign -li.tosort ^assign -li.curtime ^assign -li.count ^assign -li.code ^assign -li.since ^assign -li.nick ^assign -li.diff }