예제 #1
0
        //Обработка отправки сообщений
        public void Message(Message Msg)
        {
            //Подключение отправителя
            ICallbackMessage Connection = OperationContext.Current.GetCallbackChannel <ICallbackMessage>();

            //Если отправитель не подключен
            if (!ConnectedUsers.TryGetValue(Connection, out ChatUser Sender))
            {
                return;
            }
            //Установка идентификатора отправителя к сообщению
            Msg.SenderID = Sender.ID;
            //Установка даты отправки
            Msg.SendDate = DateTime.Now;

            //Определение подключения получателя
            ICallbackMessage Receiver = ConnectedUsers.FirstOrDefault(x => x.Value.ID == Msg.ReceiverID).Key;

            //Отправка сообщения получателю если он подключен
            if (Receiver != null)
            {
                Receiver.GetMessage(Msg);
            }

            //Добавление сообщения в общий список
            Messages.Add(Msg);
        }
예제 #2
0
        //Обработка отключения пользователя
        public void Disconnect(ChatUser User)
        {
            //Определение подключения
            ICallbackMessage Connection = ConnectedUsers.FirstOrDefault(x => x.Value.Name == User.Name).Key;

            Console.WriteLine(User.Name + " trying to disconnect!");
            //Если подкючение найдено
            if (Connection != null)
            {
                //Удаление текущего пользователя из списка подключенных
                ConnectedUsers.Remove(Connection);
                Console.WriteLine(User.Name + " disconnected!");
                //Обновление списка подключенных у всех пользователей
                foreach (ICallbackMessage u in ConnectedUsers.Keys)
                {
                    u.UpdateConnected(ConnectedUsers.Values.ToArray());
                }
                return;
            }
            else
            {
                Console.WriteLine(User.Name + " connection not found!");
                return;
            }
        }
예제 #3
0
        public async void Game()
        {
            var c = ConnectedUsers.FirstOrDefault(u => u.ID == Context.ConnectionId);

            if (c.Room.WaitingUsers.Count == 0 && c.Room.ReadyUsers.Count > 0 && c.Room.game == false)
            {
                c.Room.game = true;
                Random        rnd          = new Random();
                var           palabra      = palabras[rnd.Next(0, palabras.Length)];
                List <string> asignaciones = new List <string>();
                for (int i = 0; i < c.Room.ReadyUsers.Count; i++)
                {
                    asignaciones.Add(palabra);
                }
                asignaciones[rnd.Next(0, c.Room.ReadyUsers.Count)] = "Imbecil";
                await Clients.Group(c.Room.Name).SendAsync("empezando");

                Task.Delay(4000).Wait();
                int i2 = 0;
                foreach (var user in c.Room.ReadyUsers)
                {
                    string secreto = null;
                    secreto = asignaciones[i2];
                    i2++;
                    await Clients.Client(user.ID).SendAsync("recibeTarjeta", secreto);
                }
            }
        }
예제 #4
0
        public async Task <IActionResult> SendPrivateMessage(MessageDetail message)
        {
            if (!ConnectedUsers.Any(x => x.UserId.Equals(message.FromUserId)))
            {
                throw new InvalidOperationException(Resources.UserIsDisconnected);
            }

            var toUser = ConnectedUsers.FirstOrDefault(x => x.UserId == message.ToUserId);

            if (toUser is null)
            {
                throw new InvalidOperationException(Resources.UserIsDisconnected);
            }

            await Clients.AllExcept(Context.ConnectionId)
            .SendAsync(ChatHubMethods.UpdateUnreadMessages, message.FromUserId);

            // send a private message to listener user
            await Clients.Client(toUser.ConnectionId)
            .SendAsync(ChatHubMethods.ReceiveMessage, message);

            AddMessageInCache(message);

            return(new OkResult());
        }
