Пример #1
0
        public async Task AddFriend(FriendRequestSent friend)
        {
            RineUser receiver = _context.Users.First(u => u.UserName == friend.Receiver);
            RineUser sender   = _context.Users.First(u => u.UserName == Context.User.Identity.Name);

            DateTime now = DateTime.Now;

            if (sender != null && receiver != null)
            {
                var friendship = new Friendship
                {
                    UserRecvId    = receiver.Id,
                    UserRequestId = sender.Id,
                    Description   = friend.Description,
                    Status        = FriendshipStatus.Pending,
                };
                _context.Add(friendship);
                await _context.SaveChangesAsync();

                await Clients.User(receiver.UserName).NotifyFriendRequests(new FriendRequestRecv
                {
                    Id          = friendship.Id,
                    Sender      = sender.UserName,
                    Created     = now,
                    Description = friend.Description,
                });
            }
        }
Пример #2
0
        public async Task ActionFriendRequest(FriendRequestAction action)
        {
            RineUser   sender     = _context.Users.First(u => u.UserName == action.Sender);
            RineUser   receiver   = _context.Users.First(u => u.UserName == Context.User.Identity.Name);
            Friendship friendship = _context.Friendship.Find(action.Id);

            if (receiver != null &&
                sender != null &&
                friendship != null &&
                friendship.UserRecvId == receiver.Id &&
                friendship.UserRequestId == sender.Id &&
                friendship.Status == FriendshipStatus.Pending)
            {
                if (action.Accept)
                {
                    await Clients.User(sender.UserName).NotifyNewFriend(UserToFriendInfo(receiver));

                    await Clients.User(receiver.UserName).NotifyNewFriend(UserToFriendInfo(sender));
                }

                friendship.Actioned = DateTime.Now;
                friendship.Status   = action.Accept
                    ? FriendshipStatus.Accepted
                    : FriendshipStatus.Denied;
                await _context.SaveChangesAsync();
            }
        }
Пример #3
0
        public async Task SendMessage(MessageSent mesg)
        {
            // don't use `mesg.Sender` to prevent forged messages
            RineUser sender   = _context.Users.First(u => u.UserName == Context.User.Identity.Name);
            RineUser receiver = _context.Users.First(u => u.UserName == mesg.Receiver);

            bool     received = false;
            DateTime now      = DateTime.Now;

            if (receiver.Status == UserStatus.Online || receiver.Status == UserStatus.Invisible)
            {
                await Clients.User(receiver.UserName).ReceiveMessage(new MessageRecv
                {
                    Content = mesg.Content,
                    Sender  = sender.UserName,
                    Created = now,
                });

                received = true;
            }

            if (sender != null && receiver != null)
            {
                _context.Add(new RineMessage
                {
                    Content  = mesg.Content,
                    Sender   = sender,
                    Receiver = receiver,
                    Received = received
                });

                await _context.SaveChangesAsync();
            }
        }
Пример #4
0
        public async Task <IActionResult> Register(UserRegister userInfo)
        {
            var user = new RineUser {
                UserName = userInfo.UserName
            };
            var result = await _userManager.CreateAsync(user, userInfo.Password);

            if (result.Succeeded)
            {
                await _userManager.AddClaimAsync(user, new Claim(ClaimTypes.Name, userInfo.UserName));

                _logger.LogInformation($"User created a new account with UserName: {userInfo.UserName}");
                return(Json(new
                {
                    code = 0,
                    messages = new List <string> {
                        "registration success"
                    },
                }));
            }
            else
            {
                return(Json(new
                {
                    code = 1,
                    messages = result.Errors.ToList(),
                }));
            }
        }
Пример #5
0
 public static FriendInfo UserToFriendInfo(RineUser user)
 {
     return(new FriendInfo
     {
         UserName = user.UserName,
         Created = user.Created,
         LastOnline = user.LastOnline,
         Status = user.Status == UserStatus.Online
             ? FriendStatus.Online
             : FriendStatus.Offline,
     });
 }
Пример #6
0
        public async override Task OnDisconnectedAsync(Exception exception)
        {
            string name = Context.User.Identity.Name;

            RineUser user = _context.Users.First(u => u.UserName == name);

            user.Status     = UserStatus.Offline;
            user.LastOnline = DateTime.Now;
            await _context.SaveChangesAsync();

            var friendsOnline = (from f in _context.GetAllFriendsOnline(user)
                                 select f.UserName).ToList();
            await Clients.Users(friendsOnline).NotifyFriendStatus(UserToFriendInfo(user));

            await base.OnDisconnectedAsync(exception);
        }
Пример #7
0
        public async override Task OnConnectedAsync()
        {
            string name = Context.User.Identity.Name;

            RineUser user = _context.Users.First(u => u.UserName == name);

            user.Status = UserStatus.Online;
            await _context.SaveChangesAsync();

            var friendsOnline = (from f in _context.GetAllFriendsOnline(user)
                                 select f.UserName).ToList();
            await Clients.Users(friendsOnline).NotifyFriendStatus(UserToFriendInfo(user));

            var tasks = _context.GetAllFriends(user).Select(f => Clients.User(name).NotifyFriendStatus(UserToFriendInfo(f)));

            Task.WaitAll(tasks.ToArray());

            await base.OnConnectedAsync();
        }