Autor Tema: Bot para turnos de DJs de radio  (Leído 7892 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Shakwon

  • Visitante
Bot para turnos de DJs de radio
« en: Agosto 29, 2010, 08:08:50 am »
Buenas comunidad  ;)

Mi duda es la siguiente:

Tengo una sala de radio y ultimamente han incrementado el numero de djs asi que siempre andan preguntandome despues de quien les toca emitir. Una vez estuve en una radio pero por poco tiempo y en la sala dj habia un bot que ponias un comando por ejemplo !lista y el bot te botaba la lista en orden de quienes ya habian serapado un turnopara emitir, por ejemplo si yo pongo !lista para que el bot me diga:

[BOT]: Emitiendo Dj fulano 2)pepito  3)pepita  4)Vacio

Si yo pongo un comando por ejemplo !turno para que el bot me separe un tuno en la casilla 4 y asi sucesivamente. Espero no sea mucha molestia. Gracias de antemano

« última modificación: Agosto 30, 2010, 09:51:10 am por Lokiyo, Razón: Título poco descriptivo »

mOX

  • Visitante
Re: Bot?
« Respuesta #1 en: Agosto 30, 2010, 03:12:15 am »
on *:text:*:#: {
  if $strip($1) = !turno {
    if ( !$2 ) { msg # Sintaxis: $+($chr(2),!turno <dj>) }
    else {
      msg # $2 fue agregado a la lista.
      write -s $2 dj-action.txt $2
    }
  }
  if $strip($1) = !lista {
    if ( !$lines(dj-action.txt) ) { msg # Lista vacía | return }
    else {
      var %x = 1
      while ( %x <= $lines(dj-action.txt) ) {
        var %djs = $addtok(%djs,$+($chr(2),$base(%x,10,10,2),º,$chr(2)) $read(dj-action.txt,%x) - ,32)
        inc %x
      }
    }
    msg # Emitiendo - %djs
  }
  if $strip($1) = !borrar {
    if ( !$lines(dj-action.txt) ) { msg # Lista vacía | return }
    elseif ( $strip($2) !isnum ) { msg # Sintaxis: $+($chr(2),!borrar <Nº>) }
    else { write $+(-dl,$2) dj-action.txt }
  }
}

Cualquier cosa nos avisas, aquí hay mucha gente para ayudar.
- Saludos -
« última modificación: Agosto 30, 2010, 03:48:01 am por mOX »

Shakwon

  • Visitante
Re: Bot?
« Respuesta #2 en: Agosto 30, 2010, 06:17:37 am »
Amigo Mil gracias pero me podrias explicar como? donde? cuanto? como ? por que? xd Na broma.. Si quisera saber como hacerlo funcionar. Gracias  :)

Desconectado Lokiyo

  • Administrador
  • Héroe
  • *****
  • Mensajes: 739
  • Karma: +22/-2
  • Sexo: Masculino
    • El revoltijo de Lokiyo
Re: Bot?
« Respuesta #3 en: Agosto 30, 2010, 09:50:25 am »
Código: [Seleccionar]
on *:text:*:#: {
  if $strip($1) = !turno {
    if ( !$2 ) { msg # Sintaxis: $+($chr(2),!turno <dj>) }
    else {
      msg # $2 fue agregado a la lista.
      write -s $2 dj-action.txt $2
    }
  }
  if $strip($1) = !lista {
    if ( !$lines(dj-action.txt) ) { msg # Lista vacía | return }
    else {
      var %x = 1
      while ( %x <= $lines(dj-action.txt) ) {
        var %djs = $addtok(%djs,$+($chr(2),$base(%x,10,10,2),º,$chr(2)) $read(dj-action.txt,%x) - ,32)
        inc %x
      }
    }
    msg # Emitiendo - %djs
  }
  if $strip($1) = !borrar {
    if ( !$lines(dj-action.txt) ) { msg # Lista vacía | return }
    elseif ( $strip($2) !isnum ) { msg # Sintaxis: $+($chr(2),!borrar <Nº>) }
    else { write $+(-dl,$2) dj-action.txt }
  }
}

Podrías usar elseifs, así como hacer el strip() sólo una vez guardando el resultado en una variable... Además, tal como está, esto permitiría usarse en todos los canales. Además, cualquier usuario puede añadir o borrar la lista de Djs con lo cual, los líos pueden ser tremendos ;)

No está mal como base, pero creo que podrías currarlo un poco más. :)


Amigo Mil gracias pero me podrias explicar como? donde? cuanto? como ? por que? xd Na broma.. Si quisera saber como hacerlo funcionar. Gracias  :)
Tienes que crear un nuevo fichero de 'remote' (Alt+R -> File -> new), pegar ese código (mejor te esperas a que esté corregido) y después guardarlo (pulsando en OK). Una vez hecho eso, tendrías los comandos !lista, !turno y !borrar para listar los djs, añadirlos o borrarlos, respectivamente.
Como ya he dicho, para mí, tiene algunos problemas ese código, así que no lo usaría. Espera mejor a que lo corrijan.

Saludos.


Shakwon

  • Visitante
Re: Bot?
« Respuesta #4 en: Agosto 30, 2010, 10:12:31 am »
Podrías usar elseifs, así como hacer el strip() sólo una vez guardando el resultado en una variable... Además, tal como está, esto permitiría usarse en todos los canales. Además, cualquier usuario puede añadir o borrar la lista de Djs con lo cual, los líos pueden ser tremendos ;)


Amigo tienes razon ya han habido varios roces entre djs  y creo que si cualquiera lo maneja podrian haber problemas. Creo que el comando !borrar seria bueno que fuera manipulado por algunos (los dueños de la radio) porfavor podrian ayudarme con eso, disculpen las molestias pero no se mucho de scripting :-\


Amigo Mil gracias pero me podrias explicar como? donde? cuanto? como ? por que? xd Na broma.. Si quisera saber como hacerlo funcionar. Gracias  :)
Tienes que crear un nuevo fichero de 'remote' (Alt+R -> File -> new), pegar ese código (mejor te esperas a que esté corregido) y después guardarlo (pulsando en OK). Una vez hecho eso, tendrías los comandos !lista, !turno y !borrar para listar los djs, añadirlos o borrarlos, respectivamente.
Como ya he dicho, para mí, tiene algunos problemas ese código, así que no lo usaría. Espera mejor a que lo corrijan.

