Quantcast
Channel: Comunidad Underground Hispana
Viewing all articles
Browse latest Browse all 11602

Problema con Time

$
0
0
Hola a todos, les comento, estoy haciendo un bot de juego para IRC, el mismo esta escrito en Python y no se necesita de la libreria PyGame.
El bot envia palabras aleatorias a un canal y hay que ordenarlas y por supuesto escribir las palabras, todo me estaba funcionando bien, hasta que me tope con los relojes Timers de Python y ahora es donde estoy atascado sin poder continuar.
Voy a empezar por lo primero amigos, el bot larga palabras mezcladas al gral de un canal y cuando el usuario va respondiendo esas palabras, que serian coincidencias de varias palabras, es ahi donde deberia leer el socket los datos que el usuario envia e ir comprobando si las palabras que escriben son las correctas, mientras tanto hay activado un reloj Timer que cuenta en segundos para pasar a otra ronda en el caso que nadie haya contestado todas las palabras correctamente, es aqui donde tengo el problema, en el bucle del socket estoy llamando a una funcion que esta dentro de una clase cuando el usuario escribe algo, adentro de esa clase esta la funcion de nombre "Checkear" en donde compara si lo que escribio el usuario es correcto, pero no me sale nada en la consola, es decir lo que escribe un usuario no se muestra en la consola de Python, porque por ej cuando escribo una palabra correcta deberia decirme el bot que he acertado, pero no me dice nada, es como que la conexion Socket deja de recibir datos, este comportamiento se ocasiona por el reloj Timer que se activa cuando el bot larga las palabras mezcladas, pero no se como solucionarlo, ya que si no uso el Timer, ahi si me toma bien las palabras y puedo ver en la consola lo que voy escribiendo.
Realmente no comprendo como puede pasar esto, ya que la conexion socket tiene un bucle infinito, y el reloj Timer se activa 1 solo despues que envia las palabras y a mi entender la conexion Socket y el Timer deberian ser independientes.
Pido disculpas si no me expreso bien, todavia soy muy novato en Python, pero me falta poco para terminar mi bot, me falta la escritura de los puntajes y los 5 mejores jugadores, cuando solicen al bot los mejores puntajes.
Voy a pegar un codigo de ejemplo de como esta estructurado mi codigo:
Código:

class Botito:
  def __init__(self, RespuestaPals):
      self.RespuestaPals = RespuestaPals
  def Jugar(self):
      # Aqui se hace todo el mezclado de las palabras y las envia al canal #Juego.
      #Aqui calcula la cantidad de palabras en la respuesta y activa el tiempo adecuado:
      if Respuesta.count(' ') == 1:
          time.sleep(10)
          Bot.Tiempo()
      elif Respuesta.count(' ') == 2:
          time.sleep(20)
          Bot.Tiempo()
      elif Respuesta.count(' ') == 3:
          time.sleep(30)
          Bot.Tiempo()
      elif Respuesta.count(' ') == 4:
          time.sleep(40)
          Bot.Tiempo()
      elif Respuesta.count(' ') >= 5:
          time.sleep(50)
          Bot.Tiempo()
  def Checkear(self):
      if Texto in self.RespuestaPals:
          print "Aqui se compara si lo que escribio el usuario es correcto."
  def Tiempo(self):
      if self.RespuestaPals.count(' ') > 1:
          BotJuego.send('PRIVMSG #Juego :Se acabó el tiempo! Las palabras correctas eran: %s\r\n' % self.RespuestaPals)
          time.sleep(2)
          Bot.Jugar()
      else:
          BotJuego.send('PRIVMSG #Juego :Se acabó el tiempo! La palabra correcta era: %s\r\n' % self.RespuestaPals)
          time.sleep(2)
          Bot.Jugar()
 
 
# Bucle Socket:
while 1:
  """ Aqui hace todo lo haria cualquier bot, guardar en buffer, etc. """
  for Linea in Temporal:
      # Aqui crea variables como el Nick, Texto enviado, etc.
      if (LineaLista[1]=='001'):
          BotJuego.send('JOIN #Juego\r\n')
          Bot = Botito(Respuesta) #Crea el objeto
      if (LineaLista[1]=='PRIVMSG'):
          Bot.Checkear()
          if (LineaLista[3]==':!comenzar') and Estado == 'Inactivo':
              BotJuego.send('PRIVMSG #Juego :El juego ha sido iniciado por %s\r\n' % NickName)
              Estado = "Activo"
              Bot.Jugar()
  print Temporal

Bueno esta claro el codigo, a pesar de que lo resumi, pero eso es en lo que fallaria, en la parte cuanto activo el reloj Timer.
Me gustaria que alguien sea tan amable y me posteara una pagina web sobre el uso de la libreria Time de Python, he leido la documentacion de la pagina oficial de Python, pero le entiendo poco.
Tambien me gustaria que alguien me diga si los Timers de Python pueden llevar nombres, como en el caso de los Timers de mIRC Scripting, que llevan nombre, segundos o milisegundos, cantidad de acciones y hasta incluso se los puede comparar con un simple IF.
Un ejemplo seria asi:
Código:

//timerPrueba 5 1 echo -a hola
Ese reloj imprimiria 5 veces la palabra "hola" en la ventana activa cada 1 segundo y ese Timer lleva de nombre "Prueba".
Para una comparacion para saber si esta ese reloj activado seria:
Código:

if ($timer(Prueba) == $null) echo -a El reloj no esta activado
else El reloj si esta activado.

Solo pego un codigo de ejemplo para saber si en Python esto es posible.
Bueno en el codigo que pegue de Python ahi se puede observar lo que esta mal, pero yo no le encuentro la falla, el problema es que al hacer (por decirlo de alguna manera) el bucle de time.sleep ahi el bot deja de leer lo que recibiria en el buffer, porque no puedo ver en la consola las palabras que escribo ni tampoco puedo detener el bot, y cuando escribo las palabras correctas tampoco las toma, pero si quitara los timers, ahi si me funciona sin problemas.
¿Cual seria el problema y como puedo solucionarlo?
Desde ya estoy agradecido por su tiempo y ayuda.
Muchas gracias.
Buena suerte!!
PD: He notado que el bot a pasado casi 10 minutos y no ha caido del servidor, que en realidad deberia ya que supuestamente no esta recibiendo datos y en este caso, aparentemente esta recibiendo los PINGs del servidor y el bot devuelve los PONGs, de hecho si esto no lo recibiria no podria responder y el bot caeria con el msj "Ping timeout".
Los Pings que envia el servidor son de aproximadamente 1 minuto y medio.

Viewing all articles
Browse latest Browse all 11602

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>