SCRIPTING
1.- INTRODUCCIÓN
Se conocen como EVENTOS, en informática, todos aquellos
sucesos que se producen a lo largo de una sesión de
trabajo de un programa, y que éste es capaz de detectar y
controlar. La programación orientada a eventos es aquella en
la que podemos definir previamente las acciones que el
programa debe de emprender en el momento en que se produzca un
evento concreto. Es decir, predisponemos al programa a que
preste especial atención a algunos sucesos, y le
obligamos a que analice dichos eventos a fin de determinar si
se reúnen las circunstancias que hemos establecido, y de ser
así, a ejecutar las acciones que para ese caso le hemos
programado.
El mIRC es un programa altamente configuráble y personalizáble
a través de la definición de Alias, Popups, y Remotes.
Dentro de este último grupo provee una de sus herramientas más
potentes: la posibilidad de programar acciones orientadas a un
grupo de eventos propios de una sesión de IRC; es decir, es
posible programar de modo sencillo acciones de cierta
complejidad como respuesta a algunas situaciones.
Existen tres tipos de eventos
en el mIRC, los que llamaremos estándar, que son los que se
describen aquí, y los eventos CTCP que describiré en un capítulo
aparte, y los eventos RAW que se explicarán en el apartado Números
Raw.
En este manual de referencia se incluyen los eventos descritos
para la versión 5.31 del mIRC.
2.- UN EJEMPLO DEL USO DE EVENTOS
Por ejemplo, es
muy sencillo hacer que el programa detecte cada vez que, en
cualquier canal en el que estemos, alguien escriba nuestro
nick (supongamos que es SomaTic), y en consecuencia, si lo
deseamos, comunicar privadamente a esa persona que no estamos
prestando atención en ese momento. No habría más que
recurrir al evento "onTEXT", quizás el más
importante de todos.
Para esto debemos de ir al menú "TOOLS" que se
encuentra en la barra de menús de la parte superior de la
pantalla y pulsar la opción "REMOTE...". Nos
aparece un cuadro con una gran ventana de texto y una nueva
barra de menús en la parte superior. Vayamos al menú
"VIEW" y seleccionemos la opción
"events"; ya podemos escribir en el cuadro de texto
nuestras órdenes para el control de eventos (hágalo a ser
posible al principio de esta caja de texto). Escribiremos la
siguiente línea:
on 1:TEXT:Somatic:#: notice $nick
Perdona $nick no estoy prestando atención!!!.
Pulsamos el botón
"OK" y trabajo concluido. Desde este momento, si
{_PePe_} menciona el nombre de SomaTic recibirá un mensaje
que solo podrá ver él (notice), en el que le decimos:
"Perdona {_PePe_} no estoy prestando atención!!!".
Al margen de la sintaxis de
la línea, que veremos más adelante, la objeción es
evidente: ¿Y que pasa si SÍ estamos prestando atención? ¿tenemos
que ir otra ver a la ventana de edición de eventos y borrar
lo que pusimos?. Bueno, es una posibilidad, pero
afortunadamente también tenemos la facilidad de hacer que la
acción de los eventos que deseemos se active y desactive a
nuestra voluntad. Vayamos de nuevo a la ventana de edición de
eventos y escribamos lo siguiente en las líneas anterior y
posterior a la que escribimos antes: #ausente
off y #ausente end. El bloque total (grupo) quedará de
la siguiente forma:
- #ausente
off
on 1:TEXT:Somatic:#:/notice $nick
Perdona $nick no estoy prestando atención!!!.
#ausente end
De esta forma podemos crear
bloques o grupos de eventos con tantas líneas como deseemos
en su interior. Para activar o desactivar su efecto debemos de
incluir las instrucciones: .enable
#ausente y .disable #ausente
dentro de algún alias o de un menú (si esto le causa
problemas ahora es el momento que estudiar a fondo las
secciones de aliases y popups del mIRC ;)). (el punto delante
de las cláusulas enable y disable tiene el único fin de
inhibir el mensaje que el programa presenta en pantalla
anunciando la activación o desactivación del grupo).
Pruebe los efectos de la programación de eventos aplicando
los distintos comandos del IRC y del mIRC en su interior (por
motivos que desconozco algunos de ellos no funcionan en este
contexto, como por ejemplo /me, /ame,
/say, ... etc). También puede
hacer uso de alias préviamenre definidos, o de la estructura
IF-ELSE, pero, en cualquier caso, si desea incluir varias líneas
de órdenes vinculadas a un mismo evento use siempre el
separador de comandos (el carácter "|", que se
obtiene pulsando las teclas ALTGR y 1).
3.- GENERALIDADES DE LA SINTAXIS DE EXENTOS
Como ya se ha
podido observar en el ejemplo anterior, lo que hemos dado en
llamar un la línea de evento se forma mediante una cadena de
caracteres en la que los distintos campos de información están
separados por el símbolo de los dos puntos. Los campos son
los siguientes:
on
<nivel>:<EVENTO>:<texto>:<lugar>:<comando/os>
En el primer campo es
necesario especificar en nivel de acceso remoto que ese
usuario tiene a nuestro sistema. Este es un tema algo complejo
en el que no procede entrar ahora, baste saber que este nivel
es un número que marca la capacidad de acceso que cada
usuario tiene para ejecutar comandos del IRC de forma remota
dentro de nuestro ordenador. No se alarme, nadie tendrá un
nivel que usted no le haya concedido previamente, y este para
los comandos que usted especifique. Para comprobar quien tiene
nivel de acceso remoto a su sistema no tiene más que mirar en
la solapa de "USERS" de la misma ventana desde donde
introducimos los eventos, ahí puede añadir o borrar lo que
desee. En principio, y para todos los efectos de este
documento, podemos considerar el nivel de acceso 1 que es el
que otorga el programa por defecto a todos lo usuarios; por
tanto, en este caso el primer campo sería: on
1.
también es posible anteponer el símbolo @ antes del número
de nivel, si hacemos esto, la definición del evento no se
ejecutará nada más que en caso de que dispongamos del
estatus de operador del canal.
El segundo campo es el identificador del evento que estamos
configurando, en el ejemplo anterior era TEXT, pero descubrirá
que hay otros muchos.
El tercer campo es el "texto", este no tiene sentido
en todos los eventos, gran parte de ellos no están vinculados
a texto alguno, y simplemente se omite este campo.
El cuarto campo es
"lugar", es decir, el canal, privado...etc. donde el
mIRC vigilará la circunstancia del evento, podemos
especificar de este modo que determinado evento produzca las
acciones especificadas solo si se da en un determinado lugar.
Como en el campo anterior no siempre tiene sentido y por tanto
se omite en algunas definiciones de eventos.
El último campo es el más grande, incluye el comando o
comandos, alias, etc... que se ejecutarán en caso de que se
produzca el evento y las circunstancias especificadas. En este
campo se pueden concatenar varios comandos utilizando el símbolo
"entubador": "|" (no olvide dejar espacios
en blanco a ambos lados del entubador).
Para aumentar aun más la potencia de la configuración de
eventos, estos admiten el uso de funciones, son todos aquellos
identificadores que comienzan por el símbolo $ (la referencia
del mIRC los llama parámetros, el tema es mas bien terminológico,
yo prefiero verlas como funciones puesto que junto con las
internas del programa el mIRC permite definir otras propias,
con una sintaxis muy similar a la del lenguaje C). No se
relaciona en este documento una lista
exhaustiva de dichas funciones, puesto que muchas de ellas son
propias de un solo evento concreto, mientras que otros no las
admiten. No obstante, si presta atención a los ejemplos irá
viendo la forma y utilidad de la mayoría de ellas, en los
lugares en los que son efectivas; el resto lo debe de aportar
la experiencia personal. (las funciones deberán de tener
siempre espacios en blanco a ambos lados de su nombre).
Es perfectamente posible, así mismo, el empleo de variables y
estructuras IF-ELSE dentro de las definiciones de eventos,
encontrará numerosos ejemplos de este uso en los scripts para
mIRC que circulan a libre disposición en la WWW y el IRC.
Es hora de entrar a conocer una a una las definiciones de
eventos que proporciona la versión 5.31 del mIRC. Esta lista
está basada en la ayuda del propio programa y no la considero
cerrada, por tanto agradeceré cualquier crítica y
sugerencia, por supuesto las dudas también serán atendidas
en mi e-mail: sucubus@arrakis.es,
o en el canal #Ayuda_IRC del IRC Hispano, no tiene más que
preguntar por SomaTic ;).
Este evento se produce al recibirse un mensaje especificado,
bien en un privado, o bien en un canal en el que nos
encontramos.
El texto del mensaje que
deseamos que produzca el evento se puede especificar de varias
maneras:
* |
El
evento se producirá ante cualquier texto. |
& |
El
evento se producirá ante cualquier palabra. |
Texto |
El evento se
produce anta una palabra concreta y no otra. |
Texto* |
Se produce ante una
cadena de caracteres que comience por el texto
especificado. |
*Texto |
Se produce ante una
cadena de caracteres que finalice por el texto
especificado. |
*Texto* |
El evento se
produce si el texto contiene la cadena especificada,
sea cual sea su posición. |
Se puede especificar el lugar donde se controlará el evento
de la siguiente forma:
? |
Controlara
la producción del evento dentro de un query o de un
DCC chat |
# |
Controlara la
producción del evento dentro de un canal cualquiera
en el que nos encontremos |
#canal_1,#canal_2,... |
Controlará la
producción del evento dentro de un canal
especificado. |
* |
Controla el evento
en un privado o canal indistintamente. |
Ejemplos:
on 1:TEXT:Hola*:#:/msg
$chan ¡Bienvenido al canal $chan $nick $+ !
Esta instrucción detectará
cuando alguien diga la palabra "Hola" en cualquier
canal que nos encontremos, y automáticamente le dará la
bienvenida al canal en cuestión. El identificador $+ elimina
los espacios en blanco que tiene a ambos lados, de ese modo
podemos hacer que el nick de la persona que ha dicho
"hola" aparezca en nuestra respuesta seguido del símbolo
"!", si escribimos directamente este símbolo a
continuación de $nick este no será reconocido como un
identificador del nick del usuario, sino que aparecerá
literalmente como está en la orden.
También es
posible emplear variables para dar más flexibilidad al
formato del evento, por ejemplo:
on 1:TEXT:%text:%canal:/msg $nick
Tú has escrito %text en el canal: %channel
Este ejemplo trabajará con
los valores previamente guardados en las variables %text, y
%canal.
Nota: Este
evento se producirá solo ante textos de otros usuarios, los
de usted no desencadenarán el evento.
Eventos
ON ACTION y ON NOTICE |
Tienen el mismo
formato que on TEXT, y se producen a partir de una acción o
de una noticia respectivamente. Recordemos que una noticia se
produce cuando alguien nos envía un mensaje con el comando /notice,
y una acción cuando alguien efectúa una acción de control
dentro del canal; por ejemplo:
on 1:ACTION:*set mode*:#:/msg
$chan ¡Ya estamos jugando con los modos!
Esta orden
detectará cualquier acción que contenga la cadena "Set
mode", y emitirá un mensaje al canal en que se produce.
on 1:NOTICE:*:?:/msg $nick Estoy
ocupado, espera un momento!
Esta orden
detecta cualquier /notice
recibido estando en un privado, y responde con otro /notice
al autor.
Eventos
ON BAN y ON UNBAN |
Estos eventos se producirán
cuando un usuario sea baneado o desbaneado en el canal.
El segundo ejemplo es una
acción múltiple que quita el estatus de operador al usuario
que puso el ban, y elimina este cuando el usuario baneado
tiene nivel 9 o superior en la lista de usuarios de nuestro
programa (la función $banmask devuelve la máscara de baneo
que fue empleada, y se usa, en este caso, para eliminar dicho
baneo).
on 1:UNBAN:#:/msg $bnick Has sido
desbaneado por $nick
Observe en este ejemplo el
uso de la función $bnick. Esta devuelve el nick del usuario
baneado o desbaneado, pero solo en caso de que dicho nick este
incluido dentro de la máscara del baneo. En caso contrario
$bnick = $null (nulo).
Es posible tener
en cuenta en la sintaxis de la instrucción los niveles del
baneador y del baneado. A este fin se puede preceder el número
de l nivel de los signos: <,>,<=,=>,<>, ó
=. Por ejemplo:
on >=2:BAN:#:/msg $chan $nick
baneado $banmask (legal)
En esta situación, si el
nivel del baneador es mayor o igual que el del usuario
baneado, se comunica queeste es un ban legal (como se podría
comunicar cualquier otra cosa)
Recuerde, esta sintaxis
compara los niveles de baneado y baneador, nunca que este
tenga o no nivel superior o igual a 2.
Nota: Estos eventos solo
operan cuando el server de IRC proporciona los nicks de
baneador y baneado, y no su cuando da sus direcciones.
Observe el siguiente ejemplo:
- on
1:BAN:#: {
if ( $banmask iswm $address( $me
,0)) || ( $me isin $banmask ) { echo -s $nick te ha
baneado con esta máscara: $banmask
}
if ( $me isop $chan ) { mode $chan
-ob+b $nick $banmask $address($nick,2) }
}
Esta rutina se inicia cada
vez que se produce una acción de baneo en un canal en que nos
encontramos. En primer lugar comprueba que la máscara del ban
coincide con la nuestra o bien tiene incluido nuestro nick, en
tal caso emite un mensaje a la ventana de estatus
especificando la persona que lo ha realizado y la máscara con
la que se ha hecho el ban, a continuación comprueba si somos
operadores del canal, y en tal caso retira el estatus de
operador a quien nos ha baneado, y le banea a su vez.
Eventos
ON CHAT y ON SERV |
Los eventos on CHAT y on SERV
se producen cada vez que es enviado un mensaje la una ventana
de DCC chat, o a un Fserve respectivamente. Es similar al
evento on TEXT, el cual no funciona en un chat ni en un
servidor de ficheros.
La especificación del texto
que producirá el evento se hace de la misma forma que en ON
TEXT.
Eventos
ON CHATOPEN y ON CHATCLOSE |
Estos eventos se producen al
abrirse o cerrarse (respectivamente), una sesión de DCC chat.
Ejemplos:
on 1:CHATOPEN:/msg =$nick Hola,
estoy contigo en un momento.
Esta instrucción
envía una frase al DCC chat cuando este se abre por primera
vez. El uso del signo "igual" delante de $nick es
necesario para que el mensaje se dirija a la misma ventana del
DCC chat, y no a una ventana privada aparte.
on 1:CHATCLOSE:/notice $nick fin
de la discusión!
Esto se produce
al cerrar la ventana del DCC chat.
Eventos
ON SERVOPEN y ON SERVCLOSE |
Estos eventos se producen al
abrirse o cerrarse (respectivamente), una sesión del FSERVE .
Eventos
ON CONNECT y ON DISCONNECT |
El evento on
CONNECT se produce cuando mIRC conecta al server de IRC, después
de visualizar el MOTD (mensaje del día del servidor).
on DISCONNECT es
otro evento con el mismo formato, que se produce al
desconectarse del server.
Ejemplo: on
1:CONNECT:/echo Conectado a $server a las $time Tu nick es:
$nick
Se produce cuando otro usuario responde a una pregunta CTCP
por parte de usted.
Ver evento on
TEXT para los formatos de texto aceptados.
Ejemplo: on
1:CTCPREPLY:PING*:/echo -s $nick ha respondido al ping!
Se producen cuando un usuario
del canal es opeado o deopeado.
El evento on SERVEROP es
exactamente igual, y se produce cuando un usuario es opeado
por el server.
Ejemplos: on 9:OP:#:/mode $chan -o
$opnick | /msg $nick no opees a esa persona!
En este
ejemplo el evento se produce cuando es opeado un usuario de
nivel de acceso 9 en nuestra sección de remotes. $opnick
devuelve el nick de la persona opeada o deopeada, y $nick el
de la que lo opeó o deopeó. on
1:DEOP:#ayuda_irc:/mode $chan +o $opnick
Con esta orden devolvemos el
op a cualquier persona que sea deopeada en el canal
#ayuda_irc.
Es posible
tener en cuenta en la sintaxis de la instrucción los niveles
del opeador y del opeado. A este fin se puede preceder el número
de nivel de los signos: <,>,<=,=>,<>, ó =.
Por ejemplo:
on >=2:OP:#mIRC:/msg $chan
$nick opeado (legal)
En esta situación, si el
nivel del opeador es mayor o igual que el del usuario opeado,
se comunica que este es un op legal (como se podría comunicar
cualquier otra cosa)
Recuerde, esta sintaxis
compara los niveles de opeado y opeador, nunca que este tenga
o no nivel superior o igual a 2.
Nota: Estos
eventos solo operan cuando el server de IRC proporciona los
nicks de opeador y opeado, y no su cuando da sus direcciones.
Eventos
ON VOICE y ON DEVOICE |
Se produce cuando un usuario recibe o es privado de voz en un
canal moderado en que nos encontramos.
-
Formato: on
<level>:VOICE:<#[,#]>:<comandos>
Ejemplo: on
1:VOICE:#:/msg $vnick ya tienes voz en: $chan
Ejemplos: on
9:VOICE:#:/mode $chan -v $vnick | /msg $nick No des voz o ese
tío!
Esta orden se
ejecuta cuando el que recibe voz tiene nivel 9 o superior.
on 1:DEVOICE:#mIRC:/mode $chan +v
$vnick
Devuelve la voz
al que se le quite en el canal.
Son aplicables
también los prefijos de comparación de niveles descritos en
on BAN y on OP.
Se produce cuando hacemos un
requerimiento DNS (comando /dns).
Ejemplo:
on 1:DNS:/echo $nick ip address:
$iaddress named address: $naddress resolved address: $raddress
Se produce cuando el server envía un mensaje de error, por
ejemplo, en una desconexión.
Ver el evento on
TEXT para el formato del texto.
Ejemplos: on
1:ERROR:*banned*:/echo Has sido baneado de este server!
Eventos
ON FILESEND y ON FILERCVD. ON SENDFAIL y ON
GETFAIL |
Se producen al completarse un dcc send o un dcc get (envio o
recepción de ficheros reapectivamente).
-
Formato: on
<level>:FILESENT:<filename[,filename]>:<comandos>
Ejemplo: on
1:FILESENT:*.txt:/msg $nick ahí te mando: $filename !!
Los eventos on
SENDFAIL y on GETFAIL se producen cuando un dcc send o un
dcc get son fallidos.
Ejemplos: on
1:FILESENT:*.txt,*.ini:/echo Enviado $filename a $nick
$address
Se produce
cuando enviamos un fichero .TXT o INI. $filename devuelve el
nombre del fichero enviado.
on 1:FILERCVD:*.txt,*.ini:/echo Recibido
$filename de $nick | /run notepad.exe $filename
Esta orden avisa
cuando hemos recibido ficheros .TXT e .INI, y abre el bloc de
notas para ver su contenido.
on 1:SENDFAIL:*.txt:/echo Ha
fallado el envío de $filename a $nick!!
Se produce cuando
introducimos texto en una caja de texto y pulsamos INTRO.
La función $1- devuelve en
este caso toda la cadena de texto introducida.
Se produce cuando un usuario nos invita a un canal.
Eventos
ON JOIN y ON PART |
Se producen al entrar o salir
un usuario de un canal en que nos encontramos
Se produce cuando un usuario
es expulsado de un canal en el que nos encontramos.
Es aplicable también aquí
la regla de comparación de niveles de los nicks descrita el
los eventos on BAN y on OP.
Eventos
ON LOAD y ON START |
Estos eventos se producen cuando un fichero de script es
cargado o descargado.
Eventos
ON MIDIEND y ON WAVEEND |
Se produce cuando el mIRC
termina la reproducción de un fichero MIDI o WAV
Este evento no tiene
funciones asociadas. No se producirá si la reproducción se
detiene a causa de una interrupción, solo lo hace cuando la
reproducción es completada.
Se produce cuando un usuario cambia los modos del canal (pero
no los de usuario).
-
Formato: on
<level>:MODE:<#[,#]>:<comandos>
Ejemplo: on
1:MODE:#ayuda_IRC:/notice $me $nick Cambia modos de $chan
a: $1-
On SERVERMODE es
otro evento que se produce cuando los modos son cambiados por
el servidor.
Ejemplo: on
@1:MODE:#:/notice $me $nick changed $chan mode to $1-
Esta instrucción
se produce cuando alguien cambia los modos del canal teniendo
nosotros también el estatus de operador.
Se produce cuando un usuario
cambia de nick dentro del canal.
$nick devuelve el nick
antiguo; $newnick el nuevo.
Este evento se produce cuando
alguien activa un sonido en el canal y el mIRC no encuentra el
fichero midi o wav en nuestros directorios de sonidos, los
especificados en el dialogo FILE/OPTONS/SOUNDS
Eventos
ON NOTIFY y UNOTIFY |
Se producen al entrar o salir
del IRC un usuario que se encuentra en nuestra lista de
notificaciones.
Eventos
ON QUERYOPEN y ON QUERYCLOSE |
Se producen respectivamente
al abrirse una ventana de query.
Se produce cuando un usuario
que está en nuestro canal sale del IRC.
Se produce
cuando recibimos una noticia del server.
Para una
explicación del formato del texto, ver el evento on TEXT.
Ejemplo: on
1:SNOTICE:*split*:/splay hack.wav
Activa un
fichero de sonido en caso de una noticia del server anunciando
un split.
Se produce cuando algún
usuario cambia el tópico del canal.
La función $1- devuelve el
texto completo del nuevo tópico.
Se produce cuando cambiamos
nuestros modos de usuario.
Se produce cuando recibimos
un wallops message.
Ver el evento on TEXT para
una explicación de los posibles formatos del texto.
Se produce cuando algún
usuario cambia el tópico del canal.
La función $1- devuelve el
texto del nuevo tópico.
<---Atrás
|