Example #1
0
        /// <summary>
        /// Termina la sesion de una cuenta en el servicio de chat
        /// </summary>
        /// <param name="Cuenta">Cuenta</param>
        public void Desconectar(CuentaModel Cuenta)
        {
            CuentaModel CuentaCompleta = ObtenerCuentaEnElDiccionario(Cuenta);

            lock (SincronizarObjeto)
            {
                List <CuentaModel> CuentasDeLaSala = ManejadorDeSalas.RecuperarCuentasDeSalaDeJugador((Cuenta));
                foreach (CuentaModel CuentaClave in CuentasConetadas.Keys)
                {
                    foreach (CuentaModel CuentaEnSala in CuentasDeLaSala)
                    {
                        if (CuentaClave.NombreUsuario == CuentaEnSala.NombreUsuario)
                        {
                            IChatServiceCallback Callback = CuentasConetadas[CuentaClave];
                            Callback.Abandonar(Cuenta);
                        }
                    }
                }
                if (CuentaCompleta != null)
                {
                    CuentasConetadas.Remove(CuentaCompleta);
                    Cuentas.Remove(CuentaCompleta);
                }
            }
        }
        public bool AddMeToServer(string userName)
        {
            if (userName.Length > 15)
            {
                userName = userName.Substring(0, 15);
            }


            IChatServiceCallback callback = OperationContext.Current.GetCallbackChannel <IChatServiceCallback>();

            if (!loggedInUsers.ContainsKey(userName))
            {
                loggedInUsers.Add(userName, callback);

                SendMessage("Admin", $"User {userName} logged in...");

                Console.WriteLine($"User {userName} logged in...");

                return(true);
            } // end of if

            else
            {
                DuplicateUserFault fault = new DuplicateUserFault()
                {
                    Reason = "User '" + userName + "' already logged in!"
                };
                throw new FaultException <DuplicateUserFault>(fault);
            } // end of else
        }     // end of method
Example #3
0
        /// <summary>
        /// Login
        /// Logins the user and registers the callback into a dictionary of
        /// logged in users.
        /// Sends a messgae that the user has logged on...
        /// </summary>
        /// <param name="userName">user name from the client (string)</param>
        public void Login(string userName)
        {
            // Trim the Username to 15 Characters
            if (userName.Length > 15)
            {
                userName = userName.Substring(0, 15);
            }

            // This is the caller and registers the callback for the service to
            // communicate the new messages
            IChatServiceCallback callback = OperationContext.Current.GetCallbackChannel <IChatServiceCallback>();

            // Validates the User is Not Already Logged In
            if (!loggedInUsers.ContainsKey(userName))
            {
                // Add to the List of Logged on Users
                loggedInUsers.Add(userName, callback);

                // Send a Message that the new user is Logged In
                SendMessage("Admin", $"User {userName} logged in...");

                // Write to Console
                Console.WriteLine($"User {userName} logged in...");
            } // end of if

            // Duplicate User Fault - User Logged In Already
            else
            {
                DuplicateUserFault fault = new DuplicateUserFault()
                {
                    Reason = "User '" + userName + "' already logged in!"
                };
                throw new FaultException <DuplicateUserFault>(fault);
            } // end of else
        }     // end of method
Example #4
0
        public ChatWCFClient(string ipAddress, IChatServiceCallback callback)
        {
            try
            {
                m_ipAddress = ipAddress;
                NetTcpBinding tcpBinding = new NetTcpBinding();
                tcpBinding.OpenTimeout    = TimeSpan.FromSeconds(5);
                tcpBinding.ReceiveTimeout = TimeSpan.FromSeconds(5);
                tcpBinding.SendTimeout    = TimeSpan.FromSeconds(5);
                tcpBinding.CloseTimeout   = TimeSpan.FromSeconds(5);
                tcpBinding.MaxConnections = 2000;

                tcpBinding.TransactionFlow = false;
                //tcpBinding.Security.Transport.ProtectionLevel = System.Net.Security.ProtectionLevel.EncryptAndSign;
                //tcpBinding.Security.Transport.ClientCredentialType = TcpClientCredentialType.None;
                //tcpBinding.Security.Mode = SecurityMode.Transport;

                pipeFactory =
                    new DuplexChannelFactory <IChatService>(
                        new InstanceContext(callback),
                        tcpBinding,
                        new EndpointAddress("net.tcp://" + ipAddress + ":8099/ChatService"));


                m_client = pipeFactory.CreateChannel();
            }
            catch (Exception err)
            {
                pipeFactory.Close();
                throw (new SystemException(err.Message));
            }
        }
