diff --git a/pokecli.py b/pokecli.py index 6366ea194f..bfc9bfd2ea 100644 --- a/pokecli.py +++ b/pokecli.py @@ -328,7 +328,17 @@ def report_summary(bot): return # Bot didn't actually start, no metrics to show. metrics = bot.metrics - metrics.capture_stats() + try: + metrics.capture_stats() + except NotLoggedInException: + bot.event_manager.emit( + 'api_error', + sender=bot, + level='info', + formatted='Not logged in, reconnecting in {:d} seconds'.format(5) + ) + time.sleep(5) + return logger.info('') logger.info('Ran for {}'.format(metrics.runtime())) logger.info('Total XP Earned: {} Average: {:.2f}/h'.format(metrics.xp_earned(), metrics.xp_per_hour())) diff --git a/pokemongo_bot/__init__.py b/pokemongo_bot/__init__.py index dc6d2f62ed..a0cd4da6d9 100644 --- a/pokemongo_bot/__init__.py +++ b/pokemongo_bot/__init__.py @@ -135,6 +135,9 @@ def __init__(self, db, config): self.catch_disabled = False self.capture_locked = False # lock catching while moving to VIP pokemon + + # Inform bot if there's a response + self.empty_response = False client_id_file_path = os.path.join(_base_dir, 'data', 'mqtt_client_id') saved_info = shelve.open(client_id_file_path) @@ -955,6 +958,9 @@ def check_session(self, position): def login(self): status = {} + retry = 0 + quit_login = False + self.event_manager.emit( 'login_started', sender=self, @@ -963,21 +969,36 @@ def login(self): ) lat, lng = self.position[0:2] self.api.set_position(lat, lng, self.alt) # or should the alt kept to zero? + + while not quit_login: + try: + self.api.login( + self.config.auth_service, + str(self.config.username), + str(self.config.password)) + # No exception, set quit_login = true + quit_login = True + except AuthException as e: + self.event_manager.emit( + 'login_failed', + sender=self, + level='info', + formatted='Login process failed: {}'.format(e) + ) + # Exception encountered. Retry 3 times, everytime increase wait time 5 secs + retry += 1 + sleeptime = retry*5 - try: - self.api.login( - self.config.auth_service, - str(self.config.username), - str(self.config.password)) - except AuthException as e: - self.event_manager.emit( - 'login_failed', - sender=self, - level='info', - formatted='Login process failed: {}'.format(e) - ) - - sys.exit() + self.event_manager.emit( + 'login_failed', + sender=self, + level='info', + formatted="Retry {} time(s) for {} secs".format(retry,sleeptime) + ) + sleep(retry*5) + # Quit after 3rd tries + if retry == 3: + sys.exit() with self.database as conn: c = conn.cursor() @@ -1545,38 +1566,41 @@ def heartbeat(self): responses = request.call() except NotLoggedInException: self.logger.warning('Unable to login, retying') + self.empty_response = True except: self.logger.warning('Error occured in heatbeat, retying') - - if responses['responses']['GET_PLAYER']['success'] == True: - # we get the player_data anyway, might as well store it - self._player = responses['responses']['GET_PLAYER']['player_data'] - self.event_manager.emit( - 'player_data', - sender=self, - level='debug', - formatted='player_data: {player_data}', - data={'player_data': self._player} - ) - if responses['responses']['CHECK_AWARDED_BADGES']['success'] == True: - # store awarded_badges reponse to be used in a task or part of heartbeat - self._awarded_badges = responses['responses']['CHECK_AWARDED_BADGES'] - - if 'awarded_badges' in self._awarded_badges: - i = 0 - for badge in self._awarded_badges['awarded_badges']: - badgelevel = self._awarded_badges['awarded_badge_levels'][i] - badgename = badge_type_pb2._BADGETYPE.values_by_number[badge].name - i += 1 + self.empty_response = True + + if not self.empty_response: + if responses['responses']['GET_PLAYER']['success'] == True: + # we get the player_data anyway, might as well store it + self._player = responses['responses']['GET_PLAYER']['player_data'] self.event_manager.emit( - 'badges', + 'player_data', sender=self, - level='info', - formatted='awarded badge: {badge}, lvl {level}', - data={'badge': badgename, - 'level': badgelevel} + level='debug', + formatted='player_data: {player_data}', + data={'player_data': self._player} ) - human_behaviour.action_delay(3, 10) + if responses['responses']['CHECK_AWARDED_BADGES']['success'] == True: + # store awarded_badges reponse to be used in a task or part of heartbeat + self._awarded_badges = responses['responses']['CHECK_AWARDED_BADGES'] + + if 'awarded_badges' in self._awarded_badges: + i = 0 + for badge in self._awarded_badges['awarded_badges']: + badgelevel = self._awarded_badges['awarded_badge_levels'][i] + badgename = badge_type_pb2._BADGETYPE.values_by_number[badge].name + i += 1 + self.event_manager.emit( + 'badges', + sender=self, + level='info', + formatted='awarded badge: {badge}, lvl {level}', + data={'badge': badgename, + 'level': badgelevel} + ) + human_behaviour.action_delay(3, 10) try: self.web_update_queue.put_nowait(True) # do this outside of thread every tick @@ -1588,7 +1612,9 @@ def heartbeat(self): def update_web_location_worker(self): while True: self.web_update_queue.get() - self.update_web_location() + #skip undate if no response + if not self.empty_response: + self.update_web_location() def display_player_info(self): player_stats = player() diff --git a/pokemongo_bot/cell_workers/follow_path.py b/pokemongo_bot/cell_workers/follow_path.py index 272fa9f6af..6ac08254af 100644 --- a/pokemongo_bot/cell_workers/follow_path.py +++ b/pokemongo_bot/cell_workers/follow_path.py @@ -27,25 +27,29 @@ class FollowPath(BaseTask): def initialize(self): self._process_config() - self.points = self.load_path() - self.status = STATUS_MOVING - self.waiting_end_time = 0 - self.distance_unit = self.bot.config.distance_unit - self.append_unit = False + if self.enable: + self.points = self.load_path() + self.status = STATUS_MOVING + self.waiting_end_time = 0 + self.distance_unit = self.bot.config.distance_unit + self.append_unit = False - if self.path_start_mode == 'closest': - self.ptr = self.find_closest_point_idx(self.points) + if self.path_start_mode == 'closest': + self.ptr = self.find_closest_point_idx(self.points) - else: - self.ptr = 0 + else: + self.ptr = 0 - if self.disable_location_output: - self.emit_event( - 'followpath_output_disabled', - formatted="Bot in follow path mode, position update disabled. You will not be inform of path taken by bot." - ) + if self.disable_location_output: + self.emit_event( + 'followpath_output_disabled', + formatted="Bot in follow path mode, position update disabled. You will not be inform of path taken by bot." + ) + else: + self.status = STATUS_FINISHED def _process_config(self): + self.enable = self.config.get("enable", True) self.path_file = self.config.get("path_file", None) self.path_mode = self.config.get("path_mode", "linear") self.path_start_mode = self.config.get("path_start_mode", "first") diff --git a/pokemongo_bot/cell_workers/spin_fort.py b/pokemongo_bot/cell_workers/spin_fort.py index 2e231f8cc2..1686a16052 100644 --- a/pokemongo_bot/cell_workers/spin_fort.py +++ b/pokemongo_bot/cell_workers/spin_fort.py @@ -108,6 +108,7 @@ def work(self): 'items': awards } ) + #time.sleep(10) else: self.emit_event( 'pokestop_empty',