예제 #5
0
        public void GetMessages(string projectId, string fromId, string toId)
        {
            if (!Guid.TryParse(projectId, out Guid result))
            {
                throw new InvalidOperationException(Resources.UnableToGetMessages);
            }

            if (!Guid.TryParse(fromId, out Guid fromUserGuid))
            {
                throw new InvalidOperationException(Resources.UnableToGetMessages);
            }

            if (!Guid.TryParse(toId, out Guid toUserGuid))
            {
                throw new InvalidOperationException(Resources.UnableToGetMessages);
            }

            var queryResult = new Dictionary <string, string>
            {
                { nameof(fromId), fromId },
                { nameof(toId), toId }
            };

            var messages = CallApiGET <List <MessageResponseDTO> >(uri: "api/messages/" + projectId + QueryString.Create(queryResult), isSecured: true);

            if (messages is null || messages.Count == 0)
            {
                return;
            }

            var userMessages = messages
                               .Select(x => new
            {
                fromUserId  = x.FromUserId,
                toUserId    = x.ToUserId,
                userName    = (x.FromUserId == fromUserGuid)? "Yo" : x.User.UserName,
                text        = x.Text,
                messageDate = x.MessageDate
            });

            Clients.Caller.SendAsync(ChatHubMethods.ReceiveConversation, userMessages).Wait();

            var toUser = ConnectedUsers.FirstOrDefault(x => x.Id == toUserGuid);

            if (toUser != null)
            {
                var user     = ConnectedUsers.FirstOrDefault(x => x.ConnectionId == Context.ConnectionId);
                var fromUser = new
                {
                    id           = user.Id,
                    userName     = user.UserName,
                    messageCount = 0
                };

                Clients.Client(toUser.ConnectionId)
                .SendAsync(ChatHubMethods.NewUserAvailable, fromUser).Wait();
            }
        }
예제 #6
0
 private void ChannelOnUserLeft(object sender, IrcChannelUserEventArgs e)
 {
     ExecuteOnUiThread(() =>
     {
         var vm = ConnectedUsers.FirstOrDefault(vmu => vmu.User == e.ChannelUser.User);
         if (vm != null)
         {
             ConnectedUsers.Remove(vm);
         }
     });
 }
예제 #7
0
 private void ChannelOnUserJoined(object sender, IrcChannelUserEventArgs e)
 {
     ExecuteOnUiThread(() =>
     {
         var vm = ConnectedUsers.FirstOrDefault(vmu => vmu.User == e.ChannelUser.User);
         if (vm == null)
         {
             ConnectedUsers.Add(GetUserViewModel(e.ChannelUser.User));
         }
     });
 }
예제 #8
0
        public override Task OnDisconnectedAsync(Exception exception)
        {
            var user = ConnectedUsers.FirstOrDefault(x => x.ConnectionId == Context.ConnectionId);

            if (user == null)
            {
                return(base.OnDisconnectedAsync(exception));
            }

            ConnectedUsers.Remove(user);
            return(base.OnDisconnectedAsync(exception));
        }
예제 #9
0
        public async void Ready()
        {
            var c = ConnectedUsers.FirstOrDefault(u => u.ID == Context.ConnectionId);

            c.Room.ReadyUsers.Add(c);
            c.Room.WaitingUsers.Remove(c.Room.WaitingUsers.FirstOrDefault(u => u.ID == Context.ConnectionId));
            await Clients.Group(c.Room.Name).SendAsync("updateUsers", c.Room.WaitingUsers.Count, c.Room.WaitingUsers.Select(u => u.Usuario));

            await Clients.Group(c.Room.Name).SendAsync("updateReadyUsers", c.Room.WaitingUsers.Count + c.Room.ReadyUsers.Count, c.Room.ReadyUsers.Count, c.Room.ReadyUsers.Select(u => u.Usuario), c.Room.game);

            Game();
        }
예제 #10
0
        public void Message(string toUserId, string message)
        {
            string fromUserID = Context.ConnectionId;
            var    toUser     = ConnectedUsers.FirstOrDefault(x => x.ID == toUserId);
            var    fromUser   = ConnectedUsers.FirstOrDefault(x => x.ID == fromUserID);

            if (fromUser != null && toUser != null)
            {
                Clients.Client(toUserId).message(fromUserID, fromUser.Name, message);
                Clients.Caller.message(toUserId, fromUser.Name, message);
            }
        }
