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
}
Come nel vero mIRC: dentro aliases.ini si scrive solo nome { ... }, MAI alias nome { ... } - quel prefisso serve (ed è richiesto) solo dentro Remote qui sotto, dove distingue un alias da un on evento.

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.

Oltre alla forma semplificata on start { ... } (nessun livello, niente condizione: Yoake non ha livelli d'accesso e i suoi eventi non filtrano per nick/canale, scattano sempre), è accettata anche la sintassi vera del vero mIRC on *:START:{ ... } (con livello ed eventuali condizioni extra, es. on *:TEXT:*:#canale:{ ... }) - comoda per incollare uno script mIRC già pronto senza doverlo tradurre a mano. Livello e condizione vengono letti e scartati (nessun matching reale su di essi), solo il nome evento conta.
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 noticesì
on whoisPrima di stampare il risultato di /whois - nostra aggiunta: il vero mIRC non ha un evento dedicato, usa invece i RAW event numerici del protocollo (301/311/312/317/318/319...), uno per ogni pezzo di dato. Qui il nostro /whois restituisce già tutto insieme, quindi un solo evento con haltdef ha più senso che simularne 5-6 finti.la persona cercata-$1 = nome, $2 = username, $3 = telefono, $4 = on/off/vuoto (stato online, vuoto se sconosciuto), $5 = bio, $6 = URL foto profilo, $7 = data spunte blu lette (entrambe le reti, vuoto se non lo sappiamo), $8 = ultimo accesso (data precisa, o su Telegram anche una fascia vaga tipo "di recente"/"nell'ultima settimana"/"nell'ultimo mese" quando Telegram non dà un orario esatto - vuoto se non lo sappiamo o se è online adesso)sì - sopprime le righe di default, lo script le ridisegna come preferisce
on callUna chiamata (audio o video) sta arrivando - nostra aggiunta: solo segnalazione, GramJS/Baileys non implementano affatto l'audio/video vero, non è possibile "rispondere" per davvero. Vedi /rejectcall in Comandi per rifiutarla (eventualmente con un messaggio a chi ha chiamato).chi sta chiamando-$1 = video o audiosì - sopprime la riga "Chiamata in arrivo" di default
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 separatesì - /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 runNostra aggiunta (il vero /run non restituisce mai l'output - vedi Comandi, sezione Programmi esterni). Un programma avviato con /run è terminato.--$1- = l'output (diviso in parole) - $runoutput per il testo intero, a capo compresino
on reactionNostra aggiunta (il vero mIRC non ha reazioni - vedi /react in Comandi). Qualcuno reagisce con un'emoji a un tuo messaggio o a una tua Storia/Stato, su Telegram o WhatsApp. Vale solo per reazioni nuove/cambiate da quando Yoake è connesso, non per reazioni già esistenti su messaggi vecchi.chi ha reagitoil canale/gruppo (vuoto in privato o per una reazione a una Storia/Stato)$1 = l'emoji, $2 = id del messaggio (vuoto per una reazione a una Storia/Stato)sì - sopprime la riga di default, lo script la ridisegna come preferisce
on join/on part/on kick/on topic/ on op/on deop/on invite funzionano su Telegram e WhatsApp (on invite non ha senso su IRC, che non ha link d'invito). 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. Su IRC, on join/on part/on kick/ on topic/on op/on deop funzionano senza questo limite (il server manda sempre questi eventi a tutti quelli nel canale, non solo agli admin) - vedi IRC.
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
}

Whois personalizzato - sostituisce le righe di default con un formato tutto tuo:

on whois {
  haltdef
  echo -a ── $nick ──
  echo -a Nome: $1
  if ($2 != $null) echo -a Username: $2
  if ($4 == on) echo -a Stato: 🟢 online
  elseif ($4 == off) echo -a Stato: ⚫ offline
}

Blocca tutte le chiamate - le rifiuta subito e avvisa chi ha chiamato invece di mostrare "Chiamata in arrivo":

on call {
  haltdef
  rejectcall Non rispondo alle chiamate, scrivimi pure qui!
}

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.