Exemplo n.º 1
0
        public async Task <IList <string> > GetKarmaResponseTextsAsync(Activity activity, CancellationToken cancellationToken)
        {
            List <string> responses = new List <string>();

            // Get Mentions
            var userMentions = Utilities.GetUserMentions(activity).ToList();

            // Strips stuff like '@' so '@msteams' and 'msteams' can have the same karma.
            Utilities.StripCharactersWeDontCareAbout(activity);

            // Remove the space before the karma score
            activity.Text = Regex.Replace(activity.Text, "[ ]([+-]{2,})", "$1");

            // Remove spaces in entity names
            foreach (var mention in userMentions)
            {
                var mentionName          = mention.Mentioned.Name;
                var spaceStrippedMention = mentionName.Replace(" ", "");
                activity.Text = activity.Text.Replace(mentionName, spaceStrippedMention);
            }

            var karmaChanges          = new List <KarmaChange>();
            var multiWordKarmaMatches = Regex.Matches(activity.Text, MultiWordKarmaRegexPattern, RegexOptions.RightToLeft);

            foreach (Match match in multiWordKarmaMatches)
            {
                var karmaStr  = match.Value;
                var cleanName = karmaStr.TrimEnd(' ', '+', '-').Trim('\"');
                karmaChanges.Add(new KarmaChange(karmaStr, cleanName, cleanName.ToLower()));
                // less frustrating to have "test karma" and "Test Karma" use the same karma.
                activity.Text = activity.Text.Replace(karmaStr, "");
            }

            // Get list of karma strings
            var separatedBySpaces = activity.Text.Split(new[] { ' ', '\n' }, StringSplitOptions.RemoveEmptyEntries).ToList();

            // Add all the user karma strings
            foreach (var mention in userMentions)
            {
                string mentionName          = mention.Mentioned.Name;
                string spaceStrippedMention = mentionName.Replace(" ", "");
                string karmaString          = separatedBySpaces.FirstOrDefault(a => a.Contains(spaceStrippedMention));
                separatedBySpaces.Remove(karmaString);
                karmaChanges.Add(new KarmaChange(karmaString, mention.Mentioned.Name, mention.Mentioned.Id));
            }

            // Now add all the non-user karma strings
            foreach (var nonUserKarmaString in separatedBySpaces)
            {
                string cleanName = nonUserKarmaString.TrimEnd(' ', '+', '-').Trim('\"');
                karmaChanges.Add(new KarmaChange(nonUserKarmaString, cleanName, cleanName.ToLower()));
            }

            // Generate messages
            foreach (var karmaChange in karmaChanges.Distinct(new DuplicateKarmaComparer()))
            {
                // Process the alleged Karma instruction and add the response message
                if (KarmaLogic.IsKarmaString(karmaChange.KarmaString))
                {
                    var replyMessage = await _karmaLogic.GetReplyMessageForKarma(karmaChange.KarmaString, karmaChange.UniqueId, karmaChange.Name, cancellationToken);

                    if (string.IsNullOrEmpty(replyMessage))
                    {
                        return(null);
                    }

                    responses.Add(replyMessage);
                }
            }

            // Add space back... "AaronRosenberger" -> "Aaron Rosenberger"
            foreach (var mention in userMentions)
            {
                var mentionName          = mention.Mentioned.Name;
                var spaceStrippedMention = mentionName.Replace(" ", "");
                responses = responses.Select(a => a = a.Replace(spaceStrippedMention, mentionName)).ToList();
            }

            // Remove extra line breaks
            responses = responses.Select(Utilities.TrimWhitespace).ToList();

            return(responses);
        }
Exemplo n.º 2
0
 public TeamsKarmaLogic(KarmaLogic karmaLogic)
 {
     _karmaLogic = karmaLogic;
 }