예제 #11
0
        public async Task End()
        {
            var c = ConnectedUsers.FirstOrDefault(u => u.ID == Context.ConnectionId);

            c.Room.game = false;
            await Clients.Group(c.Room.Name).SendAsync("solucion");

            c.Room.WaitingUsers.InsertRange(c.Room.WaitingUsers.Count, c.Room.ReadyUsers);
            c.Room.ReadyUsers.Clear();
            await Clients.Group(c.Room.Name).SendAsync("updateUsers", c.Room.WaitingUsers.Count, c.Room.WaitingUsers.Select(u => u.Usuario));

            await Clients.Group(c.Room.Name).SendAsync("updateReadyUsers", c.Room.WaitingUsers.Count + c.Room.ReadyUsers.Count, c.Room.ReadyUsers.Count, c.Room.ReadyUsers.Select(u => u.Usuario), c.Room.game);
        }
예제 #12
0
        public override Task OnDisconnectedAsync(Exception exception)
        {
            var user = ConnectedUsers.FirstOrDefault(x => x.ConnectionId == Context.ConnectionId);

            if (user == null)
            {
                return(base.OnDisconnectedAsync(exception));
            }

            Clients.All.SendAsync(ChatHubMethods.UserNotAvailable, user.UserId);
            ConnectedUsers.Remove(user);
            return(base.OnDisconnectedAsync(exception));
        }
예제 #13
0
        public async void Game()
        {
            var c = ConnectedUsers.FirstOrDefault(u => u.ID == Context.ConnectionId);

            if (c.Room.WaitingUsers.Count == 0 && c.Room.ReadyUsers.Count > 0 && c.Room.game == false)
            {
                c.Room.game = true;
                Random        rnd          = new Random();
                var           situacion    = situaciones[rnd.Next(0, situaciones.Length)];
                var           roles        = situacion.Roles.ToList();
                List <string> asignaciones = new List <string>();
                var           randomIndex  = 0;
                for (int i = 0; i < c.Room.ReadyUsers.Count; i++)
                {
                    if (roles.Count == 0)
                    {
                        asignaciones.Add("Espia");
                    }
                    else
                    {
                        randomIndex = rnd.Next(0, roles.Count); //Choose a random object in the list
                        asignaciones.Add(roles[randomIndex]);   //add it to the new, random list
                        roles.RemoveAt(randomIndex);            //remove to avoid duplicates
                    }
                }
                if (!asignaciones.Contains("Espia"))
                {
                    asignaciones[rnd.Next(0, asignaciones.Count)] = "Espia";
                }
                roles = asignaciones;
                for (int i = 0; i < c.Room.ReadyUsers.Count; i++)
                {
                    randomIndex = rnd.Next(0, roles.Count); //Choose a random object in the list
                    asignaciones.Add(roles[randomIndex]);   //add it to the new, random list
                    roles.RemoveAt(randomIndex);            //remove to avoid duplicates
                }
                await Clients.Group(c.Room.Name).SendAsync("empezando");

                Task.Delay(4000).Wait();
                int i2 = 0;
                foreach (var user in c.Room.ReadyUsers)
                {
                    string rol = null;
                    rol = asignaciones[i2];
                    i2++;
                    await Clients.Client(user.ID).SendAsync("recibeTarjeta", situacion.Nombre, rol);
                }
            }
        }
