diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 7606647a3c..725360784b 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -65,3 +65,4 @@ * Nivong * kestel * joaodragao + * extink diff --git a/pokemongo_bot/event_handlers/colored_logging_handler.py b/pokemongo_bot/event_handlers/colored_logging_handler.py index 6c527511ba..cedd0e53dc 100644 --- a/pokemongo_bot/event_handlers/colored_logging_handler.py +++ b/pokemongo_bot/event_handlers/colored_logging_handler.py @@ -1,87 +1,88 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -import time -import sys -import struct + +import logging from pokemongo_bot.event_manager import EventHandler + class ColoredLoggingHandler(EventHandler): EVENT_COLOR_MAP = { - 'api_error': 'red', - 'bot_exit': 'red', - 'bot_start': 'green', - 'config_error': 'red', - 'egg_already_incubating': 'yellow', - 'egg_hatched': 'green', - 'future_pokemon_release': 'yellow', - 'incubate': 'green', - 'incubator_already_used': 'yellow', - 'inventory_full': 'yellow', - 'item_discard_fail': 'red', - 'item_discarded': 'green', - 'keep_best_release': 'green', - 'level_up': 'green', - 'level_up_reward': 'green', - 'location_cache_error': 'yellow', - 'location_cache_ignored': 'yellow', - 'login_failed': 'red', - 'login_successful': 'green', - 'lucky_egg_error': 'red', - 'move_to_map_pokemon_encounter': 'green', - 'move_to_map_pokemon_fail': 'red', - 'next_egg_incubates': 'yellow', - 'next_sleep': 'green', - 'no_pokeballs': 'red', - 'pokemon_appeared': 'yellow', - 'pokemon_capture_failed': 'red', - 'pokemon_caught': 'blue', - 'pokemon_evolved': 'green', - 'pokemon_fled': 'red', - 'pokemon_inventory_full': 'red', - 'pokemon_nickname_invalid': 'red', - 'pokemon_not_in_range': 'yellow', - 'pokemon_release': 'green', - 'pokemon_vanished': 'red', - 'pokestop_empty': 'yellow', - 'pokestop_searching_too_often': 'yellow', - 'rename_pokemon': 'green', - 'skip_evolve': 'yellow', - 'softban': 'red', - 'spun_pokestop': 'cyan', - 'threw_berry_failed': 'red', - 'unknown_spin_result': 'red', - 'unset_pokemon_nickname': 'red', - 'vip_pokemon': 'red', + 'api_error': 'red', + 'bot_exit': 'red', + 'bot_start': 'green', + 'config_error': 'red', + 'egg_already_incubating': 'yellow', + 'egg_hatched': 'green', + 'future_pokemon_release': 'yellow', + 'incubate': 'green', + 'incubator_already_used': 'yellow', + 'inventory_full': 'yellow', + 'item_discard_fail': 'red', + 'item_discarded': 'green', + 'keep_best_release': 'green', + 'level_up': 'green', + 'level_up_reward': 'green', + 'location_cache_error': 'yellow', + 'location_cache_ignored': 'yellow', + 'login_failed': 'red', + 'login_successful': 'green', + 'lucky_egg_error': 'red', + 'move_to_map_pokemon_encounter': 'green', + 'move_to_map_pokemon_fail': 'red', + 'next_egg_incubates': 'yellow', + 'next_sleep': 'green', + 'no_pokeballs': 'red', + 'pokemon_appeared': 'yellow', + 'pokemon_capture_failed': 'red', + 'pokemon_caught': 'blue', + 'pokemon_evolved': 'green', + 'pokemon_fled': 'red', + 'pokemon_inventory_full': 'red', + 'pokemon_nickname_invalid': 'red', + 'pokemon_not_in_range': 'yellow', + 'pokemon_release': 'green', + 'pokemon_vanished': 'red', + 'pokestop_empty': 'yellow', + 'pokestop_searching_too_often': 'yellow', + 'rename_pokemon': 'green', + 'skip_evolve': 'yellow', + 'softban': 'red', + 'spun_pokestop': 'cyan', + 'threw_berry_failed': 'red', + 'unknown_spin_result': 'red', + 'unset_pokemon_nickname': 'red', + 'vip_pokemon': 'red', # event names for 'white' still here to remember that these events are already determined its color. - 'arrived_at_cluster': 'white', - 'arrived_at_fort': 'white', - 'bot_sleep': 'white', - 'catchable_pokemon': 'white', - 'found_cluster': 'white', - 'incubate_try': 'white', - 'load_cached_location': 'white', - 'location_found': 'white', - 'login_started': 'white', - 'lured_pokemon_found': 'white', - 'move_to_map_pokemon_move_towards': 'white', - 'move_to_map_pokemon_teleport_back': 'white', - 'move_to_map_pokemon_updated_map': 'white', - 'moving_to_fort': 'white', - 'moving_to_lured_fort': 'white', - 'pokemon_catch_rate': 'white', - 'pokestop_on_cooldown': 'white', - 'pokestop_out_of_range': 'white', - 'polyline_request': 'white', - 'position_update': 'white', - 'set_start_location': 'white', - 'softban_fix': 'white', - 'softban_fix_done': 'white', - 'spun_fort': 'white', - 'threw_berry': 'white', - 'threw_pokeball': 'white', - 'used_lucky_egg': 'white' + 'arrived_at_cluster': 'white', + 'arrived_at_fort': 'white', + 'bot_sleep': 'white', + 'catchable_pokemon': 'white', + 'found_cluster': 'white', + 'incubate_try': 'white', + 'load_cached_location': 'white', + 'location_found': 'white', + 'login_started': 'white', + 'lured_pokemon_found': 'white', + 'move_to_map_pokemon_move_towards': 'white', + 'move_to_map_pokemon_teleport_back': 'white', + 'move_to_map_pokemon_updated_map': 'white', + 'moving_to_fort': 'white', + 'moving_to_lured_fort': 'white', + 'pokemon_catch_rate': 'white', + 'pokemon_evolve_fail': 'white', + 'pokestop_on_cooldown': 'white', + 'pokestop_out_of_range': 'white', + 'polyline_request': 'white', + 'position_update': 'white', + 'set_start_location': 'white', + 'softban_fix': 'white', + 'softban_fix_done': 'white', + 'spun_fort': 'white', + 'threw_berry': 'white', + 'threw_pokeball': 'white', + 'used_lucky_egg': 'white' } CONTINUOUS_EVENT_NAMES = [ 'catchable_pokemon', @@ -89,83 +90,29 @@ class ColoredLoggingHandler(EventHandler): 'spun_fort' ] COLOR_CODE = { - 'red': '91', - 'green': '92', - 'yellow': '93', - 'blue': '94', - 'cyan': '96' + 'gray': '\033[90m', + 'red': '\033[91m', + 'green': '\033[92m', + 'yellow': '\033[93m', + 'blue': '\033[94m', + 'magenta': '\033[95m', + 'cyan': '\033[96m', + 'white': '\033[97m', + 'reset': '\033[0m' } - def __init__(self): - self._last_event = None - try: - # this `try ... except` is for ImportError on Windows - import fcntl - import termios - self._ioctl = fcntl.ioctl - self._TIOCGWINSZ = termios.TIOCGWINSZ - except ImportError: - self._ioctl = None - self._TIOCGWINSZ = None - def handle_event(self, event, sender, level, formatted_msg, data): - # Prepare message string - message = None - if formatted_msg: - try: - message = formatted_msg.decode('utf-8') - except UnicodeEncodeError: - message = formatted_msg - else: - message = '{}'.format(str(data)) - - # Replace message if necessary - if event == 'catchable_pokemon': - message = 'Something rustles nearby!' + logger = logging.getLogger(type(sender).__name__) - # Truncate previous line if same event continues - if event in ColoredLoggingHandler.CONTINUOUS_EVENT_NAMES and self._last_event == event and sys.stdout.isatty(): - # Filling with "' ' * terminal_width" in order to completely clear last line - terminal_width = self._terminal_width() - if terminal_width: - sys.stdout.write('\r{}\r'.format(' ' * terminal_width)) - else: - sys.stdout.write('\r') - else: - sys.stdout.write("\n") - - color_name = None - if event in ColoredLoggingHandler.EVENT_COLOR_MAP: - color_name = ColoredLoggingHandler.EVENT_COLOR_MAP[event] - - # Change color if necessary + color = self.COLOR_CODE['white'] + if event in self.EVENT_COLOR_MAP: + color = self.COLOR_CODE[self.EVENT_COLOR_MAP[event]] if event == 'egg_hatched' and data.get('pokemon', 'error') == 'error': - # `egg_hatched` event will be dispatched in both cases: hatched pokemon info is successfully taken or not. - # change color from 'green' to 'red' in case of error. - color_name = 'red' + color = self.COLOR_CODE['red'] + formatted_msg = '{}{}{}'.format(color, formatted_msg, self.COLOR_CODE['reset']) - if color_name in ColoredLoggingHandler.COLOR_CODE: - sys.stdout.write( - '[{time}] \033[{color}m{message}\033[0m'.format( - time=time.strftime("%H:%M:%S"), - color=ColoredLoggingHandler.COLOR_CODE[color_name], - message=message - ) - ) + if formatted_msg: + message = "[{}] {}".format(event, formatted_msg) else: - sys.stdout.write('[{time}] {message}'.format( - time=time.strftime("%H:%M:%S"), - message=message - )) - - sys.stdout.flush() - self._last_event = event - - def _terminal_width(self): - if self._ioctl is None or self._TIOCGWINSZ is None: - return None - - h, w, hp, wp = struct.unpack(str('HHHH'), - self._ioctl(0, self._TIOCGWINSZ, - struct.pack(str('HHHH'), 0, 0, 0, 0))) - return w + message = '{}: {}'.format(event, str(data)) + getattr(logger, level)(message)