14 assert sys.version_info >= (3, 5)
 
  16 from presence import Presence
 
  18 def handleInterrupt(sig, frame):
 
  20     if os.getpid() == mainPid:
 
  21         logging.info( "Got stop signal." )
 
  23         for presence in presences:
 
  27     client = nio.AsyncClient(config['server']['url'], config['server']['user'])
 
  30         await client.login(config['server']['password'])
 
  33         for presence in presences:
 
  34             presence_tasks.append( asyncio.create_task(presence.run(client)) )
 
  36         done, pending = await asyncio.wait( presence_tasks,
 
  37                                             return_when = asyncio.FIRST_EXCEPTION )
 
  39         for presence in presences:
 
  45             except Exception as e:
 
  46                 logging.error( "Error running task: %s" % str(e) )
 
  49         logging.info("Closing client...")
 
  52 logging.basicConfig(format='[%(asctime)s] %(levelname)s: %(message)s',
 
  54                     datefmt='%m/%d/%Y %H:%M:%S')
 
  57 signal.signal(signal.SIGINT, handleInterrupt)
 
  58 signal.signal(signal.SIGTERM, handleInterrupt)
 
  62 if len(sys.argv) != 2:
 
  63     print("Usage: %s <config json>" % sys.argv[0])
 
  66 with open(sys.argv[1]) as configFile:
 
  67     config = json.load(configFile)
 
  69 fifo_dir = os.getenv('MTXBOT_FIFO_DIR', '/run/mtxbot')
 
  73     for entry in os.listdir(fifo_dir):
 
  74         fullpath = "%s/%s" % (fifo_dir, entry)
 
  75         if stat.S_ISFIFO(os.stat(fullpath).st_mode):
 
  76             logging.info("Creating presence for %s..." % entry)
 
  77             presences.append( Presence(entry, fullpath) )
 
  78     if len(presences) == 0:
 
  79         logging.error("No fifos could be found!")
 
  83         logging.warning("Main loop exited!")
 
  84         logging.info("Restarting after grace period...")