duda con scripting

0buS

buenas

Os queria comentar una duda que tengo, que me solucionaria muchos problemas. vereis, lo que quiero conseguir es crear yo una variable, tal que funcione por ejemplo asi:

on 10:TEXT:.topic*:#: { .topic $chan [ Cambiando topic: $2 y despues... $3- }

En este ejemplo, cuando ejecutas .topic y una frase, el topic cambia, sustituyendo la variable $2 por la 1º palabra después de ".topic", y sustituyendo $3- por el resto.
Pues bien, lo que quiero saber es como crear mis propias variables, tal que si pongo .ciudad Alicante, me guarde "Alicante" en la variable $ciudad, si no es mucho pedir.

Gracias

A

Creo que lo que quieres crear es un alias.

Ejemplo:

alias hola {
return Hola mundo
}

Al hacer:
echo $hola
devolverá "hola mundo"

Ejemplo con parámetros:

alias ciudad {
if ( $1 == albacete ) { return hola mudno }
}

Al hacer:
echo $saludo(albacete)
devolverá "hola mundo"

Otro ejemplo:

alias ciudad {
if ( $1 == albacete ) {
if ( $prop == habitantes ) {
return Albacete tiene muchos habitantes
}
}
}

Al hacer:
echo $ciudad(albacete).habitantes
devolverá "Albacete tiene muchos habitantes"

Espero te refieras a eso. Lo digo de memoria, es posible (y probable) que me equivoque con la sintaxis, pero creo recordar era así.

0buS

ok entendido, ya lo tengo bien montado, pero esa variable me vale solo para almacenar digamos que 1 vez. Como hago para que almacene a mas de un usuario? Es decir, que pongas !usuarios, y te responda:
0buS Alicante
Archiville Madrid

Anteriormente yo puse !ciudad alicante, y tu !ciudad Madrid.

Mc_KaNaN

Bien. Si he entendido bien, lo que quieres es:

  • Poner: .ciudad Barcelona y se cree la variable: %ciudad Barcelona verdad?

on :input:: {
if ($1 == .ciudad) { set %ciudad $2- }
}

Esto SOLO funciona si lo pones en la ventana de Alt+R de tu script, no en el del bot ok?

En cuanto al tema de almacenar ciudades por nicks yo emplearia los write y $read :)

0buS

a eso quiero llegar. a ver si me podeis poner un ejemplo, de alguna variable o algun comando, para que almacene "por lista", a todos los usuarios que han ido poniendo sus ciudades. de forma que quede algo como dije arriba:

nº1 0buS Alicante
nº2 Archiville Madrid
nº3 Cs_KaNaN Barcelona

Ahora mismo me he creado un script para agregar por ejemplo servidores. Pero el problema es que me sirve unicamente para 1 servidor. Si quiero poner otro se me monta encima de las primeras variables:

on 10:text:.addserver*:#: {
if (!$2) { .msg $chan Introduce seguidamente, nombre del servidor, ip : puerto ( Ej: ClanCarapanes 193.222.46.15 27045 ) }
{ /set %server1 $2 }
{ /set %addserver $3 }
{ /set %addport $4 }
if ($4) { .msg $chan Server %addserver %addport con nombre %server1 añadido con éxito! }
}

on *:text:.servers:#:{
.msg $chan Servidores agregados :
.msg $chan %server1 %addserver : %addport
.msg $chan Para ver el estado de un servidor, teclea .status
}

Mc_KaNaN

on :text::#: {
if ($1 == .ciudad) { write ciudades.txt $nick $2- }
if ($1 == .mostrar) { ciudades }
}

alias ciudades {
set %lineaslog $lines(ciudades.txt)
var %i = 1
while (%i <= %lineaslog) {
msg $chan $read -l [ $+ [ %i ] ] ciudades.txt
inc %i
}
}

Esto lo que hace es: TODO el mundo que ponga: .ciudad <nombre de la ciudad> quedara memorizado en tu pc en un txt con su nick y la ciudad a la que pertenece.
En el momento en el que alguien quiera ver el listado de las ciudades solamente tiene que poner: .mostrar y le saldran TODOS los nicks del txt con sus correspondientes ciudades

A

Para listas así yo usaría hash tables.

Ejemplo:

on *:start: {
hmake mitabla 100
if ($isfile(mitabla.hash)) { hload mitabla mitabla.hash }
}

ON *:EXIT: {
if ($hget(mitabla)) { hsave -o mitabla mitabla.hash }
}

Para añadir ciudad y usuario:
hadd mitabla usuario ciudad

Para recoger ciudad de usuario:
echo $hget(mitabla usuario)

Ejemplo:
/hadd mitabla 0buS Alicante
/hadd mitabla Archville Madrid
echo -a $hget(mitabla,0buS)

Devolverá "Alicante"

Mc_KaNaN

#7 mi problema es que nunca llegue a manejar tablas hash :)

A

Siempre hay una primera vez : -P

Imagina por ejemplo que quieres guardar en una base de datos el nick, el teléfono, la ciudad, la raza, el clan, el dni y 50 datos más de un total de 4.000 personas.

A medida que el fichero crezca leerlo con $read se hará lentísimo, especialmente en bucles. Ponlo a prueba por ejemplo con un fichero de 4 o 5 Mb.

Con hash tables es practicamente instantaneo. La alternativa serían ficheros .ini, con readini y writeini, que aunque es más lento que las hash, es bastante más rápido que leer\escribir en ficheros "a pelo".

0buS

ok gracias a los dos, aunque me aclaro mejor con el .txt. Utiliza comandos que conozco, sin embargo los comandos de lo del hash me resultan mucho mas raros y a la vez complicados.

Mc_KaNaN

#9 Sabes de donde podria sacar una especie de tutorial para empezar a manejar tablas hash? :)

#10 :) Espero que sea util jeje

A

Aquí hay un tutorial:
http://www.mirc.net/projects.php?go=1064732500&get_desc=1

La ayuda del propio Mirc es el mejor tutorial de todos modos.

Usuarios habituales

  • Archville
  • Mc_KaNaN
  • 0buS