Enigma Bot — File Browser
EnigmaBotv1.4 / EnigmaBotv1.4 / Enigma versione1_4 / Addons / meteo.mrc
meteo.mrc — 7.61 KB — Download this file
alias html { var %x | var %i | %i = $regsub($1-,/(^[^<]*>|<[^>]*>|<[^>]*$)/g,$null,%x) | %x = $remove(%x, ) | return %x }
;È un alias che ci permette di filtrare testi/parole/url sulle righe html. Si usa nella forma $html(riga)
on *:text:!meteo *:%canalemeteo: {
set %chan.meteo $chan
meteo $2-
.timerchiudisock 1 15 /SOCKCLOSE meteo
}
alias meteo {
if ($sock(meteo)) || ($sock(meteo2)) { /msg %chan.meteo —]0,12Meteo[— È gia in corso una ricerca, aspettare i risultati. | halt }
;Controlla se è ancora aperta la connessione socks del meteo
unset %meteo*
set %meteo.ticks $ticks
set %meteo.find $replace($1-,$chr(32),$chr(43))
;Abbiamo settato le variabili per la durata della ricerca (ticks) e per il comune da trovare, se eventualmente il comune ha più parole trasformiamo gli spazi in un +
sockopen meteo meteo.ansa.it 80
;Apriamo la connessione al sito http://meteo.ansa.it tramite la porta 80
}
on 1:SOCKOPEN:meteo: {
if ($sockerr > 0) return
sockwrite -n meteo $eval(GET http://meteo.ansa.it/ricerca.asp?cerca=,0) $+ %meteo.find
;Mandiamo ulteriori informazioni al sito: il comando ricerca e da trovare il comune desiderato
}
on 1:SOCKCLOSE:meteo: { return }
on 1:SOCKREAD:meteo: {
if ($sockerr > 0) return
:meteo
sockread %meteo.temp
if ($sockbr == 0) return
if (Nessun Comune isin %meteo.temp) {
/msg %chan.meteo —]0,12Meteo[— $upper($left($replace(%meteo.find,+,$chr(32)),1)) $+ $right($replace(%meteo.find,+,$chr(32)),$calc($len($replace(%meteo.find,+,$c hr(32))) -1)) $+ : comune inesistente. [ $+ $calc(($ticks - %meteo.ticks) / 1000) $+ secs.]
unset %meteo* | sockclose meteo | return
;Se il comune è inesistente lo script finisce e si ferma qua
}
if (Location: isin %meteo.temp) {
set %meteo.url $remove(%meteo.temp,$gettok(%meteo.temp,1,32),$chr(32))
sockopen meteo2 meteo.ansa.it 80 | sockclose meteo | return
;Il sito usa un relink per le pagine riguardanti i comuni: ogni regione/comune ha un numero
;e per trarre le informazioni sul meteo bisogna prima sapere il numero identificativo del comune
;e della regione.
}
if ($replace(%meteo.find,+,$chr(32)) isin %meteo.temp) && ($gettok(%meteo.temp,1-3,32) == <td HEIGHT="20" BGCOLOR="#F0F1F2"><a) {
set %meteo.url $remove(%meteo.temp,$gettok(%meteo.temp,1-3,32),$gettok(%meteo.temp,5-,32),H REF=",amp;,&Tur=",$chr(32))
sockopen meteo2 meteo.ansa.it 80 | sockclose meteo | return
;Alcuni comuni hanno un nome o una parte in comune, e quindi il sito ci mostra la lista di tutti i
;comuni che possono corrispondere alla ricerca.
;Perciò noi prendiamo il comune in cima alla lista,
;identifichiamo il numero corrispondente al nome e alla regione e apriamo la "vera" ricerca sul
;comune
}
goto meteo
;Ritorniamo al :meteo finchè non abbiamo avuto le informazioni necessarie
}
on 1:SOCKOPEN:meteo2: {
if ($sockerr > 0) return
sockwrite -n meteo2 $eval(GET http://meteo.ansa.it/Regione.asp?,0) $+ $remove(%meteo.url,Regione.asp?)
;Mandiamo ulteriori informazioni al sito, con il numero della regione e del comune
}
on 1:SOCKCLOSE:meteo2: { return }
on 1:SOCKREAD:meteo2: {
if ($sockerr > 0) return
:meteo2
sockread %meteo.temp
if ($sockbr == 0) return
if (<td colspan="4"><font color="#FFFFFF"><small><small> isin %meteo.temp) && (</small></small></font></td><td align="right"><img src="images/smusso.gif" WIDTH="5" HEIGHT="15"> isin %meteo.temp) {
set %meteo.regione $remove($html(%meteo.temp), )
goto meteo2
;Settiamo nella variabile %meteo.regione il nome della regione del comune
}
if ($replace(%meteo.find,+,$chr(32)) isin %meteo.temp) && (<td HEIGHT="20" isin %meteo.temp) && (</a></td> isin %meteo.temp) && (!%meteo.citta) {
set %meteo.citta $html(%meteo.temp)
if ($replace(%meteo.find,+,$chr(32)) !isin %meteo.citta) { unset %meteo.citta | goto meteo2 }
else { set %meteo.comune on | goto meteo2 }
;In questo caso controlliamo che il comune selezionato può corrispondere al nome della città che
;abbiamo trovato.
;Se sì, attiviamo la variabile %meteo.comune per poi attivare tutti i parametri seguenti
;(temperatura, tempo etc..)
;Se no, cancelliamo la variabile della città e riproviamo un'altra volta con un altro comune della
;stessa regione
;(può succedere che la stringa html contiene un gruppo di lettere che però non appartiene al
;nome della città ma però combacia, per questo bisogna fare questo controllo)
}
if (%meteo.comune == on) && ($gettok(%meteo.temp,1-2,32) == <div ALIGN="right"><img) {
if (%meteo.tempo == $null) {
set %meteo.tempo $remove(%meteo.temp,$gettok(%meteo.temp,1-3,32),ALT=","></div>)
set %meteo.comune off
}
goto meteo2
;Abbiamo settato la variabile riguardante il tempo e disattivato la variabile %meteo.comune per
;non rischiare che vengono registrati parametri di altri comuni
}
if (%meteo.comune == on) && (</div> isin %meteo.temp) {
inc %meteo.temperatura 1
if (%meteo.temperatura == 1) { set %meteo.temper $html(%meteo.temp) | goto meteo2 }
elseif (%meteo.temperatura > 1) && (%meteo.temperatura < 3) {
set %meteo.temper %meteo.temper $html(%meteo.temp)
set %meteo.temper , la temperatura e' intorno a $+ $round($calc( ( $gettok(%meteo.temper,1,32) + $gettok(%meteo.temper,2,32) ) /2 ),1) $+ ° - min $gettok(%meteo.temper,1,32) $+ ° max $gettok(%meteo.temper,2,32) $+ °. | goto meteo2
;Tramite la variabile %meteo.temperatura abbiamo potuto controllare e dividere le due
}
}
if (altitudine isin %meteo.temp) {
set %meteo.alt $gettok($gettok(%meteo.temp,$calc($numtok(%meteo.temp,32) -1) $+ -,32),1,32)
goto meteo2
}
;Abbiamo settato la variabile riguardante l'altitudine del comune rispetto al livello del mare
if (vento isin %meteo.temp) && (%meteo.vento != on) { set %meteo.vento on | goto meteo2 }
;Abbiamo attivato la variabile %meteo.vento così che al prossimo ciclo scattino i parametri
;seguenti
if (%meteo.vento == on) && (<br><br> isin %meteo.temp) {
set %meteo.spira $remove(%meteo.temp,<br><br>) $+ .
set %meteo.tipovento on
goto meteo2
;Abbiamo settato da dove "tira" il vento, e ora abbiamo attivato anche la variabile
;%meteo.tipovento
;al prossimo ciclo scatta il parametro seguente
;Dobbiamo fare questo procedimento perché la riga html dopo di questa è senza codici e non
;possiamo verificare manualmente che cosa contiene
}
if (%meteo.tipovento == on) {
/msg %chan.meteo —]0,12Meteo[— %meteo.regione $+ : $iif($mid(%meteo.citta,1,1) isin aeiou,Ad,A) %meteo.citta $iif(temporale isin %meteo.tempo,c'è il,il tempo è) $lower(%meteo.tempo) $+ %meteo.temper Altitudine media: %meteo.alt $+ m s.l.m. $iif($gettok(%meteo.temp,1,32) = vento,Un,Una) %meteo.temp spira %meteo.spira [ $+ $calc(($ticks - %meteo.ticks) / 1000) $+ secs.]
unset %meteo* | sockclose meteo2 | return
;Finito
}
if (</html> isin %meteo.temp) {
/msg %chan.meteo —]0,12Meteo[— %meteo.regione $+ : $iif($mid(%meteo.citta,1,1) isin aeiou,Ad,A) %meteo.citta $iif(temporale isin %meteo.tempo,c'è il,il tempo è) $lower(%meteo.tempo) $+ %meteo.temper Altitudine media: %meteo.alt $+ m s.l.m. [ $+ $calc(($ticks - %meteo.ticks) / 1000) $+ secs]
unset %meteo* | sockclose meteo2 | return
;Se il sito non ha il dato del vento riguardante il comune, aspettiamo l'ultimo carattere html
;(</html>)
;Inseriamo anche variabili che potrebbero essere vuote (come la temperatura) per mancanza
;del dato da parte del sito
}
goto meteo2
}
Per fare la ricerca basta fare: /meteo <comune>