예제 #14
0
        public async Task <IActionResult> RequestConversation(string fromId, string toId)
        {
            Guid fromUserId = Guid.Parse(fromId);
            Guid toUserId   = Guid.Parse(toId);

            if (!ConnectedUsers.Any(x => x.UserId.Equals(fromUserId)))
            {
                throw new InvalidOperationException(Resources.UserIsDisconnected);
            }

            var toUser = ConnectedUsers.FirstOrDefault(x =>
                                                       x.UserId == toUserId &&
                                                       (x.IsOnHold || x.ConnectedWith == fromUserId));

            if (toUser is null)
            {
                throw new InvalidOperationException(Resources.UserIsDisconnected);
            }

            if (toUser.IsOnHold)
            {
                toUser.IsOnHold      = false;
                toUser.ConnectedWith = fromUserId;
                // set all cached messages to the requesting user
                CurrentMessages.Where(u => u.FromUserId == toUserId)
                .ToList()
                .ForEach(message => message.ToUserId = fromUserId);
            }

            // get all cached messages
            var cachedConversation = CurrentMessages
                                     .Where(u =>
                                            (u.FromUserId == fromUserId && u.ToUserId == toUserId) ||
                                            (u.FromUserId == toUserId && u.ToUserId == fromUserId));

            // hide user to others
            await Clients.AllExcept(Context.ConnectionId)
            .SendAsync(ChatHubMethods.UserNotAvailable, toUserId);

            await Clients.Client(toUser.ConnectionId)
            .SendAsync(ChatHubMethods.ConnectWith, fromUserId);

            await Clients.Caller.SendAsync(ChatHubMethods.ReceiveConversation, cachedConversation);

            return(new OkResult());
        }
예제 #15
0
파일: AppHub.cs 프로젝트: abisevilla/chat
        public void Connect(string name)
        {
            Client c = new Client()
            {
                Id       = Context.ConnectionId,
                NickName = name
            };

            var result = ConnectedUsers.FirstOrDefault(u => u.NickName == c.NickName);

            if (result == null)
            {
                AddUser(c);
                // return true;
            }

            Clients.Client(Context.ConnectionId).onMessage("Seleccionar otro usuario");
        }
예제 #16
0
        public override async Task OnDisconnectedAsync(Exception exception)
        {
            var c = ConnectedUsers.FirstOrDefault(u => u.ID == Context.ConnectionId);

            c.Room.ReadyUsers.Remove(c);
            c.Room.WaitingUsers.Remove(c);
            if ((c.Room.WaitingUsers.Count + c.Room.ReadyUsers.Count) == 0)
            {
                OnlineRooms.Remove(c.Room);
            }
            Game();
            await Clients.Group(c.Room.Name).SendAsync("updateUsers", c.Room.WaitingUsers.Count, c.Room.WaitingUsers.Select(u => u.Usuario));

            await Clients.Group(c.Room.Name).SendAsync("updateReadyUsers", c.Room.WaitingUsers.Count + c.Room.ReadyUsers.Count, c.Room.ReadyUsers.Count, c.Room.ReadyUsers.Select(u => u.Usuario), c.Room.game);

            await Clients.Caller.SendAsync("close");

            ConnectedUsers.Remove(c);
        }
예제 #17
0
        public IActionResult SendPrivateMessage(MessageResponseDTO message)
        {
            var newMessage = CallApiPOST <MessageResponseDTO>(uri: "api/messages/", body: message, isSecured: true);

            var toUser = ConnectedUsers.FirstOrDefault(x => x.Id == message.ToUserId);

            if (toUser != null)
            {
                var sendMessage = new {
                    fromUserId  = newMessage.FromUserId,
                    toUserId    = newMessage.ToUserId,
                    userName    = newMessage.User.UserName,
                    text        = newMessage.Text,
                    messageDate = newMessage.MessageDate
                };

                Clients.Client(toUser.ConnectionId)
                .SendAsync(ChatHubMethods.ReceiveMessage, sendMessage).Wait();
                Clients.Client(toUser.ConnectionId)
                .SendAsync(ChatHubMethods.UpdateUnreadMessages, sendMessage.fromUserId).Wait();
            }

            return(new OkResult());
        }
예제 #18
0
 public IMinecraftUser GetUser(string username) => ConnectedUsers.FirstOrDefault(x => x.Username == username);
예제 #19
0
 public LoginClient GetClientByUserID(int userID)
 {
     return(ConnectedUsers.FirstOrDefault(x => x.UserId == userID));
 }