public async Task OnMessageReceived(SlackMessage message) { if (string.IsNullOrEmpty(message?.Text)) { return; } if (message.Text.StartsWith("!")) { var split = message.Text.Split(new[] { ' ' }); var command = split[0]; ITriggerArguments arguments = null; if (split.Length > 1) { arguments = new TriggerArguments(split.Skip(1).Take(split.Length - 1).ToArray()); } if (_triggers.Keys.Contains(command)) { using (var context = new SlackerDbContextFactory().CreateDbContext(null)) { await _triggers[command](arguments, _connection, message.ChatHub, context); } } } else { if (message.User.IsBot) { return; } // ReSharper disable once AssignNullToNotNullAttribute using (var context = new SlackerDbContextFactory().CreateDbContext(null)) { context.Messages.Add(new Message { Content = message.Text, User = message.User.Name, Created = DateTime.UtcNow }); await context.SaveChangesAsync(); } } }
public Task Execute(ITriggerArguments arguments, ISlackConnection connection, SlackChatHub chatHub, SlackerContext context) { if (arguments == null || arguments.Arguments.Length != 1) { connection.Say(new BotMessage { ChatHub = chatHub, Text = "Usage: !talk <user>" }); return(Task.CompletedTask); } var user = arguments.Arguments[0]; var messages = context.Messages.Where(x => x.User == user && x.Content.Length > 10); if (!messages.Any()) { connection.Say(new BotMessage { ChatHub = chatHub, Text = $"There aren't enough messages by {arguments.Arguments[0]} to go on" }); return(Task.CompletedTask); } var chain = new MarkovChain <string>(1); foreach (var message in messages) { chain.Add(message.Content.Split(new[] { ' ' }), 1); } var random = new Random(DateTime.UtcNow.Millisecond); var stringBuilder = new StringBuilder(GetRandomMessageStart(user, random)); stringBuilder.Append(">" + string.Join(" ", chain.Chain(random))); connection.Say(new BotMessage { ChatHub = chatHub, Text = stringBuilder.ToString() }); return(Task.CompletedTask); }