class Server(object): SHUTDOWN_TIMEOUT = 60 def __init__(self): self._cfg = _load_cfg() try: with open(os.path.join(APP_PATH, 'data.json')) as json_fp: user_data = json.load(json_fp) except IOError: logging.warning('No user data') user_data = {} self._download_manager = DownloadManager(self._cfg['user'], self._cfg['password'], user_data.get('session_id')) def stop(self): self._bottle_server.stop() def _on_heartbeat_timeout(self, heartbeat): ''' Called if we haven't had a heartbeat in a while ''' if any(self._download_manager.get_downloading()): logging.debug('No heartbeat but downloading.... Still alive') heartbeat.beat() else: logging.debug('No heartbeat, no downloads. Stopping...') self._bottle_server.stop() def _on_dl_finished(self, path, file_name): ''' TODO this needs sorting ''' import shutil save_path = os.path.join(self._cfg['save_location'], file_name) logging.debug('Moving <%s> to <%s>' % (path, save_path,)) shutil.move(path, save_path) def start_download(self, game, game_id, mod_id, file_id): self._download_manager.download(self._on_dl_finished, game, game_id, mod_id, file_id) def start_server(self, host, port): self._bottle_server = StoppableWSGIRefServer(host=host, port=port) hb = Heartbeat() install(partial(local_variable_plugin, { 'cfg':self._cfg, 'heartbeat': hb, 'server' : self, 'download_manager' : self._download_manager, })) hb_monitor = HeartbeatMonitor(hb, self.SHUTDOWN_TIMEOUT, self._on_heartbeat_timeout) hb_monitor.monitor() run(server=self._bottle_server) self._download_manager.stop() hb_monitor.stop() _save_cfg(self._cfg)