コード例 #1
0
        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
                });
            }
        }
コード例 #2
0
 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);
     }
 }
コード例 #3
0
        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);
            }
        }
コード例 #4
0
        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);
            }
        }
コード例 #5
0
        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);
            }
        }
コード例 #6
0
        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()
                    });
                }
            }
        }
コード例 #7
0
        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();
            }
        }