public async Task ExecuteEvent(SlackEvent slackEvent)
        {
            string textToSave = GetEventKeywords(slackEvent.Event.Text);
            GetAuthorQueryResult authorResult = await _mediator.Send(new GetAuthorQuery(slackEvent.Event.User));

            if (authorResult.Result == QueryResult.NotFound)
            {
                await _disappearingSlackMessageProvider.SendDisappearingSlackMessage(
                    text : Constants.Constants.GetCannotSaveMessage("save"),
                    channel : slackEvent.Event.Channel,
                    attachment : "");

                return;
            }

            Note note = new Note(
                textToSave,
                slackEvent.Event.User,
                authorResult.Document.Team,
                GetUnixTimeNow());

            CreateNoteQueryResult result = await _mediator.Send(new CreateNoteQuery(note));

            await _disappearingSlackMessageProvider.SendDisappearingSlackMessage(
                text : Constants.Constants.MessageNoteSaved,
                channel : slackEvent.Event.Channel,
                attachment : "");
        }
        public async Task ExecuteEvent(SlackEvent slackEvent)
        {
            GetNotesQueryResult results = await _mediator.Send(new GetNotesQuery(slackEvent.Event.User, null, null, GetNotesQueryType.GetUserNotes));

            if (results.Result == QueryResult.NotFound)
            {
                await _disappearingSlackMessageProvider.SendDisappearingSlackMessage(
                    text : Constants.Constants.MessageNoUserNotesFound,
                    channel : slackEvent.Event.Channel,
                    attachment : "");

                return;
            }

            string cacheId = Guid.NewGuid().ToString();

            await _mediator.Send(new SetCacheItem(cacheId, results.Documents));

            dynamic notesAttachment = _attachmentGenerator.GenerateAttachment(results.Documents, cacheId, 1);

            await _disappearingSlackMessageProvider.SendDisappearingSlackMessage(
                text : Constants.Constants.MessageUserNotesFound,
                channel : slackEvent.Event.Channel,
                attachment : (string)notesAttachment);
        }
        public async Task <IActionResult> Event([FromBody] SlackEvent request)
        {
            switch (request.Type)
            {
            case (Constants.Constants.RequestTypeUrlVerification):
                return(Ok(_slackVerificationService.VerifySlackEventRequest(request)));

            case (Constants.Constants.RequestTypeEventCallback):
                if (!_eventFilter.IsBlocked(request))
                {
                    Hangfire.BackgroundJob.Enqueue(() =>
                                                   _commandStrategy.ExecuteEvent(request));
                }
                await _disappearingSlackMessageProvider.SnapSlackMessage(
                    request.Event.Channel,
                    request.Event.Ts);

                break;

            default:
                return(Ok());
            }

            return(Ok());
        }
 public async Task ExecuteEvent(SlackEvent slackEvent)
 {
     await _disappearingSlackMessageProvider.SendDisappearingSlackMessage(
         text : Constants.Constants.MessageTeamQuestion,
         channel : slackEvent.Event.Channel,
         attachment : _teamMenuAttachment);
 }
 public async Task ExecuteEvent(SlackEvent slackEvent)
 {
     await _disappearingSlackMessageProvider.SendDisappearingSlackMessage(
         text : Constants.Constants.MessageFallback,
         channel : slackEvent.Event.Channel,
         attachment : "");
 }
示例#6
0
 public string VerifySlackEventRequest(SlackEvent challengePayload)
 {
     if (challengePayload != null && challengePayload.Token == _verificationToken)
     {
         return(challengePayload.Challenge);
     }
     return(null);
 }
示例#7
0
 public async Task ExecuteEvent(SlackEvent slackEvent)
 {
     if (string.IsNullOrWhiteSpace(slackEvent.Event.Text))
     {
         return;
     }
     await _commands.FirstOrDefault(x => x.GetEventPattern.IsMatch(slackEvent.Event.Text))?.ExecuteEvent(slackEvent);
 }
        public async Task ExecuteEvent(SlackEvent slackEvent)
        {
            string textToSearch = GetEventKeywords(slackEvent.Event.Text);

            GetAuthorQueryResult authorResult = await _mediator.Send(new GetAuthorQuery(slackEvent.Event.User));

            if (authorResult.Result == QueryResult.NotFound)
            {
                await _disappearingSlackMessageProvider.SendDisappearingSlackMessage(
                    text : Constants.Constants.GetCannotSaveMessage("search"),
                    channel : slackEvent.Event.Channel,
                    attachment : "");

                return;
            }

            GetNotesQueryResult userNotes = await _mediator.Send(
                new GetNotesQuery(
                    slackEvent.Event.User,
                    authorResult.Document.Team,
                    textToSearch,
                    GetNotesQueryType.SearchUserNotes));

            GetNotesQueryResult teamNotes = await _mediator.Send(
                new GetNotesQuery(
                    slackEvent.Event.User,
                    authorResult.Document.Team,
                    textToSearch,
                    GetNotesQueryType.SearchTeamNotes));

            if (userNotes.Result == QueryResult.NotFound && teamNotes.Result == QueryResult.NotFound)
            {
                await _disappearingSlackMessageProvider.SendDisappearingSlackMessage(
                    text : Constants.Constants.MessageSearchNoNotes,
                    channel : slackEvent.Event.Channel,
                    attachment : "");

                return;
            }

            StringBuilder stringBuilder = new StringBuilder();

            stringBuilder.Append(_attachmentGenerator.GenerateAttachment(userNotes.Documents));
            stringBuilder.Append(_attachmentGenerator.GenerateAttachment(teamNotes.Documents));

            string notesAttachment = stringBuilder.ToString();

            await _disappearingSlackMessageProvider.SendDisappearingSlackMessage(
                text : Constants.Constants.MessageSearchFoundNotes,
                channel : slackEvent.Event.Channel,
                attachment : notesAttachment);
        }
