class SharedData(metaclass=Singleton): def __init__(self): print("Shared Data initializing....", end="") self._online = {} self._players = {} self._all_ufos = {} self._all_bases = {} self._sessions = {} self._chat = Chat() self._map = Map(1, 1) self._log = Logger('XFF', 'SharedData') self._map_actions = {} self._skill_queues = [] self._loop = GeoLoop() self.organizations = {} self.NPCs = {} self.havens = {} self.mongo_helper = mongohelper.MongoHelper() # Populate UFOs collection with default objects if config.BACKSERVER_POPULATE_MONGO: self.mongo_helper.add_ufo(UFOs.Probe()) self.mongo_helper.add_ufo(UFOs.SmallScout()) self.mongo_helper.add_ufo(UFOs.MediumScout()) self.mongo_helper.add_ufo(UFOs.LargeScout()) self.mongo_helper.add_site(GroundSite.BasicSectoidOperation()) # Load Collections from Mongo self._ufos = self.mongo_helper.get_all_ufos() self._sites = self.mongo_helper.get_all_sites() print("OK") def is_online(self, session_id): return session_id in self._online def add_online(self, session_id): if session_id not in self._online: self._online[session_id] = None def get_online(self, session_id): if session_id not in self._online: return None else: return self._online[session_id] def add_action(self, action): self._loop.actions.append(action) def start_loop(self): self._loop.start_loop() def add_base(self, b): self._all_bases[b.id] = b self._map.DefaultSector.add_object(b.map_object) def get_default_sector(self): return self._map.DefaultSector def remove_ufo(self, ufo_id): del self._all_ufos[ufo_id] def get_online_player(self, session_id): if self.is_online(session_id) and self._online[session_id]: return self._players[self._online[session_id]] return None def add_online_player(self, session_id, player): self._online[session_id] = player.Token self._players[player.Token] = player self._chat.subscribe_player_to_channel(player, "local") def get_map_object_by_id(self, object_id): if object_id in self._map.DefaultSector.objects: return self._map.DefaultSector.objects[object_id] else: return None def get_all_map_objects_json(self): return self._map.DefaultSector.get_objects_on_map_json() def get_players_on_channel(self, channel): return self._chat.Channels2Players[channel] def get_player_by_token(self, token_id): if token_id in self._players: return self._players[token_id] else: return None def send_message(self, player, channel, message): self._chat.send_message(player, channel, message) def get_base(self, base_id): if base_id in self._all_bases: return self._all_bases[base_id] else: return None def get_combat_site(self, site_id): if site_id in self._all_ufos: return self._all_ufos[site_id] else: return None def spawn_combat_sites(self, site_constructor): probability = random.randint(0, config.EVENTS_MAX_PROBABILITY) sites = [e for e in self._sites if e['probability'] > probability] for u in sites: site = site_constructor(u, SharedData().get_default_sector()) self._all_ufos[site.map_object.id] = site def save_organization(self, o): self.mongo_helper.save_organization(o) def save_npc_character(self, npc): self.mongo_helper.save_npc_character(npc) def save_haven(self, haven): self.mongo_helper.save_haven(haven)