IAL-Update
From Scriptwiki
Revision as of 18:40, 15 August 2006 by Vliedel (talk | contribs) (bug: $len(%chan) while %chan isn't used)
To have your IAL always up-to-date, you can use the following script (you can find more detailed explanations in the script).
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IAL-UPDATE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;info: ; ; by wiebe @ QuakeNet ; version 1.0 (written and tested on mIRC 6.15) ; ; last edit: Sun Jun 06 2004 ; ; ;What does this script do? ; ; updates the IAL by doing /who chan1,chan2,chan3 etc ; if a channel is too big, /who nick1,nick2,nick3 etc is done untill the IAL for the channel is updated ; script updates from smallest to the biggest channel ; ; ;How to use this script? ; ; config the options below ; /ialupdate can be used to make the script update the IAL without waiting for the timer to trigger it ; ; ;Why is this script good? ; ; sending /who chan for every channel is not needed and goes slow (lag) ; sending /who chan on join may cause Excess Flood or Max sendQ exceeded ; sending /who chan1,chan2,chan3 can be much faster, but only if there are not too many results (Max sendQ exceeded) ; ; ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ALIAS MAX.WHO ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; alias -l max.who { ; maximum number of replies in a WHO, too big may cause 'Max sendQ exceeded' disconnection ; too low may take the script a long time to update the IAL, 500 or 400 should be fine for most situations !return 700 } ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ALIAS LEN.WHO ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; alias -l len.who { ; maximum length of the /who <string>, too long may cause the server to ignore the command ; too low may slow things down, 400 should be fine in most cases !return 400 } ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ALIAS DELAY.WHO ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; alias -l delay.who { ; N seconds after the first join, the script starts to update the IAL !return 120 } ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ALIAS REPEAT.WHO ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; alias -l repeat.who { ; wait N seconds after doing /who to do the next check and /who !return 30 } ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ALIAS SHOW ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; alias -l show.who { ; set this to 1 if you want the script to echo when the IAL is updated ; shows number of opers, number of users that are away, number of users that are deaf (+d), ; number of users that have fake host (+x) ; may slow things down, needs some checks / loops etc ; only shows when a whole channel is being who'd !return 1 } ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; JOIN EVENT ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; on *:join:#:{ ; we join, IAL not updated, timer does not run, start a timer if ($nick == $me) && (!$timer($+($cid,.ial-update.update))) { .!timer $+ $cid $+ .ial-update.update 1 $$delay.who ial-update.update } } ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; LOAD EVENT ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; on *:load:{ !scon -am1 .!timer $!+ $!cid $!+ .ial-update.update 1 $$delay.who ial-update.update } ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ALIAS IALUPDATE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; alias ialupdate { !echo -a IAL-update: $ial-update.update } ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ALIAS IAL-UPDATE.UPDATE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; alias -l ial-update.update { !var %c, %n ; IAL is set on if ($ial) { ; hash table does not exist, set a var with the channels we need to who if (!$hget($+(ial-update.,$cid))) { !var %c = $ial-update.chan($max.who,$len.who) ; something is in there, send it to the hash alias, send the who request if (%c) { ial-update.hash %c | .!quote WHO %c } ; else no channels to who, set a var with the nicks we need to who else { !var %n = $ial-update.nick($max.who,$len.who) ; something is in there, send it to the hash alias, send the who request if (%n) { ial-update.hash %n | .!quote WHO %n } } } ; we did a who or the hash table was not empty, start a timer to run this alias again if (%c) || (%n) || ($hget($+(ial-update.,$cid))) { .!timer $+ $cid $+ .ial-update.update 1 $$repeat.who ial-update.update } ; return some info if (%c) || (%n) { !return updating } elseif ($hget($+(ial-update.,$cid))) { !return already in progress } else { !return nothing to update } } ; ial is off return some info else { !return ERROR, IAL is turned off, /IAL on to enable } } ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ALIAS IAL-UPDATE.SORT ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; $ial-update.sort ; sorts channels where the IAL is not updated ; <number of nicks>.<channel number> ; 127.1 <= means 127 users on channel 1 alias -l ial-update.sort { !var %x = 1, %c ; loop through all common channels that we have with ourself ; $chan(0) returns the number of open channel windows, ; which does not mean you are on it ("keep channels open" option) while (%x <= $comchan($me,0)) { ; check if the ial is not updated or busy, add it to a var if ($chan($comchan($me,%x)).ial == $false) { !var %c = $addtok(%c,$+($nick($comchan($me,%x),0),.,%x),32) } !inc %x } ; return it sorted !return $sorttok(%c,32,n) } ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ALIAS IAL-UPDATE.MAX ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; $ial-update.max(N) ; N maximum number of nicks to request at once ; this alias returns the channels to ial based on the info provided by $ial-update.sort ; #chan1,#chan2,#chan3 alias -l ial-update.max { !var %x = 1, %t = 0, %c = $ial-update.sort, %w ; loop through the channels and as long as %t smaller then $1, increase %t while (%x <= $numtok(%c,32)) && (%t < $1) { !inc %t $gettok($gettok(%c,%x,32),1,46) ; if %t is greater then $1, stop the loop if (%t > $1) { !break } ; add it to a var !var %w = $addtok(%w,$gettok($gettok(%c,%x,32),2,46),32) !inc %x } !return %w } ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ALIAS IAL-UPDATE.CHAN ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; $ial-update.chan(N,L) ; N maximum number of nicks to request at once ; L maximum length of the WHO request ; this alias is used to WHO channels alias -l ial-update.chan { !var %x = 1, %l = 0, %c = $ial-update.max($1), %w ; loop through the channels, as long as %l smaller then $2, increase %l for the length of the channel while (%x <= $numtok(%c,32)) && (%l < $2) { !inc %l $len($comchan($me,$gettok(%c,%x,32))) ; %l greater then $2, stop the loop if (%l > $2) { !break } ; add it to the var !var %w = $addtok(%w,$comchan($me,$gettok(%c,%x,32)),44) !inc %x } !return %w } ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ALIAS IAL-UPDATE.NICK ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; $ial-update.nick(N,L) ; N maximum number of nicks to request at once ; L maximum length of the WHO request ; this alias is used to WHO nicks alias -l ial-update.nick { !var %x = 1 ; loop through the channels untill we found one where the IAL isnt updated while ($chan($comchan($me,%x)).ial != $false) && (%x <= $comchan($me,0)) { !inc %x } ; ial is not updated, set vars if ($chan($comchan($me,%x)).ial == $false) { !var %y = 1, %t = 0, %l = 0, %w ; loop while (%t <= $1) && (%l < $2) && (%y <= $nick($comchan($me,%x),0)) { ; ial for that nick isnt updated, increase %l if (!$ial($nick($comchan($me,%x),%y))) { !inc %l $len($nick($comchan($me,%x),%y)) ; if greater then $2, stop the loop if (%l > $2) { !break } ; add it to the var !var %w = $addtok(%w,$nick($comchan($me,%x),%y),44) } !inc %y } !return %w } } ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ALIAS IAL-UPDATE.HASH ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; /ial-update.hash <things> -remove alias -l ial-update.hash { ; $2 is not there, set a var if ($2 == $null) { !var %x = $numtok($1,44) ; loop through each part seperated with a comma, add it to a hash table while (%x) { !hadd -m $+(ial-update.,$cid) $gettok($1,%x,44) 1 | !dec %x } ; add mask !hadd -m $+(ial-update.,$cid) -mask $1 } ; $2 is -remove, set a var elseif ($2 == -remove) { !var %x = $numtok($1,44) ; loop through each part seperated with a comma, remove it from the hash table while (%x) { if ($hget($+(ial-update.,$cid))) { !hdel $+(ial-update.,$cid) $gettok($1,%x,44) } | !dec %x } ; del mask !hdel $+(ial-update.,$cid) -mask ; check hash table, free hash table if ($hget($+(ial-update.,$cid),0).item == 0) && ($hget($+(ial-update.,$cid))) { !hfree $+(ial-update.,$cid) } } } ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; RAW 352 WHO ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; 352 <you> <channel> <user> <host> <server> <nick> <flags> :<distance> <realname> raw 352:& & & & & & & & *: { ; chan or nick are in the hash table if ($hget($+(ial-update.,$cid),$2)) || ($hget($+(ial-update.,$cid),$6)) { ; check setting, set a var if ($show.who == 1) && ($hget($+(ial-update.,$cid),$2)) && ($comchan($6,0)) { !var %x = $comchan($6,0) ; loop, set a var while (%x) { !var %c = $comchan($6,%x) ; check has table if ($hget($+(ial-update.,$cid),%c)) { ; * meaning oper isin $7, increase if (* isin $7) { !hinc $+(ial-update.,$cid) $+(%c,$chr(44),oper) } ; G meaning Gone isin $7, increase if (G isincs $7) { !hinc $+(ial-update.,$cid) $+(%c,$chr(44),away) } ; d meaning deaf isin $7, increase if (d isincs $7) { !hinc $+(ial-update.,$cid) $+(%c,$chr(44),deaf) } ; x meaning fake host isin $7, increase if (x isincs $7) { !hinc $+(ial-update.,$cid) $+(%c,$chr(44),xhost) } } !dec %x } } ; stop mirc from showing this raw !haltdef } } ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; RAW 315 WHO END ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; raw 315 <you> <requested> :End of /who list. raw 315:& & end of /WHO list.: { ; check -mask in hash table if ($hget($+(ial-update.,$cid),-mask) == $2) { ; check setting, set a var if ($show.who == 1) { !var %x = $numtok($2,44) ; loop, we are on the channel, set var while (%x) { if ($me ison $gettok($2,%x,44)) { !var %c = $gettok($2,%x,44) ; oper info !var %oper = $iif($hget($+(ial-update.,$cid),$+(%c,$chr(44),oper)),$ifmatch,0) !var %oper = %oper / $round($calc(%oper / $nick(%c,0) * 100),1) $+ % Oper ; away info !var %away = $iif($hget($+(ial-update.,$cid),$+(%c,$chr(44),away)),$ifmatch,0) !var %away = %away / $round($calc(%away / $nick(%c,0) * 100),1) $+ % Away ; deaf info !var %deaf = $iif($hget($+(ial-update.,$cid),$+(%c,$chr(44),deaf)),$ifmatch,0) !var %deaf = %deaf / $round($calc(%deaf / $nick(%c,0) * 100),1) $+ % deaf ; xhost info !var %xhost = $iif($hget($+(ial-update.,$cid),$+(%c,$chr(44),xhost)),$ifmatch,0) !var %xhost = %xhost / $round($calc(%xhost / $nick(%c,0) * 100),1) $+ % x-host ; echo !echo -t $gettok($2,%x,44) * IAL updated ( $+ %oper ---- %away ---- %deaf ---- %xhost $+ ) } ; remove from hash table !hdel $+(ial-update.,$cid) $+(%c,$chr(44),oper) | !hdel $+(ial-update.,$cid) $+(%c,$chr(44),away) !hdel $+(ial-update.,$cid) $+(%c,$chr(44),deaf) | !hdel $+(ial-update.,$cid) $+(%c,$chr(44),xhost) !dec %x } } ; remove the items from the hash table ial-update.hash $2 -remove !haltdef } } ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DISCONNECT EVENT ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; on *:disconnect:{ if ($hget($+(ial-update.,$cid))) { !hfree $+(ial-update.,$cid) } }