예제 #1
0
        public async Task Process(IncomingMessage incomingMessage)
        {
            Log.Debug("Processing {@incomingMessage}", incomingMessage);

            if (incomingMessage == null)
            {
                throw new ArgumentNullException("incomingMessage");
            }

            var values = incomingMessage.Text.Split(new [] { ' ' }, StringSplitOptions.RemoveEmptyEntries);

            var botName = incomingMessage.IsSlashCommand()
                ? incomingMessage.Command.Substring(1)
                : values[0].ToLower().Replace(":", "");

            incomingMessage.BotName = botName;

            var command = values[incomingMessage.Command == null ? 1 : 0].ToLower();

            incomingMessage.Text = string.Join(" ", values.Skip(incomingMessage.IsSlashCommand() ? 0 : 1));

            Exception exception = null;

            try
            {
                foreach (var handler in _messageHandlers)
                {
                    using (var session = _documentStore.OpenSession())
                    {
                        var handlerType = handler.GetType().FullName;
                        var company     = SlackContext.Current.Company;
                        var models      = session.Query <ViewBagModel>();

                        var model = models.FirstOrDefault(c => c.Company == company && c.HandlerName == handlerType)
                                    ?? new ViewBagModel(company, handlerType);

                        handler.Brain = model.ViewBag;

                        await handler.Handle(incomingMessage);

                        session.Store(model);
                        session.SaveChanges();
                    }
                }
            }
            catch (Exception ex)
            {
                exception = ex;
            }

            if (exception != null)
            {
                var response = string.Format("@{0} Umm, something went wrong  \"{1} {2}\" {3}", incomingMessage.UserName,
                                             command, incomingMessage.Text, exception.Message);

                await _client.SendAsync(incomingMessage.ReplyTo(), response);
            }
        }
예제 #2
0
        public async Task Process(string company, string token, IncomingMessage incomingMessage)
        {
            if (incomingMessage == null)
            {
                throw new ArgumentNullException("incomingMessage");
            }

            var values  = incomingMessage.Text.Split(new [] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
            var command = values[incomingMessage.Command == null ? 1 : 0].ToLower();

            incomingMessage.Text = string.Join(" ", values.Skip(incomingMessage.Command == null ? 2 : 1));

            var messages = new List <Message>();

            try
            {
                using (var scope = _rootScope.BeginLifetimeScope())
                {
                    var handlers = scope.Resolve <IEnumerable <IHandleMessage> >();

                    foreach (var handler in handlers.Where(handler => handler.CanHandle(command)))
                    {
                        messages.Add(await handler.Handle(incomingMessage));
                    }

                    if (messages.Any() == false)
                    {
                        messages.Add(new Message
                        {
                            Text    = string.Format("@{0} Umm, what do you mean by \"{1} {2}\"", incomingMessage.UserName, command, incomingMessage.Text),
                            Channel = string.Format("#{0}", incomingMessage.ChannelName)
                        });
                    }
                }
            }
            catch (Exception ex)
            {
                messages.Add(new Message
                {
                    Text    = string.Format("@{0} Umm, something went wrong  \"{1} {2}\" {3}", incomingMessage.UserName, command, incomingMessage.Text, ex.Message),
                    Channel = string.Format("#{0}", incomingMessage.ChannelName)
                });
            }

            if (incomingMessage.IsSlashCommand() && command != "echo")
            {
                foreach (var message in messages)
                {
                    message.Channel = string.Format("@{0}", incomingMessage.UserName);
                }
            }

            foreach (var message in messages)
            {
                await _client.PostMessage(company, token, message);
            }
        }
예제 #3
0
 public static string ReplyTo(this IncomingMessage incomingMessage)
 {
     return(incomingMessage.IsSlashCommand()
         ? incomingMessage.UserId
         : incomingMessage.ChannelId);
 }