/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 7 / 2 0 2 1 Ġ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 . connector . ale xa Ċ Ċ import Ġai . to ck . bot . connector . Connector Base Ċ import Ġai . to ck . bot . connector . Connector Callback Ċ import Ġai . to ck . bot . connector . Connector Message Ċ import Ġai . to ck . bot . connector . media . Media Card Ċ import Ġai . to ck . bot . connector . media . Media Message Ċ import Ġai . to ck . bot . engine . Bot Bus Ċ import Ġai . to ck . bot . engine . Bot Repository Ċ import Ġai . to ck . bot . engine . Connector Controller Ċ import Ġai . to ck . bot . engine . action . Action Ċ import Ġai . to ck . bot . engine . action . Send Attachment . Attachment Type . image Ċ import Ġai . to ck . bot . engine . event . Event Ċ import Ġai . to ck . shared . boolean Property Ċ import Ġai . to ck . shared . error Ċ import Ġai . to ck . shared . vertx . blocking Ċ import Ġcom . amazon . speech . Sdk Ċ import Ġcom . amazon . speech . speech let . Intent Request Ċ import Ġcom . amazon . speech . speech let . Speech let RequestHandler Ċ import Ġcom . amazon . speech . speech let . Speech let RequestHandler Exception Ċ import Ġcom . amazon . speech . speech let . authentication . Speech let Request Signature Verifier Ċ import Ġcom . amazon . speech . speech let . verifier . Application Id Speech let Request Envelope Verifier Ċ import Ġcom . amazon . speech . speech let . verifier . Speech let Request Verifier Wrapper Ċ import Ġcom . amazon . speech . speech let . verifier . Timestamp Speech let Request Verifier Ċ import Ġio . vertx . core . buffer . Buffer Ċ import Ġio . vertx . ext . web . Routing Context Ċ import Ġmu . Kotlin Logging Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ /** Ċ Ġ* Ġ[ Connector ] Ġfor ĠAmazon ĠAlex a . Ċ Ġ*/ Ċ class ĠAlex a Connector Ġinternal Ġconstructor ( ĊĠĠĠ Ġval Ġapplication Id : ĠString , ĊĠĠĠ Ġval Ġpath : ĠString , ĊĠĠĠ Ġval Ġa lex a To ck Mapper : ĠAlex a To ck Mapper , ĊĠĠĠ Ġsupported Alex a Application Ids : ĠSet < String >, ĊĠĠĠ Ġtimestamp In Ms : ĠLong Ċ ) Ġ: ĠConnector Base ( Alex a Connector Provider . connector Type ) Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠKotlin Logging . logger Ġ{} ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġdisable Request Signature Check Ġ= Ġboolean Property (" to ck _ ale xa _ disable _ request _ signature _ check ", Ġfalse ) ĊĊĠĠĠĠĠĠĠ Ġinternal Ġfun Ġsend Technical Error ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext : ĠRouting Context , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrowable : ĠThrowable , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest : ĠIntent Request ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" request : Ġ$ request ", Ġthrowable ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( throwable Ġis ĠSpeech let RequestHandler Exception Ġ|| Ġthrowable Ġis ĠSecurity Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . fail ( 4 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . fail ( throwable ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error ( t ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . fail ( t ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġrequest Handler Ġ= ĠSpeech let RequestHandler ( ĊĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠApplication Id Speech let Request Envelope Verifier ( supported Alex a Application Ids ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSpeech let Request Verifier Wrapper ( Timestamp Speech let Request Verifier ( timestamp In Ms , ĠTimeUnit . MILLISECONDS )) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġoverride Ġfun Ġregister ( controller : ĠConnector Controller ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcontroller . register Services ( path ) Ġ{ Ġrouter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" deploy Ġrest Ġa lex a Ġservices Ġfor Ġroot Ġpath Ġ$ path Ġ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġrouter . post ( path ). blocking Ġ{ Ġcontext Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Request ( controller , Ġcontext ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . fail ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsend ( event : ĠEvent , Ġcallback : ĠConnector Callback , Ġdelay In Ms : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcallback Ġas ĠAlex a Connector Callback ĊĠĠĠĠĠĠĠ Ġcallback . addAction ( event , Ġdelay In Ms ) ĊĠĠĠĠĠĠĠ Ġif Ġ( event Ġis ĠAction ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( event . metadata . last Answer ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . send Response () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . trace Ġ{ Ġ" unsupported Ġevent : Ġ$ event " Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġinternal Ġfor Ġtests ĊĠĠĠ Ġinternal Ġfun Ġhandle Request ( ĊĠĠĠĠĠĠĠ Ġcontroller : ĠConnector Controller , ĊĠĠĠĠĠĠĠ Ġcontext : ĠRouting Context ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtimer Data Ġ= ĠBot Repository . request Timer . start (" ale xa _ webhook ") ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbytes Ġ= Ġcontext . body . bytes ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġcertificate ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! disable Request Signature Check ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSpeech let Request Signature Verifier . check Request Signature ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbytes , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . request (). getHeader ( Sdk . SIGNATURE _ REQUEST _ HEADER ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . request (). getHeader ( Sdk . SIGNATURE _ CER TIFICATE _ CHAIN _ URL _ REQUEST _ HEADER ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. response () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. put Header (" Content - Type ", Ġ" application / json ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. end ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBuffer . buffer ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Handler . handle Speech let Call ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAlex a Connector Callback ( application Id , Ġcontroller , Ġa lex a To ck Mapper , Ġcontext ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbytes ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBot Repository . request Timer . throwable ( ex , Ġtimer Data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend Technical Error ( context , Ġex ) ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBot Repository . request Timer . end ( timer Data ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġto Connector Message ( message : ĠMedia Message ): ĠBot Bus . () Ġ-> ĠList < Connector Message > Ġ= Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( message Ġis ĠMedia Card ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtitle Ġ= Ġmessage . title ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsub Title Ġ= Ġmessage . sub Title ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġmessage . file ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( title Ġ!= Ġnull Ġ&& Ġsub Title Ġ!= Ġnull Ġ&& Ġfile Ġ!= Ġnull Ġ&& Ġfile . type Ġ== Ġimage ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( ale xa Standard Card ( title , Ġsub Title , Ġfile . url )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġempty List () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġempty List () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