class ServicoServidorMensageiro(ServicoConversaServidor):
    listaClientesAtualizada = pyqtSignal(list)
    dadosUsuarioAtualizado = pyqtSignal(Usuario)
    def __init__(self, portaReceber=45456, portaResponder=45455, parent=None):
        super().__init__(portaReceber=portaReceber, portaResponder=portaResponder, parent=parent)

        self._servicoConexao = ServicoConexaoServidor(self)
        self._servicoConexao.listaIPsClientesAtualizada.connect(self._pedirDadosUsuarios)
        self._dadosUsuarios = {}

    def _receberInformacaoTipoValor(self, de, tipo, valor):
        if tipo == _ServicoMensageiro.DADOS_USUARIO:
            usuario = valor.copy()
            usuario.setIP(de)

            self._dadosUsuarios[de] = usuario
            
            self._enviarDadosUsuario(usuario)
            self.dadosUsuarioAtualizado.emit(usuario)
            self.listaClientesAtualizada.emit(self.getDadosUsuarios())
        elif tipo == _ServicoMensageiro.PEDIR_DADOS:
            for usuario in self.getDadosUsuarios():
                self.enviarInformacaoTipoValor(_ServicoMensageiro.USUARIO_ALTERADO, usuario, de)
        
        super()._receberInformacaoTipoValor(de, tipo, valor)

    def _enviarDadosUsuario(self, usuario):
        self._enviarInformacaoParaClientes(_ServicoMensageiro.USUARIO_ALTERADO, usuario)

    def _pedirDadosUsuarios(self):
        self._enviarInformacaoParaClientes(_ServicoMensageiro.PEDIR_DADOS, None)
            
    def _enviarInformacaoParaClientes(self, tipo, valor):
        for ip in self._servicoConexao.listaIPsClientes():
            self.enviarInformacaoTipoValor(tipo, valor, ip)

    def _atualizarListaIPsClientes(self):
        self._servicoConexao.atualizarListaIPsClientes()

    def getDadosUsuarios(self):
        return list(self._dadosUsuarios.values())

    def atualizarListaClientes(self):
        self._atualizarListaIPsClientes()
        self._pedirDadosUsuarios()
        
    def __init__(self, portaReceber=45456, portaResponder=45455, parent=None):
        super().__init__(portaReceber=portaReceber, portaResponder=portaResponder, parent=parent)

        self._servicoConexao = ServicoConexaoServidor(self)
        self._servicoConexao.listaIPsClientesAtualizada.connect(self._pedirDadosUsuarios)
        self._dadosUsuarios = {}