From 774e85272a6d17ad52f16f1e6f234296fc0fbf57 Mon Sep 17 00:00:00 2001 From: Douglas Camata Date: Sun, 31 Jul 2016 03:23:41 +0200 Subject: [PATCH 1/5] improved websocket and logging handler --- pokecli.py | 16 ++++++++++++---- pokemongo_bot/__init__.py | 7 ++++--- pokemongo_bot/event_handlers/logging_handler.py | 7 +++++-- pokemongo_bot/event_handlers/socketio_handler.py | 13 ++++++++++--- pokemongo_bot/event_manager.py | 6 ++++-- 5 files changed, 35 insertions(+), 14 deletions(-) diff --git a/pokecli.py b/pokecli.py index 502c50f2cd..2d2444a5c9 100755 --- a/pokecli.py +++ b/pokecli.py @@ -146,8 +146,16 @@ def init_config(): parser, load, short_flag="-ws", - long_flag="--websocket_server", - help="Start websocket server (format 'host:port')", + long_flag="--websocket.server_url", + help="Connect to websocket server at given url", + default=False + ) + add_config( + parser, + load, + short_flag="-ws", + long_flag="--websocket.start_embedded_server", + help="Start embedded websocket server", default=False ) add_config( @@ -251,7 +259,7 @@ def init_config(): type=str, default=None ) - + add_config( parser, load, @@ -410,7 +418,7 @@ def init_config(): config.hatch_eggs = load.get("hatch_eggs", True) config.longer_eggs_first = load.get("longer_eggs_first", True) - + config.vips = load.get('vips',{}) if config.auth_service not in ['ptc', 'google']: diff --git a/pokemongo_bot/__init__.py b/pokemongo_bot/__init__.py index f7d64c5e34..2bd6be5c05 100644 --- a/pokemongo_bot/__init__.py +++ b/pokemongo_bot/__init__.py @@ -64,11 +64,12 @@ def start(self): def _setup_event_system(self): handlers = [LoggingHandler()] if self.config.websocket_server: - websocket_handler = SocketIoHandler(self.config.websocket_server) + websocket_handler = SocketIoHandler(self.config.websocket_server_url) handlers.append(websocket_handler) - self.sio_runner = SocketIoRunner(self.config.websocket_server) - self.sio_runner.start_listening_async() + if self.config.websocket_start_embedded_server: + self.sio_runner = SocketIoRunner(self.config.websocket_server_url) + self.sio_runner.start_listening_async() self.event_manager = EventManager(*handlers) diff --git a/pokemongo_bot/event_handlers/logging_handler.py b/pokemongo_bot/event_handlers/logging_handler.py index af4e9fae65..c54f435e19 100644 --- a/pokemongo_bot/event_handlers/logging_handler.py +++ b/pokemongo_bot/event_handlers/logging_handler.py @@ -4,7 +4,10 @@ class LoggingHandler(EventHandler): - def handle_event(self, event, sender, level, data): + def handle_event(self, event, sender, level, formatted_msg, data): logger = logging.getLogger(type(sender).__name__) - message = '{}: {}'.format(event, str(data)) + if formatted_msg: + message = formatted_msg + else: + message = '{}: {}'.format(event, str(data)) getattr(logger, level)(message) diff --git a/pokemongo_bot/event_handlers/socketio_handler.py b/pokemongo_bot/event_handlers/socketio_handler.py index 22dc443802..3c850ca4c4 100644 --- a/pokemongo_bot/event_handlers/socketio_handler.py +++ b/pokemongo_bot/event_handlers/socketio_handler.py @@ -11,7 +11,14 @@ def __init__(self, url): self.host, port_str = url.split(':') self.port = int(port_str) - - def handle_event(self, event, sender, level, data): + def handle_event(self, event, sender, level, msg, data): + if msg: + date['msg'] = msg with SocketIO(self.host, self.port) as sio: - sio.emit('bot:broadcast', {'event': event, 'data': data}) + sio.emit( + 'bot:broadcast', + { + 'event': event, + 'data': data, + } + ) diff --git a/pokemongo_bot/event_manager.py b/pokemongo_bot/event_manager.py index c7a31d70de..9af63690e6 100644 --- a/pokemongo_bot/event_manager.py +++ b/pokemongo_bot/event_manager.py @@ -25,7 +25,7 @@ def add_handler(self, event_handler): def register_event(self, name, parameters=None): self._registered_events[name] = parameters - def emit(self, event, sender=None, level='info', data={}): + def emit(self, event, sender=None, level='info', formatted=None, data={}): if not sender: raise ArgumentError('Event needs a sender!') @@ -42,6 +42,8 @@ def emit(self, event, sender=None, level='info', data={}): if k not in parameters: raise EventMalformedException("Event %s does not require parameter %s" % (event, k)) + formatted_msg = formatted.format(**data) + # send off to the handlers for handler in self._handlers: - handler.handle_event(event, sender, level, data) + handler.handle_event(event, sender, level, formatted_msg, data) From db59e8a4e7df9cd1cf4b0a4bc8ba2c49ad23a10a Mon Sep 17 00:00:00 2001 From: Douglas Camata Date: Sun, 31 Jul 2016 06:43:15 +0200 Subject: [PATCH 2/5] added support for remote command execution through websocket and a player_info call example --- pokecli.py | 10 +++++- pokemongo_bot/socketio_server/app.py | 10 ++++++ pokemongo_bot/websocket_remote_control.py | 39 +++++++++++++++++++++++ 3 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 pokemongo_bot/websocket_remote_control.py diff --git a/pokecli.py b/pokecli.py index 2d2444a5c9..0f6629cd38 100755 --- a/pokecli.py +++ b/pokecli.py @@ -153,11 +153,19 @@ def init_config(): add_config( parser, load, - short_flag="-ws", + short_flag="-wss", long_flag="--websocket.start_embedded_server", help="Start embedded websocket server", default=False ) + add_config( + parser, + load, + short_flag="-wsr", + long_flag="--websocket.remote_control", + help="Enable remote control through websocket (requires websocekt server url)", + default=False + ) add_config( parser, load, diff --git a/pokemongo_bot/socketio_server/app.py b/pokemongo_bot/socketio_server/app.py index 583b3aa404..4aac36c202 100644 --- a/pokemongo_bot/socketio_server/app.py +++ b/pokemongo_bot/socketio_server/app.py @@ -15,6 +15,16 @@ "websocket_client_connected", ) +# client asks for data +@sio.on('remote:send_request') +def remote_control(sid, command): + sio.emit('bot:process_request', data=command) + +# sending bot response to client +@sio.on('bot:send_reply') +def request_reply(sid, response): + sio.emit(response['command'], response['response']) + @sio.on('bot:broadcast') def bot_broadcast(sid, env): sio.emit(env['event'], data=env['data']) diff --git a/pokemongo_bot/websocket_remote_control.py b/pokemongo_bot/websocket_remote_control.py new file mode 100644 index 0000000000..5567bbba58 --- /dev/null +++ b/pokemongo_bot/websocket_remote_control.py @@ -0,0 +1,39 @@ +import threading +from socketIO_client import SocketIO, BaseNamespace + + +class WebsocketRemoteControl(object): + + + def __init__(self, bot): + self.bot = bot + self.host, port_str = self.bot.config.websocket_server_url.split(':') + self.port = int(port_str) + self.sio = SocketIO(self.host, self.port) + self.sio.on('bot:process_request', self.on_remote_command) + + def start(self): + self.thread.start() + return self + + def process_messages(self): + while True: + self.sio.wait(5) + + def on_remote_command(self, command): + name = command['name'] + command_handler = getattr(self, name) + if 'args' in command: + command_handler(*args) + return + command_handler() + + def get_player_info(self): + player_info = self.bot.get_inventory()['responses']['GET_INVENTORY'] + self.sio.emit( + 'bot:send_reply', + { + 'response': player_info, + 'command': 'get_player_info' + } + ) From daaa74fd85a5bd37c2bcd8b9086a35e66daeaf63 Mon Sep 17 00:00:00 2001 From: Douglas Camata Date: Sun, 31 Jul 2016 06:56:58 +0200 Subject: [PATCH 3/5] adding a missing variable --- pokemongo_bot/websocket_remote_control.py | 1 + 1 file changed, 1 insertion(+) diff --git a/pokemongo_bot/websocket_remote_control.py b/pokemongo_bot/websocket_remote_control.py index 5567bbba58..18751e1d04 100644 --- a/pokemongo_bot/websocket_remote_control.py +++ b/pokemongo_bot/websocket_remote_control.py @@ -11,6 +11,7 @@ def __init__(self, bot): self.port = int(port_str) self.sio = SocketIO(self.host, self.port) self.sio.on('bot:process_request', self.on_remote_command) + self.thread = threading.Thread(target=self.process_messages) def start(self): self.thread.start() From e022b51fb245b98849bfb55c8e8b710bb71cb557 Mon Sep 17 00:00:00 2001 From: Douglas Camata Date: Sun, 31 Jul 2016 07:00:10 +0200 Subject: [PATCH 4/5] only execute remote command if it exists and is callable, else return command not found --- pokemongo_bot/websocket_remote_control.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/pokemongo_bot/websocket_remote_control.py b/pokemongo_bot/websocket_remote_control.py index 18751e1d04..7ccaa23556 100644 --- a/pokemongo_bot/websocket_remote_control.py +++ b/pokemongo_bot/websocket_remote_control.py @@ -23,7 +23,16 @@ def process_messages(self): def on_remote_command(self, command): name = command['name'] - command_handler = getattr(self, name) + command_handler = getattr(self, name, None) + if not command_handler or not callable(command_handler): + self.sio.emit( + 'bot:send_reply', + { + 'response': '', + 'command': 'command_not_found' + } + ) + return if 'args' in command: command_handler(*args) return From ff363961391c848c4d45a685adbd978aedcff596 Mon Sep 17 00:00:00 2001 From: Douglas Camata Date: Sun, 31 Jul 2016 07:05:35 +0200 Subject: [PATCH 5/5] wait forever instead of 5 secs in an infinite loop --- pokemongo_bot/websocket_remote_control.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pokemongo_bot/websocket_remote_control.py b/pokemongo_bot/websocket_remote_control.py index 7ccaa23556..cd8e04e0fe 100644 --- a/pokemongo_bot/websocket_remote_control.py +++ b/pokemongo_bot/websocket_remote_control.py @@ -18,8 +18,7 @@ def start(self): return self def process_messages(self): - while True: - self.sio.wait(5) + self.sio.wait() def on_remote_command(self, command): name = command['name']