Example #5
0
        /// <summary>
        /// Recorre el diccionario de CuentasModel conectados, notificando que la cuenta se ha conectado
        /// </summary>
        /// <param name="Cuenta">CuentaModel</param>
        /// <returns>Boolean</returns>
        private Boolean NotificarClientesNuevoConectado(CuentaModel Cuenta)
        {
            SessionManager     ManejadorDeSesiones    = SessionManager.GetSessionManager();
            List <CuentaModel> CuentasDeSalaDeJugador = ManejadorDeSalas.RecuperarCuentasDeSalaDeJugador(Cuenta);

            foreach (CuentaModel cuentaDeSala in CuentasDeSalaDeJugador)
            {
                foreach (CuentaModel CuentaClave in CuentasConetadas.Keys)
                {
                    if (CuentaClave.NombreUsuario == cuentaDeSala.NombreUsuario)
                    {
                        if (ManejadorDeSesiones.VerificarCuentaLogeada(CuentaClave))
                        {
                            IChatServiceCallback Callback = CuentasConetadas[CuentaClave];
                            try
                            {
                                Callback.Unirse(Cuenta);
                            }
                            catch (Exception)
                            {
                                CuentasConetadas.Remove(Cuenta);
                                return(false);
                            }
                        }
                    }
                }
            }
            return(true);
        }
Example #6
0
        virtual public bool Connect(User user)
        {
            if (user == null || _connectedUsers.Where(u => u.Id == user.Id).FirstOrDefault() != null)
            {
                return(false);
            }

            IChatServiceCallback currentCallback = OperationContextWrapper.GetCallbackChannel <IChatServiceCallback>();

            if (currentCallback == null)
            {
                return(false);
            }

            lock (syncObj)
            {
                _userCallbackPairs.Add(user.Id, currentCallback);
                _connectedUsers.Add(user);
                foreach (IChatServiceCallback callback in _userCallbackPairs.Values)
                {
                    callback.RefreshUsers(_connectedUsers);
                    callback.UserConnect(user);
                }
            }
            return(true);
        }
Example #7
0
 // ako postoji (prethodna metoda) onda cemo zapamtiti grupu, korisnika i kanal
 public void AddUserToGroup(string groupName, string userName, IChatServiceCallback callBack)
 {
     if (_groupsWithUsers.ContainsKey(groupName))
     {
         _groupsWithUsers[groupName].Add(userName);  //zapamtimo usera
         _userCallbacks[userName] = callBack;        //zapamtimo kanal
     }
 }
Example #8
0
        public IChatService Create(ConnectionConfiguration configuration, IChatServiceCallback callbackClient)
        {
            IChatService channel = DuplexChannelFactory <IChatService> .CreateChannel(
                new InstanceContext(callbackClient),
                new NetTcpBinding(SecurityMode.None),
                new EndpointAddress($"net.tcp://{configuration.ServerName}/Service.svc"));

            return(channel);
        }
        public Guid Connect(string login)
        {
            Guid clientId = Guid.NewGuid();

            lock (_locker)
            {
                _connectedClients.Add(new ChatClient(clientId, login, OperationContext.Current));

                IChatServiceCallback callback = OperationContext.Current.GetCallbackChannel <IChatServiceCallback>();
                callback.PushMessage(new ChatMessage {
                    From = "Server", Message = "Bienvenue " + login
                });
            }

            return(clientId);
        }
        Guid IChatService.Subscribe()
        {
            IChatServiceCallback callback =
                OperationContext.Current.GetCallbackChannel <IChatServiceCallback>();

            Guid clientId = Guid.NewGuid();

            if (callback != null)
            {
                lock (clients)
                {
                    clients.Add(clientId, callback);
                }
            }

            return(clientId);
        }
