| | 
| 
| 
|  |  
| 
Joined:  Feb 2003 Posts: 2,737 Hoopy frood |  
| OP   Hoopy frood Joined:  Feb 2003 Posts: 2,737 | 
Show someone's idle times for the server and each channel you share in common. Handy if you're being a nosy stalker. Replaces /whois  in most cases. Usage: /idle Raccoon * Raccoon signed on 2w1d, idle 1s, @#raccoon[1s] Query[1m5s] Chat[1m12s] @#irchelp[2h9m] +#politics[15h6m] #efnet[2w1d]http://www.hawkee.com/snippet/10010/ ; Use: /idle <nickname>
ALIAS idle { ; by Raccoon 10-July-2013 13-aug-2013
  .raw WHOIS $$1 $1
  .enable #idle_whois
  hinc -mu5 idle_whois cnt 1
  .timerIDLE_WHOIS 1 5 .disable #idle_whois
}
#idle_whois off
RAW 319:*: { hadd -mu5 idle_whois $cid $+ $2 $+ .chans $hget(idle_whois,$cid $+ $2 $+ .chans) $3- | halt }
RAW 317:*: { hadd -mu5 idle_whois $cid $+ $2 $+ .idle $3-4 | halt }
RAW 318:*: { 
  VAR %PRECISION = 2
  var %nick = $2
  var %chans = $hget(idle_whois,$cid $+ $2 $+ .chans)
  var %idles = $hget(idle_whois,$cid $+ $2 $+ .idle)
  var %idle = $gettok(%idles,1,32), %signon = $gettok(%idles,2,32)
  var %i = 1, %cidles, %rchans = %chans
  if ($query(%nick)) { var %cidles = $query(%nick).idle $+ :Query }
  if ($chat(%nick)) { var %cidles = %cidles $chat(%nick).idle $+ :Chat }
  WHILE $gettok(%chans,%i,32) {
    var %pchan = $v1
    var %chan = $regsubex(%pchan,/^[^ $chantypes ]*/x,)
    var %cidle = $nick(%chan,%nick).idle
    if (%cidle != $null) { 
      var %cidles = %cidles %cidle $+ : $+ %pchan
      var %rchans = $remtok(%rchans,%pchan,1,32)
    }
    inc %i
  }
  var %cidles = $sorttok(%cidles,32,n)
  var %i = 1, %chanidles
  WHILE $gettok(%cidles,%i,32) {
    var %pchan = $gettok($v1,2,58)
    var %cidle = $gettok($v1,1,58)
    var %chanidles = %chanidles %pchan $+ [[ $+ $dur(%cidle,%PRECISION) $+ ]]
    inc %i
  }
  echo -atic whois * $2 signed on $dur($calc($ctime - %signon),2) $+ , idle $dur(%idle,2) $+ , %chanidles %rchans
  hdel -w idle_whois $cid $+ $2 $+ .*
  hdec -m idle_whois cnt 1
  if (!$hget(idle_whois,cnt)) { .disable #idle_whois | hfree -w idle_whois }
  halt
}
RAW *:*: halt
#idle_whois end
;$duration(12345678) = 20wks 2days 21hrs 21mins 18secs / $dur(12345678) = 20w2d21h21m18s / $dur(12345678,2) = 20w2d
ALIAS dur { return $remove($gettok($regsubex($duration($1),/(\d+\w)\S*/g,\t),1- $+ $2,32),$chr(32)) } ; by Raccoon |  |  |  
| 
| 
|  |  
| 
Joined:  Feb 2003 Posts: 2,737 Hoopy frood |  
| OP   Hoopy frood Joined:  Feb 2003 Posts: 2,737 | 
Any suggestions on simplifying this script?  It works nicely but doesn't look very elegant. |  |  |  
| 
| 
|  |  
| 
Deega
 |  
| Deega | 
Couple of things I see at a quick look There's no reason for "var %nick = $2", just use $2. Why loop channel/query/chat's twice? Also just declare %rchans blank and add chans as needed. 
  var %i = 1, %cidles, %rchans
  if ($query($2)) { %cidles = $+(Query[,$dur($query($2).idle,%PRECISION),]) }
  if ($chat($2)) { %cidles = %cidles $+(Chat[,$dur($chat($2).idle,%PRECISION),]) }
  WHILE $gettok(%chans,%i,32) {
    var %pchan = $v1, %chan = $regsubex(%pchan,/^[^ $chantypes ]*/x,)
    if ($nick(%chan,$2).idle isnum) { %cidles = %cidles $+(%pchan,[,$dur($v1,%PRECISION),]) }
    else %rchans = %rchans %pchan
    inc %i
  }
Also 
alias dur return $regsubex($gettok($duration($1),1- $2,32),/[kayrinec ]s?/g,)
Last edited by Deega; 18/08/13 11:05 PM.
 |  |  |  
| 
| 
|  |  
| 
Joined:  Jan 2004 Posts: 1,330 Hoopy frood |  
|   Hoopy frood Joined:  Jan 2004 Posts: 1,330 | 
There is a reason to use var %nick = $2; readability and maintainability. |  |  |  
| 
| 
|  |  
| 
Deega
 |  
| Deega | 
If you look at his original code you'll see that both "%nick" and "$2" are being used throughout (even after setting %nick), there goes readability   As for maintainability, "$2" is always going to be... "$2" That will not change.   |  |  |  
| 
| 
|  |  
| 
Joined:  Jan 2004 Posts: 1,330 Hoopy frood |  
|   Hoopy frood Joined:  Jan 2004 Posts: 1,330 | 
But %nick might not always be $2 |  |  |  
| 
| 
|  |  
| 
Joined:  Sep 2005 Posts: 2,630 Hoopy frood |  
|   Hoopy frood Joined:  Sep 2005 Posts: 2,630 | 
I prefer to initialise everything at the start, but that's just a preference thing I guess. Also, as previously suggested you should use %nick for readability purposes. You may one day forget what $2 is in the context of a whois reply, but you'll always know what %nick means   ; Use: /idle <nickname>
ALIAS idle { ; by Raccoon 10-July-2013 13-aug-2013
  .raw WHOIS $$1 $1
  .enable #idle_whois
  hinc -mu5 idle_whois cnt 1
  .timerIDLE_WHOIS 1 5 .disable #idle_whois
}
#idle_whois off
RAW 319:*: { hadd -mu5 idle_whois $cid $+ $2 $+ .chans $hget(idle_whois,$cid $+ $2 $+ .chans) $3- | halt }
RAW 317:*: { hadd -mu5 idle_whois $cid $+ $2 $+ .idle $3-4 | halt }
RAW 318:*: { 
  VAR %PRECISION = 2, %nick = $2, %chans = $hget(idle_whois,$cid $+ $2 $+ .chans), %idles = $hget(idle_whois,$cid $+ $2 $+ .idle), $&
  %idle = $gettok(%idles,1,32), %signon = $gettok(%idles,2,32), %i = 1, %cidles, %rchans = %chans, %pchan, %chan, %cidles, %cidle, %chanidles
  if ($query(%nick)) { %cidles = $query(%nick).idle $+ :Query }
  if ($chat(%nick)) { %cidles = %cidles $chat(%nick).idle $+ :Chat }
  WHILE $gettok(%chans,%i,32) {
    %pchan = $v1
    %chan = $regsubex(%pchan,/^[^ $chantypes ]*/x,)
    %cidle = $nick(%chan,%nick).idle
    if (%cidle != $null) { 
      %cidles = %cidles %cidle $+ : $+ %pchan
      %rchans = $remtok(%rchans,%pchan,1,32)
    }
    inc %i
  }
  %cidles = $sorttok(%cidles,32,n)
  %i = 1
  %chanidles = 
  WHILE $gettok(%cidles,%i,32) {
    %pchan = $gettok($v1,2,58)
    %cidle = $gettok($v1,1,58)
    %chanidles = %chanidles %pchan $+ [[ $+ $dur(%cidle,%PRECISION) $+ ]]
    inc %i
  }
  echo -atic whois * %nick signed on $dur($calc($ctime - %signon),2) $+ , idle $dur(%idle,2) $+ , %chanidles %rchans
  hdel -w idle_whois $cid $+ %nick $+ .*
  hdec -m idle_whois cnt 1
  if (!$hget(idle_whois,cnt)) { .disable #idle_whois | hfree -w idle_whois }
  halt
}
RAW *:*: halt
#idle_whois end
;$duration(12345678) = 20wks 2days 21hrs 21mins 18secs / $dur(12345678) = 20w2d21h21m18s / $dur(12345678,2) = 20w2d
ALIAS dur { return $remove($gettok($regsubex($duration($1),/(\d+\w)\S*/g,\t),1- $+ $2,32),$chr(32)) } ; by Raccoon |  |  |  
| 
| 
|  |  
| 
Joined:  Feb 2025 Posts: 19 Pikka bird |  
|   Pikka bird Joined:  Feb 2025 Posts: 19 | 
Show someone's idle times for the server and each channel you share in common. Handy if you're being a nosy stalker. Replaces /whois  in most cases. Usage: /idle Raccoon * Raccoon signed on 2w1d, idle 1s, @#raccoon[1s] Query[1m5s] Chat[1m12s] @#irchelp[2h9m] +#politics[15h6m] #efnet[2w1d]http://www.hawkee.com/snippet/10010/ ; Use: /idle <nickname>
ALIAS idle { ; by Raccoon 10-July-2013 13-aug-2013
  .raw WHOIS $$1 $1
  .enable #idle_whois
  hinc -mu5 idle_whois cnt 1
  .timerIDLE_WHOIS 1 5 .disable #idle_whois
}
#idle_whois off
RAW 319:*: { hadd -mu5 idle_whois $cid $+ $2 $+ .chans $hget(idle_whois,$cid $+ $2 $+ .chans) $3- | halt }
RAW 317:*: { hadd -mu5 idle_whois $cid $+ $2 $+ .idle $3-4 | halt }
RAW 318:*: { 
  VAR %PRECISION = 2
  var %nick = $2
  var %chans = $hget(idle_whois,$cid $+ $2 $+ .chans)
  var %idles = $hget(idle_whois,$cid $+ $2 $+ .idle)
  var %idle = $gettok(%idles,1,32), %signon = $gettok(%idles,2,32)
  var %i = 1, %cidles, %rchans = %chans
  if ($query(%nick)) { var %cidles = $query(%nick).idle $+ :Query }
  if ($chat(%nick)) { var %cidles = %cidles $chat(%nick).idle $+ :Chat }
  WHILE $gettok(%chans,%i,32) {
    var %pchan = $v1
    var %chan = $regsubex(%pchan,/^[^ $chantypes ]*/x,)
    var %cidle = $nick(%chan,%nick).idle
    if (%cidle != $null) { 
      var %cidles = %cidles %cidle $+ : $+ %pchan
      var %rchans = $remtok(%rchans,%pchan,1,32)
    }
    inc %i
  }
  var %cidles = $sorttok(%cidles,32,n)
  var %i = 1, %chanidles
  WHILE $gettok(%cidles,%i,32) {
    var %pchan = $gettok($v1,2,58)
    var %cidle = $gettok($v1,1,58)
    var %chanidles = %chanidles %pchan $+ [[ $+ $dur(%cidle,%PRECISION) $+ ]]
    inc %i
  }
  echo -atic whois * $2 signed on $dur($calc($ctime - %signon),2) $+ , idle $dur(%idle,2) $+ , %chanidles %rchans
  hdel -w idle_whois $cid $+ $2 $+ .*
  hdec -m idle_whois cnt 1
  if (!$hget(idle_whois,cnt)) { .disable #idle_whois | hfree -w idle_whois }
  halt
}
RAW *:*: halt
#idle_whois end
;$duration(12345678) = 20wks 2days 21hrs 21mins 18secs / $dur(12345678) = 20w2d21h21m18s / $dur(12345678,2) = 20w2d
ALIAS dur { return $remove($gettok($regsubex($duration($1),/(\d+\w)\S*/g,\t),1- $+ $2,32),$chr(32)) } ; by RaccoonIf it's just idle without having to have a whois script, is that possible? |  |  |  
| 
| 
|  |  
| 
Joined:  Dec 2002 Posts: 254 Fjord artisan |  
|   Fjord artisan Joined:  Dec 2002 Posts: 254 | 
One form of simplification I could suggest is abusing regex for all this and avoid the while loops entirely. While this doesn't go as deep as your /whois to grab sign-on time and reported server-idle, it's still a good example: NOTE: looks bigger than what it is... remove the comments it's quite small. 
alias idl {
  ;== Set who we're going to check
  var %who = $1
  ;== 1st Regsubex: make a string of spaces one less than the number of common channels, replace the zero-width spots in-between with the common channel name
  ;== 2nd Regsubex: Find all "channels" within said string, replace it with [idle]:[modeprefix][channel]
  var %ret = $regsubex($regsubex($str($chr(32),$calc($comchan($me,0) -1)),//g,$comchan($me,\n)),/([^ ]+)/g,$+($nick(\1,%who).idle,:,$left($nick(\1,%who,a,r).pnick,1),\1))
  ;== prepend query/dcc-chat info to the end [idle]:[type]
  if ($query(%who)) { var %ret = %ret $+($query(%who).idle,:Query) }
  if ($chat(%who)) { var %ret = %ret $+($chat(%who).idle,:Chat) }
  ;== Regsubex: Sort all by number via $sorttok() (lowest idle) find [(digits)]:[(not space or end of string)] and reformat to <word>[<duration>]
  ;NOTE: we started each "token" with a number (idle) so we can hack $sorttok() in our favor. and use regsubex to "reformat" to your preference.
  var %ret = $regsubex($sorttok(%ret,32,n),/(\d+)\x3a([^ ]+|$)/g,$+(\2,[,$dur(\1),]))
  ;== return if called as an $identifier() else echo to active.
  ;NOTE: Here's where you could prepend your "sign-on" and "whois-idle" before %ret
  $iif($isid,return,echo -a) %ret
}
;== Forgot yours was posted in your snippet so I just whipped up this one....
alias dur { return $regsubex(dur,$duration($1),/([a-z]+|\s)/gi,$iif(\1 != $chr(32),$left(\1,1))) }
/idl Talon +#minecraft[5m39s] Query[23m34s] %#swiftirc[24m44s] #programming[24m44s] |  |  |  
| 
| 
|  |  
| 
Joined:  Dec 2002 Posts: 254 Fjord artisan |  
|   Fjord artisan Joined:  Dec 2002 Posts: 254 | 
Sorry, ignore my first post, I found a bug (return of ":" I didn't consider), and also forgot to replace $me with %who on the two $comchan()'s, still a good reference for the comments. I also reduced the double regex, while it was shorter character wise, it felt wasteful to use the 2nd just to reference $comchan() as \1 for the 3 spots... 
alias idl {
  var %who = $1 , %ret = $regsubex($str($chr(32),$calc($comchan(%who,0) -1)),//g,$+($nick($comchan(%who,\n),%who).idle,:,$left($nick($comchan(%who,\n),%who,a,r).pnick,1),$comchan(%who,\n)))
  ;== If $str(<space>,-1) (IE no common channels) we wind up with ONE zero-width spot (since $str() returned $null), which has no idle and no channel name so you wind up getting a return of ":", reset the var to null.
  if (%ret == :) { var %ret = $null }
  if ($query(%who)) { var %ret = %ret $+($query(%who).idle,:Query) }
  if ($chat(%who)) { var %ret = %ret $+($chat(%who).idle,:Chat) }
  var %ret = $regsubex($sorttok(%ret,32,n),/(\d+)\x3a([^ ]+|$)/g,$+(\2,[,$dur(\1),]))
  $iif($isid,return,echo -a) %ret
}
alias dur { return $regsubex(dur,$duration($1),/([a-z]+|\s)/gi,$iif(\1 != $chr(32),$left(\1,1))) }
/idl Talon %#swiftirc[23m34s] +#minecraft[40m54s] Query[58m49s] #programming[59m59s] /idl Dragon @#swiftirc[15m3s] ~#programming[36m30s] ~#minecraft[36m30s] |  |  |  
| 
| 
|  |  
| 
Joined:  Jul 2006 Posts: 4,032 Hoopy frood |  
|   Hoopy frood Joined:  Jul 2006 Posts: 4,032 | 
Since you mentioned shorter character stuff, I'll point out that you're bringing $calc to the $str just to be able to use the empty pattern // to get the correct number of match, is the arguement there that using // as a pattern is much faster than using a pattern /C/g? Because the $regsubex that doesn't use $calc (GM of slowness) and use such a pattern would be shorter (and probably just as fast pcre wise) than what you used:
 
 
 %ret = $regsubex($str($chr(32),$calc($comchan(%who,0) -1)),//g,$+($nick($comchan(%who,\n),%who).idle,:,$left($nick($comchan(%who,\n),%who,a,r).pnick,1),$comchan(%who,\n)))
 vs
 %ret = $regsubex($str(a,$comchan(%who,0)),/a/g,$+($nick($comchan(%who,\n),%who).idle,:,$left($nick($comchan(%who,\n),%who,a,r).pnick,1),$comchan(%who,\n)))
 
 #mircscripting @ irc.swiftirc.net == the best mIRC help channel
 |  |  |  
| 
| 
|  |  
| 
Joined:  Dec 2002 Posts: 254 Fjord artisan |  
|   Fjord artisan Joined:  Dec 2002 Posts: 254 | 
No it's more in keeping it "correct" in terms of tokens, as your replace combines them all into one garbled string, sure you could do it that way but you'd have to include $chr(32) in your regex substitution to space them out, and possibly $mid(,1,-1) to remove the trailing space at the end (if more regexes done on it which could throw off matches not accounting for the extra space at the end, token identifiers wouldn't care...) |  |  |  
| 
| 
|  |  
| 
Joined:  Jul 2006 Posts: 4,032 Hoopy frood |  
|   Hoopy frood Joined:  Jul 2006 Posts: 4,032 | 
$chr(32) can be added to the $+() and it is still shorter that way, the trailing space should be gone by itself because you're using a variable assignment which doesn't store single trailing space. 
 #mircscripting @ irc.swiftirc.net == the best mIRC help channel
 |  |  |  | 
 |