private async Task <string> ParseMemberFromMessage(SlackEventFullDto <ReactionEventDto> slackEventDto) { SlackMessageDto messageDto = await _slackService.ChatRetrieveMessage(slackEventDto.Event.Item.Channel, slackEventDto.Event.Item.Ts); MessageDetailsDto initialMessage = messageDto.Messages.FirstOrDefault(); int startIndex = initialMessage.Text.IndexOf('@') + 1; int endIndex = initialMessage.Text.IndexOf('>') - 1; int length = endIndex - startIndex + 1; string memberId = initialMessage.Text.Substring(startIndex, length); return(memberId); }
private async Task ProcessReactionRemovedEvent(SlackEventFullDto <ReactionEventDto> slackEventDto) { if (InvalidTechnologyReaction(slackEventDto)) { return; } string reactionName = slackEventDto.Event.Reaction; SlackMessageDto messageDto = await _slackService.ChatRetrieveMessage(slackEventDto.Event.Item.Channel, slackEventDto.Event.Item.Ts); MessageDetailsDto initialMessage = messageDto.Messages.First(); Reaction reaction = initialMessage.Reactions?.Find(r => r.Name == reactionName); // Only delete technology if it's the last // instance of the particular reaction and // if the remaining reactions do not belong // to privileged members. if (reaction != null) { bool reactedByPrivilegedUsers = reaction.Users.Intersect(_privilegedMembers.Members).Count() > 0; bool reactedByOwner = reaction.Users.Contains(initialMessage.User); if (reactedByPrivilegedUsers || reactedByOwner) { return; } } string technologyName = reactionName.Remove(reactionName.LastIndexOf("-")); // if technology name uses keywords - replace them with appropriate // value foreach (var word in _keywords) { technologyName = technologyName.Replace(word.Key, word.Value); } string workspaceId = slackEventDto.TeamId; string workspaceMemberId = slackEventDto.Event.ItemUser; UserEntity user = await GetUserEntity(workspaceId, workspaceMemberId); TechnologyEntity technology = user.UserTechnologies.Find(tech => tech.Name == technologyName); // if technology has been deleted that for // some reason doesn't exist in db return if (technology == null) { return; } await _technologiesStorage.DeleteAsync(technology.Id); }
private async Task ProcessPrivateProjectsReactionAddedEvent(SlackEventFullDto <ReactionEventDto> slackEventDto) { string reaction = slackEventDto.Event.Reaction; if (reaction == "share") { SlackMessageDto message = await _slackService.ChatRetrieveMessage(slackEventDto.Event.Item.Channel, slackEventDto.Event.Item.Ts); MessageDetailsDto messageDetails = message.Messages.FirstOrDefault(); // replace unicode left and right quote var text = messageDetails.Text.Replace('\u201c', '"').Replace('\u201d', '"'); ProjectDto project = JsonConvert.DeserializeObject <ProjectDto>(text); string projectMessage = Messages.ProjectPostedMessage(project, $"{_mainUrl}/projects/{project.Id}"); await _slackService.ChatPostMessage(_projectIdeasChannel, projectMessage, asUser : true, unfurlLinks : false); } }