import time from .noSysModule import NoSysModule from .peers import Peer from .events import Events, DynamicEvents from libs.noSys.noSysApiBlueprint import Blueprint from libs.noSys.noSysSocketio import HandlerSocketio class NoSys(NoSysModule): """Core module of NoSys that handles system-level messages.""" def __init__(self, nosys_core): super().__init__(nosys_core) self.nosys_core.subscribe_event(Events.USER_ADDED, self.on_user_added) self.nosys_core.subscribe_event(Events.PEER_CONNECTED, self.on_peer_connected) def setup(self): self.nosys_core.modules.api.register_blueprint(Blueprint(self).blueprint) self.socketio = HandlerSocketio(self) self.nosys_core.modules.api.register_socketio(self.socketio) def on_nosys_ready(self, event): pass def on_user_added(self, event): user_id:str = event.user_id user_data = self.nosys_core.data.get_user(user_id) if not user_data: user_data = self.nosys_core.data.add_user(user_id) def on_peer_connected(self, event): peer:Peer = event.peer self.send_info(peer.id) def on_module_message(self, event): handler_action = getattr(self, 'on_'+event.data.get("action")) handler_action(event) def send_info(self, peer_id): modules = [] for key, module in self.nosys_core.modules.modules.items(): modules.append({"package":module.package_id, "module":module.module_id}) networks = [] for network in self.nosys_core.data.list_networks(): networks.append({"id":network.get("id")}) self.nosys_core.dispatcher.send_message({'action':'info','modules':modules, 'networks':networks}, peer_id, self.id) def on_info(self, event): peer: Peer = event.peer modules = event.data['modules'] for module in modules: lib = module.get("package") module = module.get("module") peer.modules[(lib, module)] = module self.nosys_core.fire_event(DynamicEvents.module_connection(lib, module), peer=event.peer) networks = event.data['networks'] for network in networks: network_id = network.get("id") peer.networks[network_id] = network my_net = self.nosys_core.data.get_network(network_id) if my_net: self.nosys_core.fire_event(DynamicEvents.network_connection(network_id), network_id=network_id, peer=event.peer) def on_module_connection(self, event): pass