Example #11
0
        public OperationResult <Person[]> Join(Person person)
        {
            _eventHandler = EventHandler;
            var opResult = new OperationResult <Person[]>();

            lock (SyncObj)
            {
                if (!CheckIfPersonExists(person.Name))
                {
                    _person = person;
                    Persons.Add(person, EventHandler);
                }
                else
                {
                    opResult.Success = false;
                    var em = $"Пользователь с именен {person.Name} уже в чате";
                    opResult.Errors.Add(new OperationError {
                        ErrorMessage = em
                    });
                    Logger.Error(em);

                    return(opResult);
                }
            }

            _callback = OperationContext.Current.GetCallbackChannel <IChatServiceCallback>();
            var e = new ChatEventArgs
            {
                CallbackType = CallbackType.UserEnter,
                Person       = _person
            };

            _inactiveTimer = new Timer(InactiveTimerCallback, null, _inactiveTimeout, TimeSpan.FromMilliseconds(-1));
            Logger.Info("{0} зашел в чат", _person.Name);
            BroadcastMessage(e);
            ChatEvent += _eventHandler;

            opResult.Result = new Person[Persons.Count];
            lock (SyncObj)
            {
                Persons.Keys.CopyTo(opResult.Result, 0);
            }

            opResult.Success = true;
            return(opResult);
        }
Example #12
0
        public int JoinTheConversation(string userName)
        {
            // Subscribe the user to the conversation
            IChatServiceCallback registeredUser = OperationContext.Current.GetCallbackChannel <IChatServiceCallback>();

            if (!_callbackList.Contains(registeredUser))
            {
                _callbackList.Add(registeredUser);
            }

            _callbackList.ForEach(
                delegate(IChatServiceCallback callback)
            {
                callback.NotifyUserJoinedTheConversation(userName);
            });
            _registeredUsers++;
            return(_registeredUsers);
        }
Example #13
0
        public int LeaveTheConversation(string userName)
        {
            // Unsubscribe the user from the conversation.
            IChatServiceCallback registeredUser = OperationContext.Current.GetCallbackChannel <IChatServiceCallback>();

            if (_callbackList.Contains(registeredUser))
            {
                _callbackList.Remove(registeredUser);
                _registeredUsers--;
            }

            // Notify everyone that user has arrived.
            // Use an anonymous delegate and generics to do our dirty work.
            _callbackList.ForEach(
                delegate(IChatServiceCallback callback)
                { callback.NotifyUserLeftTheConversation(userName); });

            return(_registeredUsers);
        }
