Clone Scanner

"Come posso scrivere un clone scanner" è una delle domande che più frequentemente ho visto pubblicate su vari siti. È anche un esempio di come la maggior parte di utenti riescano ad utilizzare adeguatamente i loro due strumenti più importanti: il file di help di mIRC ed i loro propri cervelli. In ogni modo, iniziamo...

Prima di poter scrivere uno Script per il clone scanner bisogna essere sicuri di sapere esattamente cosa è un clone.

Cosa sono i cloni?
Sono semplicemente connessioni multiple dallo stesso host (si ricordi che un host è la parte di indirizzo dopo il segno @).
Ah, qui il primo indizio: l'indirizzo.
Ora, come possiamo noi vedere l'indirizzo di qualcuno? Domanda abbastanza semplice, chiunque abbia avuto qualche esperienza con lo scripting conoscerà l'identificatore $address.
Per chi non ne fosse a conoscenza la traduzione da "address" (indirizzo) ad "$address" è piuttosto ovvia...

Questa fase è importante. Rivela il segreto più importante del tutto dello scripting in mIRC.

/help $address

Il file di Help praticamente quasi vi rivela come scrivere lo Script, Si guardi la voce $mask per i tipi di indirizzi che si possono usare e si ricordi che siamo soltanto interessati ad un host corrispondente. Così dovreste individuare subito che quello *!*@host.dominio è la mask corretta, che è la mask di tipo 2.

Trovare i Cloni
Dopo, sappiamo che la cosa importante è che esiste più di un collegamento da quell' host. Come si faccia questo è un po' più ingannevole ed ammetto che questa parte dell'operazione non è qualcosa che salti prontamente dall' helpfile.
Potete pensare di fare un ciclo di confonrti tra $$address ad altri $$address-es, ed in effetti non c'e' nulla di sbagliato in questo. Tuttavia, il modo migliore è lasciare che il mIRC faccia il lavoro duro per voi. Essite infatti un identifier che permette di sapere "quanta gente ha questo host", e se il numero è maggiore di 1, avete un clone. Quell'identifier è $$ial.

Il normale clone scanner farà uno scan solo un canale, così si può preferire il comando $$ialchan e ricordarsi che lo script standard, che usa 0 nel campo N vi dà il conto totale.Passiamo ad un po' di codice.

Controllare un nick.

%host_to_search_for = $address(nick,2)
%number_from_that_host = $ialchan(%host_to_search_for,chan,0)
if (%number_from_that_host > 1) {
;we have clones!
;first set up our vars and loop
var %count = 0
unset %clones
:loop
inc %count
;loop through every nick, adding the nicks to %clones
%clones = %clones $ialchan(%host_to_search_for,chan,%count).nick
if (%count < %number_from_that_host) { goto loop }
echo -a The clones were %clones
}


Controllare un canale.

Naturalmente, quel codice ha funzionato soltanto per un nick. noi invece vogliamo che vengano controllati tutti i nick nel canale. Ciò è (si spera) evidente - basta fare un ciclo di loop attraverso $$nick fino a che non otteniate il risultato di tutti i nick. (proprio come $$address). Per ciascun $$nick che controlliamo, dovremo effettuare il "ciclo interno" codificato sopra.

alias clonescan {
;$1 is the channel to scan
var %count1 = 0
:outer_loop
inc %count1
;now $nick($1,%count) is the nick to check
;the following code is just like that above, but smaller
if ($ialchan($address($nick($1,%count1),2),$1,0) > 1) {
var %clones, %count2 = 0
:inner_loop
inc %count2
%clones = $ialchan($address($nick($1,%count1),2),$1,%count2).nick
if (%count2 < $ialchan($address($nick($1,%count1),2),$1,0)) {
goto inner_loop
}
echo -a These are clones: %clones
}
;now just go to the next nick if there are any more
if (%count1 < $nick($1,0)) { goto outer_loop }
}


Problemi
Noterete certamente alcuni problemi esaminando un certo alias in un canale con vari cloni. Se che Joe è un clone di Jack, allora Jack è un clone di Joe. Questo significa che si innesca due volte:

Questi sono i cloni: Jack Joe
Questi sono i cloni: Joe Jack

Non così buono. Come possiamo riparare a ciò?
Semplice... basta applicare un po' di logica! Avrete bisogno di ricordare l'indirizzo appena controllato e se lo troverete di nuovo non applicare il ciclo interno.
 

 


2001 Mondo IRC®. All rights reserved.
Mondo IRC non e' collegato ai siti linkati e non e' responsabile del loro contenuto.
E' vietata la riproduzione anche parziale.