package Ġio . github . pe ter tr r . init bot . discord Ċ Ċ import Ġio . github . pe ter tr r . init bot . Command Result Ċ import Ġio . github . pe ter tr r . init bot . discord . entities . Response Context Ċ import Ġkotlin . reflect . K Class Ċ Ċ class ĠResponse Processor Ġprivate Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġhandlers : ĠList < Response Context .( Command Result ) Ġ-> ĠUnit >, ĊĠĠĠ Ġprivate Ġval Ġmap pers : ĠList < Response Context .( Command Result ) Ġ-> ĠString ? >, Ċ ) Ġ{ ĊĠĠĠ Ġfun Ġ< T Ġ: ĠCommand Result > Ġprocess ( ctx : ĠResponse Context , Ġraw Result : ĠT ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġhandlers . forEach Ġ{ Ġhandler Ġ-> Ġhandler ( ctx , Ġraw Result ) Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġmap pers . first NotNull Of OrNull Ġ{ Ġmapper Ġ-> Ġmapper ( ctx , Ġraw Result ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġraw Result . message ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠBuilder Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġhandlers : ĠMutable List < Response Context .( Command Result ) Ġ-> ĠUnit > Ġ= Ġmutable ListOf () ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġmap pers : ĠMutable List < Response Context .( Command Result ) Ġ-> ĠString ?> Ġ= Ġmutable ListOf () ĊĊĠĠĠĠĠĠĠ Ġfun Ġbuild () Ġ= ĠResponse Processor ( handlers , Ġmap pers ) ĊĊĠĠĠĠĠĠĠ Ġfun Ġ< T Ġ: ĠCommand Result > Ġdo On ( response Type : ĠK Class < T >, Ġhandler : ĠResponse Context .( command Result : ĠT ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandlers . add Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( response Type . is Instance ( it )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler ( this , Ġit Ġas ĠT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġ< T Ġ: ĠCommand Result > Ġmap If ( response Type : ĠK Class < T >, Ġmapper : ĠResponse Context .( T ) Ġ-> ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap pers . add Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( response Type . is Instance ( it )) Ġmapper ( this , Ġit Ġas ĠT ) Ġelse Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġcreate ( configure : ĠBuilder . () Ġ-> ĠUnit ) Ġ= ĠBuilder (). apply ( configure ). build () ĊĠĠĠ Ġ} Ċ } Ċ