Exemple #1
0
        public async Task Leave(string groupId)
        {
            var existingGroup = chatGroups.FirstOrDefault(x => x.PublicId == groupId);

            if (existingGroup == null)
            {
                await Clients.Caller.SendAsync(receiveMethodName, MessageConstructor.SystemMessage(ErrorMessages.GroupDoesNotExist(groupId)));

                return;
            }

            if (existingGroup.ClientsConnected.FirstOrDefault(x => x == Context.ConnectionId) == null)
            {
                await Clients.Caller.SendAsync(receiveMethodName, MessageConstructor.SystemMessage(ErrorMessages.NotAGroupMember(existingGroup.Name)));

                return;
            }

            existingGroup.ClientsConnected.Remove(Context.ConnectionId);
            if (existingGroup.ClientsConnected.Count == 0)
            {
                chatGroups.Remove(existingGroup);
            }

            var clientName = await _processor.OnGroupLeave(groupId, Context.ConnectionId);

            Task.WaitAll(
                Groups.RemoveFromGroupAsync(Context.ConnectionId, existingGroup.Name),
                Clients.Caller
                .SendAsync(receiveMethodName, MessageConstructor.SystemMessage(InformationMessages.SuccessfullyLeftGroup(existingGroup.Name))),
                Clients.Group(existingGroup.Name)
                .SendAsync(receiveMethodName, MessageConstructor.SystemMessage(InformationMessages.ClientHasLeftGroup(clientName))));
        }
Exemple #2
0
        public async Task Join(string groupId)
        {
            var existingGroup = chatGroups.FirstOrDefault(x => x.PublicId == groupId);

            if (existingGroup == null)
            {
                await Clients.Caller.SendAsync(receiveMethodName, MessageConstructor.SystemMessage(ErrorMessages.GroupDoesNotExist(groupId)));

                return;
            }

            var groupName = existingGroup.Name;

            if (existingGroup.CurrentClientsAmount == existingGroup.MaximumClientsAmount)
            {
                await Clients.Caller.SendAsync(receiveMethodName, MessageConstructor.SystemMessage(InformationMessages.ClientsInGroupLimitReached(groupName, _appConfig.MaximumGroupSize)));

                return;
            }

            if (existingGroup.ClientsConnected.FirstOrDefault(x => x == Context.ConnectionId) != null)
            {
                await Clients.Caller.SendAsync(receiveMethodName, MessageConstructor.SystemMessage(ErrorMessages.AlreadyAGroupMember(groupName)));

                return;
            }
            var groupHistoryToClientDto = await _processor.OnGroupJoin(existingGroup.PublicId, Context.ConnectionId);

            var groupMessage = new GroupMessage
            {
                GroupName = groupName,
                GroupId   = existingGroup.PublicId
            };

            existingGroup.ClientsConnected.Add(Context.ConnectionId);
            var exclutionList = new List <string> {
                Context.ConnectionId
            };

            Task.WaitAll(
                Groups.AddToGroupAsync(Context.ConnectionId, groupName),
                Clients.Caller.SendAsync(receiveMethodName, MessageConstructor.SystemMessage(InformationMessages.SuccessfullyJoinedGroup(groupName))),
                Clients.Caller.SendAsync(GroupMethodNames.OnGroupJoined, groupMessage),
                Clients.Caller.SendAsync(GroupMethodNames.ReceiveGroupHistory, MessageConstructor.GroupMessageHistory(groupHistoryToClientDto)),
                Clients.GroupExcept(groupName, exclutionList)
                .SendAsync(receiveMethodName, MessageConstructor.SystemMessage(InformationMessages.ClientHasJoinedGroup(groupHistoryToClientDto.Client.PublicName))));
        }
Exemple #3
0
        public async Task Create(string groupName)
        {
            if (chatGroups.FirstOrDefault(x => x.Name == groupName) != null)
            {
                await Clients.Caller.SendAsync(receiveMethodName, MessageConstructor.SystemMessage(ErrorMessages.GroupAlreadyExists(groupName)));

                return;
            }
            var groupDto = new GroupDto
            {
                Name = groupName,
                CurrentClientsAmount = 1,
                MaximumClientsAmount = _appConfig.MaximumGroupSize,
                CreatorConnectionId  = Context.ConnectionId,
                ClientsConnected     = new List <string>
                {
                    Context.ConnectionId
                }
            };
            var publicId = await _processor.OnGroupCreation(groupDto);

            groupDto.PublicId = publicId;
            chatGroups.Add(groupDto);

            await Groups.AddToGroupAsync(Context.ConnectionId, groupName);

            var message      = MessageConstructor.SystemMessage(InformationMessages.GroupSuccessfullyCreated(groupName));
            var groupMessage = new GroupMessage
            {
                GroupName  = groupName,
                GroupId    = groupDto.PublicId,
                Body       = message.Body,
                SenderName = message.SenderName,
                Time       = message.Time
            };

            await Clients.Caller.SendAsync(receiveMethodName, message);

            await Clients.Caller.SendAsync(GroupMethodNames.OnGroupJoined, groupMessage);
        }
Exemple #4
0
 public async Task List()
 {
     var body = JsonConvert.SerializeObject(chatGroups);
     await Clients.Caller.SendAsync(receiveMethodName, MessageConstructor.SystemMessage(body));
 }