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)))); }
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)))); }
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); }
public async Task List() { var body = JsonConvert.SerializeObject(chatGroups); await Clients.Caller.SendAsync(receiveMethodName, MessageConstructor.SystemMessage(body)); }