Funzionamento inatteso delle Funzioni Avanzate

Difficoltà con lo script ? Qui puoi esporre i tuoi problemi.
BuDuS
Amministratore
Messaggi: 364
Iscritto il: 19/07/2009, 14:15
Contatta:

Funzionamento inatteso delle Funzioni Avanzate

Messaggioda BuDuS » 03/02/2010, 22:01

Il titolo completo di questo post penso debba essere:

Funzionamento inatteso delle Funzioni Avanzate usate come Comando di una Sentinella
Dunque, partiamo dal principio.
Creando una sentinella come questa:

Codice: Seleziona tutto

/event add 0 jchannel '#miocanale'='$channel' /budus cmd /SAY Utenti in $channel = stat( ,$channel )

Tradotta significa: aggiungi (add) una sentinella che ogni volta (0) che entra nel canale (evento jchannel) di nome "#miocanale" (la variabilie "$channel" viene risolta con il nome del canale nel quale avviene l'evento e quindi effettuato un concronto), esegui il comando "/budus cmd", il quale, ha lo scopo di risolvere variabili di sistema/utente e funzioni avanzate, nel nostro caso la funzione "stat()" che, a sua volta, viene invocata per ritornare il numero di utenti presenti in "$channel" (cioè "#miocanale", dato che non potrà essere altrimenti risolta la variabile "$channel")

e facendo entrare un utente (tipo un clone) in "#miocanale" (chiaramente il nome del canale può essere uno qualsiasi), si ottiene un risultato inatteso: non viene riportato il numero di utenti comprensivo di quello appena entrato, ma il numero "prima che entrasse"

In altri termini: se in "#miocanale" ci sono 10 utenti, entra pluto, la sentinella reagisce, il risultato non è 11 ma ancora 10.

Questa "anomalia" è dovuta al fatto che l'evento viene generato quando qualcuno entra nel canale, ma X-Chat ancora non ha recepito l'evento e ritorna il numero di utenti attualmente presenti nel canale, quindi escludendo quello che sta entrando.

Il discorso, in maniera opposta, si manifesta anche quando un utente esce: viene fornito il numero di quando l'utente era ancora presente.

Non si tratta di un BUG, ma semplicemente un modo di funzionare "meno intuitivo" che, per ragioni tecniche, non è (facilmente) modificabile e che comunque ha un suo perché.

Quello che a noi interessa è "risolvere in qualche modo il problema".
A livello di funzioni avanzate, nel nostro caso "stat()" (ma anche con "exec()" c'è il medesimo problema e anche in altre situazioni, come ad esempio il salvataggio su disco del Database con comandi come "/budus dbsave"), possiamo risolvere in 2 modi:
  • Temporizzando il comando
  • Facendo un'operazione matematica di correzione (aggiungendo o sottraendo un'unità, a seconda dei casi)

Temporizzare un comando
E' semplice, basta usare o il comando di X-Chat "/TIMER" o quello avanzato di BuDuScRiPt "/budus InsertCommandInQueueTimed()".
Ad esempio il comando sopra diventa:

Codice: Seleziona tutto

/event add 0 jchannel '#miocanale'='$channel' /TIMER 1 budus cmd /SAY Utenti in $channel = stat( ,$channel )


Eseguire un'operazione aritmetica
Nel caso del JOIN dovremo sommare un utente - quello che sta entrando - a quelli attualmente presenti, mentre con PART, QUIT e KICK l'esatto contrario.
Ad esempio il comando sopra diventa:

Codice: Seleziona tutto

/event add 0 jchannel '#miocanale'='$channel' /budus cmd /SAY Utenti in $channel = math( stat( ,$channel )+1 )


***
Questo problema è stato riscontrato utilizzando il BOT, dato che lo script budus_peak.sh (che serve per registrare il picco di un canale) fa uso proprio delle suddette funzionalità.
Per sistemare lo script (relativo al BOT versione 11.3, le versioni successive già sarà sistemato) è necessario modificare il file addpeak.mcr e cambiare il comando:

Codice: Seleziona tutto

/event add 0 jchannel '$mhostname:$1'='$hostname:$channel' /budus cmd /budus pipe_script $HOME/$mxchat_path/buduscript/budus_peak.sh \($hostname\) \($server\) \($channel\) \(stat( $server,$channel)\)

in:

Codice: Seleziona tutto

/event add 0 jchannel '$mhostname:$1'='$hostname:$channel' /budus cmd /budus pipe_script $HOME/$mxchat_path/buduscript/budus_peak.sh \($hostname\) \($server\) \($channel\) \(math( stat( $server,$channel )+1 )\)


Intervento analogo va effettuato sul file addservices_private.mcr, dove la riga:

Codice: Seleziona tutto

/event add 0 spcl_text_$1 !peak='$data' /budus cmd /budus pipe_script $HOME/$mxchat_path/buduscript/budus_query.sh \(stat( $server,$channel )\) \($ru\) \($server\) \($channel\) \($hostname\) \($server\) \($data\) \($database\)

diventa:

Codice: Seleziona tutto

/event add 0 spcl_text_$1 !peak='$data' /budus cmd /budus pipe_script $HOME/$mxchat_path/buduscript/budus_query.sh \(math( stat( $server,$channel )+1 )\) \($ru\) \($server\) \($channel\) \($hostname\) \($server\) \($data\) \($database\)

Torna a “Supporto BuDuScRiPt”

Chi c’è in linea

Visitano il forum: Nessuno e 0 ospiti