async def cast_entity( entity: Entity, position: PositionComponent, update=True, on_connect=False, reason=None ): assert isinstance(position, PositionComponent) from core.src.world.builder import events_subscriber_service, events_publisher_service loop = asyncio.get_event_loop() if update: current_position = await get_components_for_entity(entity, (PositionComponent, 'coord')) position.add_previous_position(current_position) entity = entity.set_for_update(position).set_room(Room(position)) update_response = await update_entities(entity.set_for_update(position)) if not update_response: LOGGER.core.error( 'Impossible to cast entity {}'.format(entity.entity_id)) return area = Area(position).make_coordinates() listeners = await get_eligible_listeners_for_area(area) entity.entity_id in listeners and listeners.remove(entity.entity_id) if on_connect: await events_publisher_service.on_entity_appear_position(entity, position, reason, targets=listeners) loop.create_task(events_subscriber_service.subscribe_events(entity)) else: pass await events_publisher_service.on_entity_change_position(entity, position, reason, targets=listeners) entity.set_component(position) return True
async def on_message(self, message: typing.Dict): assert message['c'] == 'cmd' if message['n'] not in self._enabled_channels: LOGGER.core.error('Error, message received on closed channel: %s', message) return try: data = message['d'].strip().split(' ') if not data: raise TypeError('Empty command?') entity = Entity(message['e_id'], itsme=True) entity.set_component(SystemComponent(connection=message['n'])) command = self._commands[data[0].lower()] if getattr(command, 'get_self', False): await self._commands[data[0]](entity, *data) else: await self._commands[data[0]](entity, *data[1:]) except KeyError as exc: if settings.RUNNING_TESTS: raise await self._on_error(message, "Command not found: %s" % data[0]) LOGGER.core.exception('Unhandled exception %s', exc) except TypeError as exc: if settings.RUNNING_TESTS: raise await self._on_error(message, "Command error: %s" % str(exc)) LOGGER.core.exception('Unhandled exception %s', exc) except Exception as exc: LOGGER.core.exception('Unhandled exception %s', exc) print(exc)