| Autore: Grifisx | Data: 2005-11-20 |
| Modificato:
2005-12-17 |
Letture: 1357 |
|
Start: In questo tutorial parleremo degli eventi e faremo qualche accenno ai pop-up. Gli Eventi: In poche parole impareremo ad automatizzare le azioni del nostro KVIrc, in modo da fargli tenere certi comportamenti, al verificarsi di certe condizioni, in modo automatico. Il mondo di IRC è costellato di eventi, gli eventi sono delle situazioni che possono verificarsi, come nel mondo reale del resto. Ad esempio quando qualcuno ci dà lo stato di operatore su un canale (la chiocciolina per intenderci @) è educazione ringraziare, tutti abbiamo risposto (reazione all'evento che si è verificato , cioè "sono diventato op")in modo quasi istintivo ringraziando con un "tnx" oppure con un "grazie dell'op =)". Adesso vediamo come far si che il nostro KVIrc lo faccia in modo automatico (=D ...bello vero?). Una nota: su molti canali gli script automatici, non sono visti di buon occhio quindi se qualcuno vi dirà "togli sto saluto automatico!" non preoccupatevi noi impareremo anche ad evitare che il nostro script possa dare fastidio sul canale di quel tizio antipatico e schizzinoso =P. Cominciamo ad aprire il nostro event-editor (mostrate la barra dello scripting da Impostazioni->Barre degli strumenti->Mostra Scripting e dopo cliccate sul pulsante con la “e” blu) e vediamo cosa ci troviamo davanti. Sulla sinistra abbiamo un elenco con tutti quelli che sono gli eventi a cui il KVIrc reagisce, e sulla destra troviamo una finestra nera nella quale ci viene detto il valore che $0, $1, $2 etc…etc… assumono al verificarsi di quell’evento. Vediamo di capire tutto buttando giù un po’ di codice, quindi andiamo al primo degli eventi: OnAccelKeyPressed L’evento si verifica ogni qualvolta viene premuto un "AccelKey", i tasti veloci che il KVIrc conosce attualmente sono: Da F2 a F12, da F1 a F12 con il tasto SHIFT premuto e da 0 a 9 con il tasto CTRL premuto. Come possiamo vedere qui $0 corrisponde al tasto premuto. Proviamo a mettere in azione la fantasia: Tasto destro sull’evento OnAccelKeyPressed e creiamo un “Nuovo Gestore”, cambiamogli il nome di “predefinito” in qualche cosa di più carino e poi cominciamo a scrivere dentro la finestra nera (come abbiamo fatto per gli alias). If($0=="F2") { echo Tasto F2 premuto;}; If($0=="F3") { echo Tasto F3 premuto;}; If($0=="F4") { echo Tasto F4 premuto;}; oppure, come abbiamo visto per gli alias, possiamo dare il comando /event(OnAccelKeyPressed,eventoMio1){ If($0=="F2") { echo Tasto F2 premuto;};} e come vedrete avremo aggiunto all’evento OnAccelKeyPressed, il gestore eventoMio1 che contiene il nostro codice senza dover aprire l'event editor (la sintassi del comando è event(,{codice;};) questo comando come vedremo può essere molto comodo in certi casi. Mettiamo il caso che, volessimo ringraziare quando su un canale un nostro amico ci dà lo stato di voice, o di halfop o di op. Sfogliamo la lista degli eventi fino ad imbatterci in : OnMeHalfOp OnMeOp OnMeVoice Evidenziamo il primo e, dopo aver notato che $0=nick che ci halfoppa, $1=username di chi ci ha halfoppato e $2= host di chi ci ha halfoppato, aggiungiamo un gestore (tasto destro->nuovo gestore)e chiamiamolo ad esempio “tnxFor”. Adesso mettiamo dentro il gestore che abbiamo creato il codice che dovrà essere eseguito al verificarsi dell'evento stesso: msg $target \[ $0 \]tnx for the halfop on $target la funzione $target ci restituisce il destinatario (nick o nome del canale a seconda che sia una query o una finestra di canale) della finestra corrente, quindi, nel nostro caso, il nome del canale (avremmo potuto usare anche la funzione $chan.name). Vi consiglio di andarvi a guardare le funzioni sul manuale ufficiale, quelle utilissime sono tante oltre $target, $me e $chan.name. Se volessimo farlo più simpatico potremmo anche fare un messaggio pseudo-casuale, con un codice del genere: %tmp=$rand(3) if(%tmp==0){msg $target \[ $0 \]tnx for the halfop on $target ;} if(%tmp==1){msg $target Tnx $0 ^_^ ;} if(%tmp==2){msg $target grazie :* ;} if(%tmp==3){msg $target ..ohoho I'm an halfop ^_^ tnx ;} Se invece il fondatore del canale #0antipatici_456YK(il numero finale è stato aggiunto per evitare di nominare un canale esistente), non ama queste cose e non vuole che sul suo canale si ringrazi in modo automatico, basta che facciamo un: if($chan.name!=”#0antipatici_456YK”){ %tmp=$rand(3) if(%tmp==0){msg $target \[ $0 \]tnx for the halfop on $target } if(%tmp==1){msg $target Tnx $0 ^_^ } if(%tmp==2){msg $target grazie :* } if(%tmp==3){msg $target I'm an halfop ^_^ tnx to $0} } e risolveremo il problema =D poiché con la condizione precedente (cioè a dire if($chan.name!=”#0antipatici_456YK”)) abbiamo fatto in modo che ringrazi solo nel caso in cui il canale sia diverso da #0antipatici_456YK. Ovviamente una cosa del genere possiamo farla per tutti gli eventi che vogliamo, come ad esempio OnMeBan, OnMeOp etc.. etc.. Adesso mettiamo il caso che volessimo scrivere alternando i colori delle lettere invece del solito color nero, per far ciò portiamoci all’evento:
OnTextInput Questo evento si verifica quando diamo l’invio e “mandiamo” il testo che abbiamo scritto. Ora dobbiamo far in modo che il nostro script vada a modificare la nostra scrittura normale per trasformarla, in modo automatico in una scritta colorata, senza essere costretti a fare per ogni lettera CTRL+K e colore. In realtà se avete letto i tutorial precedenti avevamo già scritto un codice del genere e l’avevamo messo in un alias (ricordate lo script che salutava? Ricordate che i nick li avevamo fatti apparire tipo arcobaleno? Bene usiamo lo stesso procedimento), riprendiamo il codice e lo mettiamo dentro quest’evento, tenendo in considerazione che $0, così come leggiamo nella finestra a destra dell’evento, contiene la frase che abbiamo scritto : %szFrase=$0 %idx=1 while(%idx!=($str.len(%szFrase)+1)) { %sztmp = $str.section(%szFrase,"",%idx,%idx) %szFraseColorata=%szFraseColorata$k($rand(15))%sztmp %idx++; } say %szFraseColorata ; halt; Adesso clicchiamo sul pulsante “applica”, e poi proviamo a scrivere in un qualsiasi canale, o query di un amico o anche a noi stessi( che forse è meglio =P). Come vedete le scritte sono tutte colorate (questo script non lo spiego, perché l’ho già fatto nel tutorial precedente). Per disabilitarlo e far tornare tutto come prima, facciamo tasto destro sul gestore e poi facciamo “Disabilita Gestore” (oppure elimina se volete toglierlo). Potremmo fare la stessa cosa se ad esempio volessimo scrivere tipo specchio, cioè al contrario, eccovi un piccolo codice da testare: %szFrase=$0 %idx=$($str.len(%szFrase)+1) while(%idx!=0) { %sztmp = $str.section(%szFrase,"",%idx,%idx) %szFraseColorata=%szFraseColorata%sztmp; %idx--; } say %szFraseColorata ; halt;
In pratica, come vedete ricompongo la frase al contrario, partendo dall’ultima lettera e risalendo, infatti %idx è uguale alla lunghezza della frase+1, quindi al primo giro %idx sarà uguale alla posizione dell’ultima lettera della frase, cosi con la funzione $str.section() prendo proprio quest’ultima, al secondo giro invece sarà uguale alla penultima e così via(infatti come vedete diminuisco con %idx--, al contrario dell’esempio precedente in cui aumentavo). Per capirlo un po’ meglio seguiamo passo passo cosa succede ad esempio con la frase “ciao Grifisx” %szFrase=”ciao Grifisx” %idx=$($str.len(%szFrase)+1) In questo modo assegno ad %idx il valore di 12 infatti $str.len(“ciao Grifisx”)+1) poiché la fase è composta da 12 lettere ma l’indice parte da 0 quindi dobbiamo fare il +1); while(%idx!=0) fino a quando %idx è diverso da 0 { %sztmp = $str.section(%szFrase,"",%idx,%idx) Al primo giro %sztmp sarà uguale a $str.section(“ciao Grifisx”,"",12,12) cioè a dire ad “x” %szFraseColorata=%szFraseColorata%sztmp; Al primo giro avremo che %szFraseColorata=”””x”; Diminuiamo l’indice; %idx--; Si ricomincia il giro, al secondo giro avremo che %sztmp sarà uguale a $str.section(“ciao Grifisx”,"",11,11) cioè a dire ad “s” e poi %szFraseColorata=”x””s” Al terzo giro $str.section(“ciao Grifisx”,"",10,10) cioè a dire ad is” e poi %szFraseColorata=”xs””i” e cosi via fino alla fine quando avremo %szFraseColorata=”xsifirg oaic” } say %szFraseColorata ; halt; Se non siete riusciti a capire bene fermatevi, e rileggete tutto con calma e fate delle prove. Dovrete avere i concetti visti fino ad ora ben chiari altrimenti il prossimo script non sarà cosi facile da capire. Creiamo l’alias lolwritecolor e mettiamo dentro questo codice: class(lolwritecolor,object) { rainbow() { event(OnTextInput,msgTextColor) { %szFrase=$0 %idx=1 while(%idx!=($str.len(%szFrase)+1)) { %sztmp = $str.section(%szFrase,"",%idx,%idx) %szFraseColorata=%szFraseColorata$k($rand(15))%sztmp %idx++; } say %szFraseColorata ; halt; } } mirror() { event(OnTextInput,msgTextColor) { %szFrase=$0 %idx=$($str.len(%szFrase)+1) while(%idx!=0) { %sztmp = $str.section(%szFrase,"",%idx,%idx) %szFraseColorata=%szFraseColorata%sztmp; %idx--; } say %szFraseColorata ; halt; } } disable() { event(OnTextInput,msgTextColor){} } } switch($0){ case("d") { %tmp=$new(lolwritecolor); %tmp->$disable(); break; } case("r") { %tmp=$new(lolwritecolor); %tmp->$rainbow(); break; } case("m") { %tmp=$new(lolwritecolor); %tmp->$mirror(); break; } default{ echo $k(5) $u() "Usage:" echo $k(5) \[ $k(10) $u()"Rainbow mode"$u() $k(5) \]$o - /lolwritecolor r echo $k(5) \[ $k(10) $u()"Mirror mode"$u() $k(5) \]$o - /lolwritecolor m echo $k(5) \[ $k(10) $u()"Disable script"$u() $k(5) \]$o - /lolwritecolor d break; } } Come possiamo vedere esaminando il nostro alias “lolwritecolor” per prima cosa creiamo una classe con 3 funzioni, le tre funzioni servono in pratica per “impiantare” (le prime 2) e rimuovere (l’ultima) l’evento, vediamolo da vicino senza il codice: class(lolwritecolor,object) { rainbow() { event(OnTextInput,msgTextColor) { CODICE } } mirror() { event(OnTextInput,msgTextColor) { CODICE } } disable() { event(OnTextInput,msgTextColor){} } } Come potete osservare le funzioni usano per l’installazione e la rimozione del codice il comando event(,){ ;} Come vi avevo detto è molto comodo perché cosi possiamo, sfruttando in modo incrociato alias ed eventi, disinstallare ed installare gli eventi con l’esecuzione di un semplice comando. Per scegliere, comunque, la funzione da eseguire, utilizziamo il costrutto switch\case che ci permetterà di esaminare il parametro che passiamo all’alias, infatti, ad esempio, quando passiamo “r” viene creato un nuovo oggetto tramite la nostra classe %tmp=$new(lolwritecolor); e viene chiamata poi la funzione $raibow()(%tmp->$rainbow();) che, come sappiamo, installerà nell’evento OnTextInput, il nostro codice per scrivere arcobaleno. Avremmo if(%ModoColore==”mirror”) { CODICE } if(%ModoColore==”rainbow”) { CODICE } La variabile %ModoColore poi avremmo potuto settarla tramite un semplice alias, ovviamente non sarebbe stato necessario il “disabled” poiché nel caso in cui la variabile non fosse stata settata (sarebbe bastato svuotarla), dai due casi sopra visti (mirror e rainbow) nell'evento le condizioni non si sarebbero verificate e quindi non sarebbe successo niente. Ma tutto questo significava sprecare controlli (perché mettendo l'evento il client dovrebbe comunque controllare il valore di quella variabile ad ogni input) e comunque sarebbe stato troppo elementare, ed a noi piacciono le cose complicate :D.
Qualche cenno sui Popup: Adesso però dobbiamo accennare alla possibilità di godere dell'utilità dei menù a tendina che appaiono quando clicchiamo col tasto destro su una finestra del KVIrc (o sulla lista dei nick o sui nick). Riguardando lo script di sopra ci accorgiamo che effettivamente è un po' scomodo dover digitare, ad esempio, “/lolwritecolor r” per scrivere arcobaleno e poi “/lolwritecolor d” per disabilitarlo. Sarebbe più comodo, senza dubbio, fare tasto destro sulla finestra del canale e avere un nostro menù a tendina dove poter scegliere se scrivere colorato, a specchio, o disabilitare lo script. Clicchiamo sul tasto con la p sulla barra di scripting in modo da aprire il popup editor; adesso andiamo a crearci quello che sarà il nostro menù, tasto destro in uno spazio vuoto sulla lista dei popup a sinistra e creiamo un nuovo pop-up e cambiamogli il nome dallo standard “senza nome” a “wColor” (o a quello che più preferite). Una volta fatto questo andiamo a creare tre elementi all'interno del pop-up nel modo seguente: dopo aver selezionato il nostro nuovo pop-up facciamo tasto destro nel riquadro bianco a destra della lista dei pop-up e creiamo “Nuovo elemento sotto”, evidenziamoli e chiamiamoli (Scrivendo nella riga bianca accanto all'etichetta “Testo:”) “Scrivi Arcobaleno”, “Scrivi rovesciato” e “Disabilita”, volendo possiamo scegliere anche 3 icone (per vedere tutte le icone disponibili fate :Strumenti-->Mostra tabella delle icone) e metterne il numero identificativo (o il percorso) nell'apposito spazio “Icona:”. Una volta fatto ciò andiamo a scrivere il codice che dovrà essere eseguito quando selezioneremo un elemento del nostro menù. Portiamoci nel box nero che appare quando selezioniamo uno degli elementi che abbiamo creato, ad esempio selezioniamo “Scrivi arcobaleno” e poi sotto, nel box nero che appare, mettiamo il codice che eseguirà l'alias per scrivere arcobaleno, cioè a dire: echo Modalita' Raibow attiva. lolwritecolor r Stessa cosa facciamo per “Scrivi rovesciato” e disabilita, ovviamente qui metteremo echo Modalita' Mirror attiva. lolwritecolor m e echo Write Color Disattivato. lolwritecolor d In pratica come vedete i pop-up funzionano come gli alias, possono ospitare qualsiasi codice, solo che il vantaggio è che il codice verrà eseguito nel momento in cui selezioneremo la voce del menù e non sarà necessario richiamarlo scrivendo manualmente /nomealias. Adesso però dobbiamo fare in modo che questo menù che abbiamo creato appaia quando facciamo tasto destro sulle finestre dei canali accanto alle altre voci del menù di default che ha KVIrc. Portiamoci sul popup channeltextview e alla fine, sotto tutti gli altri elementi, creiamo un “Nuovo Separatore” e dopo, sotto il separatore, creiamo un “Nuovo menù esterno” chiamiamolo “Write color” ( scrivendolo in “Testo:”) e associamogli il menù esterno che abbiamo creato, scrivendo, alla voce “Menù Esterno:”, il nome del menù che abbiamo creato poco prima (nel nostro esempio wColor), volendo possiamo associargli anche un id (scrivendo un numero casuale tipo 1006969001 alla voce “Id elemento:”) che ci servirà se un giorno volessimo distribuire il nostro script come se fosse un addon con la possibilità di installazione e rimozione dello stesso...ma questa e un'altra storia. Adesso portiamoci sulla finestra di un canale e facciamo tasto destro e... godiamoci il nostro nuovo menù a tendina =D. E anche questa avventura è finita ...adesso digitiamo pure.... /ECHO STOP
|