/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 7 / 2 0 2 0 Ġe - voy age urs Ġtechnologies Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġai . to ck . bot . engine . config Ċ Ċ import Ġai . to ck . bot . admin . answer . Answer Configuration Type . builtin Ċ import Ġai . to ck . bot . admin . story . Story Definition Configuration Ċ import Ġai . to ck . bot . definition . Bot Definition Ċ import Ġai . to ck . bot . definition . Intent Ċ import Ġai . to ck . bot . definition . Intent . Companion . unknown Ċ import Ġai . to ck . bot . definition . Intent Aware Ċ import Ġai . to ck . bot . definition . Story Definition Ċ import Ġmu . Kotlin Logging Ċ Ċ /** Ċ Ġ* Ċ Ġ*/ Ċ internal Ġclass ĠBot Definition Wrapper ( val Ġbot Definition : ĠBot Definition ) Ġ: ĠBot Definition Ġby Ġbot Definition Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠKotlin Logging . logger Ġ{} ĊĊĠĠĠ Ġ@ Volatile ĊĠĠĠ Ġprivate Ġvar Ġconfigured St ories : ĠMap < String , ĠList < Configured Story Definition >> Ġ= Ġempty Map () ĊĊĠĠĠ Ġ@ Volatile ĊĠĠĠ Ġprivate Ġvar Ġall St ories : ĠList < Story Definition > Ġ= Ġbot Definition . stories ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠStory Ġred irection s Ġ( resolved Ġfrom Ġstory Ġfeatures ). ĊĠĠĠĠ Ġ* ĠKey : Ġstory Id ĊĠĠĠĠ Ġ* ĠValue : Ġstory Id Ġto Ġredirect Ġto Ġ| Ġ< code > null </ code > Ġwhen Ġstory Ġis Ġdisabled ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Volatile ĊĠĠĠ Ġprivate Ġvar Ġstory Red irection s Map : ĠMap < String , ĠString ?> Ġ= Ġempty Map () ĊĊĠĠĠ Ġfun Ġupdate St ories ( configured St ories : ĠList < Configured Story Definition >, Ġconnector Id : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . configured St ories Ġ= Ġconfigured St ories . groupBy Ġ{ Ġit . configuration . story Id Ġ} ĊĠĠĠĠĠĠĠ Ġall St ories Ġ= Ġ( this . configured St ories Ġ+ Ġbot Definition . stories . groupBy Ġ{ Ġit . id Ġ}). values . flatten () ĊĠĠĠĠĠĠĠ Ġval Ġstory Configurations Ġ= Ġconfigured St ories . map Ġ{ Ġit . configuration Ġ}. map Ġ{ Ġit . story Id Ġto Ġit Ġ}. toMap () ĊĠĠĠĠĠĠĠ Ġstory Red irection s Map Ġ= Ġstory Configurations . map Ġ{ Ġit . key Ġto Ġfollow Story Redirect s ( connector Id , Ġstory Configurations , Ġit . key , Ġnull ) Ġ}. toMap () ĊĠĠĠĠĠĠĠ Ġlogger . debug Ġ{ Ġ" Story Ġrules Ġfor Ġ'${ bot Definition . bot Id } Ġ($ connector Id ) ': Ġ$ story Red irection s Map " Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġstories : ĠList < Story Definition > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġall St ories ĊĊĠĠĠ Ġoverride Ġfun Ġfind Intent ( intent : ĠString ): ĠIntent Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġi Ġ= Ġsuper . find Intent ( intent ) ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( i Ġ== Ġunknown ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġi 2 Ġ= Ġbot Definition . find Intent ( intent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i 2 Ġ== Ġunknown ) ĠBot Definition . find Intent ( stories , Ġintent ) Ġelse Ġi 2 ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġi ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġfind Story Definition ( intent : ĠIntent Aware ?): ĠStory Definition Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfind Story Definition ( intent ?. wrapped Intent ()?. name ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfollow Story Redirect s ( connector Id : ĠString ?, Ġstories : ĠMap < String , ĠStory Definition Configuration >, Ġrequest Story Id : ĠString , Ġswitch Story Id : ĠString ?): ĠString ? Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( switch Story Id Ġ== Ġrequest Story Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Story Id ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( switch Story Id Ġ?: Ġrequest Story Id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġthe Story Ġ= Ġstories [ this ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( the Story ?. is Disabled ( connector Id ) Ġ== Ġtrue ) Ġ{ Ġreturn Ġnull Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthe Story ?. find Features ( connector Id )?. find Ġ{ Ġit . enabled Ġ&& Ġ! it . switch To Story Id . isNull Or Blank () Ġ} ?. let Ġ{ Ġfeature Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfollow Story Redirect s ( connector Id , Ġstories . filter Keys Ġ{ Ġthis Ġ!= Ġit Ġ}, Ġrequest Story Id , Ġfeature . switch To Story Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġfind Story Definition ( intent : ĠString ?, Ġapplication Id : ĠString ?): ĠStory Definition Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtarget Story Ġ= Ġstory Red irection s Map [ intent ] ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( story Red irection s Map . containsKey ( intent ) Ġ&& Ġtarget Story Ġ== Ġnull ) Ġ{ Ġ// ĠStory Ġis Ġdisabled ĊĠĠĠĠĠĠĠĠĠĠĠ Ġunknown Story ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( target Story Ġ!= Ġnull Ġ&& Ġtarget Story Ġ!= Ġintent ) Ġ{ Ġ// ĠStory Ġis Ġredirected ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfind Story Definition ( target Story , Ġapplication Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintent ?. let Ġ{ Ġi Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġenabled Configured St ories Ġ= Ġconfigured St ories [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . filter Ġ{ Ġ! it . configuration . is Disabled ( application Id ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠConfig ured Ġstories Ġhave Ġpriority Ġover Ġbuilt - in ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenabled Configured St ories ?. first OrNull Ġ{ Ġit . answer Type Ġ!= Ġbuiltin Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġenabled Configured St ories ?. first OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: ĠBot Definition . find Story Definition ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstories . filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠConfig ured Story Definition Ġ-> Ġ! it . configuration . is Disabled ( application Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintent , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunknown Story , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkeyword Story ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ" Wrapper ($ bot Definition )" ĊĠĠĠ Ġ} Ċ Ċ }