public bool CanRespond(ResponseContext context)
        {
            if (Scorebook == null || TeamID != context.TeamID)
            {
                // start up scorebook for this team
                TeamID    = context.TeamID;
                Scorebook = new Scorebook(TeamID);
            }
            // put the scorebook in context in case someone wants to see the scoreboard
            context.Set(Scorebook);

            return(!context.Message.User.IsSlackbot && Regex.IsMatch(context.Message.Text, SCORE_REGEX));
        }
        public BotMessage GetResponse(ResponseContext context)
        {
            // perform scoring
            List <ScoringResult> scoringResults = new List <ScoringResult>();

            // bet you anything there's a better way to do this
            Match match = Regex.Match(context.Message.Text, SCORE_REGEX);

            for (int i = 0; i < match.Groups["formattedUserID"].Captures.Count; i++)
            {
                scoringResults.Add(new ScoringResult()
                {
                    FormattedUserID = match.Groups["formattedUserID"].Captures[i].Value,
                    IsNewScorer     = !this.Scorebook.HasUserScored(match.Groups["userID"].Captures[i].Value),
                    IsValidScorer   = (match.Groups["userID"].Captures[i].Value != context.Message.User.ID),
                    UserID          = match.Groups["userID"].Captures[i].Value
                });
            }

            var newScorers   = scoringResults.Where(r => r.IsNewScorer).Select(r => r.UserID).ToList();
            var scoringUsers = scoringResults.Where(r => r.IsValidScorer).Select(r => r.UserID).ToList();
            var allUsers     = scoringResults.Select(r => r.UserID).ToList();

            // score the users and shove the scorebook into the context for use by the ScoreboardRequestResponder
            Scorebook.ScoreUsers(scoringUsers, 1);

            var phrasebook      = context.Get <Phrasebook>();
            var responseBuilder = new StringBuilder();

            if (allUsers.Contains(context.Message.User.ID))
            {
                responseBuilder.Append(string.Format("Bless your heart, {0}. You can't score yourself - what kinda game would that be?! Y'all, {0} is cute, but I think he/she might be dumb as a box o' rocks.\n\n", context.Message.User.FormattedUserID));
            }

            if (scoringUsers.Count() > 0)
            {
                if (responseBuilder.Length > 0)
                {
                    responseBuilder.Append("Anyway... ");
                }

                if (scoringUsers.Count() == 1)
                {
                    if (scoringUsers[0] == context.BotUserID)
                    {
                        int margieScore = Scorebook.GetUserScore(context.BotUserID);
                        responseBuilder.Append(string.Format("Awwww, aren't you a sweetie! *[blushes]* If you insist. Now I have {0} point{1}.\n\n", margieScore, margieScore == 1 ? string.Empty : "s"));
                    }
                    else if (newScorers.Contains(scoringUsers[0]))
                    {
                        responseBuilder.Append(string.Format("A new challenger appears, y'all! {0} is on the board with a point. {1}", scoringResults.Where(r => r.UserID == scoringUsers[0]).First().FormattedUserID, phrasebook.GetAffirmation()));
                    }
                    else
                    {
                        ScoringResult scoredUser = scoringResults.Where(r => r.UserID == scoringUsers[0]).First();

                        responseBuilder.Append(
                            string.Format(
                                "{0} {1} just scored a point. {2} {1}, your score is now {3}.",
                                phrasebook.GetExclamation(),
                                scoredUser.FormattedUserID,
                                phrasebook.GetAffirmation(),
                                Scorebook.GetUserScore(scoredUser.UserID)
                                )
                            );
                    }
                }
                else
                {
                    responseBuilder.Append("There's points all over this joint, y'all. ");
                    IList <ScoringResult> scoringUserResults = scoringResults.Where(r => r.IsValidScorer).ToList();

                    if (scoringUserResults.Count == 2)
                    {
                        responseBuilder.Append(
                            string.Format(
                                "{1} and {2} each just scored a point. {3}",
                                phrasebook.GetExclamation(),
                                scoringUserResults[0].FormattedUserID,
                                scoringUserResults[1].FormattedUserID,
                                phrasebook.GetAffirmation()
                                )
                            );
                    }
                    else
                    {
                        for (int i = 0; i < scoringUserResults.Count; i++)
                        {
                            responseBuilder.Append(scoringUserResults[i].FormattedUserID);

                            if (i < scoringResults.Count - 2)
                            {
                                responseBuilder.Append(", ");
                            }
                            else if (i == scoringResults.Count - 2)
                            {
                                responseBuilder.Append(", and ");
                            }
                        }

                        responseBuilder.Append(" each just scored a point. " + phrasebook.GetExclamation());
                    }
                }
            }

            return(new BotMessage()
            {
                Text = responseBuilder.ToString().Trim()
            });
        }