# #
# Comandi: /who <chan|nick> <register> (il parametro
register è opzionale) #
# /_hadd <hash> <item> <data> aggiunge
un elemento ad una Hash Table (il parametro data è
opzionale) #
# #
# Eventi On join Per registrare un nick #
# (se sono io a joinare, registra #
# l'intero canale) #
# On part Per eliminare un nick #
# On kick Per eliminare un nick #
# On quit Per eliminare un nick #
# On nick Per cambiare la registrazione di #
# un nick con il nuovo nick #
# #
# Identificatori: $_address(<chan>,<nick>,<cid>)
Restituisce l'indirizzo 127.0.0.1 #
# $_fulladdress(<chan>,<nick>,<cid>) Restituisce
tutto l'indirizzo nick!user@127.0.0.1 #
# $_realname(<chan>,<nick>,<cid>) Restituisce
il realname This is my realname #
# $_ident(<chan>,<nick>,<cid>) Restituisce
l'ident ~id #
# $_server(<chan>,<nick>,<cid>) Restituisce
il server irc.smn.it #
# Identificatori Match: #
# $_mfulladdress(<chan>,<fulladdress>,<cid>,<N>)
Restituisce l'Nesimo fulladdress trovato,N = 0 resituisce
il totale dei nick #
# $_maddress(<chan>,<address>,<cid>,<N>)
Restituisce l'Nesimo address trovato, N = 0 restituisce
il totale dei nick trovati #
# $_mident(<chan>,<ident>,<cid>,<N>)
Restituisce l'Nesimo ident trovato, N = 0 restituisce il
totale dei nick trovati #
# $_mserver(<chan>,<server>,<cid>,<N>)
Restituisce l'Nesimo server trovato,N = 0 restituisce il
totale dei nick trovati #
# $_mrealname(<chan>,<realname>,<cid>,<N>)
Restituisce l'Nesimo realname trovato,N = 0 restituisce
il totale dei nick trovati #
# #
# Raw usati: 352 Per registrare #
# 315 Per la conclusione di una registrazione #
# #
# P.S. Tutti gli identificatori match, lavorano con la seguente
stringa <nick match>, e tutti hanno la proprietà
.nick #
# Se la proprieta nick è specificata, il valore dell'identificatore
match sarà quello del nick, se la proprietà
non è specificata #
# restituirà come valore il match specificato #
# #
# Esempio #
# $_mfulladdress(#smn,*!*boo@*,1,1) Restituisce l'indirizzo
del primo nick trovato avente la mask *!*boo@* nel suo fulladdress
#
# $_mfulladdress(#smn,*!*boo@*,1,1).nick Restituisce il
nick del primo nick trovato avente la mask *!*boo@* nel
suo fulladdress #
# Cosi è anche per tutti gli altri IDENTIFICATORI
MATCH #
# #
###########################################
alias _address return $gettok($gettok($hget($+($1,~,$3),$2),1,166),2,64)
alias _ident return $gettok($hget($+($1,~,$3),$2),2,166)
alias _realname return $gettok($hget($+($1,~,$3),$2),4,166)
alias _fulladdress return $gettok($hget($+($1,~,$3),$2),1,166)
alias _server return $gettok($hget($+($1,~,$3),$2),3,166)
alias _nick return $gettok($_fulladdress($1,$2,$3),1,33)
alias _hadd .hadd -sm $1-
alias _mfulladdress {
var %a = $+($1,~,$3),%g = $+($2,*),%i = 0,%t = $hget(%a,0).item,%tot,%tot1
;dichiaro la variabile %a per l'hash del canale,%g il wildcard
match,%i è l'indicatore,%tot il numero totale di
utenti nella hash del canale,%tot,%tot1
while (%i < %t) {
;entro nel ciclo
inc %i
if (%g iswm $gettok($hget(%a,$hget(%a,%i).item),1,166))
&& (!$4) { inc %tot }
;se il wildcard da trovare si trova negli indirizzi e il
parametro $4 non esiste (uguale a 0),inc la var %tot che
restituirà il totale dei
if (%g iswm $gettok($hget(%a,$hget(%a,%i).item),1,166))
{ inc %tot1 }
;se il wildcard da trovare si trova negli indirizzi, incrementa
la var %tot1. Questo passo serve se il parametro $4 è
specificato
if ($4) && (%tot1 == $4) { var %f = $hget(%a,%i).item
$gettok($hget(%a,$hget(%a,%i).item),1,166) | return $gettok(%f,$iif(($prop),1,2-),32)
}
;se $4 esiste (non è uguale a 0) e %tot1 (il N numero
da cercare tra il totale trovati con il match %g) è
uguale a $4 (il N che abbiamo specificato)
;creo la var %f uguale al <nick> <match> e ritorna
come valore l'inidirizzo,se la proprietà .nick è
specificata, restituisce come valore il nick dell'utente
}
return %tot
;questo restituisce il valore degli utenti totali trovato
con il wildcard match (%g) nel caso il parametro $4 sia
uguale a 0
}
;gli altri alias per la ricerca funzionano allo stesso
modo, cambia solo l'uso dei token
alias _maddress {
var %a = $+($1,~,$3),%g = $+($2,*),%i = 0,%t = $hget(%a,0).item,%tot,%tot1
while (%i < %t) {
inc %i
if (%g iswm $gettok($gettok($hget(%a,$hget(%a,%i).item),1,166),2,64))
&& (!$4) { inc %tot }
if (%g iswm $gettok($gettok($hget(%a,$hget(%a,%i).item),1,166),2,64))
{ inc %tot1 }
if ($4) && (%tot1 == $4) { var %f = $hget(%a,%i).item
$gettok($gettok($hget(%a,$hget(%a,%i).item),1,166),2,64)
| return $gettok(%f,$iif(($prop),1,2-),32) }
}
return %tot
}
alias _mident {
var %a = $+($1,~,$3),%g = $+($2,*),%i = 0,%t = $hget(%a,0).item,%tot,%tot1
while (%i < %t) {
inc %i
if (%g iswm $gettok($hget(%a,$hget(%a,%i).item),2,166))
&& (!$4) { inc %tot }
if (%g iswm $gettok($hget(%a,$hget(%a,%i).item),2,166))
{ inc %tot1 }
if ($4) && (%tot1 == $4) { var %f = $hget(%a,%i).item
$gettok($hget(%a,$hget(%a,%i).item),2,166) | return $gettok(%f,$iif(($prop),1,2-),32)
}
}
return %tot
}
alias _mserver {
var %a = $+($1,~,$3),%g = $+($2,*),%i = 0,%t = $hget(%a,0).item,%tot,%tot1
while (%i < %t) {
inc %i
if (%g iswm $gettok($hget(%a,$hget(%a,%i).item),3,166))
&& (!$4) { inc %tot }
if (%g iswm $gettok($hget(%a,$hget(%a,%i).item),3,166))
{ inc %tot1 }
if ($4) && (%tot1 == $4) { var %f = $hget(%a,%i).item
$gettok($hget(%a,$hget(%a,%i).item),3,166) | return $gettok(%f,$iif(($prop),1,2-),32)
}
}
return %tot
}
alias _mrealname {
var %a = $+($1,~,$3),%g = $+($2,*),%i = 0,%t = $hget(%a,0).item,%tot,%tot1
while (%i < %t) {
inc %i
if (%g iswm $gettok($hget(%a,$hget(%a,%i).item),4-,166))
&& (!$4) { inc %tot }
if (%g iswm $gettok($hget(%a,$hget(%a,%i).item),4-,166))
{ inc %tot1 }
if ($4) && (%tot1 == $4) { var %f = $hget(%a,%i).item
$gettok($hget(%a,$hget(%a,%i).item),4-,166) | return $gettok(%f,$iif(($prop),1,2-),32)
}
}
return %tot
}
;Raw per registrare i nick
raw 352:*:{
;creo la variabile %b, che sarà l'id della connessione
di mIRC (solo se il who si fà sul canale), e la variabile
%a che farà riferimento all'hash table dove registreremo
tutti gli indirizzi
var %b = $window($2).cid,%a = $+($2,~,%b)
;a questo punto, se il parametro $2 è uguale a
*, vuol dire che abbiamo fatto un who ad un nick,quindi
se la variabile a lui riferita esiste, vuol dire che non
dovrà essere registrato
;e di conseguenza se la variabile è on, visualizziamo
la risposta del server
if ($2 == *) && (%who [ $+ [ $6 [ $+ [ ~ [ $+
[ $cid ] ] ] ] ] ] == on) { echo -a $6 - $6 $+ ! $+ $3 $+
@ $+ $4 - $5 - $6- | halt }
;se il parametro $2 è un canale e la variabile
riferita al canale è on, allora visualizziamo i messaggi
del server
if ($2 ischan) && if (%who [ $+ [ $2 [ $+ [ ~
[ $+ [ %b ] ] ] ] ] ] == on) { echo -a $2 - $6 $+ ! $+ $3
$+ @ $+ $4 - $5 - $6- | halt }
;se $2 è un canale, e non controlliamo la variabile,
segeuendo una logica,solo questa seconda condizione andrà
in funzione,per cui registriamo tutte le informazioni nel
seguente modo
; _hadd (canale~cid) nick nick!user@host ¦ ident
¦ server ¦ realname (tutto nella hash tables)
if ($2 ischan) { _hadd %a $6 $6 $+ ! $+ $3 $+ @ $+ $4
¦ $3 ¦ $5 ¦ $9- }
;altrimenti, sempre seguendo la logica delle condizioni,
ci troveremo davanti ad un who su un nick, da registrare
(es. on join)
else {
;eseguo un while per aggiungere il nick in tutte le hash
dei canali (questo code è usato quando per caso il
nick entra in + canali dove ci troviamo in rapida successione)
var %i = 0,%t = $comchan($6,0)
while (%i < %t) { inc %i | var %d = $window($comchan($6,%i)).cid,%c
= $+($comchan($6,%i),~,%d) | _hadd %c $6 $6 $+ ! $+ $3 $+
@ $+ $4 ¦ $3 ¦ $5 ¦ $9- }
}
;fermo il raw
halt
}
raw 315:*:{
;creo le variabili per l'id,e il calcolo dei secondi (in
millisecondi)
var %a = $window($2).cid,%ticks = %ticks [ $+ [ $2 [ $+
[ $cid ] ] ] ]
;se il parametro $2 è un canale, e la variabile
a cui fa riferimento il canale è settata su on, allora
visualizzo il messaggio di fine who e cancello la variabile
if ($2 ischan) && (%who [ $+ [ $2 [ $+ [ ~ [ $+
[ $cid ] ] ] ] ] ] == on) { echo -a $2- | unset %who [ $+
[ $2 [ $+ [ ~ [ $+ [ $cid ] ] ] ] ] ] | halt }
;se invece, il parametro $2 è un canale,ma la variabile
non è settata su on (nella condizione non viene controllato,perchè
nella condizione precedente in caso di variabile on, c'è
halt), allora visualizzo la durata della registrazione della
IAL del canale
if ($2 ischan) {
echo $2 -
echo $2 Lista Nick,Server,FullAddress,Address,Realname per
$+($2,/,$scid(%a).server) Finita in $calc(($ticks - %ticks)
/ 1000) secs.
echo $2 -
;cancello la variabile per il calcolo dei secondi
unset %ticks [ $+ [ $2 [ $+ [ $cid ] ] ] ]
;fermo il raw
halt
}
;se il parametro $2 non è un canale, e la variabile
a cui fà riferimento il nick è settata su
on, allora visualizzo il messaggio e cancello la variabile
if ($2 !ischan) && (%who [ $+ [ $2 [ $+ [ ~ [
$+ [ $cid ] ] ] ] ] ] == on) { echo -a $2- | unset %who
[ $+ [ $2 [ $+ [ ~ [ $+ [ $cid ] ] ] ] ] ] | halt }
;P.S. (avrete notato, che la condizione per controllare
se il who è fatto ad un nick registrato non esiste,questo
perchè nel nostro caso, il messaggio del server viene
registrato, perchè non serve
;fermo il raw
halt
}
;Passiamo ora agli eventi
on *:KICK:#:{
scid $cid
;mi trovo la hash, e attribuisco alla variabile %c il
nome della hash
var %c = $+($chan,~,$window($chan).cid)
;cancello il nick dalla hash (con il comando .hdel)
.hdel -s %c $knick
;fermo l'evento
halt
}
on *:JOIN:#:{
;controllo al join, se il nick che joina è il mio
if ($nick == $me) {
;con scid $cid, indico a mIRC che tutti i comandi eseguiti,
saranno svolti solo per quell'id (cioè $cid)
scid $cid
;setto nella variabile il valore di $ticks
set %ticks [ $+ [ $chan [ $ticks [ $cid ] ] ] ] $ticks
;eseguo il comando who, con il parametro -register (ATTENZIONE,
IL COMANDO WHO DI MIRC NON HA IL PARAMETRO REGISTER, BISOGNA
MODIFICARE IL COMANDO!!!)
who $chan -register
}
;altrimenti, se il nick non è il mio
else {
scid $cid
;eseguo il who sul nick che entra, registrandolo
who $nick register
}
}
on *:PART:*:{
;mi trovo l'id del canale,e l'hash table
var %a = $window($chan).cid,%b = $+($chan,~,%a)
;indico che i comandi devono essere eseguiti solo per
l'id $cid (l'id dell'evento)
scid $cid
;se il nick è mio, cancello la hash tables
if ($nick == $me) { .hfree %b }
;se il nick non è il mio, cancello il nick dalla
hash tables
if ($nick != $me) { .hdel %b $nick }
halt
}
;Questo è il comando who modificato
alias who {
;se il parametro $2 è uguale a -register, allora
esegue il who, registrando i nick (vedi i raw)
if ($2 == -register) { .raw who $1 | halt }
;se il parametro $2 non esiste, setta la variabile riferita
al nick o al canale su on, ed esegue il who, e visualizza
i messaggi (vedi i raw)
if (!$2) { set %who [ $+ [ $1 [ $+ [ ~ [ $+ [ $cid ] ]
] ] ] ] on | .raw who $1 | halt }
}
;Questi 2 eventi, li ho separati dagli altri, perke, a
differenza degli altri, essi non hanno l'identificatore
$chan, di conseguenza dovremo eseguire un ciclo e controllare
i canalie, vediamo :P
on *:QUIT:{
;dico a mIRC di eseguire i comandi solo per quell'id
scid $cid
;creo le variabili, una sarà l'indice del ciclo,
l'altra il num totale dei canali in comune con il nick ($nick)
var %i = 0,%t = $comchan($nick,0)
;entro nel ciclo
while (%i < %t) {
;incremento l'indice di 1 (se nn è specificato
il valore di incrementazione, di default si incrementa di
1)
inc %i
;nella variabile %c inserisco l'id del canale
var %c = $window($comchan($nick,%i)).cid
;e poi cancello nella hash table il $nick
.hdel -s $+($comchan($nick,%i),~,%c) $nick
}
;fermo l'evento
halt
}
on *:NICK:{
;dico a mIRC di eseguire i comandi solo per quell'id
scid $cid
;creo le variabili, l'indice e il totale dei canali con
il nick (in questo caso si usera $newnick, cioè il
nuovo nick)
var %i = 0,%t = $comchan($newnick,0)
;entro nel ciclo
while (%i < %t) {
;incremento l'indice
inc %i
;creo la variabile %c con l'id del canale,%n avrà
come valore tutte le informazioni del nick trovate nella
hash table del canale
var %c = $window($comchan($newnick,%i)).cid,%n = $gettok($hget($+($comchan($newnick,%i),~,%c),$nick),2-,33)
;qui cancello il vecchio nick dalla hash table
.hdel -s $+($comchan($newnick,%i),~,%c) $nick
;e qui aggiorno le informazioni aggiungendo alla hash
table del canale il nuovo nick, con tutte le informazioni
che aveva con il nick precedente
_hadd $+($comchan($newnick,%i),~,%c) $newnick $newnick
$+ ! $+ %n
}
;fermo l'evento
halt
-
|