def incoming_loop(self): while self.should_run: message = self.ws_client.receive() if message == None: break event = events.parse_event_json(message) if isinstance(event, events.AuthenticationResponse): if event.authenticated: self.username = event.username elif isinstance(event, events.JoinSpaceResponse): if event.joined: self.space_id = event.space_id self.scene = Scene().populate(simplejson.loads(event.scene_doc)) elif isinstance(event, events.NodeAdded): json = simplejson.loads(event.json_data) if 'children' in json: node = Group().populate(json) else: node = Object().populate(json) parent = self.scene.get_node(event.parent_id) parent.children.append(node) elif isinstance(event, events.UserExited): user_node = self.scene.get_user(event.username) if user_node: self.scene.remove_node(user_node) elif isinstance(event, events.PlaceableMoved): node = self.scene.get_node(event.uid) if node: print 'should set the new node position' #thing.position = Position().hydrate(event.position) #thing.orientation = Orientation().hydrate(event.orientation) elif isinstance(event, events.PoolInfo) or isinstance(event, events.TemplateUpdated) or isinstance(event, events.Heartbeat): pass # don't care else: print 'Unhandled incoming space event: %s' % event if self.event_handler: self.event_handler(event)
def handle_incoming(self): """A loop which handles incoming messages. Does not return until the connection closes.""" while not self.disconnected: incoming_data = receive_web_socket_message(self.client_socket) if incoming_data == None: break #print 'Incoming:', incoming_data event = events.parse_event_json(incoming_data) if not event: print "Could not read an event from the data: %s" % data continue response_event = None if isinstance(event, events.AuthenticationRequest): user = self.user_from_session_key(event.session_id) if user.is_authenticated(): #print "Authed: %s" % user.username self.user = user response_event = events.AuthenticationResponse(True, user.username) else: print "Auth failure with session id %s" % event.session_id response_event = events.AuthenticationResponse(False) elif isinstance(event, events.PoolInfoRequest): if not self.user: print 'Attemped unauthed pool info request' else: space_infos = [{'name':sim.space.name, 'url':sim.space.get_absolute_url()} for sim in self.server.sim_pool.simulators] response_event = events.PoolInfo({ 'space_infos':space_infos }) elif isinstance(event, events.JoinSpaceRequest): if not self.user: print 'Attemped unauthed join space' response_event = events.JoinSpaceResponse(event.space_id) else: try: space = Space.objects.get(pk=event.space_id) sim = self.server.sim_pool.get_simulator(space.id) if not sim: print 'Could not find a sim for space: %s' % space.id allow_join, space_member = Space.objects.get_membership(space, self.user) response_event = events.JoinSpaceResponse(space.id, allow_join) if allow_join: self.space_id = space.id try: response_event.scene_doc = to_json(sim.scene) except: print "Could not log in: %s" % pprint.pformat(traceback.format_exc()) else: print 'Attempted disallowed join space' if space_member: response_event.is_member = True response_event.is_admin = space_member.is_admin response_event.is_editor = space_member.is_editor except: traceback.print_exc() response_event = events.JoinSpaceResponse(event.space_id) elif isinstance(event, events.TemplateUpdated): if self.user and self.user.is_staff: event.connection = self for simulator in self.server.sim_pool.simulators: simulator.event_queue.put(event) elif self.space_id: simulator = self.server.sim_pool.get_simulator(self.space_id) if simulator: event.connection = self simulator.event_queue.put(event) else: print "Received an event for an absent simulator %s" % event else: print "Received unhandled event %s" % event.to_json() if response_event: #print 'Outgoing: ', to_json(response_event) self.client_socket.send('\x00') self.client_socket.send(response_event.to_json()) self.client_socket.send('\xff') self.finish()