def __init__(self, main, my_ipp, node_ipps, bcm=None, bsm=None):
        self.main = main
        self.main.osm = self
        self.syncd = False

        # Don't allow myself in the nodes list
        if node_ipps:
            node_ipps.discard(my_ipp)

        # Create a Node for me
        self.me = MeNode(my_ipp)
        self.me.sesid = randbytes(4)
        self.me.uptime = seconds()

        # NickManager
        self.nkm = NickManager(main)

        # MessageRoutingManager
        self.mrm = MessageRoutingManager(main)

        # PingManager
        self.pgm = PingManager(main)

        # TopicManager
        self.tm = TopicManager(main)

        # BanManager
        self.banm = BanManager(main)

        # ChatMessageSequencer
        self.cms = ChatMessageSequencer(main)

        # BridgeClientManager / BridgeServerManager
        self.bcm = bcm
        self.bsm = bsm

        # SyncManager (init after contacting the first neighbor)
        self.sm = None

        # Init all these when sync is established:
        self.yqrm = None        # SyncRequestRoutingManager

        self.sendStatus_dcall = None

        # Keep track of outbound status rate limiting
        self.statusLimit_time = seconds() - 999
        self.statusLimit_dcall = None

        self.sendLoginEcho()

        # List of online nodes, sorted by random distance.
        self.nodes = []
        # Index of online nodes: ipp -> Node()
        self.lookup_ipp = {}

        for ipp in node_ipps:
            self.addNodeToNodesList(Node(ipp))

        # Initially, we'll just connect to random nodes.
        # This list will be sorted after syncing is finished.
        random.shuffle(self.nodes)

        if self.nodes:
            self.main.showLoginStatus(
                "Joining The Network.", counter='inc')
            self.pgm.scheduleMakeNewLinks()
        else:
            self.main.showLoginStatus(
                "Creating a new empty network.", counter='inc')
            self.syncComplete()