Questo metodo può tornarvi utile se, per esempio,
un vostro amico viene bannato ingiustamente da un
canale e voi volete farlo rientrare
Moralmente
non e proprio corretto, ma spesso non lo e
nemmeno labuso che gli operatori fanno dalla
propria @.
Tutto il procedimento è realizzato usando le
funzioni sockets che il mIRC ci mette a disposizione,
si consiglia di leggere prima la guida sui sockets
presente sul sito.
;---- INIZIO CODICE ----
alias av_bnc socklisten $iif($1,-d $1,) bouncer 6667
| window @debug
on *:socklisten:bouncer:{
sockaccept bnc
sockmark bnc INDEX1
}
on *:sockread:bnc:{
if ($sockerr > 0) { echo -a Connessione fallita
| return }
var %tempbnc
sockread %tempbnc
if (%tempbnc) {
echo @debug CLIENT: %tempbnc
if ($sock($sockname).mark == INDEX1) {
%stringa_bnc_nick = %tempbnc
sockmark bnc INDEX2
halt
}
if ($sock($sockname).mark == INDEX2) {
%stringa_bnc_user = %tempbnc
sockmark bnc CON
sockwrite -n bnc In attesa di connessione: $+ $crlf
$+ server: $server $+ $crlf $+ porta: $port
sockmark $sockname CON
sockopen server_bnc $server $port
halt
}
}
}
on *:sockopen:server_bnc:{
sockwrite -n $sockname %stringa_bnc_nick
sockwrite -n $sockname %stringa_bnc_user
}
on *:sockread:server_bnc:{
if ($sockerr > 0) { echo -a Connessione fallita
| return }
var %rcv
sockread %rcv
if (%rcv) echo @debug SERVER: %rcv
sockwrite -n bnc %rcv
}
;----- FINE CODICE -----
Spegiamo passo passo i vari blocchi di codice che
ci interessano:
Lalias iniziale, chiamato av_bnc, mette in
ascolto la porta locale 6667 e crea una finestra chiamata
@debug; questa finestra avrà il compito di
monitorare tutto quello che accade tra il server e
lutente che si collega. La sintassi per avviare
il bouncer è: /av_bnc oppure /av_bnc 192.168.1.10
se si vuole bindare un ip specifico.
on *:socklisten:bouncer:{
sockaccept bnc
sockmark bnc INDEX1
}
Quando un utente tenta di connettersi sulla porta
6667 del vostro ip, lo script accetta in automatico
la connessione e gli attribuisce il nome BNC, successivamente
marca la connessione appena creata con una etichetta
chiamata INDEX1.
Sorvoliamo la parte iniziale dellevento sockread,
spiegato negli altri tutorial, ed andiamo a analizzare
la seguente parte:
if (%tempbnc) {
echo @debug CLIENT: %tempbnc
if ($sock($sockname).mark == INDEX1) {
%stringa_bnc_nick = %tempbnc
sockmark bnc INDEX2
halt
}
if ($sock($sockname).mark == INDEX2) {
%stringa_bnc_user = %tempbnc
sockmark bnc CON
sockwrite -n bnc In attesa di connessione: $+ $crlf
$+ server: $server $+ $crlf $+ porta: $port
sockmark $sockname CON
sockopen server_bnc $server $port
halt
}
Quando un client IRC si collega ad un server irc,
gli spedisce due stringhe essenziali per la connessione,
ossia NICK ed USER (e i rispettivi parametri).
Noi andremo ad estirpare queste due sequenze di dati
grazie al parametro mark.
In precedenza, come ricorderete, abbiamo marcato la
connessione con il valore INDEX1.
Adesso useremo questo valore per identificare la prima
ricezione di dati che andremo a salvare nella variabile
%stringa_bnc_nick, una volta salvato marchiamo la
connessione con il valore di INDEX2, ed aspettiamo
il secondo invio di dati da parte del client, che
salveremo nella variabile %stringa_bnc_user.
Terminato anche questo processo marchiamo la connessione
con il valore CON.
A questo punto lo script apre una connessione con
il server a cui siamo collegati
Nello stesso evento troviamo il codice:
if ($sock($sockname).mark == CON) {
sockwrite -n server_bnc %tempbnc
}
Da questo momento in poi ogni dato ricevuto viene
inviato direttamente alla connessione appena creata
e chiamata server_bnc.
Come vedete abbiamo usato il mark per dividere i diversi
stati della connessione a nostro piacimento, la stessa
strategia può tornate utile in connessioni,
per esempio, di tipo login o registrazione,
ossia in tutti quei casi dove e necessario monitorare
il susseguirsi di informazioni ricevute o inviate.
Nellultima parte troviamo:
on *:sockread:server_bnc:{
if ($sockerr > 0) { echo -a Connessione fallita
| return }
var %rcv
sockread %rcv
if (%rcv) echo @debug SERVER: %rcv
sockwrite -n bnc %rcv
}
La spiegazione di questultimo passo è
superflua (tutorial sockets per maggiorni info), lunica
cosa da notare e come la connessione server_bnc,
ossia quella collegata col server, non faccia altro
che ricevere dati, salvarli nella variabile e poi
spedirli alla connessione bnc, ossia quella creata
con il nostro ipotetico amico.
Il codice e' testato e funzionante, ma e' stato creato
per essere parte integrante di un tutorial e non di
un addon o simili.
Per chi volesse utilizzarlo per fini diversi da quello
per cui e' nato, si consiglia di aggiungere alcune
opzioni importanti, come per esempio la possibilita'
di gestire piu' utenti, proteggere la connessione
con password e/o gestire la connessione con comandi
rapidi di chiusura e apertura.
Guerrjero
www.tuttoirc.it
|