| 22 | |
| 23 | |
| 24 | class EventManager(object): |
| 25 | |
| 26 | def __init__(self, limit_output=False, *handlers): |
| 27 | self._registered_events = dict() |
| 28 | self._handlers = list(handlers) or [] |
| 29 | self._last_event = None |
| 30 | self._limit_output = limit_output |
| 31 | |
| 32 | def event_report(self): |
| 33 | for event, parameters in self._registered_events.iteritems(): |
| 34 | print('-'*80) |
| 35 | print('Event: {}'.format(event)) |
| 36 | if parameters: |
| 37 | print('Parameters:') |
| 38 | for parameter in parameters: |
| 39 | print('* {}'.format(parameter)) |
| 40 | |
| 41 | def add_handler(self, event_handler): |
| 42 | self._handlers.append(event_handler) |
| 43 | |
| 44 | def register_event(self, name, parameters=[]): |
| 45 | self._registered_events[name] = parameters |
| 46 | |
| 47 | def emit(self, event, sender=None, level='info', formatted='', data={}): |
| 48 | if not sender: |
| 49 | raise ArgumentError('Event needs a sender!') |
| 50 | |
| 51 | levels = ['info', 'warning', 'error', 'critical', 'debug'] |
| 52 | if not level in levels: |
| 53 | raise ArgumentError('Event level needs to be in: {}'.format(levels)) |
| 54 | |
| 55 | if event not in self._registered_events: |
| 56 | raise EventNotRegisteredException("Event %s not registered..." % event) |
| 57 | |
| 58 | if self._limit_output: |
| 59 | if (event == self._last_event) and (event in ["moving_to_fort", "moving_to_lured_fort", "position_update", "moving_to_hunter_target"]): |
| 60 | stdout.write("\033[1A\033[0K\r") |
| 61 | stdout.flush() |
| 62 | |
| 63 | if level == "info" and formatted: |
| 64 | self._last_event = event |
| 65 | |
| 66 | # verify params match event |
| 67 | parameters = self._registered_events[event] |
| 68 | if parameters: |
| 69 | for k, v in data.iteritems(): |
| 70 | if k not in parameters: |
| 71 | raise EventMalformedException("Event %s does not require parameter %s" % (event, k)) |
| 72 | |
| 73 | formatted_msg = formatted.format(**data) |
| 74 | |
| 75 | # send off to the handlers |
| 76 | for handler in self._handlers: |
| 77 | handler.handle_event(event, sender, level, formatted_msg, data) |
no outgoing calls
no test coverage detected