示例#9
0
        public ActionResult Event(SlackEvent slackEvent)
        {
            if (slackEvent.Type == "url_verification")
            {
                return(Ok(new { challenge = slackEvent.Challenge }));
            }

            switch (slackEvent.Event.Type)
            {
            case MessageType:
                _eventService.MessageReceived(slackEvent.Event);
                return(Ok());

            default:
                return(Ok());
            }
        }
示例#10
0
        public async Task ProcessRequest_EventTypeWrong_Ignore()
        {
            //Arrange
            var slackEvent = new SlackEvent
            {
                Type = "EmojiReaction"
            };
            var request = new EventWrapperRequest
            {
                Event = slackEvent
            };

            // Act
            await _eventService.ProcessRequest(request);

            // Assert
            _elasticSearchService.VerifyNoOtherCalls();
            _slackClientMock.VerifyNoOtherCalls();
        }
示例#11
0
        public async Task ProcessRequest_MessageFromBot_Ignore()
        {
            //Arrange
            var slackEvent = new SlackEvent
            {
                BotId = "123456"
            };
            var request = new EventWrapperRequest
            {
                Event = slackEvent
            };

            // Act
            await _eventService.ProcessRequest(request);

            // Assert
            _elasticSearchService.VerifyNoOtherCalls();
            _slackClientMock.VerifyNoOtherCalls();
        }
示例#12
0
        public async Task ProcessRequest_MessageTextIsEmpty_Ignore()
        {
            //Arrange
            var slackEvent = new SlackEvent
            {
                Text = string.Empty
            };
            var request = new EventWrapperRequest
            {
                Event = slackEvent
            };

            // Act
            await _eventService.ProcessRequest(request);

            // Assert
            _elasticSearchService.VerifyNoOtherCalls();
            _slackClientMock.VerifyNoOtherCalls();
        }
示例#13
0
        public EventServiceTests()
        {
            var elasticsearchSettingsMock = new Mock <IOptions <ElasticsearchSettings> >();

            elasticsearchSettingsMock
            .SetupGet(m => m.Value)
            .Returns(() => new ElasticsearchSettings());

            _elasticSearchService      = new Mock <IElasticSearchService>();
            _slackClientMock           = new Mock <ISlackHttpClient>();
            _searchableTextServiceMock = new Mock <ISearchableTextService>();
            var logger = new Mock <ILogger <EventService> >();

            _eventService = new EventService(_slackClientMock.Object, _elasticSearchService.Object,
                                             _searchableTextServiceMock.Object, logger.Object);

            var slackEvent = new SlackEvent
            {
                Text    = "Hello from Slack!",
                Channel = "CBGJMA0TA",
                UserId  = "UBJ6GC75K",
                Type    = "message"
            };

            _request = new EventWrapperRequest
            {
                Event = slackEvent
            };

            _question = new SearchableQuestion
            {
                Id   = Guid.NewGuid().ToString(),
                Text = "???"
            };

            _answer = new SearchableAnswer()
            {
                Text       = "???",
                Id         = Guid.NewGuid().ToString(),
                QuestionId = Guid.NewGuid().ToString()
            };
        }
示例#14
0
        public async Task <ActionResult> Event(SlackEvent slackEvent)
        {
            if (slackEvent.Type == UrlVerification)
            {
                return(Ok(new { challenge = slackEvent.Challenge }));
            }

            switch (slackEvent.Event.Type)
            {
            case MessageType:
                await _eventService.MessageReceived(slackEvent.Event);

                return(Ok());

            case ReactionAdded:
                await _eventService.ReactionAdded(slackEvent.Event);

                return(Ok());

            default:
                return(Ok());
            }
        }
