A partire dalla versione 2.0 X-Chat consente all'utente di personalizzare il menu dei comandi, tuttavia, non offre un sistema pratico per farlo, ad esempio "caricando un file di menu" o qualcosa del genere; in altri termini: un conto è aggiungersi un paio di comandi, un altro aggiungere un menu personalizzato "di una certa entità".
Ma, aldilà delle dimensioni del menu che si vuole realizzare, diciamo che è proprio scomodo personalizzarlo con gli strumenti di default e, volendo, non è nemmeno semplicissimo, soprattutto per quegli utenti che sono abituati a mIRC.
BuDuScRiPt offre diverse possibilità per colmare queste lacune:
- Consente di creare delle MACRO Parametriche, in modo da automatizzare la creazione di menu di qualsiasi dimensione.
- Consente di trasformare un file di menu mIRC (file .ini) in una MACRO Parametrica.
Cercherò qui di spiegare come creare un menu mIRC semplice, che sia trasformabile in una MACRO Parametrica (chiaramente non è supportato tutto lo standard mIRC, ma solo un piccolo sottoinsieme che, in linea di massima, ritengo sufficiente per soddisfare le esigenze di chiunque).
File Menu mIRC supportati da BuDuScRiPt
Come prima cosa il menu lo possiamo creare con qualsiasi editor di testo ed è solo richiesta l'estensione .ini
Un menu a tendina è composto da nomi di menu e comandi. Deve sempre partire da un nome di menu, il quale, può contenere ulteriori nomi di menu (in questo caso diventano: sotto-menu) o comandi (cioè voci che, se selezionate dall'utente, provocano un'azione).
I nomi di menu sono il titolo che deve avere il menu e sono composti semplicemente da una stringa alfanumerica; è consigliato l'uso di soli caratteri e numeri ma, in linea di massima, dovrebbero essere convertiti anche tutti gli altri caratteri. Particolare funzione la fa l'underscore '_' che X-Chat interpreta come acceleratore di tastiera. Se, ad esempio, scriviamo come nome "_Menu Personale", X-Chat toglierà l'underscore e visualizzerà la voce "Menu Personale", ad indicare che premendo "ALT+m" equivale a selezionare la medesima voce con mouse o tasti freccia+INVIO.
I comandi hanno sia un titolo, che rispetta le stesse caratteristiche dei nomi di menu, che l' azione IRC/X-Chat/BuDuScRiPt, separata dal primo da ':' ; l'azione rappresenta ciò che deve essere effettivamente eseguito quando l'utente seleziona la voce.
Nei comandi è possibile utilizzare alcune parole chiave o variabili che consentono di eseguire azioni anche in base agli utenti che sono selezionati (lista utenti di X-Chat), piuttosto che al nome del canale o anche richiedendo input all'utente per mezzo di un'apposita finestra.
Ecco la lista supportata da BuDuScRiPt:
- VARIABILE $$1 : Rappresenta il nickname dell'utente selezionato nella lista utenti.
- VARIABILE $+ : Rappresenta il nickname dell'utente selezionato nella lista utenti.
- VARIABILE $me : Rappresenta il nickname dell'utente locale.
- VARIABILE $nickname : Rappresenta il nickname dell'utente locale.
- VARIABILE $null : Rappresenta il "nulla" (non è ben chiaro a cosa serve - non conosco molto mIRC ... - ma in X-Chat verrà sostituito con "echo NULL").
- VARIABILE $chan : Rappresenta il canale corrente (io consiglio di usare questa per identificare il nome del canale corrente).
- VARIABILE $server : Rappresenta il nome del server al quale si è attualmente collegati.
- VARIABILE $network : Rappresenta il nome del network al quale si è collegati (non supportata da mIRC, ma presente in X-Chat e molto utile).
- CHIAVE #mychan : Rappresenta il canale corrente (sconsiglio l'uso di questa parola chiave, presente solo per compatibilità).
- CHIAVE +# : Rappresenta il canale corrente (sconsiglio l'uso di questa parola chiave, presente solo per compatibilità).
- CHIAVE | : Il carattere PIPE viene usato per separare comandi multipli.
- CHIAVE - : Rappresenta una linea di separazione del menu (utile per suddividere il menu).
- COMANDO run : Consente l'esecuzione di un comando del sistema operativo.
- COMANDO explorer.exe : Consente l'esecuzione di Firefox.
- COMANDO $$?="domanda" : Consente di effettuare una richiesta di input all'utente, chiedendo la "domanda"; l'intero comando sarà poi sostituito con la risposta dell'utente. La si può immaginare come una variabile dinamica.
Altra caratteristica dei menu a tendina è il livello di menu; avremo un nome di menu principale (livello 1) che stabilisce il nome dell'intero menu (quello che vedremo visualizzato nella barra di X-Chat) e gli eventuali sotto-menu che, man mano che sono concatenati, aumentano di livello. BuDuScRiPt supporta fino a 9 livelli.
Per definire il livello di menu dobbiamo utilizzare il carattere punto '.' seguito o dal nome di menu o dal comando; per ogni riga del file .ini avremo una di queste due tipoligie e, a stabilire la gerarchia del menu, saranno i punti che, in modo progressivo, stabiliranno il livello.
Il livello dei menu richiede attenzione perché se, ad esempio, definiamo una voce di livello 3, quella successiva potrà essere o di livello inferiore, o uguale o di un solo livello superiore (in altri termini: per la voce successiva non sarà consentito più di un livello superiore).
Se definiamo un nome di menu e desideriamo che al suo interno compaiano dei comandi, quest'ultimi dovranno essere di un livello superiore (di una unità).
Al fine di prendere familiarità, iniziamo con il definire un semplice menu:
Codice: Seleziona tutto
.Comando 1 di livello 2:ECHO Comando 1 di livello 1
.SubMenu A Livello 2
..Comando 1 di livello 3 SubMenu A:ECHO Comando 1 di livello 3 del SubMenu A
..Comando 2 di livello 3 SubMenu A:ECHO Comando 2 di livello 3 del SubMenu A
..Comando 3 di livello 3 SubMenu A:ECHO Comando 3 di livello 3 del SubMenu A
.SubMenu B Livello 2
..Comando 1 di livello 3 SubMenu B:ECHO Comando 1 di livello 3 del SubMenu B
..Comando 2 di livello 3 SubMenu B:ECHO Comando 2 di livello 3 del SubMenu B
..SubMenu C Livello 3
...Comando 1 di livello 4 SubMenu C:ECHO Comando 1 di livello 4 del SubMenu C
...Comando 2 di livello 4 SubMenu C:ECHO Comando 2 di livello 4 del SubMenu C
...-
...Comando 3 di livello 4 SubMenu C:/ECHO Comando 3 di livello 4 del SubMenu C
..-
..Comando 3 di livello 3 SubMenu B:ECHO Comando 3 di livello 3 del SubMenu B
.-
.Il tuo nickname:ECHO Il tuo nickname: $nickname
.Il nickname dell'utente selezionato:ECHO Il nickname dell'utente selezionato: $$1
.Il canale corrente:ECHO Il canale corrente: $chan
.Il server corrente:ECHO Il server corrente: $server
.Il network corrente:ECHO Il network corrente: $network
.Hai inserito ...:ECHO Hai inserito: $$?="Inserisci una frase"
.Comando multiplo:ECHO 1 $nickname | ECHO 2 $chan | ECHO 3 $network | ECHO 4 $$?="Inserisci una parola"
Forse, visto così, potrebbe risultare ancora poco semplice da capire; sono convito che, trasformandolo in MACRO, caricandolo in BuDuScRiPt e utilizzandolo da X-Chat, le cose saranno più chiare.
Salviamo il menu definito sopra nel file "$HOME/.xchat2/buduscript/prova.ini".
Convertire un menu mIRC in MACRO Parametrica BuDuScRiPt
Salvato il file ini, proviamo a convertirlo con i seguenti comandi (da terminale):
Codice: Seleziona tutto
cd $HOME/.chat2/buduscript
./buduscript_script__import_mirc_ini.sh prova.ini Prova prova.mcr
Alla richiesta di conversione dei caratteri in UTF-8 premere INVIO. Premere INVIO per terminare l'importazione.
Se non si sono manifestati problemi imprevisti, lo script ci ha creato un file di nome "prova.mcr"; il contenuto è il seguente:
Codice: Seleziona tutto
#nolist
#fastflush
#budusmenu
# ******************************************************************************
# File MACRO importato dal file dati mIRC: prova.ini
# By UDA'Software 2010
# ******************************************************************************
/MENU DEL "Prova"
/MENU ADD "Prova"
/MENU ADD "Prova/_Ricarica Menu Prova" "budus macro prova"
/MENU ADD "Prova/-"
/MENU ADD "Prova/Comando 1 di livello 2" "ECHO Comando 1 di livello 1"
# ******************************************************************************
# SEZIONE di livello 2: SubMenu A Livello 2
# ******************************************************************************
/MENU ADD "Prova/SubMenu A Livello 2"
/MENU ADD "Prova/SubMenu A Livello 2/Comando 1 di livello 3 SubMenu A" "ECHO Comando 1 di livello 3 del SubMenu A"
/MENU ADD "Prova/SubMenu A Livello 2/Comando 2 di livello 3 SubMenu A" "ECHO Comando 2 di livello 3 del SubMenu A"
/MENU ADD "Prova/SubMenu A Livello 2/Comando 3 di livello 3 SubMenu A" "ECHO Comando 3 di livello 3 del SubMenu A"
# ******************************************************************************
# SEZIONE di livello 2: SubMenu B Livello 2
# ******************************************************************************
/MENU ADD "Prova/SubMenu B Livello 2"
/MENU ADD "Prova/SubMenu B Livello 2/Comando 1 di livello 3 SubMenu B" "ECHO Comando 1 di livello 3 del SubMenu B"
/MENU ADD "Prova/SubMenu B Livello 2/Comando 2 di livello 3 SubMenu B" "ECHO Comando 2 di livello 3 del SubMenu B"
# ******************************************************************************
# SEZIONE di livello 3: SubMenu C Livello 3
# ******************************************************************************
/MENU ADD "Prova/SubMenu B Livello 2/SubMenu C Livello 3"
/MENU ADD "Prova/SubMenu B Livello 2/SubMenu C Livello 3/Comando 1 di livello 4 SubMenu C" "ECHO Comando 1 di livello 4 del SubMenu C"
/MENU ADD "Prova/SubMenu B Livello 2/SubMenu C Livello 3/Comando 2 di livello 4 SubMenu C" "ECHO Comando 2 di livello 4 del SubMenu C"
/MENU ADD "Prova/SubMenu B Livello 2/SubMenu C Livello 3/-"
/MENU ADD "Prova/SubMenu B Livello 2/SubMenu C Livello 3/Comando 3 di livello 4 SubMenu C" "ECHO Comando 3 di livello 4 del SubMenu C"
/MENU ADD "Prova/SubMenu B Livello 2/-"
/MENU ADD "Prova/SubMenu B Livello 2/Comando 3 di livello 3 SubMenu B" "ECHO Comando 3 di livello 3 del SubMenu B"
/MENU ADD "Prova/-"
/MENU ADD "Prova/Il tuo nickname" "budus macro MC ECHO Il tuo nickname: $nick "
/MENU ADD "Prova/Il nickname dell'utente selezionato" "budus macro MC ECHO Il nickname dell_VIRGOLETTA_utente selezionato: %s"
/MENU ADD "Prova/Il canale corrente" "ECHO Il canale corrente: %c"
/MENU ADD "Prova/Il server corrente" "budus macro MC ECHO Il server corrente: $server"
/MENU ADD "Prova/Il network corrente" "budus macro MC ECHO Il network corrente: $network"
/MENU ADD "Prova/Hai inserito ..." "budus macro MC ECHO Hai inserito: $$?=_VIRGOLETTE_Inserisci una frase_VIRGOLETTE_"
/MENU ADD "Prova/Comando multiplo" "budus macro MC ECHO 1 $nick | ECHO 2 %c | ECHO 3 $network | ECHO 4 $$?=_VIRGOLETTE_Inserisci una parola_VIRGOLETTE_"
A prima vista potrebbe sembrare molto diverso ma, analizzandolo, si potrà notare che le differenze non sono molte e comunque sono dovute al modo leggermente diverso che ha X-Chat di trattare le cose. Volendo, dopo aver preso un po' di familiarità con le MACRO generate in questo modo, si può anche pensare di modificarle direttamente, facendo attenzione ai seguenti aspetti:
- Anziché usare il punto '.', X-Chat struttura i menu come se fossero delle cartelle, separandole con il forward slash '/'.
- Sia i nomi di menu che i comandi sono racchiusi tra virgolette '"'; questo comporta che non è possibile usarle all'interno di un nome e soprattutto come parte di un comando.Questa impossibilità di usare le virgolette per i propri scopi comporta una certa limitazione, che è possibile superare solo attraverso l'uso della MACRO MC di BuDuScRiPt.
MC consente di utilizzare la parola chiave _VIRGOLETTA_ laddove sia necessario l'apice e _VIRGOLETTE_ dove si devono usare le virgolette.
Quindi, dato che una voce di menu come questa:Codice: Seleziona tutto
/MENU ADD "Comando" "ECHO $$?="Inserisci una frase""
non sarebbe accettata da X-Chat, dobbiamo ripiegare in questo modo:Codice: Seleziona tutto
/MENU ADD "Comando" "budus macro MC ECHO $$?=_VIRGOLETTE_Inserisci una frase_VIRGOLETTE_" - Le variabili mIRC vengono sostituite con le analoghe X-Chat, quindi abbiamo:
- $$1 = %s
- $chan = %c
- I multi-comandi richiedono l'uso della MACRO MC.In teoria, a livello di MACRO BuDuScRiPt, si potrebbe ovviare a questi problemi anche attraverso l'uso dei Comandi Condizionali e di Variabili BuDuScRiPt (il file onload.mcr può fare da esempio piuttosto complesso), ma è chiaro che bisogna avere una certa conoscenza del plug-in.
Caricare il menu in X-Chat
Per caricare il menu in X-Chat non dobbiamo fare altro che eseguire la MACRO digitando questo comando in X-Chat:
Codice: Seleziona tutto
/budus macro provaInvito a provare i vari comandi di menu, magari confrontandoli con il codice del file .ini e anche quello del file .mcr . E' possibile modificare il file .mcr e, tramite il primo comando del menu "Prova" ("Ricarica Menu Prova" ) si possono verificare subito i risultati.
Rendere permanente il menu in X-Chat
Alla chiusura di X-Chat, il menu "sarà perso" (il menu, non la MACRO !). Per fare in modo che venga caricato in automatico ad ogni avvio di X-Chat è possibile aggiungere il comando:
Codice: Seleziona tutto
/budus macro provatramite la voce di menu: BuDuScRiPt -> Esecuzione Automatica -> Aggiungi Comando da Eseguire all'Avvio ...
Sfruttare le funzionalità avanzate dei menu di X-Chat
X-Chat offre la possibilità di manipolare i menu, aggiungendo icone, check-box, radio-button, ecc... .
La sintassi completa è la seguente (aggiornato alla versione X-Chat 2.8.6):
Codice: Seleziona tutto
/MENU [-eX] [-i<ICONFILE>] [-k<mod>,<key>] [-m] [-pX] [-rX,group] [-tX] {ADD|DEL} <path> [command] [unselect command]
Prima di modificare MACRO e quant'altro consiglio di provare direttamente in X-Chat e solo successivamente salvare in un file.
Do qualche esempio:
Codice: Seleziona tutto
/MENU -p5 ADD FServe
/MENU ADD "FServe/Visualizza la Lista dei Files" "fs list"
/MENU ADD FServe/-
/MENU -k4,101 -t1 ADD "FServe/Enabled" "fs on" "fs off"
/MENU -e0 ADD "FServe/Fai qualcosa" "fs action"
Per eliminare un menu così creato, usare:
Codice: Seleziona tutto
/MENU DEL FServe
Il carattere "-" usato da solo serve per inserire un separatore di linea (esattamente come nei files .ini di mIRC). A livello di parametri abbiamo:
- -eX ; "X" rappresenta il flag che stabilisce se la voce di menu deve essere attiva (cliccabile dall'utente: 1) o meno (0). Esempio:
Codice: Seleziona tutto
/MENU -e0 ADD "Prova/Voce Disabilitata" "ECHO %c" - -iFILE ; "FILE" rappresenta il percorso completo ad un file .png contenente un'immagine da usare come icona (consiglio 16X16). Funzionalità non supportata per radio-buttons e check-box. Esempio:
Codice: Seleziona tutto
/MENU -i.xchat2/buduscript/Icons/help_16.png ADD "Prova/Aiuto" - -kM,K ; "M" rappresenta il "modificatore", dove abbiamo:
- 1 = SHIFT
- 4 = CTRL
- 8 = ALT
Codice: Seleziona tutto
/BUDUS CMD /MENU -k12,97 -t$nickname.away ADD "BuDuScRiPt/Commuta stato di AWAY globalmente" "budus away" "budus away"In questo esempio il comando inizia con "/BUDUS CMD" perché si deve sostituire l'attributo "$nickname.away" con 1 se l'utente locale risulta AWAY e 0 se invece è presente. - -pX ; "X" rappresenta un valore numerico che stabilisce la posizione dove il menu deve essere inserito. Ad esempio "-p5" inserisce il menu nella quinta posizione. Se il valore di "X" è negativo, il menu viene posizionato in base alla voce più in basso a destra esistente.
- -rX,G ; permette di creare dei "radio-button", dove "X" rappresenta lo stato iniziale (1 spuntato e 0 no) e "G" il nome del menu. Esempio:
Codice: Seleziona tutto
/menu add "Prova/Radio"
/menu -r1,"Radio 1" add "Prova/Radio/Radio 1" "ECHO Radio 1"
/menu -r0,"Radio 1" add "Prova/Radio/Radio 2" "ECHO Radio 2"
/menu -r0,"Radio 1" add "Prova/Radio/Radio 3" "ECHO Radio 3" - -tX : "X" rappresenta se il check-box della voce deve essere attivo (1) o spento (0). Esempio:
Codice: Seleziona tutto
/MENU -t0 ADD "Prova/AWAY" "AWAY" "BACK"
- $TAB ; Tab menu (si apre con il tasto destro del mouse nella finestra della chat o nell'albero dei canali)
- $TRAY ; System Tray menu (iconcina "vicina all'orologio")
- $URL ; URL link menu (quando si clicca con il tasto destro del mouse su un link)
- $NICK ; Userlist nick-name popup menu (quando si clicca con il tasto destro del mouse su un utente nella lista utenti)
- $CHAN ; Channel menu (quando si clicca con il tasto destro del mouse, nella finestra della chat, sul nome di un canale)
Codice: Seleziona tutto
/MENU -p0 ADD "$TAB/Rientra nel Canale" "CYCLE"
ed, effettivamente, usando manualmente il comando la cosa funziona (nel senso, se digitiamo il comando manualmente in X-Chat). Tuttavia, se si esegue quel comando attraverso le funzioni di interfaccia offerte ai plug-in di X-Chat, si scoprirà che la cosa non funziona (ragione per la quale dubito esistano in giro plug-in/script - oltre a BuDuScRiPt - in grado di personalizzare i menu contestuali).
In altri termini: da script non sembra possibile modificare i menu contestuali di X-Chat.
E' però vero che con BuDuScRiPt si riesce a fare la cosa attraverso un suo Comando Avanzato; questo implica che inserendo in una macro il comando esposto sopra, questi non funzionerà (il menu non viene proprio aggiunto) ma se usiamo un comando come questo:
Codice: Seleziona tutto
/budus ExecUserInput() /MENU -p0 ADD "$TAB/Rientra nel Canale" "CYCLE"
la cosa funzionerà perfettamente
Il comando "ExecUserInput()" serve per simulare l'immissione di un comando da parte dell'utente, proprio come fosse l'utente a scriverlo. Questo consente di scavalcare le funzioni interne di X-Chat offerte ai plug-in, che sono appunto quelle che non consentono di manipolare i menu.
Conclusioni
Lo so, sono sempre piuttosto prolisso e questa guida per crearsi un menu in modo semplice sembra un'enciclopedia !
Tuttavia ho voluto dare una panoramica esauriente dell'argomento convinto che, con qualche semplice prova, sarà possibile personalizzarsi i menu e rendendosi conto che è più facile di quel che sembra !