/// <summary>
        /// Add Slack User Details to the database
        /// </summary>
        /// <param name="slackUserDetails"></param>
        private void AddSlackUserDetail(SlackUserDetails slackUserDetails)
        {
            Mapper.Initialize(cfg => cfg.CreateMap <SlackUserDetails, SlackUserDetails>()

                              .ForMember(des => des.Title,
                                         opt => opt.MapFrom(src => src.Profile.Title)
                                         )
                              .ForMember(des => des.Email,
                                         opt => opt.MapFrom(src => src.Profile.Email)
                                         )
                              .ForMember(des => des.Skype,
                                         opt => opt.MapFrom(src => src.Profile.Skype)
                                         )
                              .ForMember(des => des.LastName,
                                         opt => opt.MapFrom(src => src.Profile.LastName)
                                         )
                              .ForMember(des => des.FirstName,
                                         opt => opt.MapFrom(src => src.Profile.FirstName)
                                         )
                              .ForMember(des => des.Phone,
                                         opt => opt.MapFrom(src => src.Profile.Phone)
                                         )
                              );

            // Perform mapping
            slackUserDetails = Mapper.Map(slackUserDetails, slackUserDetails);

            slackUserDetails.CreatedOn = DateTime.UtcNow;
            _slackUserDetails.Insert(slackUserDetails);
        }
        /// <summary>
        /// Method to get slack user information by their slack user id
        /// </summary>
        /// <param name="slackId">slack user id</param>
        /// <returns>object of SlackUserDetailAc</returns>
        public async Task <SlackUserDetailAc> GetByIdAsync(string slackId)
        {
            SlackUserDetails slackUserDetail = await _slackUserDetailsRepository.FirstOrDefaultAsync(x => x.UserId == slackId);

            SlackUserDetailAc slackUserDetailAc = _mapper.Map <SlackUserDetailAc>(slackUserDetail);

            return(slackUserDetailAc);
        }
 /// <summary>
 /// Add Slack User Details to the database - JJ
 /// </summary>
 /// <param name="slackUserDetails">slack user details. Object of SlackUserDetails</param>
 private async Task AddSlackUserDetailAsync(SlackUserDetails slackUserDetails)
 {
     // Perform mapping
     slackUserDetails           = _mapper.Map <SlackUserDetails>(slackUserDetails);
     slackUserDetails.CreatedOn = DateTime.UtcNow;
     _slackUserDetailsRepository.Insert(slackUserDetails);
     await _slackUserDetailsRepository.SaveChangesAsync();
 }
        /// <summary>
        /// Method to get slack user information by their slack user name. - JJ
        /// </summary>
        /// <param name="userSlackName">slack user name</param>
        /// <returns>object of SlackUserDetailAc</returns>
        public async Task <SlackUserDetailAc> GetBySlackNameAsync(string userSlackName)
        {
            SlackUserDetails slackUserDetail = await _slackUserDetailsRepository.FirstOrDefaultAsync(x => x.Name == userSlackName);

            SlackUserDetailAc slackUserDetailAc = _mapper.Map <SlackUserDetailAc>(slackUserDetail);

            return(slackUserDetailAc);
        }
        /// <summary>
        /// Method to update slack user table when there is any changes in slack
        /// </summary>
        /// <param name="slackEvent"></param>
        public async Task SlackEventUpdateAsync(SlackEventApiAC slackEvent)
        {
            SlackUserDetails user = await _slackUserDetailsRepository.FirstOrDefaultAsync(x => x.UserId == slackEvent.Event.User.UserId);

            if (user == null)
            {
                await _slackUserRepository.AddSlackUserAsync(slackEvent.Event.User);
            }
        }
 /// <summary>
 /// Method to update slack user
 /// </summary>
 /// <param name="slackUserDetails"></param>
 public void UpdateSlackUser(SlackUserDetails slackUserDetails)
 {
     if (slackUserDetails.IsBot || slackUserDetails.Name == _stringConstant.SlackBotStringName)
     {
         UpdateSlackBotUser(slackUserDetails);
     }
     else
     {
         UpdateSlackUserDetail(slackUserDetails);
     }
 }
        /// <summary>
        /// Method to add/update slack user
        /// </summary>
        /// <param name="slackUserDetails">slack user details. Object of SlackUserDetails</param>
        public async Task AddSlackUserAsync(SlackUserDetails slackUserDetails)
        {
            SlackUserDetails slackUser = await _slackUserDetailsRepository.FirstOrDefaultAsync(x => x.UserId == slackUserDetails.UserId);

            if (slackUser == null)
            {
                if (!slackUserDetails.Deleted)
                {
                    //Added to database only if the user is not deleted
                    await AddSlackUserDetailAsync(slackUserDetails);
                }
            }
            else
            {
                await UpdateSlackUserAsync(slackUserDetails);
            }
        }
        private void UpdateSlackUserDetail(SlackUserDetails slackUserDetails)
        {
            var user = _slackUserDetails.FirstOrDefault(x => x.UserId == slackUserDetails.UserId);

            if (user != null)
            {
                Mapper.Initialize(cfg => cfg.CreateMap <SlackUserDetails, SlackUserDetails>()
                                  .ForMember(des => des.Id, opt =>
                {
                    opt.UseDestinationValue();
                    opt.Ignore();
                })
                                  .ForMember(des => des.CreatedOn, opt =>
                {
                    opt.UseDestinationValue();
                    opt.Ignore();
                })
                                  .ForMember(des => des.Title,
                                             opt => opt.MapFrom(src => src.Profile.Title)
                                             )
                                  .ForMember(des => des.Email,
                                             opt => opt.MapFrom(src => src.Profile.Email)
                                             )
                                  .ForMember(des => des.Skype,
                                             opt => opt.MapFrom(src => src.Profile.Skype)
                                             )
                                  .ForMember(des => des.LastName,
                                             opt => opt.MapFrom(src => src.Profile.LastName)
                                             )
                                  .ForMember(des => des.FirstName,
                                             opt => opt.MapFrom(src => src.Profile.FirstName)
                                             )
                                  .ForMember(des => des.Phone,
                                             opt => opt.MapFrom(src => src.Profile.Phone)
                                             )
                                  );

                // Perform mapping
                user = Mapper.Map(slackUserDetails, user);
                _slackUserDetails.Update(user);
            }
            else
            {
                throw new SlackUserNotFoundException(_stringConstant.UserNotFound);
            }
        }
        /// <summary>
        /// Method to update slack user. - JJ
        /// </summary>
        /// <param name="slackUserDetails">slack user details. Object of SlackUserDetails</param>
        public async Task UpdateSlackUserAsync(SlackUserDetails slackUserDetails)
        {
            SlackUserDetails user = await _slackUserDetailsRepository.FirstOrDefaultAsync(x => x.UserId == slackUserDetails.UserId);

            if (slackUserDetails.Deleted)
            {
                //delete the deleted user from database
                _slackUserDetailsRepository.Delete(user.Id);
                await _slackUserDetailsRepository.SaveChangesAsync();
            }
            else
            {
                // Perform mapping
                user = _mapper.Map(slackUserDetails, user);
                _slackUserDetailsRepository.Update(user);
                await _slackUserDetailsRepository.SaveChangesAsync();
            }
        }
        /// <summary>
        /// Method to add slack user
        /// </summary>
        /// <param name="slackUserDetails"></param>
        public void AddSlackUser(SlackUserDetails slackUserDetails)
        {
            SlackUserDetails   slackUser    = _slackUserDetails.FirstOrDefault(x => x.UserId == slackUserDetails.UserId);
            SlackBotUserDetail slackBotUser = _slackUserBotDetails.FirstOrDefault(x => x.UserId == slackUserDetails.UserId);

            if (slackUser == null && slackBotUser == null)
            {
                if (slackUserDetails.IsBot || slackUserDetails.Name == _stringConstant.SlackBotStringName)
                {
                    AddSlackBotUserDetail(slackUserDetails);
                }
                else
                {
                    AddSlackUserDetail(slackUserDetails);
                }
            }
            else
            {
                UpdateSlackUser(slackUserDetails);
            }
        }
        /// <summary>
        /// Add slack BotUser details to the database
        /// </summary>
        /// <param name="slackUserDetails"></param>
        private void AddSlackBotUserDetail(SlackUserDetails slackUserDetails)
        {
            SlackBotUserDetail slackUserBotDetail = new SlackBotUserDetail();

            Mapper.Initialize(cfg => cfg.CreateMap <SlackUserDetails, SlackBotUserDetail>()
                              .ForMember(des => des.FirstName,
                                         opt => opt.MapFrom(src => src.Profile.FirstName)
                                         )
                              .ForMember(des => des.LastName,
                                         opt => opt.MapFrom(src => src.Profile.LastName)
                                         )
                              .ForMember(des => des.BotId,
                                         opt => opt.MapFrom(src => src.Profile.BotId)
                                         )
                              );

            // Perform mapping
            slackUserBotDetail = Mapper.Map(slackUserDetails, slackUserBotDetail);

            slackUserBotDetail.CreatedOn = DateTime.UtcNow;
            _slackUserBotDetails.Insert(slackUserBotDetail);
        }
        private void UpdateSlackBotUser(SlackUserDetails slackUserDetails)
        {
            var botUser = _slackUserBotDetails.FirstOrDefault(x => x.UserId == slackUserDetails.UserId);

            if (botUser != null)
            {
                Mapper.Initialize(cfg => cfg.CreateMap <SlackUserDetails, SlackBotUserDetail>()
                                  .ForMember(des => des.Id, opt =>
                {
                    opt.UseDestinationValue();
                    opt.Ignore();
                })
                                  .ForMember(des => des.CreatedOn, opt =>
                {
                    opt.UseDestinationValue();
                    opt.Ignore();
                })

                                  .ForMember(des => des.LastName,
                                             opt => opt.MapFrom(src => src.Profile.LastName)
                                             )
                                  .ForMember(des => des.FirstName,
                                             opt => opt.MapFrom(src => src.Profile.FirstName)
                                             )
                                  .ForMember(des => des.BotId,
                                             opt => opt.MapFrom(src => src.Profile.BotId)
                                             )
                                  );

                // Perform mapping
                botUser = Mapper.Map(slackUserDetails, botUser);
                _slackUserBotDetails.Update(botUser);
            }
            else
            {
                throw new SlackUserNotFoundException(_stringConstant.BotNotFound);
            }
        }