示例#15
0
        public string Post([FromBody] SlackEvent json)
        {
            if (json.token != Configuration.Instance.ChallengeToken)
            {
                return(null);
            }

            if (json.challenge != null)
            {
                return(json.challenge);
            }

            if (null != json.message && !string.IsNullOrWhiteSpace(json.message.text.Trim()))
            {
                var text = json.message.text.Trim().ToLowerInvariant();
                foreach (var command in Configuration.Instance.Commands)
                {
                    if (null != json.message.user && (text.Contains(command) || intent(text).Contains(command)))
                    {
                        var ucmd = new UserCommand
                        {
                            user       = json.message.user,
                            command    = command,
                            context    = json.message.text.Trim(),
                            channel    = json.message.channel,
                            event_id   = json.event_id,
                            event_time = json.event_time
                        };

                        do
                        {
                            try
                            {
                                using (var f = System.IO.File.Open(Configuration.Instance.CommandFile, System.IO.FileMode.OpenOrCreate, System.IO.FileAccess.ReadWrite, FileShare.None))
                                {
                                    string fileContent = null;
                                    var    sr          = new StreamReader(f);
                                    fileContent = sr.ReadToEnd();

                                    if (string.IsNullOrWhiteSpace(fileContent))
                                    {
                                        fileContent = "[]";
                                    }

                                    f.Position = 0;
                                    f.SetLength(0);
                                    f.Flush();

                                    var ucmds = Newtonsoft.Json.JsonConvert.DeserializeObject <List <UserCommand> >(fileContent);
                                    ucmds.Add(ucmd);

                                    var sw = new StreamWriter(f);
                                    sw.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(ucmds));
                                    sw.Flush();
                                }
                                break;
                            }
                            catch (System.IO.IOException) { }
                        } while (true);
                    }
                }
            }
            return("");
        }
示例#16
0
 public bool IsBlocked(SlackEvent slackEvent)
 {
     return(slackEvent.Event.SubType == "bot_message");
 }
        /// <summary>
        /// Handles all slack messages and calls the specified command handler if it is a command.
        /// </summary>
        /// <param name="slackEvent"></param>
        /// <param name="teamId">The team of the user of the sent request.</param>
        /// <returns></returns>
        public async Task <IActionResult> HandleSlackMessage(SlackEvent slackEvent, string teamId)
        {
            if (slackEvent is null || _commandHandler == null)
            {
                return(BadRequest());
            }

            // Ignore if the message is coming from the bot
            // (The user field is only set on the test server, thus we also need to check for that)
            //
            if (slackEvent.User == "UJZLBL7BL" || string.IsNullOrEmpty(slackEvent.User))
            {
                return(Ok());
            }

            var reply         = new Dictionary <string, string>();
            var hiddenMessage = false;

            //
            // Set the reply data
            //
            reply["channel"] = slackEvent.Channel;
            reply["user"]    = slackEvent.User;

            // We accept two types of messages as command:
            // - Normal Chat Messages:
            //      > time
            //      > start
            // - Bot Mentions
            //      > @tcslackbot time
            //      > @tcslackbot start
            //
            // Slack does not provide names but ids, thus, if we replace the id, it'll basically be treated like a normal chat message and still be handled.
            var text = slackEvent.Text.Replace("<@UJZLBL7BL> ", "", StringComparison.CurrentCulture).ToLower().Trim().Split(' ').FirstOrDefault();

            //
            // Handle the command
            //
            switch (text)
            {
            case "login":
            case "link":
                reply["text"] = _commandHandler.GetLoginLink(slackEvent);
                hiddenMessage = true;
                break;

            case "logout":
            case "unlink":
                reply["text"] = await _commandHandler.Logout(slackEvent);

                break;

            case "start":
                reply["text"] = await _commandHandler.StartWorkingAsync(slackEvent);

                break;

            case "stop":
                reply["text"] = await _commandHandler.StopWorkingAsync(slackEvent);

                break;

            case "pause":
            case "break":
                reply["text"] = await _commandHandler.PauseWorktimeAsync(slackEvent);

                break;

            case "resume":
                reply["text"] = await _commandHandler.ResumeWorktimeAsync(slackEvent);

                break;

            case "status":
            case "time":
                reply["text"] = await _commandHandler.GetWorktimeAsync(slackEvent);

                break;

            case "filter":
                reply["text"] = await _commandHandler.FilterObjectsAsync(slackEvent);

                break;

            case "project":
                reply["text"] = await _commandHandler.SetDefaultProject(slackEvent);

                break;

            default:
                break;
            }

            await SendReplyAsync(teamId, reply, hiddenMessage);

            return(Ok());
        }
示例#18
0
 public bool IsBlocked(SlackEvent slackEvent)
 {
     return(slackEvent.Event.SubType == "message_changed");
 }
示例#19
0
 public bool IsBlocked(SlackEvent slackEvent)
 {
     return(slackEvent.Event.Channel.StartsWith('G'));
 }
示例#20
0
 public IActionResult PostEvent(SlackEvent e) =>
 Ok(e.Challenge);
 public bool IsBlocked(SlackEvent slackEvent)
 {
     return(_filters.Any(x => x.IsBlocked(slackEvent)));
 }