Sandbox events so exceptions being thrown don't break the client.
This commit is contained in:
		@@ -127,12 +127,18 @@ class Client(object):
 | 
				
			|||||||
        else:
 | 
					        else:
 | 
				
			||||||
            return []
 | 
					            return []
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def _invoke_event(self, event_name, *args, **kwargs):
 | 
				
			||||||
 | 
					        try:
 | 
				
			||||||
 | 
					            self.events[event_name](*args, **kwargs)
 | 
				
			||||||
 | 
					        except Exception as e:
 | 
				
			||||||
 | 
					            pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def _received_message(self, msg):
 | 
					    def _received_message(self, msg):
 | 
				
			||||||
        response = json.loads(str(msg))
 | 
					        response = json.loads(str(msg))
 | 
				
			||||||
        if response.get('op') != 0:
 | 
					        if response.get('op') != 0:
 | 
				
			||||||
            return
 | 
					            return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.events['on_response'](response)
 | 
					        self._invoke_event('on_response', response)
 | 
				
			||||||
        event = response.get('t')
 | 
					        event = response.get('t')
 | 
				
			||||||
        data = response.get('d')
 | 
					        data = response.get('d')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -156,7 +162,7 @@ class Client(object):
 | 
				
			|||||||
            self.keep_alive = _keep_alive_handler(interval, self.ws)
 | 
					            self.keep_alive = _keep_alive_handler(interval, self.ws)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            # we're all ready
 | 
					            # we're all ready
 | 
				
			||||||
            self.events['on_ready']()
 | 
					            self._invoke_event('on_ready')
 | 
				
			||||||
        elif event == 'MESSAGE_CREATE':
 | 
					        elif event == 'MESSAGE_CREATE':
 | 
				
			||||||
            channel = self.get_channel(data.get('channel_id'))
 | 
					            channel = self.get_channel(data.get('channel_id'))
 | 
				
			||||||
            message = Message(channel=channel, **data)
 | 
					            message = Message(channel=channel, **data)
 | 
				
			||||||
@@ -173,7 +179,7 @@ class Client(object):
 | 
				
			|||||||
            older_message = self._get_message(data.get('id'))
 | 
					            older_message = self._get_message(data.get('id'))
 | 
				
			||||||
            if older_message is not None:
 | 
					            if older_message is not None:
 | 
				
			||||||
                message = Message(channel=older_message.channel, **data)
 | 
					                message = Message(channel=older_message.channel, **data)
 | 
				
			||||||
                self.events['on_message_edit'](older_message, message)
 | 
					                self._invoke_event('on_message_edit', older_message, message)
 | 
				
			||||||
                older_message.edited_timestamp = message.edited_timestamp
 | 
					                older_message.edited_timestamp = message.edited_timestamp
 | 
				
			||||||
            else:
 | 
					            else:
 | 
				
			||||||
                # if we couldn't find the message in our cache, just add it to the list
 | 
					                # if we couldn't find the message in our cache, just add it to the list
 | 
				
			||||||
@@ -195,7 +201,7 @@ class Client(object):
 | 
				
			|||||||
                    server.members.remove(user)
 | 
					                    server.members.remove(user)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                # call the event now
 | 
					                # call the event now
 | 
				
			||||||
                self.events['on_status'](server, user, status, data.get('game_id'))
 | 
					                self._invoke_event('on_status', server, user, status, data.get('game_id'))
 | 
				
			||||||
        elif event == 'USER_UPDATE':
 | 
					        elif event == 'USER_UPDATE':
 | 
				
			||||||
            self.user = User(**data)
 | 
					            self.user = User(**data)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -18,6 +18,7 @@ Event Reference
 | 
				
			|||||||
~~~~~~~~~~~~~~~~
 | 
					~~~~~~~~~~~~~~~~
 | 
				
			||||||
 | 
					
 | 
				
			||||||
This page outlines the different types of events listened to by :meth:`Client.event`.
 | 
					This page outlines the different types of events listened to by :meth:`Client.event`.
 | 
				
			||||||
 | 
					All events are 'sandboxed', in that if an exception is thrown while the event is called then it is caught and then ignored.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.. function:: on_ready()
 | 
					.. function:: on_ready()
 | 
				
			||||||
@@ -34,7 +35,8 @@ This page outlines the different types of events listened to by :meth:`Client.ev
 | 
				
			|||||||
.. function:: on_response(response)
 | 
					.. function:: on_response(response)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Called whenever a message is received from the websocket. Used mainly for debugging purposes.
 | 
					    Called whenever a message is received from the websocket. Used mainly for debugging purposes.
 | 
				
			||||||
    The parameter passed is raw data that was parsed via ``json.loads``.
 | 
					    The parameter passed is raw data that was parsed via ``json.loads``. Note that this is called
 | 
				
			||||||
 | 
					    before the :class:`Client` processes the event.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    :param response: The received message response after gone through ``json.loads``.
 | 
					    :param response: The received message response after gone through ``json.loads``.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user