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); } }
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); } }
public static string ReplyTo(this IncomingMessage incomingMessage) { return(incomingMessage.IsSlashCommand() ? incomingMessage.UserId : incomingMessage.ChannelId); }