Esempio n. 1
0
	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)
Esempio n. 2
0
	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()