コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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);
            }
        }