B u D u S c R i P t
Version 3.7.86
(19/11/2012)

Password per il Forum: Xk8w2AlM75pYJdv
[ DOWNLOAD ] .::. [ INSTALLAZIONE ] .::. [ USO ] .::. [ SUPPORTO ] .::. [ FAQ ] .::. [ ChangeLog ]
[ DESCRIZIONE & DOWNLOAD ]

BuDuScRiPt è un plugin (o add-on) in italiano per XChat (http://xchat.org) (famoso Client IRC per piattaforma Linux / Windows), al quale aggiunge numerose funzionalità accessibili attraverso i menu che vengono aggiunti.

Lo scopo è quello di fornire possibilità altrimenti non disponibili o riproducibili con ciò che il client base offre (se non in modo complicato), come ad esempio:

  • Possibilità di importare files INI di mIRC, in modo da riprodurre in XChat - accessibili tramite menu - i comandi più semplici che si è abituati ad avere su alcuni script Windows.
  • Ricerca e Download automatizzato di file via DCC (sistema noto come XDCC Search Engine o IRC Search Engine).
  • Supporto a Twitter.
  • eSpeak Text-To-Speech System (Sintesi Vocale / TTS Voice). Possibilità di convertire eventi testuali IRC in parole emesse da un sintetizzatore vocale (ad esempio immagina di "ascoltare" quello che viene detto in un canale mentre fai altro, con la possibilità di partecipare se, quello che senti, è di tuo interesse).
  • PasteBin System. Possibilità di inviare a PasteBin un post, facendolo formattare secondo il contenuto (Bash, C, Perl, Python, ecc...), impostandone la durata (illimitata, 10 minuti, 1 giorno, ecc...) ed inviando, in automatico, alla sessione corrente (canale o finestra privata) il link necessario per visualizzarlo.
  • Possibilità di creare MACRO di comandi (IRC / BuDuScRiPt) che possono utilizzare Variabili (nickname, canale, server, ecc...), così da realizzare procedure automatizzate facilmente.
  • Events Manager, sistema programmabile per il monitoraggio di EVENTI (join, testo, cambio nick, ctcp, ecc...) e l'esecuzione di AZIONI (comandi IRC / BuDuScRiPt , anche multiple) quando vengono soddisfatte determinate CONDIZIONI, le quali, consentono l'uso di variabili ed Espressioni Regolari POSIX.
  • Possibilità di eseguire comandi su condizione (costrutto if / else).
  • Sistema PRIVATE KILLER; consente di ignorare in automatico i messaggi provenienti da utenti sgraditi (QUERY, NOTICE ed INVITE).
  • Sistema BADWORD, BADNICK e BADCHANNEL, cioè la possibilità di eseguire azioni in automatico (KICK, BAN, ecc...) quando un utente scrive "parole proibite" (insulti, parolacce, ecc...), anche basandosi su Espressioni Regolari POSIX, o quando utilizza "nickname vietati".
  • Filtraggio dei messaggi, con possibilità di censurare parole/frasi dette in/da server/canali/utenti specifici, compresa la rimozione dei soli codici colore.
  • Esecuzione di comandi alla shell del sistema operativo e cattura dell'output, utilizzabile come si vuole. Ciò consente di creare dei propri "script" sfruttando altri linguaggi di programmazione, come bash script, estendendo quindi le possibilità di personalizzazione in modo piuttosto semplice e flessibile (è presente un add-on che trasforma XChat in un BOT, sfruttando proprio questa caratteristica.).
  • Comandi Avanzati per la gestione del comportamento Interno del plugin, del Database parallelo, dell'Events Manager, dell'interfaccia di XChat, ecc...; ad esempio sono sfruttati dal plugin stesso al fine di aggiungere menu in grado di controllare player audio come Amarok, Exaile, Rhythmbox, Audacious, Banshee e Last.fm, offrendo il classico annuncio della canzone in ascolto, ecc....
  • Possibilità di passare in modalità AWAY in tutti i canali di tutti i servers (attivi) contemporaneamente, cambiando nick, nonchè, l'identificazione automatica con password (se necessaria), quando c'è il BACK.
  • Avviso acustico (e testuale) quando un utente apre/modifica una QUERY.
  • Avviso acustico (e testuale) quando in un Canale/QUERY viene nominato il nick dell'utente locale, con possibilità di farsi elencare tutte le occorrenze nelle quali è stato nominato.
  • Azioni automatiche su un determinato nickname, come l'invio di un messaggio nel momento in cui entra in un canale, ecc....
  • IGNORE/UNIGNORE di uno o più utenti in base al nickname, anche a tempo. La stessa possibilità è offerta per i BAN.
  • Disabilitazione automatica dei messaggi CTCP in entrata nel caso in cui venga intercettato un DoS basato su CTCP Flood.
  • Gestione dei files di LOG, con ricerca, archiviazione automatica compressa, ecc...
  • Possibilità di personalizzare il menu contestuale di XChat con propri comandi (nessun'altro script per XChat risulta in grado di farlo) .
  • Clone Detector per individuare utenti doppi o di analoga provenienza.
  • Riconoscimento degli utenti anche quando agiscono in anonimato (con nick diverso dal solito) o comunque possibilità di associare ad ogni utente di particolare interesse delle informazioni (è anche disponibile un add-on grafico, installabile a parte, che consente la gestione della Rubrica).
  • Ricerca (associata a Riconoscimento) di uno o più utenti in base ad una stringa pattern.

BuDuScRiPt viene distribuito sotto forma di pacchetto tar.gz (è un archivio compresso tipicamente usato sui sistemi UNIX); sono presenti diverse tipologie di pacchetto a seconda se si desidera installare un binario precompilato oppure si preferisce scaricare i sorgenti da compilare sul proprio sistema (soluzione indispensabile quando non c'è un binario precompilato compatibile con la propria piattaforma).


If download button dont' work, click here.
[ INSTALLAZIONE ]

Una premessa: Nella pagina dei download, per le versioni principali di XChat, è previsto un "comando di installazione" che, copiato, incollato nel prompt di XChat (dove normalmente si scrive per chattare) e premuto INVIO, consente di pre-installare il plugin con estrema semplicità; a seguito del ri-avvio di XChat, il plugin ultimerà la procedura di installazione e sarà pienamente funzionante.

BuDuScRiPt si installa in una propria subdirectory sotto quella di XChat (solitamente .xchat2) al fine di non "miscelarsi" con altri add-on e i files di configurazione dello stesso XChat; in questo modo è possibile rimuoverlo con estrema semplicità nel caso in cui non piaccia (chiaramente si spera non si verifichi questa eventualità, ma almeno si è voluto tenere un occhio di riguardo anche per coloro che vogliano "liberarsene").

E' inoltre da sottolineare come l'aggiornamento sia particolarmente semplice perchè, a parte la copia di backup - vivamente consigliata - della cartella $HOME/.xchat2, non vengono sovrascritti i file di configurazione - che di norma rimangono compatibili - e quindi si procede con le operazioni elencate di seguito.

Infine sottolineo che il plugin NON VA MAI INSTALLATO - E QUINDI USATO - COME UTENTE ROOT. Su Linux l'utente root rappresenta l'Amministratore di sistema, quello che ha tutti i privilegi e la possibilità di fare "qualsiasi cosa". Ne consegue che, qualsiasi operazioni eseguita con questi privilegi, può essere potenzialmente dannosa, ma non solo: malintenzionati potrebbero sfruttare falle del plugin o di eventuali add-on (ad esempio il BOT) per ottenere, in remoto, dei privilegi sulla propria macchina, con tutte le conseguenze che lascio immaginare. Quindi lo ribadisco: mai installare ed usare plugin (ma anche lo stesso XChat) come utente root !


NB:
Mi capitano spesso utenti che, alle prime armi con Linux, hanno difficoltà ad individuare dove il file .tar.gz è stato collocato dopo il Download.
Dato che la collocazione può variare a seconda della distribuzione usata, fornisco alcuni comandi che aiutano a risolvere il problema, indipendenti dalla distribuzione; aprire un Terminale (NON DA UTENTE ROOT) e dare i seguenti comandi:

cd $HOME

find . -iname 'buduscript_*.tar.gz'

Il risultato dovrebbe essere SIMILE al seguente:

./Scaricati/buduscript_3786_2808.tar.gz

dove "buduscript_3786_2808.tar.gz" è il pacchetto dello script e "./Scaricati/" il percorso dove è stato collocato; in base a quest'ultimo, bisognerà dare il comando "cd" corrispondente per rendere corrente la directory dove è presente il pacchetto. Dovrà essere qualcosa di simile a questo:

cd ./Scaricati/

A questo punto sarà possibile continuare con i comandi di installazione descritti di seguito.

Il comando per installare il pacchetto è il seguente:

tar xvzf buduscript_xxxx_yyyy.tar.gz -C $HOME/.xchat2

dove xxxx andrà sostituito con la versione dello script e yyyy con quella del client XChat.

Ad esempio per installare BuDuScRiPt versione 3.7.86 per XChat 2.8.8 dal pacchetto binario precompilato si userà questo comando:

tar xvzf buduscript_3786_2808.tar.gz -C $HOME/.xchat2

NB:
Chi utilizza una versione di XChat precedente alla 2.0, deve tenere presente che la directory nella quale il client salva la propria configurazione è $HOME/.xchat e non $HOME/.xchat2

Una volta estratti i files dal pacchetto è necessario installare il plugin con i seguenti comandi:

cd $HOME/.xchat2/buduscript

./install.sh

Lo script install.sh si preoccuperà di verificare che tutte le condizioni per un corretto funzionamento dello script siano rispettate.

NB:
Lo script non verifica la "compatibilita' binaria" del plugin con quella di XChat o addirittura dell'Hardware.
E' infatti possibile che XChat, pur rispettando una determinata versione, sia stato compilato senza alcune componenti fondamentali per il corretto funzionamento dello script, come ad esempio SSL (Secure Socket Layer, una funzionalità che permette di comunicare con il Server IRC in modo criptato), oppure, che addirittura l'hardware non sia compatibile, come ad esempio accade per architetture diverse da x86_32 e x86_64
In questi casi l'unica soluzione è quella di installare e compilare direttamente i sorgenti dello script (vedi sotto)

XChat, quando viene lanciato, carica in automatico tutti i plugin/script che trova nella sua directory di configurazione $HOME/.xchat2 ; lo script install.sh provvede a creare un link simbolico di questo tipo:

$HOME/.xchat2/budus.so -> $HOME/.xchat2/buduscript/budus.so

Il file budus.so è il plugin vero e proprio (BuDuScRiPt) e si aspetta di trovare tutti gli altri files (configurazione, macro, database, logs, ecc...) nella directory $HOME/.xchat2/buduscript/.


[ DISINSTALLAZIONE ]

Per disinstallare è sufficiente usare il seguente comando di menu: BuDuScRiPt -> Preferenze -> Gestione Plugin\Script Esterni -> Rimuovi BuDuScRiPt (ATTENZIONE)

Oppure, per chi preferisce fare manualmente, dare il seguente comando in un terminale:

rm -fvr $HOME/.xchat2/budus.so $HOME/.xchat2/buduscript/

Se il plugin era già caricato in XChat e questi è ancora in esecuzion è opportuno, al fine di evitare un immediato crash, scaricare il plugin con il seguente comando (direttamente in XChat):

/UNLOAD budus.so

prima di rimuovere i files di installazione dello script.


Compilazione XChat & BuDuScRiPt

Chi invece ha necessità di installare il pacchetto dei sorgenti deve, come prima cosa, procurarsi quelli di XChat, installarli, configurarli opportunamente, compilarli ed eventualmente installarli (non è sempre indispensabile, uno può scaricare i sorgenti della medesima versione utilizzata dal proprio sistema operativo e continuare ad usare quello anzichè sostituirlo con il binario compilato dai sorgenti); a titolo dimostrativo e di aiuto, espongo come compilare XChat 2.8.8:

N.B.:

Affinchè XChat - e successivamente lo script - possa compilarsi è necessario che nel sistema sia installato gcc, g++, libgtk2.0-dev e tutte le dipendenze relative (libglib2.0-dev, libatk1.0-dev, libexpat1-dev, libfontconfig1-dev, libfreetype6-dev, libpango1.0-dev), libgnome-dev ed, eventualmente, libssl-dev.

Sulla distribuzione Ubuntu è possibile che ci siano dei problemi in fase di compilazione; se ad esempio viene comunicato un errore come il seguente:

In file included from fe-gtk.c:48:
xtext.h:273: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘gtk_xtext_get_type’
fe-gtk.c: In function ‘fe_ctrl_gui’:
fe-gtk.c:786: warning: implicit declaration of function ‘setup_apply_real’
fe-gtk.c: In function ‘try_browser’:
fe-gtk.c:925: warning: passing argument 1 of ‘xchat_execv’ from incompatible pointer type
make[3]: *** [fe-gtk.o] Errore 1
make[3]: uscita dalla directory «/home/budus/Scrivania/xchat-2.8.6/src/fe-gtk»
make[2]: *** [all-recursive] Errore 1
make[2]: uscita dalla directory «/home/budus/Scrivania/xchat-2.8.6/src»
make[1]: *** [all-recursive] Errore 1
make[1]: uscita dalla directory «/home/budus/Scrivania/xchat-2.8.6»
make: *** [all] Errore 2

Può essere opportuno utilizzare il seguente comando (nella cartella dei sorgenti XChat) per sistemare le cose:

sed -i 's/GtkType/GType/' src/fe-gtk/xtext.{c,h}

Da utente root:

wget http://xchat.org/files/source/2.8/xchat-2.8.8.tar.bz2
bzcat -c xchat-2.8.8.tar.bz2 | tar xv -C /usr/src/
cd /usr/src/xchat-2.8.8/
./configure --enable-openssl

Chiaramente è possibile configurare diversamente XChat, è possibile vedere i vari parametri configurabili (se ne possono specificare più di uno sulla stessa linea di comando) con:

./configure --help

Alcune opzioni consigliate o che possono risolvere problemi di configurazione/compilazione (alcune disabilitano delle funzionalità, l'alternativa è installare le librerie di sviluppo relative) sono:

--disable-nls
--enable-ipv6
--disable-python
--disable-perl

Io non consiglio di usare queste opzioni tutte e subito, in pratica bisognerebbe usare solo quelle che risolvono problemi di compilazione.

Se tutto l'occorrente è installato, si dovrebbe ottenere un output analogo al seguente:

Building GTK+ Interface .... : yes
Building TEXT Interface .... : no

PLUGINS: Perl: yes Python: yes TCL: yes

mmx tinting ......... : yes spelling .............. : static
XShm tinting ........ : no plugin interface ...... : yes
text backend ........ : pango nls/gettext ........... : yes
openssl support ..... : yes ipv6 support .......... : no
dbus support ........ : yes msproxy ntlm (ISA) .. : no

The binary will be installed in /usr/local/bin

configure complete, now type 'make' and pray.

E' ASSOLUTAMENTE fondamentale che sia presente, nell'output citato sopra, la seguente riga:

Building GTK+ Interface .... : yes

Chiaramente il benestare ultimo alla compilazione è dato dalla seguente riga:

configure complete, now type 'make' and pray.

Compilare XChat con:

make

A questo punto si hanno 2 strade:
  • Installare XChat (ma in genere non è una soluzione che consiglio o comunque è opportuno disinstallare altre versioni eventualmente presenti - in genere quella installata dalla Distribuzione Linux - altrimenti si rischia di lanciare la versione sbagliata, sovrascrivere, ecc...)
  • Limitarsi a creare un link simbolico in questo modo:

    cd /usr/local/bin/
    ln -s /usr/src/xchat-2.8.8/src/fe-gtk/xchat xchat288

    E, dopo essersi creati un'icona sul Desktop (o qualcosa del genere), usare l'icona per lanciare la "versione speciale"; se però la versione compilata è identica a quella utilizzata dalla propria distribuzione, si puo' saltare questo passaggio e procedere con la compilazione di BuDuScRiPt (vedi sotto).
Una volta compilato XChat è il turno di BuDuScRiPt; procedere come segue (da utente "normale"):

wget http://digilander.libero.it/udasoft/Software/Linux/buduscript/buduscript_3786_src.tar.gz
tar xvzf buduscript_3786_src.tar.gz -C $HOME/.xchat2

In questo modo si ottiene che tutti i sorgenti del plugin vengono installati in $HOME/.xchat2/buduscript; per compilare è necessario dare questi comandi:

cd $HOME/.xchat2/buduscript

./makescript.sh xchat_version

xchat_version andrà opportunamente sostituito con la versione dei sorgenti di XChat che si è installati in /usr/src; se ad esempio si deve compilare per la versione 2.8.8 lo script di compilazione di BuDuScRiPt si aspetterà di trovare i sorgenti di XChat in /usr/src/xchat-2.8.8 e il comando di compilazione sarà il seguente:

./makescript.sh 2.8.8

Attualmente i precompilati binari sono disponibili solo per piattaforme x86_32, ma alcuni utenti hanno compilato con successo anche su x86_64 (amd64, ad esempio). La procedura di compilazione, se giunge a termine con successo, prevede anche l'installazione del plugin previa conferma.

[ USO ]

Il plugin può essere utilizzato attraverso i comandi disponibili "a riga di comando" o tramite i menu a tendina.

A linea di comando sono disponibili 2 comandi: /budus e /event , i quali, offrono numerosi sub-comandi. E' possibile ottenere la lista dei sub-comandi usando /budus help e /event help .

E' disponibile una completa [ GUIDA ] di tutti i parametri e comandi disponibili a riga di comando e una completa [ FAQ ] che da risposta alle domande/problemi più frequenti, manifestati dagli utenti negli anni (sì, sono parecchi anni che è in giro questo script ^_^ ).

Il plugin viene caricato per mezzo di un link simbolico presente nella cartella .xchat2 che fa riferimento alla sotto-cartella buduscript; su XChat 2.x è supportato il menu a tendina, che viene creato anche in base a ciò che è effettivamente installato sul sistema. Ad esempio se viene intercettato Amarok, il plugin aggiunge in automatico il menu che ne consente la gestione. Lo stesso avviene per Audacious, Exaile, Rhythmbox.

Di seguito sono esposti i comandi più importanti disponibili a menu. Inizio con il menu BuDuScRiPt:

  • Aiuto: E' il primo posto dove guardare e leggere. Qui è possibile aprire le varie guide disponibili, in particolare:
    • Ottenere Supporto ON-LINE: E' una procedura automatica che si collega al server/canale ufficiale di BuDuScRiPt dove l'autore, eventuali utenti o anche il BOT possono fornire un aiuto concreto ai problemi relativi XChat e BuDuScRiPt.
    • FAQ dello script: La FAQ andrebbe letta almeno una volta, come minimo la prima parte, dove sono esposte le sole domande alle quali, successivamente, viene data una risposta. Aiuta a rendersi conto di quante cose sono possibili grazie al plugin.
    • LOG Cambiamenti: Quando si aggiorna lo script (anzi, io consiglio di farlo prima, leggendo quello ON-LINE aggiornato) è indispensabile sapere cosa è cambiato e la lista dei cambiamenti va sicuramente letta.
  • Preferenze: Attraverso questo menu è possibile determinare tutti i parametri esecutivi del plugin. Quando si varia un parametro, questo è effettivo solo fino alla chiusura di XChat. Se si desidera renderlo permanente, va salvato.
    • Carica Configurazione Salvata: Se è presente una configurazione su disco, questa viene caricata sovrascrivendo quella attiva. Di norma il plugin è in grado di caricare file di configurazione salvati con versioni precedenti. All'avvio di XChat, la configurazione su disco viene sempre caricata, sovrascrivendo quella di default.
    • Salva Configurazione Attiva: E' l'unico modo per rendere permanente una configurazione.
    • Mostra Configurazione Attiva: Consente di avere una panoramica di tutti i parametri dello script e del loro valore corrente.
    • Azzera e mostra Configurazione Attiva: Imposta tutti i parametri ai "valori di fabbrica" e ne mostra una panoramica; l'eventuale configurazione su disco non viene modificata quindi, se non si salva, alla chiusura di XChat la configurazione attiva sarà persa e al ri-avvio sarà caricata quella eventualmente su disco.

    • Gestione Menu Programmi Esterni: Consente di stabilire, nel caso in cui lo script individui dei programmi esterni per i quali sono previsti comandi personalizzati di gestione, quali menu devono essere aggiunti. In questo modo è possibile togliere i menu aggiuntivi che non sono desiderati.
    • Gestione Plugin\Script Esterni: Automatizza l'installazione o l'aggiornamento di Script o Plugin esterni a BuDuScRiPt (Setup Grafico, ADD-ON, ma anche software per XChat fatto da altri).
    • Aggiungi Pulsanti Monitoring in Query: Nella finestra di dialogo dei messaggi privati (QUERY tra utenti), vengono aggiunti due pulsanti che servono rispettivamente per "monitorare" e "togliere dal monitoraggio" l'utente remoto corrispondente alla finestra stessa; i pulsanti, una volta aggiunti, sono permanenti ed e' possibile rimuoverli solo manualmente agendo tramite il comando di menu: Impostazioni -> Avanzate -> Pulsanti di dialogo ....

    • Disabilita Messaggi\Avvertimenti fastidiosi dello Script: Chi si avvicina al plugin dopo l'uso dello "scarno" XChat, potrebbe trovare fastidiosi alcuni o anche tutti i messaggi "nuovi" che il plugin va ad emettere. Su suggerimento di alcuni utenti è stato creato questo comando che disabilita di colpo tutto quello che normalmente "infastidisce", dando all'utente la possibilità di attivare singolarmente quello che si desidera.
      Oltre a sottolineare che l'esecuzione di questo comando comporta che il menu Preferenze non sarà più necessariamente allineato con la sessione corrente e che, se si vuole rendere permanente la configurazione, questa va salvata, è importante porre attenzione al fatto che, in questo modo, vengono inibiti alcuni messaggi che possono aiutare l'utente a capire "il perchè" di certi comportamenti od eventuali anomalie e che quindi sarebbe opportuno evitarlo, in favore di una disabilitazione manuale e consapevole di ogni singolo aspetto che si vuole inibire.

    • Avvisi Acustici: Per avvertire l'utente il plugin si avvale di alcuni avvisi acustici (variano anche a seconda del contesto); se non si desidera riceverli, questo menu ne consente la disabilitazione.

    • Monitoraggio Domini: Consente di Abilitare/Inibire il monitoraggio dei domini degli utenti (è possibile associare informazioni ai domini e, quando il plugin individua un utente il cui dominio risulta avere informazioni associate, lo comunica).
    • Monitoraggio Nickname in JOIN: E' possibile creare una lista di nickname per i quali si desidera essere avvistati nel momento in cui effettuano i join (o comunque che acquisiscono il nickname desiderato) attraverso il menu Comandi Utente -> Monitoraggio. Questo comando permette di Abilitare/Inibire questo servizio.
    • Monitoraggio Nickname Locale: Abilita/Inibisce l'avviso (acustico/testuale) che viene emesso quando viene invocato il nickname dell'utente locale.
    • Monitoraggio QUERY: Quando un utente apre una query privata con l'utente locale, viene emesso un avviso (acustico/testuale); questo comando permette di Abilitare/Inibire questa funzione.
    • Lista Utenti Pubblica: Il comando /budus names stampa la lista degli utenti presenti nel canale corrente, formattandola opportunamente; questa opzione consente di stabilire se la cosa va fatta in modo Pubblico (default) o Privato.
    • Clone Count ... (Numero massimo di Cloni intercettabili): In canali molto frequentati o "speciali" (ad esempio su BitlBee, dove gli utenti hanno tutti il medesimo dominio, non essendo un vero e proprio Server IRC), l'individuazione di tutti i cloni possibili può essere più inopportuna che utile. Questo parametro consente di stabilire quanti cloni, al massimo, devono essere intercettati/cominicati prima che la ricerca venga interrotta. Inoltre influisce anche per determinare quante occorrenze di un medesimo dominio devono essere intercettate prima che questi sia considerato come "host virtuale" e quindi non reale. Gli "host virtuali" sono domini che non corrispondono al vero indirizzo IP dell'utente e quindi vanificano il Clone Detector. Più il limite è elevato, tanti più domini uguali saranno necessari per stabilire che si tratta di uno virtuale.
    • Clone Detector: Il Clone Detector è lo strumento che consente di verificare se due o più utenti condividono il medesimo indirizzo IP (e quindi, teoricamente, potrebbero anche essere la medesima persona). In genere i "cloni" sono un qualcosa di sgradito su IRC, ecco il perchè di questa funzionalità. Il comando permette di Abilitare/Inibire il Clone Detector.
    • Destinazione Messaggi Avvertimento in Finestra Attiva: Quando il plugin emette un messaggio testuale in base al verificarsi di una qualche condizione monitorata, ha la possibilità di mandarlo in 2 posti diversi: nella finestra corrente o in quella dove effettivamente si è verificato l'evento. Questo comando consente di stabilire dove si vuole inviare i messaggi.
    • Messaggi di Avvertimento: Al verificarsi di eventi monitorati, il plugin emette un messaggio testuale e uno sonoro; questo comando permette di Abilitare/Inibire quello testuale.
    • Messaggi di Errore: In alcune occasino il plugin deve emettere messaggi di errore o di avvertimento. Non è buono disabilitarli, ma se proprio danno fastidio, questo comando consente di farlo.
    • Messaggi Anti Flood: Quando il plugin intercetta un utente che sta generando un text-flood, provvede a segnalarlo con un messaggio testuale; questo comando permette di Abilitarlo/Inibirlo.
    • Messaggi pubblicitari dello script: In alcune occasioni lo script invia dei messaggi pubblicitari; questo comportamento può essere sgradito e tramite questo comando viene offerta la possibilità di Abilitarlo/Inibirlo.
    • Ringraziamento su MODE: Al cambio di MODE il plugin risponde in modo automatico "ringraziando" l'autore del camiamento; questo comando Abilita/Inibisce la risposta automatica.
    • Risposte CTCP: Comando per Abilitare/Inibire le risposte ai messaggi CTCP; i messaggi CTCP, in genere, vengono inviati per conoscere quale Client IRC si utilizza. BuDuScRiPt risponde fornendo la propria versione (su alcuni Network IRC è indispensabile rispondere, pena il BAN). Questo comando Abilita/Inibisce tutte le risposte CTCP. In alcuni casi, se il plugin intercetta un CTCP DoS/Flood, può disabilitare automaticamente questa opzione.

    • Sistema Anti Flood: E' un sotto-menu che contiene i comandi per Abilitare/Inibire il controllo in entrata/uscita e, soprattutto, per stabilire i parametri che determinano quando un text-flood deve essere considerato tale. Il text-flood in entrata (quello generato dagli altri utenti), se abilitato, genera anche l'Evento relativo (gestibile quindi dalle sentinelle). Il text-flood in uscita (quello generato dall'utente locale), se abilitato, può comportare il blocco del Client IRC nel caso in cui "lo si stia per superare"; questo per impedire il KICK automatico in quei canali dove i parametri anti-flood vanno rigorosamente rispettati.

    • Censura: E' un sotto-menu che consente di amministrare le funzioni del plugin dedicate alla censura di Parole/Nickname (ad esempio quando vengono utilizzate parolacce) o interi Canali/Server (censurare un canale può essere utile quando si fa "lo scambio JOIN" ma non si desidera assolutamente partecipare al canale e, anzi, si vuole che il medesimo appesantisca poco il client), oppure, non si desidera utenti che frequentano determinati canali. All'interno dello script queste funzionalità di censura sono chiamate con: BADWORD (individuazione parole proibite), BADNICK (individuazione nickname proibiti), BADCHANNEL (censura canali proibiti), FILTRO (censura parole server, canali, utenti o frasi/parole proibiti).
      N.B.: I sistemi BADWORD e BADNICK hanno il solo scopo di generare gli omonimi eventi e dovrà essere l'utente a creare le sentinelle che dovranno intraprendere azioni le desiderate; nel menu BuDuScRiPt >> Gestione Sentinelle sono presenti dei comandi che creano queste sentinelle in automatico.

      Il sistema BADCHANNEL non genera eventi, ma già la sua attivazione comporta che il plugin possa intraprendere l'azione di BANKICK a tempo sugli utenti che risultano frequentare canali proibiti laddove il sistema stesso risulta attivo. Quindi, affinchè questo controllo sia attivo, è necessario (tramite i comandi offerti dal menu BuDuScRiPt >> Preferenze >> Censura) creare la lista dei canali proibiti e stabilire in quali canali rendere attivo il servizio. Nei canali dove è attivo il servizio, ad ogni JOIN di un utente, viene eseguito un /WHOIS.

      Il FILTRO invece consente di censurare categoricamente, in base a delle regole, quello che XChat riceve. Ad esempio è possibile censurare tutto quello che viene scritto da un determinato nickname o tutte le frasi contenenti determinate parole. In questo caso per "censura" si intende che è come se il messaggio non sia ricevuto dal server quindi nè XChat, nè BuDuScRiPt potranno ulteriormente elaborarlo.
      Una funzionalità interessante offerta dal filtro consiste nella possibilità di rimuovere i colori; in questo modo è possibile leggere senza "spaccarsi gli occhi" anche in quei canali dove l'uso della formattazione testo è molto pesante.
      Il FILTRO è potenzialmente in grado di compromettere gravemente il funzionamento di BuDuScRiPt - probabilmente anche quello di altri script/plugin che agiscano successivamente - perchè interviene ad un livello molto basso. Questo comporta che "applicare filtri sbagliati o troppo generici" (ad esempio su un intero server/canale o utilizzando espressioni regolari poco "precise") possa causare forti anomalie nel comportamento e, in tutti i casi, è normale che alcune funzionalità del plugin non agiscano su ciò che viene censurato (ad esempio il monitoring di parole o nickname).
      Quindi: usare il filtro meno possibile o comunque per casi molto specifici.
      Gestione dei FILTRI

      Il menu BuDuScRiPt -> Preferenze -> Censura contiene i comandi per gestire i Filtri di BuDuScRiPt ed, in particolare, il comando Modifica dei Filtri... che apre un editor (NANO) tramite il quale è possibile modificare il "File dei Filtri"; lo script, per default, legge il file $HOME/.xchat2/buduscript/filter.txt ma, tramite il comando /budus filterfile, è possibile specificarne anche un altro.
      Il "File dei Filtri" prevede che, per ogni riga, venga specificato un filtro che rispetta la seguente sintassi:
      [[network,][canale,][nickname,][removecolors()]][[/][stringa]]
      Questo tipo di sintassi consente di ottenere 3 principali tipoligie di filtro:
      1. Che agisce su un mix di parametri formato da network, canale e nickname (dati di provenienza del messaggio).
      2. Che agisce solo sulla "stringa dati"; in linea di massima rappresenta - ma non necessariamente - ciò che un altro utente scrive (dati del messaggio).
      3. Che agisce su un mix delle due precedenti tipologie.
      Partendo per gradi, possiamo analizzare una riga di esempio come questa:
      irc.mionetwork.net,
      che rappresenta un filtro che agisce sull'interno network "irc.mionetwork.net"; in pratica, tutti i messaggi provenienti dal suddetto network, saranno censurati. In altri termini è come non ci si collegasse proprio, si fa giusto "presenza", si può inviare messaggi ma, tutti quelli ricevuti, sono eliminati (non solo messaggi di testo, ma anche JOIN e quant'altro).
      Poi abbiamo:
      #miocanale,
      che rappresenta un filtro che agisce sull'intero canale "#miocanale"; vale il medesimo discorso fatto per il network, con la differenza che è limitato ad un canale.
      Poi abbiamo:
      BuDuS,
      che rappresenta un filtro che agisce sul nickname "BuDuS"; tutto quello che farà questo utente sarà sistematicamente censurato.
      Si può specificare meglio il target del filtro "sommandoli", come ad esempio:
      #miocanale,BuDuS,
      che agisce sull'utente "BuDuS" ma nel solo canale "#miocanale", mentre:
      irc.mionetwork.net,#miocanale,
      che, analogamente, agisce sull'intero canale "#miocanale" ma solo se appartiene al network "irc.mionetwork.net".
      Infine il più completo:
      irc.mionetwork.net,#miocanale,BuDuS,
      che censura l'utente "BuDuS", ma solo nel canale "#miocanale" del network "irc.mionetwork.net". Notare che, in tutti gli esempi, i vari parametri sono separati da una virgola ",", indispensabile per non ottenere "un comportamente inaspettato".
      Anzichè censurare, potremmo volere semplicemente rimuovere i colori; valgono le cose dette precedentemente, si deve solo aggiungere il comando "removecolors()", ad esempio:
      irc.mionetwork.net,#miocanale,BuDuS,removecolors()
      rimuove i codici colore eventualmente usati dall'utente "BuDuS", ma solo nel canale "#miocanale" del network "irc.mionetwork.net".

      Anzichè censurare specificando i "dati di provenienza", si può scegliere di filtrare in base a ciò che viene ricevuto (dati del messaggio), indipendentemente da chi lo fa. In questo caso è sufficiente specificare la frase che si desidera proibire, ad esempio:
      parolaccia
      Chiunque scriva qualcosa che contiene la parola "parolaccia", verrà censurato. Intendiamoci:
      • Solo i messaggi che soddisfano il filtro vengono eliminati; in altri termini, se un utente viene "parzialmente censurato" (ad esempio solo su frasi specifiche), solo quello che combacia con il filtro subisce intervento.
      • I filtri non agiscono solo su ciò che viene scritto ma, come detto in precedenza, tutti i "messaggi IRC" (in altri termini, quelli che è possibile visualizzare tramite la voce di menu Finestra > Log grezzo..., praticamente TUTTO quello che si riceve dal Server IRC).
      • XChat riceve comunque i messaggi dal Server IRC e li gestisce normalmente; è solo BuDuScRiPt ed eventualmente altri plugin - che intervengono successivamente - subiscono la censura.

      La censura delle frasi supporta anche le Espressioni Regolari POSiX; è sufficiente anteporre il carattere "/" alla frase da censurare. Ad esempio:
      /Entrate nel canale .*, vi aspetto numerosi.
      Il codice ".*" significa "qualsiasi cosa", quindi tutte le frasi che iniziano con "Entrate nel canale ", continuano con qualsiasi cosa e continuano con ", vi aspetto numerosi." (quindi è necessario che anche questo pezzo di frase sia presente), saranno censurate.
      E' anche possibile che si desideri censurare frasi appartenenti a determinati utenti; ad esempio volendo censurare un utente che usa il nickname "Rompiballe" e che usa molto il comando "/ME" (che equivale ad "/ACTION"), si potrebbe usare:
      /Rompiballe,.ACTION 
      Un problema che può sorgere nell'uso di espressioni regolari quando sono coinvolti anche i nickname è l'interpretazione indesiderata dei "caratteri speciali"; ad esempio un nickname come "[|Pr{o}va|]" ne contiene ben 6 e, per evitare problemi, è necessario usare il carattere di escape "\" in questo modo:
      /\[\|Pr\{o\}va\|\],.ACTION 

      Una volta che il filtro è stato salvato è necessario ri-caricarlo in BuDuScRiPt tramite il comando:
      /budus filterfile
      Vengono segnalati dal plugin quanti filtri sono caricati; porre inoltre attenzione al fatto che, affinchè i filtri siano attivi, è necessario che la variabile "iFlagFilterSystem" sia ad un valore uguale o superiore ad 1 (se superiore, abilita una "modalità di debug dei filtri che può aiutare nel verificare quando e su quali messaggi un filtro agisce), tramite il comando:
      /budus filter 1
      oppure i comandi di menu BuDuScRiPt > Preferenze > Sistema di Filtraggio e BuDuScRiPt > Preferenze > Ricarica File dei Filtri.

    • AWAY System: Il plugin è in grado di gestire lo stato di AWAY dell'utente locale, in tutti i canali/server nei quali è connesso, cambiando il nickname in automatico (nonché ripristinarlo) ed eseguendo l'identificazione quando viene fatto il BACK. Questo comando consente di Abilitare/Inibire questa gestione automatica.
    • Away Message: Quando l'utente locale è in stato di AWAY ed un utente remoto nomina il suo nickname o lo contatta in QUERY, il plugin risponde in automatico fornendo una giustificazione dell'assenza; questo comando consente di Abilitare/Inibire la risposta automatica.
    • Away Postfix ... (Postfisso da aggiungere al nickname): Quando l'utente locale va in stato di AWAY è possibile rinominare in automatico il nickname, in modo che sia evidente lo stato di assenza anche per quegli utenti che, poco ferrati di IRC, non si accorgono dello status; il nickname originale viene automaticamente ripristinato facendo il BACK. Impostando un valore nullo, il postfisso applicato al Nickname non viene messo, disabilitando questa funzione.

    • Colori nei messaggi BuDuScRiPt: Se i colori sono sgraditi, attraverso questo comando, è possibile inibirli nelle funzioni decorative che, invece, ne fanno largo uso.

    • Comando del PIPE ... (Comando del PIPE e del Clone Detector): Quando si esegue un comando al sistema operativo attraverso /budus pipe, l'output viene, riga per riga, utilizzato in XChat come parametro del comando che si va a specificare tramite questa voce di menu. Normalmente si utilizza il comando /ECHO.

    • Comando Identificazione ... (Identificazione Nickname Registrato): Quando, in stato di AWAY, si esegue il BACK ed è attiva l'opzione di rinomina del nickname (vedi sopra: way Postfix ...), su alcuni Network IRC è richiesta l'identificazione nel caso in cui il nickname risulti registrato. Questo voce di menu permette di personalizzare il comando (in genere è: /ns identify).
    • Messaggio su Ignore (Messaggio che avvisa l'ignorato): Quando si utilizza il comando /budus ignore per ignorare un utente, viene emesso un messaggio pubblico che comunica la cosa. Aldilà del fatto che è possibile inibire la cosa singolarmente (utilizzando il parametro "\ dopo il nickname da ignorare nel comando /budus ignore), si può inibire definitivamente la cosa tramite questa voce di menu.
    • Lingua ... (Imposta la lingua da utilizzare): E' possibile cambiare la lingua con il quale il plugin emette i messaggi.
      N.B.: Questa possibilità è stata introdotta diversi anni fa, quando si era internazionalizzato il plugin, tuttavia, la cosa è caduta in disuso a causa della notevole difficoltà di mantenere i messaggi aggiornati in più lingue e comunque l'introduzione dei menu personalizzati ha reso troppo complicata una gestione multilingua, quindi questa funzionalità è di fatto "non funzionante".

    • Modalita' Debug: Se abilitata, consente di registrare su un apposito file di log (budus.dbg) tutti i messaggi provenienti dal Server IRC, in una forma che consenta ad UDA'Software di simulare l'esecuzione dello script. Questo modo di operare è stato utile per ottimizzare il plugin nei primi anni di vita (il parser ha richiesto molto lavoro per lavorare in modo stabile) ma, attualmente, è diventato abbastanza inutile, perchè si preferisce la "Modalità di Debug Avanzata", da attivarsi solo dietro consiglio dell'autore (ex: quando si chiede supporto on-line per un problema).

    • MP3 - Parametri dei Player Audio: Alcuni parametri dei player audio (Exaile, Amarok, Rhythmbox, ecc..) possono essere personalizzati tramite questo menu; ad esempio è possibile inibire la visualizzazione di un link relativo al media in riproduzione (certi canali lo considerano SPAM) o personalizzare il testo usato nell'annuncio della canzone in ascolto.

    • Log: Il plugin consente di salvare le informazioni ricevute dal Server IRC in files di log suddivisi per Network - il nome del file corrisponde al nome del network - e formattati in modo che sia relativamente semplice estrapolare informazioni. Nel caso in cui si desideri eseguire elaborazioni "sofisticate" sul file di log, può essere opportuno attivare la "modalità avanzata" (vedi: /budus help logadvanced) che, oltre a salvare i dati in un unico file (budus.log), li formatta utilizzando una sintassi che ne rende molto comoda l'elaborazione.

    • Postfisso (Per i messaggi in uscita): Consente di aggiungere un postfisso - da inserire nell'apposita finestra di dialogo che appare - a tutti i messaggi che si vanno a scrivere.
    • Prefisso (Per i messaggi in uscita): Consente di aggiungere un prefisso - da inserire nell'apposita finestra di dialogo che appare - a tutti i messaggi che si vanno a scrivere.
    • N.B.: Queste possibilità sono state introdotte diversi anni fa ma, fin da allora, non hanno mai funzionato benissimo, perchè vanno a modificare in modo troppo drastico il modo in cui XChat gestisce il testo scritto dall'utente locale. Per tale motivo se ne sconsiglia l'uso.

    • Private Killer System: Il Private Killer è il sistema con il quale il plugin consente/censura agli altri utenti di inviare messaggi privati (NOTICE/QUERY/INVITE) all'utente locale. Si basa su una whitelist/blacklist, dove si elencano gli utenti da abilitare in automatico e quelli da negare in automatico, in base alla coppia nickname/dominio. Gli utenti che non risultano in questa doppia lista, nel momento in cui contattano l'utente locale, fanno in modo che il plugin chieda a quest'ultimo, attraverso una finestra di dialogo, se desidera: Abilitare, Abilitare in modo permanente, Negare, Negare in modo permanente. Questa richiesta rimane attiva un certo numero di secondi (configurabile), prima di chiudersi automaticamente e negare all'autore del messaggio la possibilità di contattare privatamente ed invitandolo a farlo pubblicamente. Il sotto-menu "Private Killer System" contiene gli strumenti per Abilitare/Inibire questo sistema (per disabilitarlo è necessario mettere a zero il Tempo Attesa Messaggio Abilitazione\Negazione ...) e stabilire se e quali messaggi il plugin deve emettere quando interviene in modo automatico.

    • Protezione BAN\KICK: Contiene 2 comandi: uno serve per creare la MACRO che il plugin deve lanciare in automatico nel momento in cui intercetta un BAN\KICK sull'utente locale e l'altro per modificare la MACRO nel caso in cui si desideri personalizzarla.

    • Avanzate: E' un sotto-menu che consente di modificare i comportamente più interni del plugin. Dato che si tratta di parametri che possono comportare un funzionamento anomalo del plugin, vanno usate solo dietro consiglio di un utente esperto.

  • Commuta stato di AWAY globalmente: Possiede, internamente, due stati: AWAY e BACK. Quando si spunta l'opzione AWAY, in automatico si passa allo stato di AWAY in tutti i servers ai quali si è collegati, cambiando opportunamente Nickname. Con il BACK, oltre a tornare dall'AWAY, viene anche modificato il nickname, tornando all'originale e lanciato il comando di identificazione al NickServ. E' possibile commutarsi usando la combinazione da tastiera CTRL+ALT+A .
    N.B.: Quando si va o torna dallo stato di AWAY, per default, il plugin emette un messaggio pubblicitario.
    E' possibile inibire questo comportamento modificando una variabile e salvando la configurazione tramite questi due comandi:
    /budus budusmsg 0
    /budus save

  • PasteBin System - Incolla un testo su PasteBin e mostra LINK: Il plugin consente di creare un "NOPASTE" in modo semplice tramite i comani offerti da questo sottomenu; il plugin apre una finestra grafica nella quale incollare il testo e, premendo il pulsante PASTE, pubblica nella sessione corrente il link per visualizzarlo.
  • Cerca su Internet ...: E' presente un Search Engine interno al plugin che consente di cercare su Internet e pubblicare il risultato nella finestra corrente (se è un canale, leggeranno tutti, se è una finestra privata solo l'utente interessato).
  • Twitter: Il menu consente di gestire le funzionalità dedicate al famoso Social Network Twitter.

  • Nuova Finestra, Chiudi Finestra: Servono rispettivamente per creare una nuova finestra o chiudere quella corrente; notare che è offerta la possibilità di svolgere le operazioni anche con le combinazioni da tastiera CTRL+ALT+N e CTRL+ALT+C .
  • Esci dal Canale con messaggio e Chiudi Finestra: Esce dal canale pubblicizzando BuDuScRiPt (nella sola ragione del PART) e chiude automaticamente la finestra; in pratica, un modo alternativo e rapido per lasciare un canale, consiste nella combinazione da tastiera CTRL+ALT+P .
  • ReJoin del Canale Corrente: Equivale al comando /CYCLE e lo si lancia usando la combinazione da tastiera CTRL+ALT+R .
  • Cambia il TOPIC mantenendo i colori: Tramite questo comando viene inserito nel prompt di XChat un comando che consente di variare il Topic del Canale mantenendo inalterati i codici di formattazione (colori, bold, sottolineato, ecc...).

  • Join Monitoring - Monitoraggio Utenti che entrano nel Canale corrente: Consente di monitorare i JOIN effettuati in un determinato canale, venendo avvisati con un messaggio e acusticamente.
  • Modify Monitoring - Monitoraggio frasi scritte nel Canale corrente: Consente di monitorare quando, in un determinato canale, viene scritto qualcosa, venendo avvisati con messaggio e acusticamente.
  • Word Monitoring ... - Monitoraggio parola scritta nel Canale corrente: Consente di monitorare quando, in un determinato canale, viene scritta la parola specificata, venendo avvisati con un messaggio e acusticamente.
  • Query Monitoring: Va utilizzato esclusivamente in QUERY ed emette un avviso testuale e/o acustico nel momento in cui l'interlocutore scrive.

  • Lista Utenti e Ricerche:
    • Lista Utenti con riconoscimento Dominio: Il plugin consente di associare delle informazioni ad un determinato dominio; tramite questo comando verifica quali utenti hanno un dominio al quale sono state associate delle informazioni e li elenca.
    • Lista Utenti con riconoscimento Nickname: Il plugin consente di associare delle informazioni ad un determinato nickname; tramite questo comando verifica quali utenti hanno un nickname al quale sono state associate delle informazioni e li elenca.
    • Lista Utenti che hanno invocato il tuo Nickname: Capita di assentarsi e, tornando dopo tempo magari in un locale "rumoroso", non si riesca più a capire chi ha nominato il proprio nickname (e lo si capisce dall'avviso emesso dallo stesso XChat); tramite questo comando vengono elencate, in ordine cronologico con tanto di orario esatto, tutte le occorrenze in cui il proprio nickname è stato menzionato nel canale corrente.
    • Cerca nel _Database ...: Il plugin è dotato di un proprio database, nel quale memorizza diverse informazioni e che viene utilizzato per consentire il funzionamento di molti suoi aspetti (primi fra tutti l'Events Manager, le Funzioni Avanzate dei Comandi Condizionali, ecc...); questo comando consente di effettuare delle ricerche all'interno di questo database utilizzando un semplice pattern.

  • Comandi di Massa:
    • Invia Comando IRC in tutte le sessioni ...: Invia il comando specificato (si apre una finestra di dialogo) a tutte le sessioni di xchat (server, canali, QUERY).
    • Invia Comando IRC in tutte le sessioni del Server corrente ...: Invia il comando specificato (si apre una finestra di dialogo) a tutte le sessioni di xchat (server, canali, QUERY) appartenenti al server corrente.
    • Invia Messaggio in tutti i Canali del Server corrente ...: Invia il messaggio specificato (si apre una finestra di dialogo) in tutti i canali del server corrente.
    • Invia Comando IRC a tutti gli utenti del Canale Corrente ...: Esegue un comando IRC/BuDuScRiPt su tutti gli utenti del canale corrente; nel comando va utilizzata la variabile $nick laddove sia necessario specificare il nickname di ogni singolo utente.
    • Esegui Comando esterno ...: Lancia un comando al sistema operativo.
    • Esegui Comando esterno e visualizzane output ...: Lancia un comando al sistema operativo e visualizza l'output.
    • Esegui Comando esterno ed interpreta output ...: Lancia un comando al sistema operativo e interpreta l'output come fossero comandi impartiti dall'utente.
    • Comandi di Massa Avanzati ...: Apre un terminale nel quale esegue uno script dedicato all'esecuzione di comandi di massa basati su particolari filtri; ad esempio: inviare un messaggio a tutti gli OP

  • Clone Scanning: Il Clone Detector ha il compito di individuare quegli utenti, anche di canali diversi di un medesimo server, aventi il medesimo dominio. Quando due o più utenti hanno il medesimo dominio, è possibile si tratti anche della medesima persona.
  • Domain Scanning: Serve per verificare se, nel canale corrente, sono presenti utenti al cui dominio sono state associate delle informazioni.

  • Gestione Macro:
    • Aggiungi una MACRO ...: Le MACRO Parametriche di BuDuScRiPt sono files - di testo con estensione .mcr, contenuti nella sub-cartella buduscript/ - contenenti comandi IRC/BuDuScRiPt sequenziali parametrizzati (cioè che hanno parti che possono variare in base alle esigenze dell'utente, che ha facoltà di specificarle a linea di comando quando lancia la MACRO); anzichè digitare ripetutamente gli stessi comandi molte volte, attraverso le MACRO si può automatizzare la cosa, riducendo drasticamente "la fatica". Questo comando consente di essere guidati nella creazione di una MACRO.
    • MACRO Parametriche

      Le MACRO Parametriche di BuDuScRiPt sono semplici file di testo (che quindi si possono creare con qualsiasi editor, come gedit, emacs, ecc...) che, per ogni riga, contengono un comando da eseguire. Ad esempio prendiamo il caso di quando la connessione cade, ci si ri-collega ed, essendo ancora presente un "nickname ghost", il Server IRC non consente di usare il consueto nickname; potremmo volere una MACRO che risolve il problema e che, all'occorrenza, possiamo lanciare in modo che faccia tutto il lavoro al posto nostro. Potremmo immaginare che i comandi da dare sono i seguenti:
      /NS ghost BuDuS password
      /TIMER 2 NICK BuDuS
      /TIMER 3 NS IDENTIFY BuDuS password
      Salvando queste 3 righe nel file $HOME/.xchat2/buduscript/ghost.mcr avremo la possibilità di utilizzare questa macro con il comando: /budus macro ghost
      Nelle MACRO abbiamo la possibilità di inserire anche dei commenti, in modo che siano più comprensibili da leggere, facendo iniziare la riga con il carattere "#"; quindi otterremmo:
      # Elimino il GHOST dell'utente BuDuS
      /NS ghost BuDuS password
      # Dopo 2 secondi cambio nick ed uso BuDuS
      /TIMER 2 NICK BuDuS
      # Dopo 3 secondi mi identifico
      /TIMER 3 NS IDENTIFY BuDuS password
      Le MACRO sono dette Parametriche perché consentono di essere eseguite con dei parametri. Ad esempio supponiamo di voler specificare a riga di comando nickname e password. All'interno della MACRO i parametri sono utilizzabili attraverso delle variabili numeriche progressive, corrispondenti all'ordine con il quale si sono forniti i parametri stessi. Potremmo immaginare di invocare la MACRO sopra in questo modo: /budus macro ghost BuDuS mypassword
      La MACRO dovrà diventare così:
      # Elimino il GHOST dell'utente avente il nickname specificato con il primo parametro ($1)
      /NS ghost $1 $2
      # Dopo 2 secondi cambio nick ed uso quello specificato con il primo parametro ($1)
      /TIMER 2 NICK $1
      # Dopo 3 secondi mi identifico usando la password specificata con il secondo parametro ($2)
      /TIMER 3 NS IDENTIFY $1 $2
      Le MACRO consentono anche di utilizzare delle particolari direttive che svolgono diverse funzioni (consultare /budus help macro per ulteriori informazioni); ad esempio la direttiva "fastflush" consente di velocizzare l'esecuzione di una MACRO, dato che i primi comandi vengono eseguiti senza rispettare i parametri anti-flood. Inoltre, come spiegato di seguito, all'avvio di XChat viene creato un apposito menu che consente di accedere in modo semplice alle MACRO disponibili; per questo motivo è opportuno creare le MACRO con un'intestazione tale che dia al plugin delle informazioni su di se. Ecco un esempio di intestazione efficace:
      #fastflush
      # Macro: GHOST
      # USE: /budus macro ghost <nickname> <password>
      # EX: /budus macro ghost BuDuS mypassword
      #exec:/budus if '$1' = '' /budus cmd /ECHO end( %C8,1%BATTENZIONE: Non hai specificato il nickname. )
      #exec:/budus if '$2' = '' /budus cmd /ECHO end( %C8,1%BATTENZIONE: Non hai specificato la password. )
      # Elimino il GHOST dell'utente avente il nickname specificato con il primo parametro ($1)
      /NS ghost $1 $2
      # Dopo 2 secondi cambio nick ed uso quello specificato con il primo parametro ($1)
      /TIMER 2 NICK $1
      # Dopo 3 secondi mi identifico usando la password specificata con il secondo parametro ($2)
      /TIMER 3 NS IDENTIFY $1 $2
      In questa MACRO viene fatto uso anche della direttiva "#exec:"; questa consente l'esecuzione immediata di un comando (altrimenti i comandi vengono sempre messi nella Command's Queue nell'ordine con il quale vengono letti e risolti). Il comando che viene eseguito dalla prima direttiva è il seguente:
      /budus if '$1' = '' /budus cmd /ECHO end( %C8,1%BATTENZIONE: Non hai specificato il nickname. )
      Si tratta di un Comando Condizionale (vedere: /budus help if) che ha lo scopo di verificare che il primo parametro ($1) non sia nullo; se lo è esegue il comando:
      /budus cmd /ECHO end( %C8,1%BATTENZIONE: Non hai specificato il nickname. )
      il quale, a sua volta, esegue un altro Comando Condizionale (viene chiamato così anche se, a tutti gli effetti, non verifica una condizione, tuttavia ha funzionalità di risoluzione di variabili e "Funzioni Avanzate" come /budus if e simili) che utilizza quella che in BuDuScRiPt viene chiamata "Funzione Avanzata": end( %C8,1%BATTENZIONE: Non hai specificato il nickname. )
      Questa "Funzione Avanzata" ha lo scopo di terminare l'esecuzione di una MACRO immediatamente. Per un elenco con spiegazione ed esempi delle "Funzioni Avanzate" vedere: /budus help function .

      Le MACRO consentono di utilizzare alcune variabili proprie (vedere: /budus help macro), come ad esempio "$mpassword" che contiene la password associata al Network IRC nel quale viene eseguita la MACRO; questo consente di trasformare la MACRO esposta sopra in questo modo:
      #fastflush
      # Macro: GHOST
      # USE: /budus macro ghost <nickname>
      # EX: /budus macro ghost BuDuS
      #exec:/budus if '$1' = '' /budus cmd /ECHO end( %C8,1%BATTENZIONE: Non hai specificato il nickname. )
      # Elimino il GHOST dell'utente avente il nickname specificato con il primo parametro ($1)
      /NS ghost $1 $mpassword
      # Dopo 2 secondi cambio nick ed uso quello specificato con il primo parametro ($1)
      /TIMER 2 NICK $1
      # Dopo 3 secondi mi identifico usando la password associata al network
      /TIMER 3 NS IDENTIFY $1 $mpassword
      Questo, nel caso specifico, ci consente di dover specificare un parametro in meno (e non è poco, considerando che si tratta di una password).
      N.B.: I comandi delle MACRO non vengono eseguiti subito ma, letti e risolti uno alla volta nell'ordine con cui sono scritti nel file, inseriti nella Command's Queue. In linea di massima i comandi saranno eseguiti nell'ordine che ci si aspetta, tuttavia, è possibile che comandi che facciano a loro volta uso della Command's Queue, non lo siano. Se ci si trova, con una MACRO "complicata", a non capire come mai qualcosa non funziona come previsto, tenere a mente questo dettaglio e valutare se può essere la causa del comportamento inaspettato (che non è un BUG, semplicemente si tratta del modo di procedere del plugin).
      Se occorre, si può tentare di risolvere o temporizzando (/HELP TIMER) o usando la direttiva #exec: .

    • Lista MACRO disponibili semplice: Elenca le MACRO disponibili, visualizzandone il solo nome.
    • Lista MACRO disponibili con sorgente: Elenca le MACRO disponibili, visualizzandone nome e contenuto.
    • Ripeti ultima MACRO: Esegue l'ultima MACRO che è stata eseguita. Le MACRO si eseguono da riga di comando scrivendo /budus macro nomemacro.
  • MACRO: E' un sotto-menu dinamico che, al lancio di XChat, viene riempito con la lista di tutte le MACRO disponibili; tramite questo menu è possibile richiamare in modo semplice e rapido ogni MACRO disponibile.

  • Gestione Sentinelle: Le Sentinelle sono il sistema con il quale BuDuScRiPt permette l'esecuzione automatica di comandi al verificarsi di un determinato evento. I Comandi disponibili sotto questo menu consentono la gestione delle sentinelle, quindi: elencare quelle in memoria, salvarle, caricarle, aggiungerle, eliminarle e generare eventi manualmente.
    Tra i vari comandi, alcuni sono dedicati alla creazione di Sentinelle Prefatte, in grado di svolgere alcune funzionalità come: "KICKBAN su BADWORD", "KICKBAN su BADNICK", "IGNORE su BADWORD", "IGNORE su BADNICK", ecc...
    Event's Manager

       L'Event's Manager è il sistema con il quale il plugin gestisce gli "eventi" che si realizzano in IRC; quando un utente entra in un canale, scrive, cambia modalità, viene "kickato", "bannato", esce, ecc... , il Server IRC invia al Client XChat dei messaggi - che rispettano una precisa sintassi - che lo informano dell'accaduto. BuDuScRiPt legge questi messaggi e li converte in Eventi, associandogli alcune informazioni, ovvero:

    • Un nome. Ogni evento è identificato da un preciso nome che ne rappresenta la funzione. E' possibile ottenere la lista degli eventi gestiti ed il relativo nome tramite il comando /event help sentinels.
    • L'Utente Locale. In linea di massima rappresenta il nickname dell'utente locale (quello che usa XChat); con certi eventi può essere anche chi subisce l'evento o chi lo ha generato. La variazione dipende dal tipo di evento (i messaggi che il Server IRC invia, contengono determinate informazioni, che non sono sempre le stesse per ogni tipologia e questo influisce sui parametri associati agli eventi). E' possibile, nelle sentinelle, utilizzare questo parametro attraverso l'uso della variabile $lu.
    • L'Utente Remoto. Rappresenta il nickname dell'utente remoto. In genere si tratta di colui che ha scatenato l'evento. Ad esempio, in una sentinella che risponde all'evento text (quando qualcuno scrive), l'utente remoto sara colui che ha scritto ed è possibile utilizzare questo parametro attraverso l'uso della variabile $ru.
    • L'Indirizzo dell'Utente Remoto. Ogni utente, collegato al Server IRC, oltre ad un nickname univoco, possiede anche un "indirizzo identificativo" che ha sempre la sintassi host@domain. In alcuni casi è comodo conoscere questo indirizzo, ad esempio quando si vuole ignorare un utente, bannarlo, ecc... . E' possibile, nelle sentinelle, utilizzare questo parametro attraverso l'uso della variabile $rhost (remote host).
    • Il Canale. In genere un evento si svolge in un canale. Dato che non sempre questo è vero, non sempre questo parametro è disponibile. Ad esempio il QUIT di un utente vale "per tutto il server" e non è specifico di un singolo canale. La variabile associata a questo parametro è $channel. Laddove un evento non preveda questo parametro, la variabile non sarà risolta e quindi non va usata (ad esempio per l'evento other).
    • Il Server. Un evento è sempre generato su uno specifico Server IRC. La variabile associata a questo parametro è $server. Dato che un Server IRC può fare parte di un Network IRC, è possibile ottenere anche il nome del Network attraverso l'uso della variabile $hostname.
      N.B.: XChat (e quindi BuDuScRiPt) è in grado di capire a quale Network appartiene un Server solo nel caso in cui ci si colleghi al "server principale" ed, eventualmente, sia questo ad inoltrare la connessione ad un sotto-server. Se ci si collega direttamente ad un sotto-server, le variabili $server e $hostname coincidono.
    • I Dati. Quasi tutti gli eventi portano dei "dati" con se. Ad esempio un evento di tipo text porta con se il "testo scritto dall'utente remoto", il pserver (QUIT dal Server) può portare il messaggio di uscita del Client e così via. La variabile associata a questo evento è $data. Anche in questo caso, non tutti gli eventi forniscono questo parametro. La cosa migliore per capire quali parametri sono forniti con un determinato evento è quello di creare una sentinella che li elenca e generare l'evento; ad esempio se aggiungiamo una sentinella di questo tipo:
    • /event add 0 jchannel * /ECHO ^lu=$lu ^ru=$ru ^rhost=$rhost ^channel=$channel ^server=$server ^data=$data
      appena entra nel canale un utente, verrà emesso un messaggio (privato, solo all'utente locale) nel quale sono elencate le variabili e i valori da esse assunti. Si potrà notare che la variabile $data non viene risolta. Ma se ora usiamo questo:
      /event add 0 text * /ECHO ^lu=$lu ^ru=$ru ^rhost=$rhost ^channel=$channel ^server=$server ^data=$data
      il risultato sarà diverso.
      N.B.: Le sentinelle che reagiscono all'evento text non sono sensibili a quello che scrive l'utente locale, ma solo ciò che viene scritto dagli altri utenti.

      Questo comportamente può essere modificato per fare dei test sulle sentinelle attraverso l'uso della variabile iFlagEventsManagerDebug, modificabile attraverso il comando /budus eventdebug (vedere: /budus help eventdebug ).


       Ogni volta che viene generato un evento, il plugin verifica se esistono delle Sentinelle programmate per reagire ad esso, ne verifica la condizione e, se viene soddisfatta, procede ad eseguirne l'azione. Una sentinella è composta da 4 parti, ovvero:

    • RIPETIZIONI: E' un valore numerico che stabilisce quante volte l'AZIONE della sentinella può essere eseguita nel caso in cui sia soddisfatta la CONDIZIONE nel momento in cui viene generato l'EVENTO per il quale essa è programmata. Ad esempio impostando il numero di ripetizioni a "3", l'azione sarà eseguita un massimo di 3 volte in corrispondenza di altrettanti eventi. Il valore "0" (zero) è speciale e rappresenta "sempre" (in altri termini: la sentinella reagirà sempre se sussistono le condizioni EVENTO/CONDIZIONE).
    • EVENTO: Ogni sentinella è programmata per reagire ad uno specifico evento. Eccezione è data dall'evento all che rappresenta "tutti gli eventi" e va usato quando si vuole che una sentinella faccia qualcosa nel momento in cui riceve un evento qualsiasi. E' possibile ottenere la lista degli eventi gestiti tramite il comando /event help sentinel. Di norma gli eventi vengono generati dal Server IRC, tuttavia l'utente ha la possibilità di generarli anche manualmente ed, inoltre, è possibile creare "eventi speciali", cioè che hanno un nome determinato dall'utente e che vengono generati dall'utente stesso (in genere ciò accade a partire da un evento del Server IRC). Gli eventi speciali servono per "concatenare più sentinelle", in modo da avere CONDIZIONI multiple o anche per suddividere l'AZIONE da compiere in più momenti, a seconda delle esigenze.
    • CONDIZIONE: E' la parte più delicata - e complicata - delle sentinelle perchè quella che determina se la relativa AZIONE deve essere eseguita o meno. La condizione è formata da una espressione di confronto che rispetta la seguente sintassi:
      <costante><operatore><variabile>
      dove <costante> rappresenta ciò che noi vogliamo cercare nei parametri dell'evento, <operatore> è un carattere che determina il tipo di confronto (può essere "=" per un'operazione di ricerca - da non confondere con l'uguaglianza - o "!" per un'operazione di "non presenza", da non confondere con disuguaglianza) e <variabile> rappresenta il parametro (o i parametri) della sentinella che si vogliono verificare.
      Nella CONDIZIONE è molto importante l'uso che si può fare dell'apice "'"; prima di spiegarne l'uso è però necessario fare un passo indietro e spiegare cosa si intende per "ricerca". La verifica della CONDIZIONE - quando utilizzato l'operatore "=" - avviene in questo modo:
      • Cerca la parte <costante> in quella <variabile>
      • Cerca la parte <variabile> in quella <costante>
      • Se la parte <costante> non inizia con un apice ("'") - o comunque l'apice iniziale non è preceduto da un backslash "\" - la utilizza come Espressione Regolare POSIX e verifica se riesce a soddisfare la parte <variabile>
      Se una di queste condizioni si verifica (trova una parte in quell'altra o soddisfa l'espressione regolare), la CONDIZIONE della sentinella risulta soddisfatta; chiaramente, utilizzando "!" al posto di "=", il discorso è solo "al negativo": non deve trovare/soddisfare.
      Questo comportamento sembra semplice e banale, tuttavia, non lo è e può portare facilmente ad errori interpretativi. Se ad esempio scriviamo una sentinella come la seguente:
      /event add 0 text Ciao=$data /ECHO ^lu=$lu ^ru=$ru ^rhost=$rhost ^channel=$channel ^server=$server ^data=$data
      si potrebbe pensare che la sentinella reagirà solo quando un utente scrive "Ciao". ERRORE !. Aldilà del fatto che reagirà anche quando un utente scrive "Ciao a tutti quanti", piuttosto che "Ciaoooooo", reagirà anche quando questi scrive una semplice "a". Sì perchè la "a" è contenuta nella parola "Ciao" e quindi la seconda verifica (vedi sopra) viene soddisfatta !
      Ecco che, per ovviare a questo "inconveniente" (non è detto lo sia, in alcuni contesti può essere una cosa voluta), bisogna utilizzare gli apici, ad esempio:
      /event add 0 text 'Ciao'='$data' /ECHO ^lu=$lu ^ru=$ru ^rhost=$rhost ^channel=$channel ^server=$server ^data=$data
      la CONDIZIONE sarà soddisfatta solo ed esclusivamente se "$data" conterrà esclusivamente "Ciao" (o anche "ciao", la ricerca non è case sensitive, cioè non è sensibile a maiuscole/minuscole). Ecco che in questo caso siamo di fronte ad un qualcosa di molto più simile ad un'uguaglianza. Se avessimo voluto cercare "Ciao" all'interno di "$data", in modo che anche un "Ciao a tutti" possa essere soddisfatto, avremmo dovuto scrivere in questo modo:
      /event add 0 text 'Ciao='$data' /ECHO ^lu=$lu ^ru=$ru ^rhost=$rhost ^channel=$channel ^server=$server ^data=$data
      L'apice prefisso a "Ciao" viene eliminato in automatico e, stando alle regole dettate sopra, solo la prima condizione potrà verificarsi. Se, ancora, volessimo che "Ciao" debba essere la prima parola presente in "$data", dovremo usare il backslash in questo modo:
      /event add 0 text \'Ciao='$data' /ECHO ^lu=$lu ^ru=$ru ^rhost=$rhost ^channel=$channel ^server=$server ^data=$data
      La parte costante può essere anche un'Espressione Regolare POSIX nel caso in cui non vengano usati gli apici; in questo caso gli apici applicati alla parte variabile vengono automaticamente rimossi, anche se vanno comunque specificati per non incappare nei problemi citati prima. Ad esempio:
      /event add 0 text ^([Bb]uona($_)?)?[Nn]otte($_.*)?='$data' /ECHO Buonanotte a te, $ru
      sfrutta la potenza delle espressioni regolari per determinare se un utente remoto ha scritto una cosa come "Buonanotte", "Buona Notte", "Notte", "notte", ecc...
      Porre attenzione al fatto che, le Espressioni Regolari usate dal plugin, sono CASE SENSITIVE, quindi fa differenza scrivere minuscolo o maiuscolo; se è necessario non fare distinzione, una parola come "ciao" va scritta, sotto forma di regexp, come "[Cc][Ii][Aa][Oo]".
      Nella cartella $HOME/.xchat2/buduscript è presente un programma che si chiama udaregexp; tramite questo software è più facile creare espressioni regolari, perchè si ha la possibilità di verificarle subito. Il software è anche in grado di trovare errori e scrive esattamente quale parte della stringa soddisfa l'espressione.
      Laddove sia necessario utilizzare il carattere spazio è necessario usare la parola chiave $_ (vedi la sentinella di esempio sopra).
      Può capitare che la CONDIZIONE della sentinella sia superflua/inutile; si può evitare di utilizzare "condizioni sempre vere" sfruttando il carattere asterisco "*"; esempio:
      /event add 0 text * /ECHO Faccio sempre qualcosa
      In questo modo la valutazione delle sentinelle viene sensibilmente ottimizzata.
    • AZIONE: Se viene generato un EVENTO che combacia con quello della sentinella e la sua CONDIZIONE viene soddisfatta ecco che viene eseguita l'AZIONE. Si tratta di un qualsiasi comando IRC/BuDuScRiPt, come se a scriverlo fosse l'utente. La peculiarità, oltre al fatto di essere automatizzata, sta nel fatto che si possono utilizzare i parametri anche all'interno dell'AZIONE (attraverso le variabili, come quelle citate sopra) ed è possibile avere più comandi consecutivi, separandoli con "\;". Ad esempio supponiamo che, ad ogni utente che ci saluta, vogliamo ricambiare e dargli il VOICE in automatico; ecco una possibile soluzione:
      /event add 0 text 'Ciao$_$nick='$data' /SAY Ciao $ru\;/VOICE $ru
      La variabile $nick contiene sempre il nickname dell'utente locale; ecco quindi che se qualcuno - il cui nickname è rappresentato da $ru, immaginiamo sia "pippo" - scrive "Ciao BuDuS" (suppongo che il nick usato sia "BuDuS") andremo a rispondere con "Ciao pippo" ("/SAY" è il comando IRC per scrivere nel canale, normalmente non lo mettiamo perchè lo fa XChat in automatico quando diamo invio al prompt dei comandi) e successivamente verrà eseguito "/VOICE pippo".

       Infine, tenere a mente alcune considerazioni:

    • Le sentinelle vengono valutate nell'ordine con il quale sono inserite.
    • Non è possibile inserire più sentinelle perfettamente identiche. Anche se minima, una differenza deve esserci.
    • Le AZIONI non sono eseguide immediatamente, ma vengono inviate alla Command's Queue di BuDuScRiPt, un sistema che ha il compito di eseguire i comandi senza che il client XChat si blocchi. Di fatto questo non è un qualcosa che compromette la "velocità di esecuzione", tuttavia, può comportare l'esecuzione di comandi in un ordine diverso da quello atteso nel momento in cui le azioni, a loro volta, prevedono comandi che sfruttano la Command's Queue. Questa sorta di "anomaliaun sistema che consente di tradurre in parole gli eventi testuali di XChat" si può presentare solo in presenza di sentinelle concatenate, comandi multipli, che utilizzano generazione di eventi, comandi condizionali, ecc..., insomma, situazioni "complicate", non certo per le cose più banali.
    • Al fine di evitare loop infinito, il plugin interrompe automaticamente l'AZIONE di una sentinella nel momento in cui si accorge che è stata anche eseguita all'evento precedente e che quest'ultimo, generato manualmente dall'utente (per "manualmente" si intende "evento speciale generato dall'utente tramite il comando /event event), è identico a quello precedente. In altri termini: se l'azione di una sentinella genera un evento speciale che soddisfa la sentinella stessa, si innesca un loop infinito; il plugin se ne accorge e blocca l'esecuzione.
    • Laddove sia necessario, come azione di una sentinella, crearne un'altra contenente azioni multiple, per separare quest'ultime non si può usare il separatore "\;" - verrebbe interpretato come separazione della sentinella che ha reagito, non di quella che viene creata - e quindi va utilizzata la parola chiave _BUDUS_SEPARATOR_.
    • Non si può generare un evento speciale se non esiste una sentinella in grado di reagire. Gli eventi speciali hanno, come detto in precedenza, la peculiarità di avere un nome definito dall'utente; in particolare, questo nome può essere formato anche sfruttando i parametri della sentinella. E' possibile sfruttare questa caratteristica congiuntamente con la seconda considerazione qui sopra, per creare sentinelle che rispondono solo in una determinata condizione e per un certo numero di volte. Ad esempio, la sentinella esposta sopra che risponde al "Ciao" ha un difetto: ogni volta che l'utente "pippo" ci dice "Ciao", rispondiamo in automatico e diamo il VOICE. E' chiaro che qualche "furbo" può approfittare della situazione. Ma possiamo risolvere in questo modo:
      /event add 0 text 'Ciao$_$nick='$data' /event add 1 spcl_saluto_$ru /SAY Ciao $ru_BUDUS_SEPARATOR_/VOICE $ru\;/event event spcl_saluto_$ru $event_params
      Le azioni della prima sentinella (che reagisce al "Ciao BuDuS") sono:
      /event add 1 spcl_saluto_pippo /SAY Ciao pippo\;/VOICE pippo
      /event event spcl_saluto_pippo $lu $ru $rhost $channel $server $data
      e questo perchè, una volta risolta l'AZIONE della prima sentinella, abbiamo:
      • $ru diventa "pippo".
      • _BUDUS_SEPARATOR_ diventa "\;"
      • $event_params diventa "$lu $ru $rhost $channel $server $data"
      Quando l'utente scrive "Ciao BuDuS" viene prima creata la sentinella e poi generato l'evento che la soddisfa; ma la sentinella creata può reagire una sola volta e, se era già stata creata (e, per come sono fatte le cose, aveva anche già reagito), ecco che se "pippo" ripete il "Ciao BuDuS" la sentinella non reagirà più perchè il suo numero di RIPETIZIONI era 1 ed è già stato consumato.
    • Se non si vuole risolvere le variabili legate ai parametri degli eventi, anzichè usare "$" usare "^" (vedi gli esempi sopra, all'inizio).
    • Le sentinelle non sono permanenti, salvo non vengano salvate; in altri termini: se non si salva le sentinelle (/event save), alla chiusura di XChat, tutte quelle inserite andranno perse.
    • Se si caricano le sentinelle salvate, senza salvare quelle eventualmente aggiunte, quest'ultime vanno perse.
    • Lo "stato" delle sentinelle si azzera nel momento in cui vengono ri-caricate dal file eventualmente presente su disco.

  • Decorazioni: E' un sotto-menu che contiene dei comandi che aprono finestre di dialogo nelle quali, una volta immesso un testo, questo viene emesso nel canale corrente formattato a seconda della tipologia scelta (da usare solo laddove sono graditi/tollerati i colori e cose del genere).

  • Versione dello Script: Consente di verificare la versione del plugin attualmente utilizzata e la disponibilità di una nuova online.
  • Controlla presenza nuova versione: Il plugin verifica periodicamente la presenza di una versione e, se abilitato, propone l'auto-aggiornamento, tuttavia, utilizzare saltuariamente questo comando garantisce che la versione installata sia quella più recente (soprattutto se l'auto-aggiorna è disabilitato).
  • Aggiornamento Automatico: Opzione che stabilisce se il plugin deve verificare automaticamente o meno la presenza di una nuova versione e, conseguentemente, proporre all'utente se aggiornare o meno (in tutti i casi l'aggiornamento avviene solo dietro esplicita conferma dell'utente).
  • Utilizza Versione di Test: Opzione che stabilisce se il plugin deve aggiornarsi utilizzando la versione di beta testing. Questa opzione, disabilitata per default, va utilizzata solo se si è consapevoli che verrà utilizzata una versione che, potenzialmente, può comportare - anche gravi - malfunzionamenti di XChat.
  • Re-installa il plugin: Forza la re-installazione del plugin, sovrascrivendo files eseguibili, script, documentazione e dati appartenenti al plugin; praticamente tutto tranne configurazione e files eventualmente aggiunti dall'utente. Può risultare utile nel momento in cui il plugin presenti gravi anomalie di funzionamento e segnali la mancanza di files.

  • Esecuzione Automatica: E' un sotto-menu che consente di gestire i comandi che si vuole vengano eseguiti al caricamento di XChat/BuDuScRiPt.

  • Avanzate: In questo sotto-menu sono raccolti i comandi di uso meno frequente e che vanno a sfruttare le caratteristiche più "interne" del plugin; ad esempio la generazione di eventi acustici è un qualcosa che, di norma, viene demandato ai comandi di monitoraggio o, al limite, a qualche sentinella o comunque "in modo manuale"; è possibile conoscere i comandi avanzati con /budus help advanced .
    • Importa file INI di mIRC in un Menu Utente ...: Una delle caratteristiche più importanti di BuDuScRiPt consiste nella possibilità di aggiungere dei menu personalizzati in XChat, semplicemente importando dei file .INI del mIRC. In realtà non è affatto indispensabile che i file appartengano al mIRC, anzi, nell'area DOWNLOAD è possibile scaricare dei menu che aggiungono moltissimi comandi (gestione ChanServ, NickServ, ecc...), Auto-DCC, Bitlbee, ecc... . Tra l'altro, aprendo uno dei file messi a disposizione, penso risulti abbastanza facile comprendere il meccanismo che sta alla base e quindi ci si possa sbizzarrire a creare propri menu.
    • Salva Database Connessioni DCC: E' possibile salvare su file la lista delle connessioni DCC attualmente in coda, attive, abortite, ecc... .
    • Database: Il plugin possiede un database parallelo a quello di XChat nel quale memorizza informazioni per ogni utente; questo gli consente di associare, ad ogni utente, dei "flags" che stabiliscono, per ognuno, il comportamento da adottare (ex: emettere un avviso quando scrive in query, ignorarlo, ecc...). Di norma è un sistema che non ha nessun bisogno di intervento da parte dell'utente, non andrebbe disabilitato (se non in caso di gravi malfunzionamenti ma, in questo caso, buona parte del plugin sarà disabilitata di conseguenza) e va utilizzato solo per eseguire ricerche. In certi casi può essere utile "salvarlo" su disco, al fine di realizzare una qualche elaborazione esterna.
    • Coda dei Comandi: Come il database interno, anche la Command's Queue è un qualcosa che gestisce il plugin e non dovrebbe avere bisogno di intervento dell'utente o comunque essere direttamente usata. Può essere utile il comando di "svuotamento" nel caso in cui, per qualche ragione, sia stata introdotta una quantità eccessiva di comandi e si sta generando un flood. è possibile conoscere i comandi avanzati che la gestiscono con /budus help advanced .
    • Gestione LOG di XChat ...: Apre uno script esterno che permette la gestione dei LOG di XChat, come l'archiviazione, visualizzazione e ricerca.

  • Add-on: Oltre a BuDuScRiPt, nell'area DOWNLOAD, sono disponibili degli add-on (scaricabili separatamente) che consentono di aggiungere funzionalità specifiche. Nel momento in cui XChat viene lanciato, il plugin verifica la presenza di questi add-on ed aggiunge comandi di menu che ne consentono la gestione.

Nel caso in cui sia installato il player audio Audacious, Rhytmbox, Exaile e/o Amarok, viene aggiunto un menu che ne permette la gestione.

In modo analogo, se viene rivelata la presenza di eSpeak, viene aggiunto un menu per la gestione del Text-to-Speech System, un sistema che consente di tradurre in parole gli eventi testuali di XChat (praticamente un modo per fare parlare XChat con una voce sintetizzata, una cosa simile ai navigatori satellitari). Ad esempio, aggiungendo il monitoraggio per un certo evento, viene aggiunta una apposita sentinella che, salvata (/event save), rende il monitoraggio permanente. Sarà così possibile gestire gli eventi monitorati o addirittura personalizzarli tramite i comandi per la gestione delle Sentinelle (vedi: /event help).

Il menu Preferiti consente di gestire i canali come una sorta di "bookmarsk stile browser web". Quando si aggiunge un canale, questi viene elencato nel menu e, selezionandolo, il plugin si collega in automatico al relativo server ed entra nel canale.

Il menu Comandi Utente consente di applicare agli utenti selezionati nella User's List di XChat (quella a destra) un comando. E' quindi necessario selezionare almeno un utente (è supportata la multiselezione) dalla Lista utenti e lanciare un comando di questo menu.

Il menu XDCC consente di eseguire delle ricerche di files ed effettuarne il download automatico. Quando si effettua una ricerca, il plugin - nel caso in cui trovi un risultato - elenca ciò che ha trovato specificando l'URL (ex: http://xdcc_1) - con il quale è possibile avviare il download automatico facendo click con il tasto destro del mouse e selezionando Download-XDCC -, l'ID per il download, il NOME DEL NETWORK, il NOME DEL CANALE, il NICKNAME del BOT, la DIMENSIONE, e il NOME DEL FILE.
Il sistema effettua la ricerca sfruttando dei Bash Script plugin che si collegano alla relativa fonte; è possibile stabilire quali plugin attivare, tempi di timeout, numero di risultati massimo, ecc... .

Affinchè i comandi gestiti da script esterni funzionino correttamente è necessario che nel sistema siano disponibili questi comandi: xterm, lynx, curl, nano e wget.

Oltre a MACRO Parametriche (ne esiste una di nome MC (MultiCommand) che simula il comportamento di mIRC, permettendo l'esecuzione di comandi multipli separati dal carattere piep ("|"), la possibilità di usare variabili e fare domande all'utente; vedere la FAQ 027) ed Event's Manager, il plugin dispone dei Comandi Condizionali che sono: "/budus if", "/budus else", "/budus else if" e "/budus cmd".

Per un uso avanzato - soprattutto nelle Sentinelle e nelle MACRO - è consigliata la lettura di: "/budus help if", "/budus help else", "/budus help cmd", "/budus help set", "/budus help function"
Comandi Condizionali

Il funzionamento dei Comandi Condizionali è simile a quello delle sentinelle, fatto salvo che le sentinelle vengono invocate quando viene generato un evento (vedi sopra) mentre, in questo caso, siamo di fronte a dei comandi che vanno utilizzati manualmente, come AZIONE di una sentinella o come comando di una MACRO. Probabilmente il più "complicato" è "/budus if" perchè richiede, per eseguire un comando, che venga soddisfatta una CONDIZIONE - in modo simile alle sentinelle, appunto - ma, oltre a consentire l'uso di variabili, permette anche di usare attributi e Funzioni Avanzate. Prima di spiegarne il funzionamento, conviene quindi trattare questi tre argomenti (per capire gli esempi è opportuno provarli in XChat facendo dei copia/incolla ed eventualmente modificandoli secondo il proprio intuito):
  • VARIABILI: E' consentito l'uso di alcune variabili specifiche (come: $sesstype, $nickname, $password, $quitreason, $session, $chanlimit, $chantopic, $chanmode, $chankey, $opnum, $hopnum, $voicenum, $usernum, $servername e $network), tutte le variabili di BuDuScRiPt (di cui è possibile ottenere la lista con /budus var) e quelle che l'utente può crearsi tramite il comando /budus set.
    Ad esempio se prendiamo questa riga dal /budus var:
    awaypostfix : Variabile psAwayPostfix impostata a _Assente . (Postfisso del nickname in stato di AWAY)
    abbiamo che awaypostfix è la parola chiave necessaria per modificare la variabile psAwayPostfix tramite il comando /budus (ex: /budus awaypostfix 0); per utilizzare la variabile psAwayPostfix in un comando condizionale è sufficiente anteporre il carattere "$", ad esempio:
    /budus if '$psAwayPostfix' ! '' /ECHO Il postfisso da applicare quando sei AWAY e':%B $psAwayPostfix
    /budus else /ECHO Non hai configurato nessun postfisso per il nickname, quando vai in stato di AWAY.

  • ATTRIBUTI: sono un sistema con il quale è possibile ottenere informazioni su un utente, tramite il suo nickname e una parola chiave; la sintassi da utilizzare è nickname.attributo e gli attributi possibili sono (fa comunque fede la guida interna del plugin): hostname (indirizzo utente), realname (stringa identificativa), servername (nome del server al quale è collegato), lasttalk (valore numerico che identifica il numero di secondi trascorsi dal 1 gennaio 1970 fino a quando ha scritto l'ultimo messaggio), mode (modalità nel canale, espressa con i caratteri '*' (admin), '~' (founder), '&' (super OP), '@' (OP), '%' (HOP), '+' (voice) e 'u' (user)), away (stato di assenza, se AWAY vale 1), say (ultimo testo scritto dall'utente), state (flag BuDuScRiPt, che determina se il plugin ignora tutto quello che fa l'utente), qm (flag BuDuScRiPt che identifica se sull'utente è attivo il Query Monitoring), answer (flag/contatore BuDuScRiPt che determina lo stato di Away Answer, ovvero: se ha risposto all'utente - in modo automatico - quando questi ha contattato quello locale in stato di AWAY ed, eventualmente, quante volte ha risposto o se non deve più rispondere), who (i dati utente che si possono ottenere con il comando /WHO), badword (contatore che identifica quanti eventi "badword" ha generato l'utente) ed exist (identifica l'esistenza dell'utente; se l'utente esiste vale 1, altrimenti 0).
    Ad esempio possiamo verificare l'esistenza di un utente con questo comando:
    /budus if BuDuS.exist = 1 /ECHO L'utente BuDuS è presente nel canale corrente e ha%B BuDuS.hostname%O come indirizzo.
    Una soluzione più elegante, se vogliamo verificare un utente anzichè specificarne in modo esplicito il nickname è quello di usare una variabile. Nel caso dell'utente locale possiamo utilizzare la variabile $nickname in questo modo:
    /budus if $nickname.exist = 1 /ECHO L'utente $nickname è presente nel canale corrente e ha%B $nickname.hostname%O come indirizzo.
    Chiaramente avremmo potuto fare la medesima cosa anche usando una variabile definita dall'utente (più avanti è spiegato come crearle).

  • FUNZIONI AVANZATE: Un po' come nei linguaggi di programmazione classici è offerta la possibilità di utilizzare delle "funzioni" alle quali vengono forniti dei parametri (non sempre) e che ritornano un risultato. In modo analogo degli attributi, dove "l'attributo stesso" viene sostituito con un "risultato", le funzioni ritornano il risultato della propria elaborazione (è una sorta di cerca/sostituisci: il codice usato per invocare la funzione viene sostituito con il risultato della stessa). Le funzioni avanzate disponibili sono numerose e, per avere la lista aggiornata comprensiva di spiegazione ed esempi, è opportuno consultare la guida interna del plugin con: /budus help function.
    Per comprenderne l'uso è indispensabile fare delle prove (ottimo è provare gli esempi forniti dalla guida del plugin, modificarli e vedere cosa succede). Fondamentale requisito affinchè il sistema funzioni è rispettare la sintassi, in particolare, lo spazio che intercorre tra le parentesi tonde. Ad esempio:
    /budus cmd /ECHO Prendo il quinto sottoinsieme, separando con 'spazio': token( 5, ,uno due tre quattro cinque sei sette otto nove dieci )
    Qui abbiamo che viene invocata la funzione token( [>]token,field,string ); il carattere ">", essendo tra parentesi quadre ("[" e "]"), significa che è facoltativo (e, nel nostro esempio, è stato omesso), "token" è un parametro numerico (nel nostro esempio il "5"), "field" identifica un separatore di stringa (nel nostro esempio abbiamo messo uno spazio) e "string" è la frase sulla quale eseguire l'elaborazione (nell'esempio "uno due tre quattro cinque sei sette otto nove dieci").
    Notare che dopo token( e prima della ) finale è presente uno spazio; se non lo avessimo rispettato, il plugin non avrebbe interpretato quel codice come una chiamata a funzione, ma come un semplice testo. In altri termini scrivere:
    /budus cmd /ECHO Prendo il quinto sottoinsieme, separando con 'spazio': token(5, ,uno due tre quattro cinque sei sette otto nove dieci)
    non avrebbe funzionato !
    Nel dettaglio la funzione "token" serve per suddividere una stringa ("string") utilizzando il parametro "filed" come stringa di separazione, dopodichè viene associato un numero ad ogni segmento creato e ritornato quello corrispondente al valore espresso dal parametro "token". Specificando il carattere ">" prima di "token", non viene ritornato il solo segmento corrispondente ma anche tutta la parte restante della stringa. Giusto per dimostrarlo:
    /budus cmd /ECHO Prendo il quinto sottoinsieme e tutto il resto, separando con 'spazio': token( >5, ,uno due tre quattro cinque sei sette otto nove dieci )
    Ora, nel nostro esempio, abbiamo separato la stringa "uno due tre quattro cinque sei sette otto nove dieci" con lo spazio, ma se la stringa fosse stata "uno,due,tre,quattro,cinque,sei,sette,otto,nove,dieci", come avremmo fatto ?
    Si potrebbe provare con:
    /budus cmd /ECHO Prendo il quinto sottoinsieme, separando con la virgola: token( 5,,,uno,due,tre,quattro,cinque,sei,sette,otto,nove,dieci )
    ma, facendo un semplice test, si noterà subito che qualcosa non ha funzionato secondo le aspettative (tant'è che viene anche emesso un messaggio di errore). Il problema è dovuto al fatto che, per separare i parametri, usiamo proprio il carattere virgola (",") ed il parser dei comandi non è in grado di distinguere la virgola di separazione dei parametri da quella utilizzata come parametro.
    In questi casi è necessario fare uso di una speciale parola chiave che identifica la virgola: _BUDUSCRIPT_COMMA_
    Ecco come si presenta ora il nostro esempio:
    /budus cmd /ECHO Prendo il quinto sottoinsieme, separando con la virgola: token( 5,_BUDUSCRIPT_COMMA_,uno,due,tre,quattro,cinque,sei,sette,otto,nove,dieci )
    Affinchè sia chiaro come il rispetto della sintassi sia importante perchè le cose funzionino e come sia possibile anche annidare e/o concatenare funzioni avanzate, fornisco un altro esempio:
    /budus cmd /ECHO Nel canale tab() del server tab( s ) sono presenti stat( tab( s ),tab() @ ) OP.
    Qui abbiamo un comando che serve per emettere un messaggio nel quale è indicato il numero di OP presenti nel canale dove il comando stesso viene eseguito.
    Viene fatto uso di 2 funzioni avanzate:
    • tab( [s | n] )
    • stat( [server, | network,]session [filter] )
    La funzione "tab" ha 3 possibilità:
    • Ritornare il nome del canale corrente.
    • Ritornare il nome del Server IRC corrente (parametro "s").
    • Ritornare il nome del Network IRC corrente (parametro "n")
    Notare come, anche usando la funzione "tab" all'interno della funzione "stat" siano stati rispettati gli spazi dopo e prima le parentesi tonde e comunque quelli richiesti dalla sintassi.
    La funzione "stat" serve per eseguire ritornare il numero di utenti presenti in un determinato canale. Ha solo un parametro non facoltativo "session", cioè il nome della sessione (così XChat chiama le varie tabelle, canali compresi). Notare come, volendo specificare il "server" o il "network", sia necessario metterli prima di "session" separando con una virgola (","); nel caso in cui si voglia utilizzare il parametro "filter", sia necessario mettere uno spazio.
    Nel nostro esempio abbiamo specificato il nome del server e del canale utilizzando la funzione "tab" (rispettivamente tab( s ) e tab()), mentre come filtro abbiamo usato il carattere "@" che, in IRC, identifica gli OP (Operatori del Canale).

Ora che sappiamo di cosa possiamo utilizzare nei comandi condizionali è giunto il momento di analizzarne quello più importante (e complicato): if.

Come in tutti i linguaggi di programmazione, il suo scopo è quello di verificare una condizione e, se soddisfatta, eseguire un'azione.
La sua sintassi è la seguente:
/budus if <espressione1> <operatore> [/]<espressione2> [|]<comando>
<espressione1> può avere due forme:
  • Contenere stringhe, variabili, attributi e funzioni avanzate.
  • Un comando da eseguire al sistema operativo per mezzo della sintassi $(<comando>) .
<operatore> può essere uno dei seguenti caratteri:
  • < Operatore di minoranza tra stringhe non case-sensitive.
  • = Operatore di uguaglianza tra stringhe non case-sensitive.
  • > Operatore di maggioranza tra stringhe non case-sensitive.
  • : Operatore di presenza di <espressione1> in <espressione2> o viceversa.
  • ! Operatore di disuguaglianza tra stringhe non case-sensitive.
<espressione2> può contenere solo stringhe, variabili e/o attributi. Tuttavia, se si antepone il carattere "/", quest'ultimo viene automaticamente rimosso e <espressione2> viene usata come un'Espressione Regolare POSIX.
N.B.: Chiaramente la condizione viene valutata solo DOPO aver risolto variabili, attributi o chiamate al sistema operativo.
<comando> può essere un qualsiasi comando IRC/BuDuScRiPt; se viene preceduto dal carattere "|" (pipe), eventuali variabili, attributi o funzioni avanzate non saranno risolti (in alcuni casi può essere opportuno farlo in un secondo momento).
E' inoltre consentito l'utilizzo di una specifica variabile che contiene l'output del comando eseguito al sistema operativo (tramite la sintassi $(<comando>)): $output
Ad esempio:
/budus if "'$(uname -a)'" ! '' /SAY Dati del Sistema Operativo:%B $output
Notare che, essendo necessari 3 parametri per definire una condizione e che il comando da eseguire al sistema operativo contiene uno spazio (prima di "-a"), si è dovuto proteggere il parametro con le virgolette ('"'). Inoltre, per verificare che il valore non fosse nullo ("''") si è usato l'apice anche prima e dopo la chiamata al sistema operativo ('$(uname -a)').
In alcuni casi può essere utile eseguire il comando a sistema operativo (tramite la sintassi: $(<comando>)) proteggendo "i suoi parametri" (da non confondere quindi con quelli del comando condizionale) con il carattere apice ("'"). Tuttavia non sempre è facile operare questa operazione, soprattutto quando, ad esempio, si utilizzano delle variabili prese dalla chat, come potrebbe essere il nome di un canale; quest'ultimo, infatti, può tranquillamente contenere, nel proprio nome, un apice e questo può comportare interpretazioni anomale da parte del prompt dei comandi del sistema operativo.
Per risolvere il problema è possibile usare dei "codici di escape" forniti dal plugin in questo particolare contesto (usati anche dal comando /budus pipe) che sono: "\(" e "\)" .
Ad esempio:
/budus if "'$($HOME/.xchat2/buduscript/budus_google_search.sh \(!search $session\))'" ! '' /budus cmd $output
serve per effettuare una ricerca su Google del "nome del canale corrente" (rappresentato dalla variabile $session); facile che non trovi nulla, ma almeno fa vedere come è possibile proteggere il parametro '!search $session' . Magari, omettendo il carattere "#" dal nome del canale può darsi che la ricerca abbia esito positivo; possiamo operare la cosa usando una Funzione Avanzata, in questo modo:
/budus if "'$($HOME/.xchat2/buduscript/budus_google_search.sh \(!search replace( -#,,$session )\))'" ! '' /budus cmd replace( - /SAY,_BUDUSCRIPT_COMMA_ ,$output )
Con il primo replace (quello dentro la chiamata a sistema operativo) si è rimosso il carattere "#", mentre con il secondo (nell'azione del comando condizionale) si è sostituito il " /SAY" con un ", " (questo perchè lo script ritorna più comandi per XChat, non uno solo).


Trattato il comando if , per concludere il famoso costrutto "IF, THEN, ELSE", è necessario passare ad else.
E' molto più semplice di if perchè il suo compito consiste nell'eseguire l'azione solo nel caso in cui il precedente if abbia fallito la sua condizione.

Questo determina che non ha senso eseguire un /budus else se prima non si è eseguito un /budus if.

E' consentito anche il /budus else if, il cui funzionamento, è uguale a quello del comando /budus if, fatta eccezione del fatto che viene valutato solo se la precedente verifica ha fallito.
In alcuni casi può essere utile eseguire uno o più comandi avendo la possibilità di utilizzare variabili, attributi o funzioni avanzate.
Si tratta di /budus cmd (vedi: /budus help cmd) e, a parte la mancanza di una "verifica" e la possibilità di eseguire comandi al sistema operativo, possiede tutte le caratteristiche descritte in precedenza, in aggiunta alle quali, è concesso l'uso di comandi multipli (con possibilità di inibire la risoluzione o l'esecuzione del comando per ognuno di essi) separandoli dalla sequenza "\;" (come quella usata nelle AZIONI delle Sentinelle che, allo stesso modo, può essere protetta con l'uso della parola chiave _BUDUS_SEPARATOR_, laddove non si desidera separare subito il comando). Nella guida /budus help function è pieno di esempi sull'uso di questo comando.

Vale la pena informare sulla possibilità di utilizzare come azione di questo comando delle variabili utente il cui valore è un comando IRC/BuDuScRiPt. Questo può aiutare a semplificare sentinelle o altri contesti. Giusto per dare un esempio banale:

/budus set mio_comando /SAY Uso una variabile come fosse un comando !
/budus cmd $mio_comando
Volendo usare - in questo caso ha poco senso, chiaramente - i "multicomandi" avremmo potuto scrivere anche così
/budus cmd /budus set mio_comando /SAY Uso una variabile come fosse un comando !\;$mio_comando
ottenendo il medesimo risultato.
L'uso del carattere \ anteposto al comando da eseguire ha un senso nel caso in cui si utilizzi una funzione avanzata come la exec( filter,command ) che, già di suo, prevede l'esecuzione di comandi.

Laddove si desideri creare un comando che funziona su multiselezione (cioè che venga applicato ad N utenti selezionati dalla lista utenti di XChat) e che sia invocabile come azione di una voce del menu di XChat, può essere indispensabile utilizzare la modalità multi-invocazione, anteponendo al primo comando il carattere asterisco ("*").
/MENU ADD "Test" "budus cmd */ECHO Selezionati exec( s,/ECHO $execnick ) utenti, ecco la lista:"

Infine, come un po' si è visto in precedenza, rimane da trattare il comando /budus set, il quale, serve per creare variabili utente.
La sintassi è semplice:
/budus set [variabile] [valore]
Alcune proprietà delle variabili sono:
  • Una volta creata, una variabile non la si può eliminare. Tuttavia non sono permanenti, alla chiusura di XChat vengono perse.
  • Il nome può contenere qualsiasi carattere diverso da spazio.
  • Le variabili sono case sensitive, quindi, c'è differenza tra scrivere mia_variabile e Mia_Variabile, saranno trattate come due variabili diverse.
  • Se una variabile esiste già è solo possibile cambiarne il valore.
  • Possono avere lo stesso nome di una variabile interna di BuDuScRiPt ($output, $session, ecc... o quelle di configurazione che si ottengono con /budus var) ma non è possibile modificarne il valore tramite /budus set e comunque, in fase di risoluzione, vengono elaborate per ultime (quindi quelle del plugin hanno precedenza, verrà usata quella utente solo se, in qualche contesto particolare, non è disponibile quella interna).

Infine è da sottolineare come sia possibile usare i Comandi Condizionali all'interno di MACRO Parametriche o Sentinelle.
Nel caso delle sentinelle possono essere usati esclusivamente come AZIONE della sentinella; si può essere tentati dal non usare la CONDIZIONE delle sentinelle, in favore di un più intuitivo /budus if, ad esempio:
/event add 0 jchannel * /budus if $nick = $ru /SAY Ciao a tutti gli utenti di $channel !
anzichè:
/event add 0 jchannel '$nick'='$ru' /SAY Ciao a tutti gli utenti di $channel !
ma questo, pur facendo ottenere il medesimo risultato, è nettamente più gravoso per il calcolatore quindi, se possibile/utile, conviene sempre sfruttare la condizione delle sentinelle con priorità maggiore dei comandi condizionali.

Sempre per quanto riguarda l'uso congiunto con le sentinelle, vale la pena fare un esempio di come creare un'azione di tipo "IF, THEN, ELSE" sfruttando i comandi multipli delle sentinelle:
/event add 0 jchannel '$nick'!'$ru' /budus InsertCommandInQueueTimed() 3 /budus sendsess $server/$channel /budus if $ru.mode ! @ /VOICE $ru\;/budus InsertCommandInQueueTimed() 3 /budus sendsess $server/$channel /budus else /SAY E' entrato un Operatore in $channel, tutti sull'attenti !
N.B.: Gli eventi simili a jchannel (pchannel, pserver, ecc...) sono particolari perchè, nel momento in cui vengono generati, il database non è ancora aggiornato. In altri termini: quando si esegue un'azione derivata da un evento come jchannel, l'utente che sta entrando non è ancora dentro il canale, quindi non è possibile applicargli degli attributi.

Per ovviare al problema è necessario temporizzare l'azione; ecco quindi che nel comando sopra le azioni sono state ritardate di 3 secondi usando la Command's Queue di BuDuScRiPt con il comando "/budus InsertCommandInQueueTimed() 3".

Dato che questo "sfalsamento" può comportare la perdita della "sessione giusta" (in pratica i comandi che vengono dopo potrebbero essere eseguiti nel canale sbagliato) è buono forzare la sessione nella quale dovranno essere eseguite le azioni della sentinella tramite l'uso di "/budus sendsess $server/$channel".
Il comando esposto sopra crea una sentinella che, quando entra nel canale un utente (avente nickname diverso da quello locale), dopo 3 secondi verifica se è OP; se non lo è gli da il "VOICE", altrimenti, emette un messaggio ("E' entrato un Operatore in $channel, tutti sull'attenti !").
[ SUPPORTO ]
BuDuScRiPt è un plugin realizzato da UDA'Software per uso personale; nonostante questo, l'autore ha deciso di rendere fruibile a tutti gli utenti l'uso del software gratuitamente (il software è comunque coperto da Licenza GPL). 
La UDA'Software non si assume nessuna responsabilità per qualsiasi danno possa derivare dall'uso del plugin. 
Chiunque desideri comunicare problemi, suggerimenti, opinioni o quant'altro, non esiti a scrivere al seguente indirizzo E-Mail: 

budus@hotmail.it

 E' presente anche un forum dedicato allo script, oppure, anche la chat ufficiale, dove si potra' ottenere aiuto on-line. Per sviluppare il plugin, il feed-back e' importantissimo, ed invito gli utenti dello script a non esitare a contattarmi.