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; }
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); }
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", "#" } }; }
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; }
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; }