Saludos.

Con respecto a eso ya lo probe y pude hacerlo funcionar. Gracias. ;D

mOX

  • Visitante
Re: Bot para turnos de DJs de radio
« Respuesta #5 en: Agosto 30, 2010, 12:41:42 pm »
Código: [Seleccionar]
on *:text:*:#Channel: {
  if $level($nick) = 21 {
    if $strip($1) = !turno {
      if ( !$2 ) { msg # Sintaxis: $+($chr(2),!turno <dj>) }
      else {
        msg # $2 fue agregado a la lista.
        write -s $2 dj-action.txt $2
      }
    }
    if $strip($1) = !borrar {
      if ( !$lines(dj-action.txt) ) { msg # Lista vacía | return }
      elseif ( $strip($2) !isnum ) { msg # Sintaxis: $+($chr(2),!borrar <Nº>) }
      else { write $+(-dl,$2) dj-action.txt }
    }
  }
  if $strip($1) = !lista {
    if ( !$lines(dj-action.txt) ) { msg # Lista vacía | return }
    else {
      var %x = 1
      while ( %x <= $lines(dj-action.txt) ) {
        var %djs = $addtok(%djs,$+($chr(2),$base(%x,10,10,2),º,$chr(2)) $read(dj-action.txt,%x) - ,32)
        inc %x
      }
    }
    msg # Emitiendo - %djs
  }
}
Aquí está el código con nivel de usuario, agrega los usuarios /auser 21 Apodo que quieras que puedan usar los comandos !turno y !borrar, también debes cambiar #Channel por tu canal, con respecto al los else if me parece mas rápido así, un ejemplo :

If comando !turno
Elseif comando !borrar
Else comando !lista

Si yo busco !lista espero que pase por las tres comparaciones, si uso if las puedo obviar , no es lo mismo que si tuviera más comparaciones dentro de un comando, por ejemplo en !borrar

 if $strip($1) = !borrar {
      if ( !$lines(dj-action.txt) ) { msg # Lista vacía | return }
      elseif ( $strip($2) !isnum ) { msg # Sintaxis: $+($chr(2),!borrar <Nº>) }
      else { write $+(-dl,$2) dj-action.txt }
    }
  }

Y lo de "hacer el strip() sólo una vez guardando el resultado en una variable" no lo entendí, si me ayudas lo corrijo, o lo corrigen, no me ofendería para nada, es más, me gusta aprender 

Desconectado Lokiyo

  • Administrador
  • Héroe
  • *****
  • Mensajes: 739
  • Karma: +22/-2
  • Sexo: Masculino
    • El revoltijo de Lokiyo
Re: Bot para turnos de DJs de radio
« Respuesta #6 en: Agosto 30, 2010, 01:28:23 pm »
El problema de usar varios IF sin elseif es que SIEMPRE te pasa por todas las comparaciones (a menos que interrumpas la ejecución del evento con un return). En cambio, si usas IF ... ELSEIF, sólo te pasa por las necesarias hasta que encuentre la que corresponde.

Por supuesto en el ejemplo que has puesto tú (!list estando el último), es el peor caso posible, pero en tu mismo ejemplo si el comando es !turno, entonces sólo hace esa comparación y las otras dos no las comprueba, que NO es el caso con el script actual: siempre comprueba todas las opciones, puesto que los ifs son independientes.

Sobre el strip():
Ahora mismo tu estás haciendo el strip() en cada comparación lo cual te lo puedes ahorrar si haces algo como:
Código: [Seleccionar]
var %comando = strip($1)

if %comando == !turno
 ...
elseif %comando == !borrar
 ...
Así te ahorras el realizar el strip() en cada comparación ;)


Muy bueno lo de los niveles ;)

Espero haberme explicado bien. Cualquier otra cosa, no dudes en preguntar.
« última modificación: Agosto 30, 2010, 01:33:51 pm por Lokiyo »

mOX

  • Visitante
Re: Bot para turnos de DJs de radio
« Respuesta #7 en: Agosto 30, 2010, 02:59:16 pm »
Pero si pongo var %comando $strip($1) no va ser lo mismo? porque si traducimos la variable el resultado será  lo que esté en $strip($1) o no?

Osea:
var %comando !turno
//echo %comando = !turno

Por ahí sería mejor usar on $21:text:$(/^[!](turno|lista|borrar)$/Si):#Channel: { }

Que opinas?

Desconectado Lokiyo

  • Administrador
  • Héroe
  • *****
  • Mensajes: 739
  • Karma: +22/-2
  • Sexo: Masculino
    • El revoltijo de Lokiyo
Re: Bot para turnos de DJs de radio
« Respuesta #8 en: Agosto 30, 2010, 05:14:34 pm »
Pero si pongo var %comando $strip($1) no va ser lo mismo? porque si traducimos la variable el resultado será  lo que esté en $strip($1) o no?

La cosa es que haciendo esa asignación de variable, no se ejecuta el strip() dos o tres veces (una en cada comparacion, como tienes tú), sino simplemente una antes de la asignación a la variable. ¿Me explico?
Ya de paso, y si quisieramos ponernos tiquismiquis, incluso se podría eliminar el strip(), ya que si alguien escribe un comando con negritas o colores... pos es su problema XD Pero bueno, no me parece mal ;) De hecho es una buena práctica en multitud de ocasiones.


Por ahí sería mejor usar on $21:text:$(/^[!](turno|lista|borrar)$/Si):#Channel: { }

Que opinas?

Creo que no nos ahorra nada hacer eso, ya que luego seguimos teniendo que hacer el if .. elseif para cada comando, dentro del evento. Si se diera el caso de que quisieramos añadir más comandos, tendríamos que editar la regex del evento y además el if .. elseif interno del evento... así que me parece trabajar doble ;)

