![]() |
![]() |
Eventos CTCP
EVENTOS CTCP
Introducción.-
Las siglas
CTCP significan “Client to Client
Protocol” o “Protocolo de
cliente a cliente” en español, básicamente se trata de un tipo
especial de comunicación entre los usuarios de un servidor de IRC que será
usada para provocar que los usuarios de el script que estemos haciendo ejecuten
ciertas acciones automáticamente al recibir cierta información por CTCP.
Comandos CTCP
Para
mandar información a otro usuario mediante CTCP
lo haremos de la siguiente forma:
/ctcp <nick>
<mensaje>
donde
<nick> es el nick de la otra persona y <mensaje> es cualquiera de
los mensajes que queramos enviar por ese protocolo. Lógicamente no nos
pondremos a hablar con un usuario mediante CTCP’s
ya que sería absurdo estando los dos conectados al IRC. Los CTCP’s
tienen otra utilidad… que es la de que el otro usuario reaccione
automáticamente de una cierta manera al enviarle nosotros ese CTCP. Por ejemplo, existe uno que tiene
el mIRC ya implementado: el famoso CTCP
PING y consiste en enviar un ping al otro usuario:
/ctcp <nick> ping
El
programa del otro usuario responderá automáticamente al CTCP PING y lo hará
devolviendo una información, que al llegarnos de nuevo a nosotros el mIRC nos muestra en la pantalla. En ese
caso en la pantalla se muestra el “Lag” o retardo de línea que hay
entre nosotros y la persona a la que enviamos el ping. Se puede probar con
otros CTCP implementados ya en el mIRC, el funcionamiento de todos es
similar, solo varia la respuesta que proporcionan.
Eventos CTCP.-
Vamos a
ver como usamos este tipo de eventos para que la explicación sea más fácil de
entender. En la sección “Remotes” del editor de script del mIRC es donde definiremos estos eventos
y se hacen de una forma parecida al resto de eventos remotos. La sintaxis es:
/ctcp
<nivel>:<texto>:<#[,#]>: { comandos }
Este tipo
de eventos harán que nuestro programa se comporte de cierta manera (es decir,
que ejecute los comandos que le especifiquemos) cuando recibamos un CTCP
<texto> de otro usuario. El <nivel> de momento lo dejaremos
siempre en “1”, y el otro parámetro ha de ser, bien un
“#” si nos referimos a un canal, un “?” para un privado
(query) o un “*” para “en cualquier lado”. Con un
pequeño ejemplo lo veremos más claro, copie lo siguiente en el editor del mIRC, pestaña “Remotes”:
ctcp 1:*hora:*:{
msg $nick Son las $time
}
Este
evento hará como ya habrá imaginado que cuando un usuario nos haga un /ctcp
<nick> hora le respondamos de forma automática enviándole un
query en el que diga por ejemplo “Son las 18:35:24”. Como se ve, se
pueden usar “*” en el parámetro <texto> para indicar que si
la palabra “hora” del mensaje CTCP
viniera precedida de cualquier otra, o después de esa palabra hubiera alguna
palabra más, se ejecutaría de todas formas ese comando. En este ejemplo en
concreto eso no es de mucha utilidad pero en siguiente si que lo será:
ctcp 1:dime*:*:{
msg $nick Lo siento estoy ocupado
}
Este
evento hará que cuando un usuario le envíe un ctcp dime usted le responda que
está ocupado. Por ejemplo un usuario que le podría hacer un /ctcp
<sunick> dime la hora o quizas /ctcp <sunick> dime tu nombre. En
cualquier caso la respuesta será la misma.
Lo que
hemos visto hasta ahora se refiere a crear eventos CTCP propios, que no existían antes en el mIRC y a los que el script responderá de la forma que hemos
especificado, pero también si quisiera, podría cambiar su respuesta a algunos
de los eventos CTCP ya definidos,
como es el caso del ping, para ello tendremos que especificar al final de los
comandos, el comando /halt, por
ejemplo:
ctcp 1:ping:*:{
notice $nick Nada de pings, gracias | halt
}
Este
evento hará que cuando usted reciba un ctcp ping de algún usuario, le enviará
un notice diciéndole: “Nada de pings, gracias”, y mediante el
comando /halt haremos que el script deje de procesar ese evento, y de esta
forma no procese la parte que ya estaba hecha en el mIRC (la que devuelve el lag). También podríamos usar este
procedimiento para otros CTCPs ya definidos como son time, userinfo,
…etc.
Otra utilidad
de estos eventos puede ser la de controlar nuestro mIRC “a distancia”, y me explico, si abrimos dos mIRCs, podremos controlar a uno de
ellos mediante CTCPs mientras que el
otro lo controlaremos normalmente, se pueden usar por lo tanto para controlar a
nuestros clones, por ejemplo, si copiamos el siguiente código en la sección
Remotes y abrimos dos mIRCs:
ctcp
1:habla*:#:{ /say $1- }
Cuando
desde uno de los mIRCs escribamos /ctcp
<nick_clon> habla <mensaje> el otro mIRC que hemos abierto enviará el mensaje que pongamos después de
“habla” al canal, por ejemplo si ponemos /ctcp <nick_clon>
habla soy un bot, me manejan con ctcp’s! hará que nuestro clon diga ese
mensaje al canal.
ctcp
1:quit*:*:{ /quit $1- }
Este nuevo
ejemplo hará que al recibir el CTCP,
el clon cierre el mIRC con el
mensaje especificado en /ctcp <nickclon> quit
<mensaje_de_quit>.
ctcp
1:entra*:*:{ /join $1 }
Este hará
que el clon entre en el canal que especifiquemos en /ctcp <nickclon>
entra #canal
ctcp 1:comosoy:*:{ /say Me llamo $1
$+ , tengo $2 años y soy $3 }
Este
último hará que el clon diga en el canal ese mensaje usando las tres siguientes
palabras que ponemos después del /ctcp <nickclon> comosoy por
ejemplo, si ponemos: /ctcp <nickclon> comosoy Pepe 20 alto, el clon pondra
en el canal: “Me llamo Pepe, tengo 20 años y soy alto”.
Con esto
hemos matado dos pájaros de un tiro, no sólo ya sabemos manejar los eventos CTCP y como evitar las respuestas
predeterminadas de algunos de ellos, sino que hemos aprendido sobre su principal
utilidad que es la creación de clones que obedezcan nuestras órdenes, también
conocidos como “bots”.
Veamos
ahora los eventos CTCP a que nos
referimos con anterioridad, los que mandan respuestas estándar exclusivamente
que ya vienen predefinidos en el mIRC.
Por ejemplo cuando usted hace un pinga un usuario, ese usuario le devuelve la
información del ping y usted ve en la pantalla algo así:
[<nick] PING reply]: 0 secs
Pero
quizás para hacer más bonito el script le gustaría que pusiera:
Lag
con <nick>: 0 segundos
para ello
usaremos el evento ON CTCPREPLY que
tiene la siguiente sintaxis:
on 1:ctcpreply:<ctcp>:{ comandos }
Donde <ctcp> pondremos el CTCP predefinido al que nos referimos,
y en comandos la secuencia de comandos que queremos ejecutar. Generalmente para
este tipo de acciones usaremos /echo para poner las líneas de texto en
pantalla. Vamos a ver como conseguiríamos hacer que la respuesta del ping nos
fuera mostrada como hemos visto antes, debemos escribir en “remotes”:
on 1:ctcpreply:ping:{
%lag =
$time - $2
echo
–s Lag con $nick $+ : %lag
halt
}
Lo que
hemos hecho es primero calcular el lag basándonos en la información que nos
devuelve el nick al que le hemos hecho el ping. En este caso nos devuelve
“PING 919197981”. ¿Y qué es ese número tan largo?. Ese número
corresponde a una referencia de tiempo, indicada como el número de segundos
transcurridos desde el 1 de enero de 1970. El instante al que se refiere ese
número es el momento en que la persona recibió el PING, por lo tanto si
restamos a la hora actual en el formato $time
(que os devolverá la hora actual como número de segundos desde el 1 de enero de
1970) de la fecha en la que el nick recibió el ctcp, nos quedará un número más
pequeño y corresponderá al LAG en segundos. Guardamos ese dato en la
variable %lag y a continuación,
mediante /echo, ponemos la información en la ventana de Status, y el comando
halt. Se debe de estar preguntando ¿ese halt no parará el preoceso del PING y
nos dejará sin ver la información? La respuesta es no, puesto que cuando ese
evento “salta” la información del PING ya nos ha sido devuelta por
la otra persona, así que en este tipo de eventos el /halt al final lo único que
hará será evitar que veamos, además del mensaje que hemos especificado,
el que ya había por defecto. Pruebe ese ejemplo, y después pruébelo de nuevo
suprimiendo el /halt para que vea usted mismo a que nos referimos.