Proviamo a dare una soluzione al problema.
Come prima cosa dobbiamo verificare che il plug-in sia abilitato ad intercettare il text-flood per i messaggi in entrata (leggi: quello che scrivono gli altri); lo possiamo verificare con il seguente comando:
Codice: Seleziona tutto
/budus cmd /budus macro MC /budus if $iFlagTextFloodIncoming = 1 /ECHO Il text flood in entrata è attivo | /budus else /ECHO Il text flood in entrata è disattivo
I comandi "/budus if", "/budus else", "/budus else if" e "/budus cmd" (detti comandi condizionali) consentono di utilizzare le variabili interne del plug-in (oltre alle variabili utente, agli attributi e alle funzioni avanzate).
Per ottenere la lista delle variabili di BuDuScRiPt usare "/budus var".
***
La MACRO MC serve invece per eseguire comandi multipli (separati dal carattere pipe "|"); nella FAQ è possibile trovare ulteriori info sull'uso di questa MACRO, che consente anche di interagire con l'utente.
L'alternativa (indispensabile se la si vuole anche attivare) è quella di verificarlo tramite il menu dello script: BuDuScRiPt -> Preferenze -> Sistema Anti Flood -> Sistema Anti-flood per i messaggi ALTRUI
(deve esserci la spunta perché sia attivo)
Abilitando quella variabile si dice al plug-in che, nel caso un utente superi i limiti anti-flood, dovrà generare un evento di tipo FLOOD.
I limiti anti-flood sono determinati dalle variabili:
- iMaxMessageChar: Numero massimo di caratteri spedibili in uscita per anti-flood (vedi: "/budus help maxchar")
- iMaxMessageSent: Numero massimo messaggi spedibili in uscita per anti-flood (ma anche ricevibili in entrata) (vedi: "/budus help maxsent")
- tMinSecondSent: Lasso di tempo minimo anti-flood in uscita (ma anche ricevibili in entrata) (vedi: "/budus help minsecond")
Dunque, esaminiamo il nostro problema: Ogni volta che i limiti anti-flood vengono superati con una frase che contiene il mio nickname, voglio ignorare l'utente responsabile.
Possiamo tradurre questo problema con la seguente sentinella:
Codice: Seleziona tutto
/event add 0 flood '$nick='$data' /budus ignore $ru
che infatti significa: Aggiungi una sentinella (/event add) che ogni volta (0) che i limiti anti-flood vengono superati (flood) con una frase ('$data') che contiene il mio nickname ('$nick) ignora (/budus ignore) l'utente responsabile ($ru)
Ricordo che la CONDIZIONE delle sentinelle non è una vera uguaglianza (=) o diseguaglianza (!).
Data la sintassi "COSTANTE OPERATORE VARIABILE" abbiamo che:Notare che:
- Se OPERATORE è "=" allora la CONDIZIONE è soddisfatta se COSTANTE è contenuta in VARIABILE o viceversa.
- Se OPERATORE è "!" allora la CONDIZIONE è soddisfatta se COSTANTE non è contenuta in VARIABILE e viceversa.
Chiaramente VARIABILE viene risolta (leggi: la variabile viene sostituita con il suo valore) prima del confronto.
- Se COSTANTE è racchiusa tra apici ('COSTANTE') e lo è anche la VARIABILE ('VARIABILE') il tutto si traduce in una vera uguaglianza.
- Se COSTANTE inizia con un apice ('COSTANTE) e la VARIABILE è racchiusa tra apici ('VARIABILE') avremo che COSTANTE viene cercata all'interno di VARIABILE (ovviamente dopo che quest'ultima è stata risolta).
- Se COSTANTE non ha apici (COSTANTE) e la VARIABILE è racchiusa tra apici ('VARIABILE') avremo che COSTANTE è un'Espressione Regolare POSIX e viene verificato se VARIABILE la soddisfa.
- SE COSTANTE e VARIABILE non hanno apici, viene prima cercata COSTANTE in VARIABILE e poi il contrario; successivamente, COSTANTE viene utilizzata come Espressione Regolare POSIX e verificato se la VARIABILE (risolta) la soddisfa.
- Nel confronto con COSTANTE usata come Espressione Regolare POSIX (quindi senza apici), la VARIABILE, una volta risolta, viene utilizzata comunque senza gli apici, a differenza di tutti gli altri casi.
Il problema si potrebbe definire risolto, se non fosse per un piccolo inconveniente: se, per qualche ragione, l'hostname dell'utente che andiamo ad ignorare è uguale al nostro, di fatto ignoreremo tutti gli utenti "del nostro network".
Ad esempio: se a generare il flood è un nostro clone (ad esempio un BOT o qualcosa del genere), magari non vogliamo ignorarlo perché potrebbe essere una cosa voluta.
In altri termini: vogliamo ignorare in automatico gli altri e non noi stessi.
Per risolvere questo problema dobbiamo modificare la sentinella sopra, andando ad aggiungere un controllo teso a verificare che l'hostname che vogliamo ignorare non sia lo stesso dell'utente locale.
Questo controllo è possibile farlo tramite la funzione avanzata "match( nickname,hostname,mask )".
Considerando che a livello di variabili avremo:
- $nick contiene il nickname dell'utente locale
- $rhost contiene l'hostname dell'utente da ignorare
- $nick.hostname , usata in un comando condizionale, ritorna l'hostname dell'utente specificato; nel nostro caso $nick verrà risolto con il nickname dell'utente locale, quindi applicando l'attributo .hostname otterremo l'indirizzo di quest'ultimo (ex: budus@123.213.231.112)
Codice: Seleziona tutto
search( @,$rhost )supponendo che $rhost sia "budus@123.213.231.112", il risultato sarà "@123.213.231.112", perché la funzione cerca il "pattern" nella "string" e ritorna tutto quello che viene dopo.
Ora dobbiamo sfruttare tutto questo per eseguire la chiamata con la "match":
Codice: Seleziona tutto
match( $nick,$nick.hostname,*!*search( @,$rhost ) )
ATTENZIONE: E' molto importante rispettare gli spazi quando si utilizzano le funzioni avanzate, perché altrimenti non funzionano !
Questa funzione ritornerà il valore "0" se la maschera (mask) non soddisfa la coppia nickname/hostname fornita, altrimenti, ritorna proprio la maschera (mask).
Bene, è giunto il modo di inserire un'ulteriore condizione nella sentinella anzi, per fare un buon lavoro, ho pensato ad una cosa del tipo "IF THEN ELSE", ovvero:
Codice: Seleziona tutto
/event add 0 flood '$nick='$data' /budus if "match( $nick,$nick.hostname,*!*search( @,$rhost ) )" = 0 /budus ignore $ru\;/budus else /ECHO %C4Evito di ignorare%B $ru%O%C4 perché ha il tuo stesso hostname (%B$rhost%O%C4)
Se il match ha esito positivo, viene eseguito l'ignore; in tutti i casi viene anche eseguito il secondo comando della sentinella (/budus else ...) ma, essendo questo un comando condizionale che va invocato dopo un "/budus if", in realtà eseguirà la propria azione solo se il precedente ha fallito.