SENTINELLE: Ignore su Text-Flood del proprio Nickname

Qui trovi le Guide dedicate allo script
BuDuS
Amministratore
Messaggi: 364
Iscritto il: 19/07/2009, 14:15
Contatta:

SENTINELLE: Ignore su Text-Flood del proprio Nickname

Messaggioda BuDuS » 13/02/2010, 15:53

Qualcuno si diverte ad attirare la propria attenzione "floodando" (leggi: ripetendo, in sequenza molto ravvicinata, il medesimo testo) il tuo nickname ?

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:
  • 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.
Notare che:
  • 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)
dobbiamo solo trovare un modo per trasformare l'hostname dell'utente da ignorare (contenuto nella variabile $rhost) in una maschera di ignore (che hanno la sintassi nickname!host@domain). Per farlo possiamo appoggiarci alla funzione avanzata "search( pattern,string )" perché se ad esempio scriviamo:

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.

Torna a “Guide”

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite