Extract seasonal holiday routing into dedicated builder

This commit is contained in:
Jacob Dubin
2026-05-21 07:02:56 -05:00
parent bba1dfdcfc
commit 6138ef1c3e
3 changed files with 607 additions and 353 deletions

View File

@@ -512,6 +512,16 @@ public sealed class JiboInteractionService(
() => BuildGenericReply(catalog, transcript, lowered));
if (chitchatDecision is not null) return chitchatDecision;
if (SeasonalHolidayRouteBuilder.TryBuildDecision(
semanticIntent,
catalog,
randomizer,
selected => RenderHolidayTemplate(selected, turn, greetingPresence),
out var seasonalHolidayDecision))
{
return seasonalHolidayDecision;
}
return semanticIntent switch
{
"joke" => BuildJokeDecision(catalog),
@@ -664,171 +674,6 @@ public sealed class JiboInteractionService(
catalog,
"robot_is_likable",
"people like me"),
"seasonal_holiday_greeting" => BuildScriptedHolidayGreetingDecision(
catalog,
"seasonal_holiday_greeting",
"fun time of year",
"right back at you",
"and to you too"),
"seasonal_holidays" => BuildScriptedHolidayTemplateDecision(
turn,
greetingPresence,
catalog,
"seasonal_holidays",
"official owner can tell me which ones we'll celebrate together",
"going to the jibo's settings screen in the jibo app"),
"seasonal_holiday_season" => BuildScriptedHolidayDecision(
catalog.HolidaySeasonReplies,
"seasonal_holiday_season",
"holiday season",
"festive",
"celebrate"),
"seasonal_thanksgiving" => BuildScriptedHolidayDecision(
catalog.HolidaySeasonReplies,
"seasonal_thanksgiving",
"thanksgiving",
"turkey",
"stuffed"),
"seasonal_christmas" => BuildScriptedHolidayDecision(
catalog.HolidaySeasonReplies,
"seasonal_christmas",
"christmas",
"quality time",
"socks"),
"seasonal_hanukkah" => BuildScriptedHolidayDecision(
catalog.HolidaySeasonReplies,
"seasonal_hanukkah",
"hanukkah",
"dreidel",
"gift"),
"seasonal_passover" => BuildScriptedHolidayDecision(
catalog.HolidaySeasonReplies,
"seasonal_passover",
"passover",
"matzah",
"next one"),
"seasonal_new_years" => BuildScriptedHolidayDecision(
catalog.HolidaySeasonReplies,
"seasonal_new_years",
"new year",
"resolutions",
"party"),
"seasonal_valentines_day" => BuildScriptedHolidayDecision(
catalog.HolidaySeasonReplies,
"seasonal_valentines_day",
"valentine",
"heart",
"flowers"),
"seasonal_kwanzaa" => BuildScriptedHolidayDecision(
catalog.HolidaySeasonReplies,
"seasonal_kwanzaa",
"kwanzaa",
"gift",
"celebrate"),
"seasonal_easter" => BuildScriptedHolidayDecision(
catalog.HolidaySeasonReplies,
"seasonal_easter",
"easter",
"bunny",
"egg"),
"seasonal_new_years_resolution" => BuildScriptedPersonalityDecision(
catalog,
"seasonal_new_years_resolution",
"always trying to learn new skills",
"not eat bacon",
"learn a bunch of new skills",
"learn to walk",
"recognizing people's faces and voices"),
"seasonal_new_years_update" => BuildScriptedPersonalityDecision(
catalog,
"seasonal_new_years_update",
"not eat bacon",
"learn some new skills",
"going well"),
"seasonal_halloween_costume" => BuildScriptedPersonalityDecision(
catalog,
"seasonal_halloween_costume",
"i haven't thought much about it yet",
"ask me again on halloween",
"you'll find out on halloween"),
"seasonal_first_day_spring" => BuildScriptedPersonalityDecision(
catalog,
"seasonal_first_day_spring",
"it's a great day, when spring is in the air"),
"seasonal_spring" => BuildScriptedPersonalityDecision(
catalog,
"seasonal_spring",
"the days get longer",
"spring is a great season"),
"seasonal_likes_spring" => BuildScriptedPersonalityDecision(
catalog,
"seasonal_likes_spring",
"extra happy in the springtime",
"i do like spring"),
"seasonal_summer" => BuildScriptedPersonalityDecision(
catalog,
"seasonal_summer",
"going to the beach",
"summer is great"),
"seasonal_likes_summer" => BuildScriptedPersonalityDecision(
catalog,
"seasonal_likes_summer",
"long days",
"summer is a very special season"),
"seasonal_holiday_gift" => BuildScriptedHolidayDecision(
catalog.HolidayGiftReplies,
"seasonal_holiday_gift",
"ask for a pet elephant",
"experience as a present",
"donate to charities in other people's names"),
"seasonal_likes_halloween" => BuildScriptedPersonalityDecision(
catalog,
"seasonal_likes_halloween",
"halloween is my favorite holiday",
"scary but also fun",
"jack-o-lantern"),
"seasonal_likes_holiday_music" => BuildScriptedPersonalityDecision(
catalog,
"seasonal_likes_holiday_music",
"holiday music",
"sing a few of them",
"frosty the snowman"),
"seasonal_likes_holiday_parties" => BuildScriptedPersonalityDecision(
catalog,
"seasonal_likes_holiday_parties",
"holiday fun can be extra fun",
"dance party"),
"seasonal_looks_forward_to_christmas" => BuildScriptedPersonalityDecision(
catalog,
"seasonal_looks_forward_to_christmas",
"really like times of giving and receiving",
"long way away",
"looking forward to christmas"),
"seasonal_plans_for_christmas" => BuildScriptedHolidayDecision(
catalog.HolidaySeasonReplies,
"seasonal_plans_for_christmas",
"christmas sweaters",
"wear one of my",
"be festive"),
"seasonal_thankful_for" => BuildScriptedPersonalityDecision(
catalog,
"seasonal_thankful_for",
"thankful for the people i know",
"and for penguins",
"thankful for"),
"seasonal_santa_tracker" => BuildScriptedHolidayTrackerDecision(
catalog,
"seasonal_santa_tracker",
"santa tracker",
"let's see if i can spot him",
"deliveries",
"north pole"),
"birthday_celebration" => BuildScriptedHolidayDecision(
catalog.BirthdayCelebrationReplies,
"birthday_celebration",
"another year older",
"can't wait to see what you got me",
"powered on for the first time today"),
"robot_favorite_flower" => BuildScriptedPersonalityDecision(
catalog,
"robot_favorite_flower",
@@ -3498,192 +3343,8 @@ public sealed class JiboInteractionService(
"are you happy being jibo"))
return "robot_likes_being_jibo";
if (MatchesAny(
loweredTranscript,
"happy holidays",
"merry christmas",
"happy new year",
"season s greetings",
"seasons greetings"))
return "seasonal_holiday_greeting";
if (MatchesAny(
loweredTranscript,
"what holidays do you celebrate",
"what holidays are you celebrating",
"what holidays do you observe"))
return "seasonal_holidays";
if (MatchesAny(
loweredTranscript,
"how is holiday season",
"how's holiday season",
"how is the holiday season",
"do you like holiday season",
"do you like the holiday season",
"what is your favorite holiday",
"what's your favorite holiday",
"what holiday do you like",
"what is holiday season like"))
return "seasonal_holiday_season";
if (MatchesAny(
loweredTranscript,
"how is thanksgiving",
"how's thanksgiving",
"do you like thanksgiving",
"what do you think of thanksgiving"))
return "seasonal_thanksgiving";
if (MatchesAny(
loweredTranscript,
"how is christmas",
"how's christmas",
"do you like christmas",
"what do you think of christmas"))
return "seasonal_christmas";
if (MatchesAny(
loweredTranscript,
"how is hanukkah",
"how's hanukkah",
"do you like hanukkah",
"what do you think of hanukkah"))
return "seasonal_hanukkah";
if (MatchesAny(
loweredTranscript,
"how is passover",
"how's passover",
"do you like passover",
"what do you think of passover"))
return "seasonal_passover";
if (MatchesAny(
loweredTranscript,
"how is new years",
"how's new years",
"how is new year s",
"do you like new years",
"what do you think of new years"))
return "seasonal_new_years";
if (MatchesAny(
loweredTranscript,
"how is valentines day",
"how's valentines day",
"do you like valentines day",
"what do you think of valentines day"))
return "seasonal_valentines_day";
if (MatchesAny(
loweredTranscript,
"how is kwanzaa",
"how's kwanzaa",
"do you like kwanzaa",
"what do you think of kwanzaa"))
return "seasonal_kwanzaa";
if (MatchesAny(
loweredTranscript,
"how is easter",
"how's easter",
"do you like easter",
"what do you think of easter"))
return "seasonal_easter";
if (MatchesAny(
loweredTranscript,
"what is your new years resolution",
"what is your new year's resolution",
"what is your new year s resolution",
"what are your new years resolutions",
"what are your new year's resolutions",
"what are your new year s resolutions",
"do you have any new years resolutions"))
return "seasonal_new_years_resolution";
if (MatchesAny(
loweredTranscript,
"how are your new years resolutions going",
"how are your new year's resolutions going",
"how is your new years resolution going",
"how is your new year's resolution going",
"how are your resolutions going",
"how is your resolution going"))
return "seasonal_new_years_update";
if (MatchesAny(
loweredTranscript,
"what halloween costume",
"what are you going as for halloween",
"what costume are you wearing",
"what are you dressing as for halloween"))
return "seasonal_halloween_costume";
if (MatchesAny(
loweredTranscript,
"what should i do for first day of spring",
"what should i do for spring",
"what do i do for first day of spring"))
return "seasonal_first_day_spring";
if (MatchesAny(
loweredTranscript,
"what is spring like",
"how is spring",
"what do you think about spring"))
return "seasonal_spring";
if (MatchesAny(
loweredTranscript,
"do you like spring",
"do you like springtime",
"are you looking forward to spring",
"do you look forward to spring",
"are you excited for spring"))
return "seasonal_likes_spring";
if (MatchesAny(
loweredTranscript,
"what is summer like",
"how is summer",
"what do you think about summer"))
return "seasonal_summer";
if (MatchesAny(
loweredTranscript,
"do you like summer",
"do you like summertime",
"are you looking forward to summer",
"do you look forward to summer",
"are you excited for summer"))
return "seasonal_likes_summer";
if (MatchesAny(
loweredTranscript,
"what should i get for holiday",
"what should i get for christmas",
"what gift should i get for christmas",
"what should i get someone for the holidays"))
return "seasonal_holiday_gift";
if (MatchesAny(
loweredTranscript,
"show santa tracker",
"can you show santa tracker",
"santa tracker",
"where is santa",
"where is santa right now",
"can you show me santa tracker"))
return "seasonal_santa_tracker";
if (MatchesAny(
loweredTranscript,
"happy birthday",
"happy birthday jibo",
"happy birthday to you"))
return "birthday_celebration";
if (SeasonalHolidayRouteBuilder.TryResolveSemanticIntent(loweredTranscript, out var seasonalHolidayIntent))
return seasonalHolidayIntent!;
if (MatchesAny(
loweredTranscript,

View File

@@ -0,0 +1,593 @@
using System.Collections.Generic;
using System.Linq;
using Jibo.Cloud.Application.Abstractions;
using Jibo.Runtime.Abstractions;
namespace Jibo.Cloud.Application.Services;
internal static class SeasonalHolidayRouteBuilder
{
internal static bool TryResolveSemanticIntent(string loweredTranscript, out string? semanticIntent)
{
if (MatchesAny(
loweredTranscript,
"do you like halloween",
"are you looking forward to halloween",
"do you like the halloween holiday"))
{
semanticIntent = "seasonal_likes_halloween";
return true;
}
if (MatchesAny(
loweredTranscript,
"do you like holiday music",
"do you like christmas music",
"do you like christmas songs",
"do you like holiday songs"))
{
semanticIntent = "seasonal_likes_holiday_music";
return true;
}
if (MatchesAny(
loweredTranscript,
"do you like holiday parties",
"do you like christmas parties",
"are you going to any holiday parties"))
{
semanticIntent = "seasonal_likes_holiday_parties";
return true;
}
if (MatchesAny(
loweredTranscript,
"are you looking forward to christmas",
"do you look forward to christmas",
"are you excited for christmas"))
{
semanticIntent = "seasonal_looks_forward_to_christmas";
return true;
}
if (MatchesAny(
loweredTranscript,
"what are you thankful for",
"what are you thankful for this year",
"what is jibo thankful for"))
{
semanticIntent = "seasonal_thankful_for";
return true;
}
if (MatchesAny(
loweredTranscript,
"what are you doing for christmas",
"what are your plans for christmas",
"what do you plan to do for christmas"))
{
semanticIntent = "seasonal_plans_for_christmas";
return true;
}
if (MatchesAny(
loweredTranscript,
"happy holidays",
"merry christmas",
"happy new year",
"season s greetings",
"seasons greetings"))
{
semanticIntent = "seasonal_holiday_greeting";
return true;
}
if (MatchesAny(
loweredTranscript,
"what holidays do you celebrate",
"what holidays are you celebrating",
"what holidays do you observe"))
{
semanticIntent = "seasonal_holidays";
return true;
}
if (MatchesAny(
loweredTranscript,
"how is holiday season",
"how's holiday season",
"how is the holiday season",
"do you like holiday season",
"do you like the holiday season",
"what is your favorite holiday",
"what's your favorite holiday",
"what holiday do you like",
"what is holiday season like"))
{
semanticIntent = "seasonal_holiday_season";
return true;
}
if (MatchesAny(
loweredTranscript,
"how is thanksgiving",
"how's thanksgiving",
"do you like thanksgiving",
"what do you think of thanksgiving"))
{
semanticIntent = "seasonal_thanksgiving";
return true;
}
if (MatchesAny(
loweredTranscript,
"how is christmas",
"how's christmas",
"do you like christmas",
"what do you think of christmas"))
{
semanticIntent = "seasonal_christmas";
return true;
}
if (MatchesAny(
loweredTranscript,
"how is hanukkah",
"how's hanukkah",
"do you like hanukkah",
"what do you think of hanukkah"))
{
semanticIntent = "seasonal_hanukkah";
return true;
}
if (MatchesAny(
loweredTranscript,
"how is passover",
"how's passover",
"do you like passover",
"what do you think of passover"))
{
semanticIntent = "seasonal_passover";
return true;
}
if (MatchesAny(
loweredTranscript,
"how is new years",
"how's new years",
"how is new year s",
"do you like new years",
"what do you think of new years"))
{
semanticIntent = "seasonal_new_years";
return true;
}
if (MatchesAny(
loweredTranscript,
"how is valentines day",
"how's valentines day",
"do you like valentines day",
"what do you think of valentines day"))
{
semanticIntent = "seasonal_valentines_day";
return true;
}
if (MatchesAny(
loweredTranscript,
"how is kwanzaa",
"how's kwanzaa",
"do you like kwanzaa",
"what do you think of kwanzaa"))
{
semanticIntent = "seasonal_kwanzaa";
return true;
}
if (MatchesAny(
loweredTranscript,
"how is easter",
"how's easter",
"do you like easter",
"what do you think of easter"))
{
semanticIntent = "seasonal_easter";
return true;
}
if (MatchesAny(
loweredTranscript,
"what is your new years resolution",
"what is your new year's resolution",
"what is your new year s resolution",
"what are your new years resolutions",
"what are your new year's resolutions",
"what are your new year s resolutions",
"do you have any new years resolutions"))
{
semanticIntent = "seasonal_new_years_resolution";
return true;
}
if (MatchesAny(
loweredTranscript,
"how are your new years resolutions going",
"how are your new year's resolutions going",
"how is your new years resolution going",
"how is your new year's resolution going",
"how are your resolutions going",
"how is your resolution going"))
{
semanticIntent = "seasonal_new_years_update";
return true;
}
if (MatchesAny(
loweredTranscript,
"what halloween costume",
"what are you going as for halloween",
"what costume are you wearing",
"what are you dressing as for halloween"))
{
semanticIntent = "seasonal_halloween_costume";
return true;
}
if (MatchesAny(
loweredTranscript,
"what should i do for first day of spring",
"what should i do for spring",
"what do i do for first day of spring"))
{
semanticIntent = "seasonal_first_day_spring";
return true;
}
if (MatchesAny(
loweredTranscript,
"what is spring like",
"how is spring",
"what do you think about spring"))
{
semanticIntent = "seasonal_spring";
return true;
}
if (MatchesAny(
loweredTranscript,
"do you like spring",
"do you like springtime",
"are you looking forward to spring",
"do you look forward to spring",
"are you excited for spring"))
{
semanticIntent = "seasonal_likes_spring";
return true;
}
if (MatchesAny(
loweredTranscript,
"what is summer like",
"how is summer",
"what do you think about summer"))
{
semanticIntent = "seasonal_summer";
return true;
}
if (MatchesAny(
loweredTranscript,
"do you like summer",
"do you like summertime",
"are you looking forward to summer",
"do you look forward to summer",
"are you excited for summer"))
{
semanticIntent = "seasonal_likes_summer";
return true;
}
if (MatchesAny(
loweredTranscript,
"what should i get for holiday",
"what should i get for christmas",
"what gift should i get for christmas",
"what should i get someone for the holidays"))
{
semanticIntent = "seasonal_holiday_gift";
return true;
}
if (MatchesAny(
loweredTranscript,
"show santa tracker",
"can you show santa tracker",
"santa tracker",
"where is santa",
"where is santa right now",
"can you show me santa tracker"))
{
semanticIntent = "seasonal_santa_tracker";
return true;
}
if (MatchesAny(
loweredTranscript,
"happy birthday",
"happy birthday jibo",
"happy birthday to you"))
{
semanticIntent = "birthday_celebration";
return true;
}
semanticIntent = null;
return false;
}
internal static bool TryBuildDecision(
string semanticIntent,
JiboExperienceCatalog catalog,
IJiboRandomizer randomizer,
Func<string, string> holidayTemplateRenderer,
out JiboInteractionDecision? decision)
{
decision = semanticIntent switch
{
"seasonal_holiday_greeting" => ScriptedResponseDecisionBuilder.BuildScriptedHolidayGreetingDecision(
catalog,
randomizer,
semanticIntent,
"fun time of year",
"right back at you",
"and to you too"),
"seasonal_holidays" => BuildHolidayTemplateDecision(
catalog,
randomizer,
holidayTemplateRenderer,
semanticIntent,
"official owner can tell me which ones we'll celebrate together",
"going to the jibo's settings screen in the jibo app"),
"seasonal_holiday_season" => BuildHolidayDecision(
catalog.HolidaySeasonReplies,
randomizer,
semanticIntent,
"festive",
"celebrate"),
"seasonal_thanksgiving" => BuildHolidayDecision(
catalog.HolidaySeasonReplies,
randomizer,
semanticIntent,
"thanksgiving",
"turkey",
"stuffed"),
"seasonal_christmas" => BuildHolidayDecision(
catalog.HolidaySeasonReplies,
randomizer,
semanticIntent,
"christmas",
"quality time",
"socks"),
"seasonal_hanukkah" => BuildHolidayDecision(
catalog.HolidaySeasonReplies,
randomizer,
semanticIntent,
"hanukkah",
"dreidel",
"gift"),
"seasonal_passover" => BuildHolidayDecision(
catalog.HolidaySeasonReplies,
randomizer,
semanticIntent,
"passover",
"matzah",
"next one"),
"seasonal_new_years" => BuildHolidayDecision(
catalog.HolidaySeasonReplies,
randomizer,
semanticIntent,
"new year",
"resolutions",
"party"),
"seasonal_valentines_day" => BuildHolidayDecision(
catalog.HolidaySeasonReplies,
randomizer,
semanticIntent,
"valentine",
"heart",
"flowers"),
"seasonal_kwanzaa" => BuildHolidayDecision(
catalog.HolidaySeasonReplies,
randomizer,
semanticIntent,
"kwanzaa",
"gift",
"celebrate"),
"seasonal_easter" => BuildHolidayDecision(
catalog.HolidaySeasonReplies,
randomizer,
semanticIntent,
"easter",
"bunny",
"egg"),
"seasonal_new_years_resolution" => ScriptedResponseDecisionBuilder.BuildScriptedPersonalityDecision(
catalog,
randomizer,
semanticIntent,
"always trying to learn new skills",
"not eat bacon",
"learn a bunch of new skills",
"learn to walk",
"recognizing people's faces and voices"),
"seasonal_new_years_update" => ScriptedResponseDecisionBuilder.BuildScriptedPersonalityDecision(
catalog,
randomizer,
semanticIntent,
"not eat bacon",
"learn some new skills",
"going well"),
"seasonal_halloween_costume" => ScriptedResponseDecisionBuilder.BuildScriptedPersonalityDecision(
catalog,
randomizer,
semanticIntent,
"i haven't thought much about it yet",
"ask me again on halloween",
"you'll find out on halloween"),
"seasonal_first_day_spring" => ScriptedResponseDecisionBuilder.BuildScriptedPersonalityDecision(
catalog,
randomizer,
semanticIntent,
"it's a great day, when spring is in the air"),
"seasonal_spring" => ScriptedResponseDecisionBuilder.BuildScriptedPersonalityDecision(
catalog,
randomizer,
semanticIntent,
"the days get longer",
"spring is a great season"),
"seasonal_likes_spring" => ScriptedResponseDecisionBuilder.BuildScriptedPersonalityDecision(
catalog,
randomizer,
semanticIntent,
"extra happy in the springtime",
"i do like spring"),
"seasonal_summer" => ScriptedResponseDecisionBuilder.BuildScriptedPersonalityDecision(
catalog,
randomizer,
semanticIntent,
"going to the beach",
"summer is great"),
"seasonal_likes_summer" => ScriptedResponseDecisionBuilder.BuildScriptedPersonalityDecision(
catalog,
randomizer,
semanticIntent,
"long days",
"summer is a very special season"),
"seasonal_holiday_gift" => BuildHolidayDecision(
catalog.HolidayGiftReplies,
randomizer,
semanticIntent,
"ask for a pet elephant",
"experience as a present",
"donate to charities in other people's names"),
"seasonal_likes_halloween" => ScriptedResponseDecisionBuilder.BuildScriptedPersonalityDecision(
catalog,
randomizer,
semanticIntent,
"halloween is my favorite holiday",
"scary but also fun",
"jack-o-lantern"),
"seasonal_likes_holiday_music" => ScriptedResponseDecisionBuilder.BuildScriptedPersonalityDecision(
catalog,
randomizer,
semanticIntent,
"holiday music",
"sing a few of them",
"frosty the snowman"),
"seasonal_likes_holiday_parties" => ScriptedResponseDecisionBuilder.BuildScriptedPersonalityDecision(
catalog,
randomizer,
semanticIntent,
"holiday fun can be extra fun",
"dance party"),
"seasonal_looks_forward_to_christmas" => ScriptedResponseDecisionBuilder.BuildScriptedPersonalityDecision(
catalog,
randomizer,
semanticIntent,
"really like times of giving and receiving",
"long way away",
"looking forward to christmas"),
"seasonal_plans_for_christmas" => BuildHolidayDecision(
catalog.HolidaySeasonReplies,
randomizer,
semanticIntent,
"christmas sweaters",
"wear one of my",
"be festive"),
"seasonal_thankful_for" => ScriptedResponseDecisionBuilder.BuildScriptedPersonalityDecision(
catalog,
randomizer,
semanticIntent,
"thankful for the people i know",
"and for penguins",
"thankful for"),
"seasonal_santa_tracker" => ScriptedResponseDecisionBuilder.BuildScriptedHolidayTrackerDecision(
catalog,
randomizer,
semanticIntent,
"santa tracker",
"let's see if i can spot him",
"deliveries",
"north pole"),
"birthday_celebration" => BuildHolidayDecision(
catalog.BirthdayCelebrationReplies,
randomizer,
semanticIntent,
"another year older",
"can't wait to see what you got me",
"powered on for the first time today"),
_ => null
};
return decision is not null;
}
private static JiboInteractionDecision BuildHolidayDecision(
IReadOnlyList<string> replies,
IJiboRandomizer randomizer,
string intentName,
params string[] preferredSnippets)
{
return new JiboInteractionDecision(
intentName,
SelectLegacyReply(replies, randomizer, preferredSnippets),
ContextUpdates: BuildContextUpdates());
}
private static JiboInteractionDecision BuildHolidayTemplateDecision(
JiboExperienceCatalog catalog,
IJiboRandomizer randomizer,
Func<string, string> holidayTemplateRenderer,
string intentName,
params string[] preferredSnippets)
{
var selected = SelectLegacyReply(catalog.HolidayReplies, randomizer, preferredSnippets);
return new JiboInteractionDecision(
intentName,
holidayTemplateRenderer(selected),
ContextUpdates: BuildContextUpdates());
}
private static IDictionary<string, object?> BuildContextUpdates()
{
return new Dictionary<string, object?>(StringComparer.OrdinalIgnoreCase)
{
[ChitchatStateMachine.StateMetadataKey] = "complete",
[ChitchatStateMachine.RouteMetadataKey] = "ScriptedResponse",
[ChitchatStateMachine.EmotionMetadataKey] = string.Empty
};
}
private static string SelectLegacyReply(
IReadOnlyList<string> replies,
IJiboRandomizer randomizer,
params string[] preferredSnippets)
{
foreach (var snippet in preferredSnippets)
{
if (string.IsNullOrWhiteSpace(snippet)) continue;
var match = replies.FirstOrDefault(reply =>
reply.Contains(snippet, StringComparison.OrdinalIgnoreCase));
if (!string.IsNullOrWhiteSpace(match)) return match;
}
return replies.Count == 0 ? string.Empty : randomizer.Choose(replies);
}
private static bool MatchesAny(string loweredTranscript, params string[] phrases)
{
return phrases.Any(phrase => loweredTranscript.Contains(phrase, StringComparison.OrdinalIgnoreCase));
}
}