Example #1
0
        private async Task ProcessGithubConnectCommand(SlackCommandDto slackCommand)
        {
            string workspaceId       = slackCommand.team_id;
            string workspaceMemberId = slackCommand.user_id;

            ChatAppUserEntity workspaceUser = await _chatAppUserStorage.FindAsync(u => u.WorkspaceId == workspaceId && u.WorkspaceMemberId == workspaceMemberId);

            var githubService        = new GitHubService();
            var slackCommandResponse = new SlackCommandResponseDto();
            var user = workspaceUser.User;

            try
            {
                var organizationMembership = await githubService.InviteToGithubOrg(slackCommand.text);

                user.GitHubUsername = slackCommand.text;
                await _userStorage.UpdateAsync(user);
            }
            catch
            {
                slackCommandResponse.Text = "Sorry, something happened with our GitHub api call. :(\n Please try once more. If that doesn't work, reach out to <@UBW8QQG86> to be added manually.";
                await _slackService.RespondViaResponsUrl(slackCommand.response_url, slackCommandResponse);

                return;
            }

            slackCommandResponse.Text = $"Success! You should have gotten an email with an invite to the GitHub org. You can also visit https://github.com/{_githubOrganization} to accept the invite.";
            await _slackService.RespondViaResponsUrl(slackCommand.response_url, slackCommandResponse);

            return;
        }
Example #2
0
        private async Task <UserEntity> GetUserEntity(string workspaceId, string workspaceMemberId)
        {
            ChatAppUserEntity workspaceUser = await _chatAppUserStorage.FindAsync(u => u.WorkspaceId == workspaceId && u.WorkspaceMemberId == workspaceMemberId);

            UserEntity user = workspaceUser.User;

            return(user);
        }
Example #3
0
 public EventHandler(IConfiguration configuration)
 {
     _introductionChannelId        = configuration["IntroductionChannelId"];
     _privateIntroChannelId        = configuration["PrivateIntroChannelId"];
     _privateRegistrationChannelId = configuration["PrivateRegistrationChannelId"];
     _privateProjectsChannelId     = configuration["PrivateProjectsChannelId"];
     _projectIdeasChannel          = configuration["ProjectIdeasChannelId"];
     _chatAppUserStorage           = new ChatAppUserEntity();
     _technologiesStorage          = new TechnologyEntity();
     _slackService      = new SlackService();
     _passwordHasher    = new PasswordHasher <User>();
     _mapper            = new InitializeMapper().GetMapper;
     _privilegedMembers = JsonConvert.DeserializeObject <PrivilegedMembersDto>(configuration["PrivilegedMembers"]);
     _mainUrl           = configuration["MainUrl"];
     _keywords          = new Dictionary <string, string>()
     {
         { "dot", "." }, { "sharp", "#" }
     };
 }
Example #4
0
        private async Task GenerateMagicLoginLink(SlackCommandDto slackCommand)
        {
            var    linkExpirationInMinutes = 5;
            string token             = TokenHelper.GenerateToken().Replace("/", "");
            string workspaceId       = slackCommand.team_id;
            string workspaceMemberId = slackCommand.user_id;

            ChatAppUserEntity workspaceUser = await _chatAppUserStorage.FindAsync(u => u.WorkspaceId == workspaceId && u.WorkspaceMemberId == workspaceMemberId);

            var user = workspaceUser.User;

            user.MagicLoginToken          = token;
            user.MagicLoginTokenExpiresAt = DateTimeOffset.Now.AddMinutes(linkExpirationInMinutes);
            await _userStorage.UpdateAsync(user);

            var slackCommandResponse = new SlackCommandResponseDto();

            slackCommandResponse.Text = $"Your magic login link expires in {linkExpirationInMinutes} minutes.\n\n {_mainUrl}/magic-login?token={Uri.EscapeDataString(token)}";
            await _slackService.RespondViaResponsUrl(slackCommand.response_url, slackCommandResponse);

            return;
        }
Example #5
0
        private async Task ProcessTeamJoinEvent(SlackEventFullDto <TeamJoinEventDto> slackEventDto)
        {
            _userStorage = new UserEntity();

            if (slackEventDto.Event.User.IsBot)
            {
                return;
            }

            string workspaceId       = slackEventDto.Event.User.SlackTeamId;
            string workspaceMemberId = slackEventDto.Event.User.SlackId;

            SlackUserInfoDto slackUserInfoDto = await _slackService.GetSlackUserInfo(workspaceMemberId);

            string chatAppMemberEmail = slackUserInfoDto.User.Profile.Email;

            UserEntity existingUser = await _userStorage.FindAsync(u => u.Email == chatAppMemberEmail);

            if (existingUser == null)
            {
                // User email is not registered to frontend so
                // register user and also associate new chat app
                // user to new user entity
                string username = await GenerateUsername();

                string     password   = GenerateTemporaryPassword();
                User       user       = new User(username, slackUserInfoDto.User.Profile.Email, slackUserInfoDto.User.Timezone, slackUserInfoDto.User.Locale, true, "", slackEventDto.Event.User.Profile.Image192);
                UserEntity userEntity = _mapper.Map <UserEntity>(user);
                userEntity.HashedPassword = HashPassword(user, password);


                UserEntity newUser = await _userStorage.CreateAsync(userEntity);

                ChatAppUserEntity newChatAppUser = new ChatAppUserEntity()
                {
                    WorkspaceId       = workspaceId,
                    WorkspaceMemberId = workspaceMemberId,
                    UserId            = newUser.Id,
                };

                await _chatAppUserStorage.CreateAsync(newChatAppUser);

                string message = Messages.OnboardingMessage(workspaceMemberId, user.Email, password);
                await _slackService.ChatPostMessage(workspaceMemberId, message);

                await _slackService.ChatPostMessage(_privateRegistrationChannelId, $"<@{workspaceMemberId}>, `{username}`, `{user.Email}` joined the slack group. Send follow up.");
            }
            else
            {
                // User email is already register to frontend
                // associate new chat user record with existing user
                // TODO: Picture may be overwritten here if member
                // previously uploaded a profile pic through frontend,
                // remove once we have profile upload functionality on UI.
                existingUser.ProfilePictureUrl = slackEventDto.Event.User.Profile.Image192;

                ChatAppUserEntity newChatAppUser = new ChatAppUserEntity()
                {
                    WorkspaceId       = workspaceId,
                    WorkspaceMemberId = workspaceMemberId,
                    UserId            = existingUser.Id,
                };

                await _userStorage.UpdateAsync(existingUser);

                await _chatAppUserStorage.CreateAsync(newChatAppUser);

                string message = Messages.OnboardingRegisteredMessage(workspaceMemberId);
                await _slackService.ChatPostMessage(workspaceMemberId, message);

                await _slackService.ChatPostMessage(_privateRegistrationChannelId, $"<@{workspaceMemberId}>, `{existingUser.Username}`, `{existingUser.Username}` registered and joined the slack group. Send follow up.");
            }

            return;
        }