No obstante, gracias por comentarlo, no sabía que se podían usar regex en mirc XD

mOX

  • Visitante
Re: Bot para turnos de DJs de radio
« Respuesta #9 en: Septiembre 01, 2010, 12:38:46 am »
Ya sé dónde está el problema, no estas acostumbrado a ver un evento englobado o anidado, fíjate acá, de manera tradicional y dime si ves algún problema.

Código: [Seleccionar]
on 21:text:!turno*:#Channel: {
  if ( !$2 ) { msg # Sintaxis: $+($chr(2),!turno <dj>) }
  else {
    msg # $2 fue agregado a la lista.
    write -s $2 dj-action.txt $2
  }
}
on 21:text:!borrar*:#Channel: {
  if ( !$lines(dj-action.txt) ) { msg # Lista vacía | return }
  elseif ( $strip($2) !isnum ) { msg # Sintaxis: $+($chr(2),!borrar <Nº>) }
  else { write $+(-dl,$2) dj-action.txt }
}

on 1:text:!lista:#Channel: {
  if ( !$lines(dj-action.txt) ) { msg # Lista vacía | return }
  else {
    var %x = 1
    while ( %x <= $lines(dj-action.txt) ) {
      var %djs = $addtok(%djs,$+($chr(2),$base(%x,10,10,2),º,$chr(2)) $read(dj-action.txt,%x) - ,32)
      inc %x
    }
  }
  msg # Emitiendo - %djs
}

En un evento englobado puede haber muchos if en realidad los if son infinitos y no tiene obligación de ser evaluados con elseif o else, tranquilamente pueden trabajar solos,  en el ejemplo anterior, al ser englobados necesitas apuntar al comando, por eso es $strip($1-) = !comando no estoy tratando de hacer una comparacion sino apuntar el comando, trabaja de la misma manera que on *:text:comando, $strip lo puse para ahorrar cualquier problema con escrituras.

Ahora bien, acá tienes un ejemplo de distinta finalidad pero de similar estrctura que  puede ayudar para la comparación.

Código: [Seleccionar]
on ^1:CHAT:*: {
  if (%pflood.d == on) && (%tmp.fsnoflod != on) { inc %dclok | .timerDC 1 10 unset %dclok | if (%dclok > 80) { unset %dclok | close -c $nick | echo -ste $tma(flood,$nick,$address,$mg(dccloq)) | halt } }
  if ($strip($1) == PONGdcc)  && ( $2 isnum ) { msg =$nick 3Lag =12 $calc($ctime - $2) $mg(seg) | inc %dclok 3 }
  if ($strip($1) == PINGdcc) && ( $2 isnum ) { msg =$nick 3PONG0,0dcc $2 | inc %dclok 3 }
  if ($1- == [\]) && (%viserv == on) { inc %dclok 5 | ja liserv $nick }
}

-saludos-

Desconectado Lokiyo

  • Administrador
  • Héroe
  • *****
  • Mensajes: 739
  • Karma: +22/-2
  • Sexo: Masculino
    • El revoltijo de Lokiyo
Re: Bot para turnos de DJs de radio
« Respuesta #10 en: Septiembre 01, 2010, 10:53:35 am »
Lo dejaremos aquí, porque no me entiendes y nos hemos desviando completamente del tema de este hilo. De todas maneras ha estado entretenido.

Saludos.