IDENTIFICATORI
$sock(nome/N)
Restituisce informazioni riguardo la connessione socket.
NOME è il nome attribuito al socket
N puo' essere un asterisco o un numero ed è opzionale,
se non viene specificato il suo valore è 1.
Proprietà:
name, ip, port, status, sent, rcvd, sq, rq, ls, lr, mark,
type, saddr, sport, to, wserr, wsmsg, bindip, bindport
.name è il nome della connessione socket
.sent e .rcvd restituiscono rispettivamente il numero di
byte inviati e ricevuti
.sq e .rq restituiscono i byte in coda nei buffer di invio
e ricezione
.ls e .lr restituiscono i secondi dalle ultime informazioni
di invio e ricezione
.mark è un'area di memoria utilizzabile dall'utente
di max 512 byte
.type restituisce il tipo di socket, TCP o UDP
.saddr e .sport restituiscono l'indirizzo e la porta dell'ultimo
pacchetto UDP ricevuto
.to restituisce i secondi in cui il socket è rimasto
aperto
.wserr restituisce il numero dell'ultimo errore winsock
del socket
.wsmsg restituisce l'ultimo messaggio d'errore winsock
$sockname
è il nome attribuito alla connessione
$sockerr
Un identificatore molto importante che gestisce eventuali
errori del socket.
Lo si usa generalmente all'inizio di ogni evento per controllare
se si sono verificati errori.
$sockbr
è il numero di byte letti dal comando /sockread.
$portfree(N)
Restituisce $true se la porta specificata non è in
uso, diversamente $false.
COMANDI ED EVENTI
/socklisten [nome] [port]
mette in ascolto la porta specificata.
on 1:socklisten:name:commands
Questo evento si attiva quando qualcuno cerca di connettersi
alla porta messa in ascolto.
Per accettare la connessione si usa il comando /sockaccept.
/sockaccept [nome]
accetta la connessione attuale alla propria porta in ascolto
e le assegna un nome per identificarla.
/sockrename [nome] [nuovonome]
assegna un nuovo nome alla connessione specificata.
/sockopen [nome] [address] [port]
prova ad aprire una connessione con l'indirizzo (ip o host)
e la porta specificata.
on 1:sockopen:name:commands
Questo evento si attiva all'apertura di un socket.
/sockclose [nome]
Chiude la connessione o LE connessioni specificate (si puo'
usare anche l'asterisco nel nome)
on 1:sockclose:name:commands
Si attiva quando la connessione viene chiusa da remoto e
non dal proprio pc.
INVIARE INFORMAZIONI
/sockwrite [-tnb] [nome] [numbytes] [text|%var|&binvar]
Serve a spedire informazioni al socket.
Specificando:
La flag -t Tutte le parole che iniziano con & vengono
spedite come testo e non come variabili binarie.
La flag -n Se non presente aggiunge un CRLF alla fine della
stringa da inviare.
La flag -b indica che si sta specificando il valore di numbytes,
ovvero il numero di byte da inviare.
on 1:sockwrite:nome:commands
L'evento sockwrite si attiva quando mIRC termina di inviare
tutte le informazioni messe in coda.
Il mIRC dispone di un buffer di uscita pari a 8192 byte,
se l'aggiunta delle informazione supera questo limite
si genera un messaggio di errore; è in questo caso
che torna utile l'indentificatore sock().sq in grado di
restituire il numero di byte presenti nella coda di invio.
LEGGERE INFORMAZIONI
on 1:sockread:nome:commands
Questo evento si attiva quando ci sono informazioni in attesa
di essere lette sulla connessione specificata.
Le informazioni vengono lette con il comando /sockread.
/sockread [-fn] [numbytes] [%var|&binvar]
Se si usa una variabile di tipo %var il CRLF non viene
considerato, quindi nel caso una stringa in ricezione sia
composta soltanto da CRLF la variabile avrà valore
$null.
Utilizzando una &binvar le informazioni lette corrispondo
al numero di byte specificati (numbytes). Se questo non
viene specificato il suo valore sarà 4096 byte.
Se viene specificata la flag -f con una variabile %var,
mIRC tenterà di inserire all'interno di questa qualsiasi
testo presente nel buffer di ricezione, anche se non termina
con un carattere CRLF.
La flag -n permette di leggere una linea che termina con
un CRLF all'interno di una &binvar.
Se la linea in arrivo non contiene un CRLF, non verrà
letto nessun byte, a meno che non venga usata anche la flag
-f, che ne forza la lettura.
Nota:
un singolo /sockread potrebbe non riuscure a leggere l'intero
buffer.
la lettura dovrebbe essere attiva finchè $sockbr
(byte letti) non è pari a zero.
MARCARE UN SOCKET
/sockmark [name] [text]
Specifica un attributo di massino 512 byte per la connessione
specificata; per leggere questo valore all'interno di uno
script si usa $sock().mark.
Socket UDP
Il protocollo UDP è diverso dal TCP: infatti per
mandare informazioni non serve che la connessione venga
prima accettata;
inoltre non ci sono certezze che tutti i dati vengono spediti
correttamente e completamente.
/sockudp [-bntk] [name] [port] [ipaddress] [port] [numbytes]
[text|%var|&binvar]
Le flag -n e -t sono le stesse spiegare precedentemente
per il protocollo TCP (/sockwrite).
La flag -b indica che si sta specificando il valore di
numbytes.
La flag -k forza il socket a stare aperto, quindi è
in grado di ricevere informazioni mandate alla porta in
ascolto.
Se -k non viene specificato, il socket viene aperto, le
informazioni inviate, e poi chiuso.
Se viene specificato un socket che non esiste, verrà
creato. Se esiste, viene usato per inviare le informazioni.
E' possibile specificare la porta locale che si vuole utilizzare.
Diversamente mIRC ne sceglie una a caso.
ipaddress e port specificano l'indirizzo di destinazione
al quale si vogliono inviare informazioni. Si possono utilizzare
soltanto indirizzi IP.
In caso di errore
se un /sockudp fallisce, in $sock().wserr viene settato
il valore dell'errore, avviato l'evento on sockwrite con
$sockerr settato.
on 1:udpread:name:commands
L'evento udpread viene avviato quando c'è un'informazione
in attesa di essere lette in un socket UDP.
Le informazioni si leggono con il comando /sockread.
ESEMPIO
Finita l'infarinata di teoria passiamo ora all'aspetto
pratico, nel quale andremo a creare un semplice bot composto
da due funzioni:
- Mantenere il limite del canale ad un valore di +5 rispetto
agli utenti presenti
- Ridarci lo stato di OPeratore ogni qual volta veniamo
DEOPpati :)
;--------- INIZIO CODICE ---------
;il seguente alias controlla se il sockets sockbot è
attivo oppure no, se lo è stampa nella pagina attiva
BOT GIA ATTIVO
;diversamente apre una connessione con il nome di sockbot
specificando come indirizzo il server al quale siamo connessi
;e come porta la porta alla quale siamo connessi. Naturalmente
mIRC deve essere connesso ad un server,
;diversamente lo script non funzionerà. %cbot è
la finestra attiva, ossia il canale dove far entrare il
bot.
alias sbot {
if ($sock(sockbot)) echo 4 -a BOT GIA ATTIVO
else { sockopen sockbot $server $port | %cbot = $active
}
}
;un semplice alias che cancella la variabile %nbot e chiude
la connessione sockbot
alias dbot unset %nbot | sockclose sockbot
;questo evento riguarda noi e non il bot. Praticamente
se siamo operatori del canale dove il bot entrerà
;gli daremo in automatico lo stato di operatore.
on @*:join:%cbot:if ($nick == %nbot) mode # +o $nick
;Quando il socket viene aperto... Controlliamo prima di
tutto che non ci siano errori.
;Se non ci sono errori settiamo la variabile %nbot con un
nick generato, subito dopo
;andremo a spedire le informazioni per la connessione ad
IRC secondo quanto richiesto
;dal protocollo IRC.
on *:SOCKOPEN:sockbot:{
if ($sockerr > 0) { unset %nbot | echo 4 -a Connessione
fallita | return }
else {
%nbot = sBot_ $+ $r(0,9) $+ $r(0,9) $+ $r(0,9) $+ $r(0,9)
$+ $r(0,9)
sockwrite -n sockbot NICK %nbot
sockwrite -n sockbot USER sBot $ip $server $fullname
sockwrite -n sockbot JOIN %cbot
}
}
;Dopo aver controllato la presenza di eventuali errori
e se questi non ce ne sono, andiamo a gestire
;i dati che arrivano sul nostro socket.
on *:SOCKREAD:sockbot:{
if ($sockerr > 0) { unset %nbot | echo 4 -a Connessione
fallita | return }
else {
if ($me ison %cbot) {
;Salviamo i dati nella variabile %data e li dividiamo
con il comando tokenize la var %dati ottenendo $1 $2 etc
sockread -f %data
tokenize 32 %data
;Se $1 è uguale a ping vuole dire che il server
al quale siamo connessi sta controllando se siamo collegati
o no
;Se non rispondiamo il server ci disconnetterà dopo
pochi minuti. Ma noi rispondiamo :)
if ($1 == PING) sockwrite -n sockbot PONG $2-
;Andiamo ora ad inserire le due funzioni del bot. $2 in
questo caso è di solito "l'azione", quindi
potrebbe essere
;un JOIN, un PART, un PRIVMSG, e via dicendo. Noi andiamo
ad analizzare proprio se l'azione è un qualcosa che
;ci interessa. Nel caso si tratti di un join o di un part
impostiamo il limite del canale come voluto. Mentre se
;notiamo un DEOP (MODE # -o nick) ed il nick deoppato siamo
noi, ci facciamo ridare dal bot lo stato di operatore.
if (%nbot isop %cbot) {
if ($2 isin JOINPART) sockwrite -n sockbot MODE %cbot +l
$calc($nick(%cbot,0) + 5)
elseif (($2 == MODE) && ($4 == -o) && ($5
== $me)) sockwrite -n sockbot MODE %cbot +o $me
}
}
}
}
;infine creiamo un popups nelle finestre dei canali per
velocizzare la connessione e la disconnessione del bot...
menu channel {
$iif($sock(sockbot),Disconnetti sockBot ( $+ %cbot $+ ),Connetti
sockBot):$iif($sock(sockbot,0),dbot,sbot)
}
;--------- FINE CODICE ----------
Ricordate che il sockbot è solo un esempio di un
tutorial e va preso come tale. :)
Guerrjero
www.tuttoirc.it
|