Example #14
0
        public void Join(Guid key)
        {
            //TODO:Need to send a callback to the client to let it know that it connected successfully or make this a one way call
            try
            {
                //Make sure the client has been authenticated
                if (!Utility.Global.IsClientAuthenticated(key))
                {
                    return;
                }

                //Get the call back for the client
                IChatServiceCallback callback = OperationContext.Current.GetCallbackChannel <IChatServiceCallback>();

                //Create a CommunicationsStore to hold information about the connected client
                ChatCommunicationsStore client = new ChatCommunicationsStore(OperationContext.Current.InstanceContext, callback);

                //TODO:Need to handle the client not being authenticated
                client.UserAccount = Authentication.AuthenticationService.GetUserAccount(key);

                if (!OperationContext.Current.IncomingMessageProperties.ContainsKey(RemoteEndpointMessageProperty.Name))
                {
                    //This is for dev connections.
                    client.IPAddress = "127.0.0.1";
                }
                else
                {
                    client.IPAddress = ((RemoteEndpointMessageProperty)OperationContext.Current.IncomingMessageProperties[RemoteEndpointMessageProperty.Name]).Address;
                }

                //TODO:May need to lock the list here for thread safety
                ConnectedClients.Add(key, client);

                Console.WriteLine("{0} has joined the chat service.", client.UserAccount.Nickname);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
        }
Example #15
0
        /// <summary>
        /// Notifica a las demas cuentas del mensaje enviado
        /// </summary>
        /// <param name="Mensaje">Message</param>
        public void EnviarMensaje(Message Mensaje)
        {
            List <CuentaModel> CuentasEnSala = ManejadorDeSalas.RecuperarCuentasDeSalaDeJugador(Mensaje.Remitente);

            Debug.WriteLine(CuentasEnSala.Count);

            lock (SincronizarObjeto)
            {
                foreach (CuentaModel CuentaEnSala in CuentasEnSala)
                {
                    foreach (CuentaModel CuentaClave in CuentasConetadas.Keys)
                    {
                        if (CuentaEnSala.NombreUsuario == CuentaClave.NombreUsuario)
                        {
                            Debug.WriteLine("Se esta notificando a " + CuentaClave.NombreUsuario);
                            IChatServiceCallback callback = CuentasConetadas[CuentaClave];
                            callback.RecibirMensaje(Mensaje);
                        }
                    }
                }
            }
        }
 public void RegisterToChat(string userName)
 {
     if (userName != null && userName != "")
     {
         try
         {
             IChatServiceCallback callback =
                 OperationContext.Current.GetCallbackChannel <IChatServiceCallback>();
             lock (locker)
             {
                 //remove the old client
                 if (chatUsers.Keys.Contains(userName))
                 {
                     chatUsers.Remove(userName);
                 }
                 chatUsers.Add(userName, callback);
             }
         }
         catch (Exception ex)
         {
         }
     }
 }
Example #17
0
        } // end of method

        /// <summary>
        /// SendMessageToUsers
        /// Transmit to Registered Users & Callbacks
        /// Logs off any disconnected clients
        /// </summary>
        /// <param name="message">The message to send to all clients (ChatMessage)</param>
        private void SendMessageToUsers(ChatMessage message)
        {
            // Inform all of the clients of the new message
            List <string> callbackKeys = loggedInUsers?.Keys.ToList();

            // Loops through each logged in user
            foreach (string key in callbackKeys)
            {
                try
                {
                    IChatServiceCallback callback = loggedInUsers[key];
                    callback.SendClientMessage(message);
                    Console.WriteLine($"Sending user {key} message {message}");
                }
                // catches an issue with a user disconnect and loggs off that user
                catch (Exception ex)
                {
                    System.Diagnostics.Debug.WriteLine(ex.Message, System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Namespace + "." + System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name);
                    // Remove the disconnected client
                    Logoff(key);
                }
            } // end of foreach
        }     // end of method
Example #18
0
        /// <summary>
        /// 用户登入
        /// </summary>
        /// <param name="username">用户名</param>
        /// <param name="isOfficial">一个布尔值 标识用户是否以官方身份登入</param>
        /// <param name="callback">客户端回调</param>
        public void SetIn(string username, bool isOfficial, IChatServiceCallback callback)
        {
            UserTokenAndCallback t = GetUser(username);
            t.Token.SetIn(isOfficial);
            t.Callback = callback;

            Tokens.Where(x => x.Token.UID.ToString() == t.Token.PID
                || x.Token.PID == t.Token.UID.ToString()
                || x.Token.IsOfficial)
                .ToList()
                .ForEach(x =>
                    {
                        CallStatusChanged(x, username, UserOnlineStatus.在线);
                    });
        }
Example #19
0
 public ChatServiceClient(IChatServiceCallback callback) :
     this(new System.ServiceModel.InstanceContext(callback), Const.ChatServiceName)
 {
 }
Example #20
0
 public ChatServiceClient(IChatServiceCallback callback) :
     this(new System.ServiceModel.InstanceContext(callback), Const.ChatServiceName)
 {
 }
Example #21
0
 public ChatServiceProxy(IChatServiceCallback callbackInstance, Uri address)
     : base(callbackInstance, address)
 {
 }
 public ChatCommunicationsStore(InstanceContext instanceContext, IChatServiceCallback callback)
 {
     this.InstanceContext = instanceContext;
     this.Callback        = callback;
 }