def alert(self, next, conf, msg, send=True):
     ms = mensagem.Mensagem()
     print(next.port, ":", msg)
     if send:
         next.send(ms.confirm(conf[0], conf[1]))
         self.app.tela_atual.reload(ms.confirm(conf[0], conf[1]),
                                    "enviado: ")
 def delNode(self, index):
     ms = mensagem.Mensagem()
     print("removendo", self.no.online[index].port)
     next = self.no.online.pop(index)
     self.no.broadcast(ms.logout(next))
     print("lista online:")
     for i in self.no.online:
         print("--> :", i.nome)
 def addNode(self, next):
     ms = mensagem.Mensagem()
     self.no.broadcast(ms.login(next))
     self.no.online.append(next)
     self.app.tela_atual.reload()
     print("lista online:")
     for i in self.no.online:
         print("--> " + i.nome)
	def __init__(self,host="127.0.0.1", port = 22000, nome = "node"):
		self.host = host
		self.port = port
		self.nome = nome
		self.online = []
		self.con = None
		self.next = None
		self.intr = interno.Interno(self)
		self.msg = mensagem.Mensagem()
		self.log = False
		self.comunicando = False
		self.msgChat = []
    def answer(self, next, jsn):
        ms = mensagem.Mensagem()

        # fazendo login
        if ms.isLogin(jsn):
            # validações do login
            try:
                nome = ms.getInJson(jsn, "nome")
                ip = ms.getInJson(jsn, "ip")
                porta = int(ms.getInJson(jsn, "porta"))
            except:
                print("dados incompreensíveis")
            if nome == -1:
                self.alert(next, [1, 0], "nome invalido para login",
                           self.no.tipo == 0)
                return False
            ind = self.existeUser(nome)
            if ind != -1:
                self.alert(next, [1, 0], "nome já esta sendo usado",
                           self.no.tipo == 0)
                return False
            # ações no cliente
            if self.no.tipo:
                if ip == -1 or porta == -1:
                    # cliente avisa servidor que deu um erro
                    self.alert(next, [1, 0], "ip ou porta inválida",
                               self.no.tipo == 0)
                    return False
                # login pode ser feito
                #next.host = ip
                #next.port = porta
            #next.nome = nome ;
            else:
                next.nome = nome
            # confirmar
            self.alert(next, [1, 1], "login realizado com sucesso",
                       self.no.tipo == 0)
            # enviando lista de online para o cliente
            if self.no.tipo == 0:
                self.addNode(next)
                for cli in self.no.online:
                    next.send(ms.login(cli))
                # finalização do login
            #if self.no.tipo == 0 :

                return True
            else:
                # atualiza tela
                n = node.Node(ip, porta, nome)
                self.addNode(n)
                try:
                    self.app.tela_atual.reload()
                except:
                    pass
                return True

        # fazendo logout
        if ms.isLogout(jsn):
            # validações
            nome = ms.getInJson(jsn, "nome")
            if nome == -1:
                self.alert(next, [0, 0], "nome invalido para logout",
                           self.no.tipo == 0)
                return False
            ind = self.existeUser(nome)
            if ind == -1:
                self.alert(next, [1, 0], "nome não existe na lista",
                           self.no.tipo == 0)
                return False
            # ação em um servidor
            if self.no.tipo == 0:
                self.alert(next, [0, 1], "logout realizado com sucesso",
                           self.no.tipo == 0)
            # ação em um cliente
            #else:
            #print(next.nome,": está offline")
            # feedback desativado
            self.delNode(ind)  #next.nome = "cliente"
            # atualiza tela
            try:
                self.app.tela_atual.reload()
            except:
                pass
            return True

        # se for mensagem de confirmação
        if ms.isConfirm(jsn):

            # é uma confirmação de login?
            if ms.getInJson(jsn, "acao") == "1":
                # ações no cliente
                if (self.no.tipo):
                    if (ms.confLogin(jsn)):
                        print("cliente logado, ir para tela principal")
                        self.no.log = True
                        self.app.trocarTela(tela.Menu)
                        return True
                    else:
                        print("cliente não está logado")
                        return False
                # ações no servidor
                else:
                    return

            # é uma confirmação de logout?
            if ms.getInJson(jsn, "acao") == "0":
                if ms.confLogout(jsn):
                    self.no.online = []
                    self.no.log = False
                    self.no.msg.lista = []
                    print("Você fez logout")
                    return True

        #se for mensagem de chat
        if ms.isMsg(jsn):
            remetente = ms.getInJson(jsn, "nomeenv")
            destinatario = ms.getInJson(jsn, "nomereceb")
            msg = ms.getInJson(jsn, "msg")

            #se a mensagem estiver errada
            if remetente == -1 or destinatario == -1 or msg == -1:
                return False

            # se for cliente
            if self.no.tipo:
                # deve adicionar na lista de mensagens do chat no next?
                l = [i.nome for i in self.no.online]
                l = l.index(remetente)
                l = self.no.online[l]  #CRITICO
                l.msgChat.append([msg, "recebido"])
                print("cliente recebeu a msg", msg)
                self.app.tela_atual.mostra_msg(remetente, destinatario)
                return
            # se for servidor
            else:
                #deve redirecionar a mensagem
                l = [i.nome for i in self.no.online]
                l = l.index(destinatario)
                l = self.no.online[l]  #CRITICO
                l.send(jsn)
                self.app.tela_atual.reload(jsn, "enviado: ")
                print("o servidor repassou a mensagem", msg)
                return

        print(jsn, "não tratado")
        return True