Scripting

Yoake ha un motore di scripting che segue da vicino la sintassi del vero mIRC, applicata alle chat di Telegram e WhatsApp. Si apre da Tools > Aliases.../Popups.../Remote... (Editor Script), con quattro schede: Aliases, Remote (eventi), Popups, Variables.

Tutto è salvato come file .ini veri dentro userData/scripts/ (aliases.ini, remote.ini, popups.ini, variables.ini) - modificabili anche con un editor di testo esterno; il pulsante "Load..." nell'editor importa un file .ini esterno nella scheda aperta.

Aliases

Comandi personalizzati, richiamabili come /nome:

saluta {
  say Ciao $1
}

Remote (eventi)

Ogni evento gira PRIMA dell'azione predefinita corrispondente (come nel vero mIRC): può osservarla e, dove indicato, sopprimerla con haltdef (o interromperla del tutto con halt, solo dentro "on message").

Riga visibile in chat: come nel vero mIRC, join/part/kick/ op/deop/topic/nick mostrano sempre una riga di sistema in chat (es. --> Mario has joined, * Mario is now an admin) - indipendentemente da qualunque script tu abbia scritto, esattamente come mIRC lo fa di default. Lo script gira comunque, in aggiunta, non al posto di questa riga.

EventoQuando scatta$nick$chan$1-$9 / argshaltdef
on startUna volta sola, all'avvio di Yoake.You--no
on loadQuando salvi/chiudi l'Editor Script (gli script vengono ricompilati) - non all'avvio, a differenza del vero mIRC dove "on load" scatta quando un file .mrc viene caricato.You--no
on connectConnessione riuscita a una rete (login normale o QR).il tuo nome--no
on connectfailTentativo di connessione fallito.You-il messaggio d'errore, come parole separateno
on disconnectDisconnesso da una rete (manuale con /disconnect, o forzato es. dispositivo disassociato dal telefono).You--no
on messageUn messaggio in arrivo (mai per i tuoi stessi messaggi inviati).chi ha scrittoil canale/gruppo, vuoto in privatotesto del messaggiosì (non mostra il messaggio) - halt fa lo stesso e interrompe anche lo script
on noticeNotifica sintetica (screenshot, pin, chiamata persa...) - vedi Notifiche ed eventi di sistema per l'elenco completo dei $noticetype.chi l'ha causatadove (se nota)testo della notice
on joinQualcuno entra in un gruppo.chi è entratoil gruppo-no
on partQualcuno esce da un gruppo.chi è uscitoil gruppo-no
on kickQualcuno viene rimosso da un gruppo.chi ha rimossoil gruppo$1 = chi è stato rimossono
on opQualcuno diventa admin di un gruppo (con /op, o perché lo fa un altro admin).chi è diventato adminil gruppo-no
on deopQualcuno perde lo stato admin (con /deop, o perché lo fa un altro admin).chi ha perso l'adminil gruppo-no
on nickUn contatto/utente cambia nome - scatta nello Status e in ogni finestra aperta dove è rilevante (chat privata con lui, o gruppo di cui fa parte).il nome PRIMA del cambio-$1 = il nome nuovono
on notifyUn contatto nella tua lista Notify (vedi Rubrica) si connette. Scatta nello Status della rete.il nome del contatto--no
on unotifyUn contatto nella tua lista Notify si disconnette.il nome del contatto--no
on inviteDue casi distinti, entrambi coperti: (1) ricevi un messaggio con un vero link d'invito (t.me/joinchat, t.me/+..., chat.whatsapp.com/...) - il caso più fedele a IRC, la notifica arriva PRIMA che tu entri; (2) sei stato aggiunto direttamente a un gruppo nuovo senza nessun link (un admin che ha il tuo contatto può farlo su entrambe le reti) - qui lo scopri "a cose fatte", non c'è modo di saperlo prima.chi ha mandato il link (caso 1) o vuoto (caso 2)chi ha mandato il messaggio (caso 1) o il gruppo (caso 2)$1 = il link (solo caso 1)no
on topicL'argomento/nome di un gruppo cambia.-il gruppo$1 = il vecchio titolono
on openSi apre una finestra qualsiasi (canale, gruppo, query, status, o una @finestra creata con /window).Youil titolo della finestra (per una @finestra: il suo nome, es. @log)-no
on closeSi chiude una finestra qualsiasi (idem, incluse le @finestre).Youil titolo della finestra-no
on queryopenSi apre nello specifico una chat privata (query).You--no
on querycloseSi chiude una chat privata (query).You--no
on inputOgni riga inviata in qualsiasi finestra (comando o messaggio), prima ancora di processarla.You-il testo digitato, come parole separate - /halt//haltdef qui annullano davvero l'invio predefinito (comando o messaggio), come nel vero mIRC: lo script deve pensarci lui a mandare qualcosa con say/msg se vuole comunque far uscire un testo modificato
on filesentUn invio con /dcc send è concluso.il destinatario-$1 = nome del fileno
on filercvdUn media/documento in arrivo ha finito di scaricarsi (foto/video/audio/documento cliccato, o caricato automaticamente in modalità HTML).--$1 = nome del file (vuoto per foto/video/audio)no
on videoendNostra aggiunta (il vero mIRC non ha mai avuto video) - un video aperto nel visualizzatore (doppio click, o /playmedia) finisce di riprodursi da solo. La finestra non si chiude da sola: se lo script vuole, decide lui con /close $wid.You--no
on sockopenUn sockopen si è connesso con successo - vedi Comandi (sezione Socket).---no
on socklistenUna connessione in arrivo su un socklisten - accettala con sockaccept, altrimenti va persa.---no
on sockreadSono arrivati dati su un socket aperto - usa sockread per leggerli, altrimenti restano in coda (persi al prossimo dato in arrivo se non svuotati).---no
on sockcloseUn socket si è chiuso (dall'altra parte, o perché la connessione è fallita/caduta) - $sockerr è valorizzato se c'è stato un errore.---no
on join/on part/on kick/on topic/ on op/on deop/on invite funzionano su entrambe le reti. Su Telegram c'è però un limite della piattaforma stessa (non di Yoake): il protocollo manda questi aggiornamenti solo agli amministratori del canale/supergruppo, o a tutti i membri nei gruppi piccoli - se non li vedi arrivare in un gruppo Telegram grande di cui non sei admin, è perché Telegram stesso non te li sta mandando.
on op {
  echo $nick è diventato admin di $chan
}

on nick {
  echo $nick ora si chiama $1
}

on invite {
  echo ⚠️ $nick ti ha mandato un link d'invito: $1
}
on message {
  echo $nick ha scritto in $chan
}

on notice {
  if ($noticetype == missedcall) haltdef
}

Playlist video automatica - scorre un canale/gruppo (es. le puntate di una serie) cercando i video con $msg() (vedi Identificatori) e passa al successivo da solo con on videoend:

alias playlist {
  set %pl.chan $1
  set %pl.idx 0
  playlist.next
}
alias playlist.next {
  inc %pl.idx
  while (%pl.idx <= $msg(%pl.chan,0)) && ($msg(%pl.chan,%pl.idx).type != video) {
    inc %pl.idx
  }
  if (%pl.idx > $msg(%pl.chan,0)) {
    echo -a Playlist finita.
    return
  }
  playmedia %pl.chan $msg(%pl.chan,%pl.idx).id
}
on videoend {
  playlist.next
}

Poi basta /playlist #NomeCanale (o l'id finestra) per farla partire. Nota: $msg() vede solo i messaggi già caricati in quella finestra (apri il canale e scorri su per caricarne di più, se necessario).

Come nel vero mIRC, dentro Remote puoi scrivere anche alias nome { ... } - funziona uguale a scriverlo nella scheda Aliases, mIRC non separa gli alias per file.

Variables

Nella scheda Variables, una dichiarazione per riga: %nome valore. Usabili come %nome dentro aliases/eventi/popup, ovunque nel testo di uno script.

%saluto Ciao dal mio alias!

saluta {
  say %saluto $1
}
Persistenza: come nel vero mIRC, le variabili globali sono permanenti - restano tra un riavvio e l'altro, dentro variables.ini. Questo vale sia per quelle dichiarate a mano nella scheda Variables sia per quelle create/modificate a runtime con set/inc/dec durante l'esecuzione di uno script: vengono scritte su disco automaticamente (con un breve ritardo, per non scrivere ad ogni singola iterazione di un ciclo - lo stesso principio del vero mIRC, che salva periodicamente invece che ad ogni /set).

Esempio - un contatore che sopravvive ai riavvii, senza bisogno di dichiararlo a mano nella scheda Variables:

on message {
  set %contatore $calc(%contatore + 1)
  echo Messaggi ricevuti finora: %contatore
}

Popups

Menu contestuali (tasto destro) - stessa sintassi del vero mIRC, sezioni separate per ogni contesto:

SezioneDove compare
[status]Tasto destro nella finestra Status.
[channel]Tasto destro al centro della finestra di un gruppo/canale.
[query]Tasto destro al centro di una chat privata.
[nicklist]Tasto destro su un nick nella lista utenti.
[menubar]Popup collegabile alla barra dei menu.

Nella scheda Popups, il menu a tendina "View" (o il menu View in alto nell'editor) sceglie quale sezione stai modificando - ognuna ha il suo testo, come nel vero editor di mIRC. Il menu "Popup" in alto mostra un'anteprima dal vivo di come verrà disegnato il menu mentre lo scrivi.

Sintassi: Etichetta:comando una voce per riga, - per un separatore, sottomenu annidati con un punto in più per livello. Nei popup [nicklist], $1 e $nick sono il nick su cui hai fatto click destro:

Saluta tutti:say Ciao a tutti!
-
Altri comandi
.Chi sono:whois $1
.Espelli:kick $1
Vedi Comandi per l'elenco completo dei comandi disponibili dentro uno script, e Identificatori e funzioni per $nick/$chan/$1-$9/funzioni.