Ejemplo n.º 13
0
        public async Task <string> ProcessMessages(string userId, string channelId, string message)
        {
            string              replyText = string.Empty;
            SlackUserDetails    user      = _slackUserDetails.GetById(userId);
            SlackChannelDetails channel   = _slackChannelRepository.GetById(channelId);
            //the command is split to individual words
            //commnads ex: "scrum time", "later @userId"
            var messageArray = message.Split(null);

            if (user != null && String.Compare(message, _stringConstant.ScrumHelp, true) == 0)
            {
                replyText = _stringConstant.ScrumHelpMessage;
            }
            else if (user != null && channel != null)
            {
                //commands could be"scrum time" or "scrum halt" or "scrum resume"
                if (String.Compare(message, _stringConstant.ScrumTime, true) == 0 || String.Compare(message, _stringConstant.ScrumHalt, true) == 0 || String.Compare(message, _stringConstant.ScrumResume, true) == 0)
                {
                    replyText = await Scrum(channel.Name, user.Name, messageArray[1].ToLower());
                }
                //a particular employee is on leave, getting marked as later or asked question again
                //commands would be "leave @userId"
                else if ((String.Compare(messageArray[0], _stringConstant.Leave, true) == 0) && messageArray.Length == 2)
                {
                    int fromIndex = message.IndexOf("<@") + "<@".Length;
                    int toIndex   = message.LastIndexOf(">");
                    if (toIndex > 0)
                    {
                        try
                        {
                            //the userId is fetched
                            string applicantId = message.Substring(fromIndex, toIndex - fromIndex);
                            //fetch the user of the given userId
                            SlackUserDetails applicant = _slackUserDetails.GetById(applicantId);
                            if (applicant != null)
                            {
                                string applicantName = applicant.Name;
                                replyText = await Leave(channel.Name, user.Name, applicantName);
                            }
                            else
                            {
                                replyText = _stringConstant.NotAUser;
                            }
                        }
                        catch (Exception)
                        {
                            replyText = _stringConstant.ScrumHelpMessage;
                        }
                    }
                    else
                    {
                        replyText = await AddScrumAnswer(user.Name, message, channel.Name);
                    }
                }
                //all other texts
                else
                {
                    replyText = await AddScrumAnswer(user.Name, message, channel.Name);
                }
            }
            //If channel is not registered in the database
            else if (user != null)
            {
                //If channel is not registered in the database and the command encountered is "add channel channelname"
                if (channel == null && String.Compare(messageArray[0], _stringConstant.Add, true) == 0 && String.Compare(messageArray[1], _stringConstant.Channel, true) == 0)
                {
                    replyText = AddChannelManually(messageArray[2], user.Name, channelId).Result;
                }
                else
                {
                    replyText = _stringConstant.ChannelAddInstruction;
                }
            }
            else if (user == null)
            {
                SlackBotUserDetail botUser = _slackBotUserDetail.FirstOrDefault(x => x.UserId == userId);
                if (botUser == null)
                {
                    replyText = _stringConstant.NoSlackDetails;
                }
            }

            return(replyText);
        }
        /// <summary>
        /// Method to get slack user information by their slack user id
        /// </summary>
        /// <param name="slackId"></param>
        /// <returns>user</returns>
        public SlackUserDetails GetById(string slackId)
        {
            SlackUserDetails user = _slackUserDetails.FirstOrDefault(x => x.UserId == slackId);

            return(user);
        }
        /// <summary>
        /// Method to add/update Slack User,channels and groups information
        /// </summary>
        /// <param name="code"></param>
        /// <returns></returns>
        public async Task AddSlackUserInformationAsync(string code)
        {
            string slackOAuthRequest  = string.Format(_stringConstant.SlackOauthRequestUrl, _envVariableRepository.SlackOAuthClientId, _envVariableRepository.SlackOAuthClientSecret, code);
            string slackOAuthResponse = await _httpClientService.GetAsync(_stringConstant.OAuthAcessUrl, slackOAuthRequest, null, _stringConstant.Bearer);

            SlackOAuthResponse slackOAuth = JsonConvert.DeserializeObject <SlackOAuthResponse>(slackOAuthResponse);

            _logger.Info("slackOAuth UserID" + slackOAuth.UserId);
            bool checkUserIncomingWebHookExist = _incomingWebHookRepository.Any(x => x.UserId == slackOAuth.UserId);

            if (!checkUserIncomingWebHookExist)
            {
                IncomingWebHook slackItem = new IncomingWebHook()
                {
                    UserId             = slackOAuth.UserId,
                    IncomingWebHookUrl = slackOAuth.IncomingWebhook.Url
                };
                _incomingWebHookRepository.Insert(slackItem);
                await _incomingWebHookRepository.SaveChangesAsync();
            }

            string detailsRequest = string.Format(_stringConstant.SlackUserDetailsUrl, slackOAuth.AccessToken);
            //get all the slack users of the team
            string userDetailsResponse = await _httpClientService.GetAsync(_stringConstant.SlackUserListUrl, detailsRequest, null, _stringConstant.Bearer);

            SlackUserResponse slackUsers = JsonConvert.DeserializeObject <SlackUserResponse>(userDetailsResponse);

            if (slackUsers.Ok)
            {
                SlackUserDetails slackUserDetails = slackUsers.Members?.Find(x => x.UserId == slackOAuth.UserId);
                _logger.Debug("slackUserDetails" + slackUserDetails.UserId);
                if (!string.IsNullOrEmpty(slackUserDetails?.Profile?.Email))
                {
                    //fetch the details of the user who is authenticated with Promact OAuth server with the given slack user's email
                    _logger.Debug("Profile Email" + slackUserDetails.Profile.Email);
                    ApplicationUser applicationUser = await _userManager.FindByEmailAsync(slackUserDetails.Profile.Email);

                    if (applicationUser != null)
                    {
                        _logger.Debug("slackUserDetails UserID" + slackUserDetails.UserId);
                        applicationUser.SlackUserId = slackUserDetails.UserId;
                        _logger.Debug("applicationUser SlackUserId" + applicationUser.SlackUserId);
                        var succeeded = await _userManager.UpdateAsync(applicationUser);

                        _logger.Debug("applicationUser Object:" + JsonConvert.SerializeObject(applicationUser));
                        _logger.Debug("Update Application User succeeded" + succeeded.Succeeded);
                        _logger.Debug("Update Application User Errors" + succeeded.Errors);
                        ApplicationUser testApllicationUser = await _userManager.FindByEmailAsync(applicationUser.Email);

                        _logger.Debug("Test Application Slcak UserId" + testApllicationUser.SlackUserId);
                        _logger.Debug("Test ApplicationUser Object:" + JsonConvert.SerializeObject(testApllicationUser));
                        await _slackUserRepository.AddSlackUserAsync(slackUserDetails);

                        _logger.Debug("Add Slack User Id Done");
                        //the public channels' details
                        string channelDetailsResponse = await _httpClientService.GetAsync(_stringConstant.SlackChannelListUrl, detailsRequest, null, _stringConstant.Bearer);

                        SlackChannelResponse channels = JsonConvert.DeserializeObject <SlackChannelResponse>(channelDetailsResponse);
                        if (channels.Ok)
                        {
                            _logger.Info("Channels error:" + channels.ErrorMessage);
                            foreach (var channel in channels.Channels)
                            {
                                _logger.Info("Channel:" + channel);
                                await AddChannelGroupAsync(channel);
                            }
                        }
                        else
                        {
                            throw new SlackAuthorizeException(_stringConstant.SlackAuthError + channels.ErrorMessage);
                        }
                        _logger.Info("Slack User Id  : " + (await _userManager.FindByEmailAsync(applicationUser.Email)).SlackUserId);
                        //the public groups' details
                        string groupDetailsResponse = await _httpClientService.GetAsync(_stringConstant.SlackGroupListUrl, detailsRequest, null, _stringConstant.Bearer);

                        SlackGroupDetails groups = JsonConvert.DeserializeObject <SlackGroupDetails>(groupDetailsResponse);
                        _logger.Info("Groups:" + groups.ErrorMessage);
                        _logger.Debug("Slack User Id  : " + (await _userManager.FindByEmailAsync(applicationUser.Email)).SlackUserId);
                        if (groups.Ok)
                        {
                            foreach (var channel in groups.Groups)
                            {
                                _logger.Info("Group:" + channel);
                                await AddChannelGroupAsync(channel);

                                _logger.Debug("Slack User Id  : " + (await _userManager.FindByEmailAsync(applicationUser.Email)).SlackUserId);
                            }
                        }
                        else
                        {
                            throw new SlackAuthorizeException(_stringConstant.SlackAuthError + groups.ErrorMessage);
                        }
                    }
                    else
                    {
                        throw new SlackAuthorizeException(string.Format(_stringConstant.NotInSlackOrNotExpectedUser, slackUserDetails.Profile.Email));
                    }
                }
                else
                {
                    throw new SlackAuthorizeException(_stringConstant.UserNotInSlack);
                }
            }
            else
            {
                throw new SlackAuthorizeException(_stringConstant.SlackAuthError + slackUsers.ErrorMessage);
            }
        }