package Ġcom . tom b spawn . di Ċ Ċ import Ġcom . google . common . base . Optional Ċ import Ġcom . google . gson . reflect . Type Token Ċ import Ġcom . tom b spawn . base . config . Json Application Config Ċ import Ġcom . tom b spawn . base . di . scopes . App Scope Ċ import Ġcom . tom b spawn . base . network . Common . create HttpClient Ċ import Ġcom . tom b spawn . data . Database Service Ċ import Ġcom . tom b spawn . di . qual ifiers .* Ċ import Ġcom . tom b spawn . models . config .* Ċ import Ġcom . tom b spawn . utils . Constants Ċ import Ġdagger . Module Ċ import Ġdagger . Provides Ċ import Ġio . ktor . application . Application Ċ import Ġio . ktor . client . HttpClient Ċ import Ġio . ktor . client . features . json . Gson Serializer Ċ import Ġio . ktor . http .* Ċ import Ġjava . io . File Ċ Ċ @ Module Ċ class ĠApp Module Ġ{ ĊĊĠĠĠ Ġ@ Provides ĊĠĠĠ Ġ@ App Scope ĊĠĠĠ Ġfun Ġprovide Environment ( application : ĠApplication ): ĠJson Application Config Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġapplication . environment . config Ġas ĠJson Application Config ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Provides ĊĠĠĠ Ġ@ App Scope ĊĠĠĠ Ġfun Ġprovide Slack ( config : ĠJson Application Config ): ĠSlack Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġconfig . property (" slack "). getAs ( Slack :: class . java ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Provides ĊĠĠĠ Ġ@ App Scope ĊĠĠĠ Ġfun Ġprovide Db ( config : ĠJson Application Config ): ĠDb Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġconfig . property (" db "). getAs ( Db :: class . java ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Provides ĊĠĠĠ Ġ@ App Scope ĊĠĠĠ Ġfun Ġprovide Database ( db : ĠDb , Ġ@ Debug gable Ġis Debug : ĠBoolean ): ĠDatabase Service Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠDatabase Service ( db . url , Ġdb . username , Ġdb . password , Ġis Debug ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Provides ĊĠĠĠ Ġ@ App Scope ĊĠĠĠ Ġfun Ġprovide Common ( config : ĠJson Application Config ): ĠCommon Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġconfig . property (" common "). getAs ( Common :: class . java ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Provides ĊĠĠĠ Ġ@ App Scope ĊĠĠĠ Ġfun Ġprovide Redis Config ( config : ĠJson Application Config ): ĠRedis Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġconfig . property (" redis "). getAs ( Redis :: class . java ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Provides ĊĠĠĠ Ġ@ App Scope ĊĠĠĠ Ġ@ Slack FileUpload Client ĊĠĠĠ Ġfun Ġprovide Slack HttpClient ( gson Serializer : ĠGson Serializer , Ġ@ Debug gable Ġis Debug : ĠBoolean , Ġslack : ĠSlack ): ĠHttpClient Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcreate HttpClient ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgson Serializer , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" slack . com ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠURL Protocol . HTTPS , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Timeout Ġ= Ġslack . upload Timeout , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenable Logger Ġ= Ġis Debug , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Headers Ġ= Ġmap Of (" Authorization " Ġto Ġ" Bearer Ġ${ slack . bot Token }") ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Provides ĊĠĠĠ Ġ@ App Scope ĊĠĠĠ Ġ@ Slack Bot Client ĊĠĠĠ Ġfun Ġprovide Slack Bot Client ( gson Serializer : ĠGson Serializer , Ġ@ Debug gable Ġis Debug : ĠBoolean , Ġslack : ĠSlack ): ĠHttpClient Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcreate HttpClient ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgson Serializer , Ġ" slack . com ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠURL Protocol . HTTPS , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenable Logger Ġ= Ġis Debug , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Timeout Ġ= Ġslack . request Timeout , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Headers Ġ= Ġmap Of (" Authorization " Ġto Ġ" Bearer Ġ${ slack . bot Token }") ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Provides ĊĠĠĠ Ġ@ App Scope ĊĠĠĠ Ġ@ Upload Dir ĊĠĠĠ Ġfun Ġprovide Temp Upload Dir (): ĠFile Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠFile ( System . getProperty (" user . dir "), Ġ" temp ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Provides ĊĠĠĠ Ġ@ App Scope ĊĠĠĠ Ġ@ Waiting Messages ĊĠĠĠ Ġfun Ġprovide Waiting Messages ( config : ĠJson Application Config ): ĠOptional < List < String >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmessages : ĠList < String >? Ġ= Ġconfig . property OrNull (" waiting _ messages ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . getAs < List < String >>( object Ġ: ĠType Token < List < String >>() Ġ{} . type ). take If Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! it . isNull OrEmpty () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠOptional . from Nullable ( messages ) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Provides ĊĠĠĠ Ġ@ App Scope ĊĠĠĠ Ġ@ Debug gable ĊĠĠĠ Ġfun Ġprovide Is Debug ( server Conf : ĠOptional < Server Conf >): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġserver Conf . get ()?. debug Ġ?: Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Provides ĊĠĠĠ Ġ@ Application Base Uri ĊĠĠĠ Ġfun Ġprovide Application Base Uri (@ Debug gable Ġdebug : ĠBoolean , Ġserver Conf : ĠOptional < Server Conf >): ĠURL Builder Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠURL Builder (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( debug ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . protocol Ġ= Ġserver Conf . get ()?. scheme ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠURL Protocol . create OrDefault ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: ĠURL Protocol . HTTP ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . host Ġ= Ġserver Conf . get (). host Name Ġ?: ĠConstants . Common . DEFAULT _ HOST ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . port Ġ= Ġserver Conf . get (). port Ġ?: ĠConstants . Common . DEFAULT _ PORT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . protocol Ġ= ĠURL Protocol . HTTP ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . host Ġ= Ġserver Conf . get (). host Name Ġ?: Ġ" application " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . port Ġ= Ġserver Conf . get ()?. port Ġ?: ĠConstants . Common . DEFAULT _ PORT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Provides ĊĠĠĠ Ġ@ App Scope ĊĠĠĠ Ġfun Ġprovide App List ( config : ĠJson Application Config ): ĠList < App > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġconfig . config List (" apps "). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . getAs ( App :: class . java ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Provides ĊĠĠĠ Ġ@ App Scope ĊĠĠĠ Ġfun Ġprovide Server Conf ( config : ĠJson Application Config ): ĠOptional < Server Conf > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠOptional . from Nullable ( config . property OrNull (" ktor . deployment ") ?. getAs ( Server Conf :: class . java )) ĊĠĠĠ Ġ} Ċ }