private void CommandREQSendChatMessage(Connection clientConnection, Data dato) { string[] payloadSplitted = dato.Payload.Message.Split(ParseConstants.SEPARATOR_PIPE); string clientFrom = payloadSplitted[0]; string clientTo = payloadSplitted[1]; Connection clientToConnection = SingletonClientConnection.GetInstance().GetClient(clientTo); Connection clientFromConnection = SingletonClientConnection.GetInstance().GetClient(clientFrom); if (clientToConnection != null) { //envio el mensaje al destinatario SendMessage(clientToConnection, Command.REQ, dato.OpCode, dato.Payload); //aviso al remitente que envie su mensaje string messageSuccess = clientTo + ParseConstants.SEPARATOR_PIPE + MessageConstants.MESSAGE_SUCCESS; SendMessage(clientFromConnection, Command.RES, OpCodeConstants.RES_SEND_CHAT_MSG, new Payload() { Message = messageSuccess }); } else { //aviso que se perdio la conexion con el destinatario string messageError = clientTo + ParseConstants.SEPARATOR_PIPE + MessageConstants.MESSAGE_ERROR; SendMessage(clientFromConnection, Command.RES, OpCodeConstants.RES_SEND_CHAT_MSG, new Payload() { Message = messageError }); } }
public void Logout(Connection clientConnection) { if (clientConnection.IsServer) { log.InfoFormat("Desconectando el servidor {0}", clientConnection.Name); Console.WriteLine("Desconectando el servidor {0}", clientConnection.Name); SingletonServerConnection.GetInstance().RemoveServer(clientConnection.Name); } else { log.InfoFormat("Desconectando el cliente {0}", clientConnection.Name); Console.WriteLine("Desconectando el cliente {0}", clientConnection.Name); NotifyUserChangedStatus(clientConnection.Name, MessageConstants.STATUS_OFFLINE); SingletonClientConnection.GetInstance().RemoveClient(clientConnection.Name); } }
private void CommandRESContactList(Connection clientConnection, Data entryData) { //obtengo el login del payload string login = UtilContactList.ExtractLogin(entryData.Payload.Message); //construyo un diccionario donde cada entrada es un login y el value indica si esta o no conectado Dictionary <string, bool> tmpContactList = UtilContactList.ContactListFromString(entryData.Payload.Message); //agrego la lista de contactos del usuario al cache local del DNS SingletonClientConnection.GetInstance().AddContactToClient(login, tmpContactList.Keys.ToList <string>()); //marco los contactos que estan conectados var keys = new List <string>(tmpContactList.Keys); foreach (string key in keys) { tmpContactList[key] = SingletonClientConnection.GetInstance().ClientIsConnected(key); } //envio la trama actualizada con los contactos conectados Connection loginConnection = SingletonClientConnection.GetInstance().GetClient(login); if (loginConnection != null) { Data outData = new Data() { Command = Command.RES, OpCode = OpCodeConstants.RES_CONTACT_LIST, Payload = new Payload(UtilContactList.StringFromContactList(tmpContactList, entryData.Payload.Message)) }; foreach (var item in outData.GetBytes()) { loginConnection.WriteToStream(item); } //notifico que el usuario se conecto NotifyUserChangedStatus(login, MessageConstants.STATUS_ONLINE); } else { Console.WriteLine("Tengo que descartar respuesta para {0} que no tiene Conexion", login); } }
private void CommandREQFindContacts(Connection clientConnection, Data dato) { string[] payloadSplitted = dato.Payload.Message.Split('|'); string login = payloadSplitted[0]; string pattern = payloadSplitted[1]; //me fijo que contactos de los registrados matchea con el patron recibido List <string> contactsFound = SingletonClientConnection.GetInstance().FindRegisteredClientByPattern(pattern, login); //construyo el diccionario resultado, marcando los contactos que esten conectados Dictionary <string, bool> result = new Dictionary <string, bool>(); foreach (string key in contactsFound) { result.Add(key, SingletonClientConnection.GetInstance().ClientIsConnected(key)); } //armo la lista resultado y devuelvo if (clientConnection != null) { Data outData = new Data() { Command = Command.RES, OpCode = OpCodeConstants.RES_FIND_CONTACT, Payload = new MultiplePayload() { Message = UtilContactList.StringFromContactList(result), Destination = login } }; foreach (var item in outData.GetBytes()) { clientConnection.WriteToStream(item); } } else { Console.WriteLine("Tengo que descartar respuesta para {0} que no tiene Conexion", login); } }
private void CommandRESAddContact(Connection connection, Data dato) { //la respuesta viene en el formato n|m|loginDestino|contactoAgregado@estado|mensaje_success_o_error string[] payLoadSplitted = dato.Payload.Message.Split(ParseConstants.SEPARATOR_PIPE); string login = payLoadSplitted[2]; string contactAddedInfo = payLoadSplitted[3]; string opStatus = payLoadSplitted[4]; string contactAdded = contactAddedInfo.Split(ParseConstants.SEPARATOR_AT)[0]; //si el servidor agrego el contacto, lo agrego a la lista local de contactos if (opStatus.Equals(MessageConstants.MESSAGE_SUCCESS)) { //agrego a los usuarios como contactos mutuamente SingletonClientConnection.GetInstance().AddContactToClient(login, contactAdded); SingletonClientConnection.GetInstance().AddContactToClient(contactAdded, login); //si el usuario esta conectado actualizo la trama if (SingletonClientConnection.GetInstance().ClientIsConnected(contactAdded)) { dato.Payload.Message = CreateUserIsConnectedMessage(payLoadSplitted, login, contactAdded); } } //notifico al login para que actualice su lista de contactos Connection loginConnection = SingletonClientConnection.GetInstance().GetClient(login); SendMessage(loginConnection, Command.RES, dato.OpCode, dato.Payload); //si el contacto que fue agregado esta online tambien lo notifico Connection contactAddedConnection = SingletonClientConnection.GetInstance().GetClient(contactAdded); if (contactAddedConnection != null) { dato.Payload.Message = CreateUserIsConnectedMessage(payLoadSplitted, contactAdded, login); SendMessage(contactAddedConnection, Command.RES, dato.OpCode, dato.Payload); } }
private void NotifyUserChangedStatus(string user, string newStatus) { StringBuilder sb; Connection contactConnection; foreach (string contact in SingletonClientConnection.GetInstance().GetContactsOfLogin(user)) { if (SingletonClientConnection.GetInstance().ClientIsConnected(contact)) { sb = new StringBuilder(); sb.Append("01").Append(ParseConstants.SEPARATOR_PIPE); sb.Append("01").Append(ParseConstants.SEPARATOR_PIPE); sb.Append(contact).Append(ParseConstants.SEPARATOR_PIPE); sb.Append(user).Append("@").Append(newStatus).Append(ParseConstants.SEPARATOR_PIPE); sb.Append(MessageConstants.MESSAGE_SUCCESS); contactConnection = SingletonClientConnection.GetInstance().GetClient(contact); SendMessage(contactConnection, Command.RES, OpCodeConstants.RES_ADD_CONTACT, new Payload() { Message = sb.ToString() }); } } }
private void CommandREQLogin(Connection clientConnection, Data dato) { string login = dato.Payload.Message; bool ret = true; if (!UsersPersistenceHandler.GetInstance().IsLoginRegistered(login)) { try { string serverName = FindAGoodServer(); //agrega el usuario y el server al registro de usuario-server bool ok = UsersPersistenceHandler.GetInstance().RegisterLoginServer(login, serverName); if (ok) { //aumenta el contador de usuarios por servidor, luego que el server agreaga el usuario //ret = UsersPersistenceHandler.GetInstance().RegisterLoginServer(login, serverName); AddUserToServer(login, serverName); } else { ret = false; } } catch (Exception e) { Console.WriteLine("Error : {0}", e.Message); ret = false; } } if (ret)//si esta registrado { SingletonClientConnection scc = SingletonClientConnection.GetInstance(); Connection oldConnection = scc.GetClient(login); if (oldConnection == null) { if (SingletonServerConnection.GetInstance().GetServer(UsersPersistenceHandler.GetInstance().GetServerName(login)) != null) { scc.AddClient(login, clientConnection); SendMessage(clientConnection, Command.RES, OpCodeConstants.REQ_LOGIN, new Payload("SUCCESS")); } else { SendMessage(clientConnection, Command.RES, OpCodeConstants.REQ_LOGIN, new Payload("ERROR Servidor Offline")); clientConnection.CloseConn(); ret = false; } } else { SendMessage(clientConnection, Command.RES, OpCodeConstants.REQ_LOGIN, new Payload("ERROR Login en uso")); clientConnection.CloseConn(); ret = false; } } else { SendMessage(clientConnection, Command.RES, OpCodeConstants.REQ_LOGIN, new Payload("ERROR No se pudo registrar el login nuevo (server offline??)")); clientConnection.CloseConn(); } }