Example #1
0
        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();
                }
            }
        }
Example #2
0
        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);
        }