package Ġcommands . w ishes Ċ Ċ import Ġcom . fasterxml . jackson . databind . json . Json Mapper Ċ import Ġcom . fasterxml . jackson . module . kotlin . Kotlin Feature Ċ import Ġcom . fasterxml . jackson . module . kotlin . Kotlin Module Ċ import Ġcom . fasterxml . jackson . module . kotlin . readValue Ċ import Ġcommands . api . Client Command Ċ import Ġcommands . api . Command Exception Ċ import Ġcommands . api . UserID Ċ import Ġcommands . w ishes . api .* Ċ import Ġdev . min n . j da . k tx . Embed Builder Ċ import Ġdev . min n . j da . k tx . SL F 4 J Ċ import Ġdev . min n . j da . k tx . await Ċ import Ġkotlinx . coroutines . Job Ċ import Ġkotlinx . coroutines . delay Ċ import Ġkotlinx . coroutines . launch Ċ import Ġnet . dv 8 tion . j da . api . entities . Message Embed Ċ import Ġnet . dv 8 tion . j da . api . events . interaction . command . Slash Command Interaction Event Ċ import Ġnet . dv 8 tion . j da . api . events . interaction . component . Button Interaction Event Ċ import Ġnet . dv 8 tion . j da . api . inter actions . components . buttons . Button Ċ import Ġokhttp 3 . Ok HttpClient Ċ import Ġokhttp 3 . Request Ċ import Ġorg . jetbrains . ex posed . sql . transactions . transaction Ċ import Ġorg . jetbrains . ex posed . sql . update Ċ import Ġjava . time . LocalDate Ċ import Ġjava . time . format . DateTime Formatter Ċ import Ġkotlin . time . Duration . Companion . minutes Ċ Ċ class ĠW ish History Ġ: ĠClient Command Ġ{ ĊĠĠĠ Ġprivate Ġval Ġlog Ġby ĠSL F 4 J ĊĠĠĠ Ġprivate Ġval Ġrequests Ġ= ĠHashMap < UserID , ĠHistory Request >() ĊĠĠĠ Ġprivate Ġval Ġrequest Results Ġ= ĠHashMap < UserID , ĠW ishes >() ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġtimeout : ĠJob ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġexecute ( event : ĠSl ash Command Interaction Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġauth Key Ġ= ĠW ish . entries [ event . user . id ] ĊĊĠĠĠĠĠĠĠ Ġif Ġ( auth Key Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent . hook . edit Original (" No ĠAPI Ġkey Ġis Ġset .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġevent . getOption (" banner ") ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbanner Type Ġ= ĠBanner Type . from Value ( it . as Long ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequests [ event . user . id ] Ġ= ĠHistory Request ( auth Key , Ġbanner Type ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhr Ġ= Ġrequests [ event . user . id ] !! ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRetrieve Ġstored Ġwish Ġhistory Ġfrom Ġthe Ġcache ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Wish . cache s [ event . user . id ] Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmapper Ġ= ĠJson Mapper . builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Module ( Kotlin Module . Builder (). configure ( Kotlin Feature . Strict Null Checks , Ġtrue ). build ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcached Ġ= Ġmapper . readValue < Cached Wish >( Wish . cache s [ event . user . id ] !! ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Results [ event . user . id ] Ġ= Ġcached . w ishes ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Results [ event . user . id ] Ġ= Ġrequest Wish Data ( hr , Ġevent . user . id , Ġevent . j da . httpClient ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠCommand Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . error ( e . localized Message ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent . hook . edit Original ( e . response Message ()). await () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġrequest Results [ event . user . id ]?. get ( requests [ event . user . id ]?. banner Type ) !! ĊĊĠĠĠĠĠĠĠ Ġevent . hook . edit Original Embed s ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġform Embed ( data [ requests [ event . user . id ] !!. pageNumber ], Ġrequests [ event . user . id ] !!. pageNumber ) ĊĠĠĠĠĠĠĠ Ġ). await () ĊĊĠĠĠĠĠĠĠ Ġ// ĠWe Ġare Ġguaranteed Ġto Ġbe Ġon Ġthe Ġfirst Ġpage , Ġso Ġdisable Ġthe Ġ" prev " Ġbutton . ĊĠĠĠĠĠĠĠ Ġevent . hook . edit Original Components (). setAction Row ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠButton . primary (" prev ", Ġ"\ u 2 5 c 0 \ ufe 0 f "). as Disabled (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠButton . primary (" next ", Ġ"\ u 2 5 b 6 \ ufe 0 f ") ĊĠĠĠĠĠĠĠ Ġ). await () ĊĊĠĠĠĠĠĠĠ Ġtimeout Ġ= Ġexecutor . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 2 . minutes ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent . hook . edit Original Components (). await () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġhandle Buttons ( event : ĠButton Interaction Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtimeout . cancel () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( request Results [ event . user . id ]?. get ( requests [ event . user . id ]?. banner Type ) !!. isEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( event . component Id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" prev " Ġ-> Ġhandle Prev ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" next " Ġ-> Ġhandle Next ( event ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġhandle Prev ( event : ĠButton Interaction Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrequests [ event . user . id ] !!. pageNumber Ġ-= Ġ 1 ĊĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġrequest Results [ event . user . id ]?. get ( requests [ event . user . id ]?. banner Type ) !! ĊĊĠĠĠĠĠĠĠ Ġif Ġ( requests [ event . user . id ] !!. pageNumber Ġ<= Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent . hook . edit Original Components (). setAction Row ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠButton . primary (" prev ", Ġ"\ u 2 5 c 0 \ ufe 0 f "). as Disabled (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠButton . primary (" next ", Ġ"\ u 2 5 b 6 \ ufe 0 f ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). await () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent . hook . edit Original Components (). setAction Row ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠButton . primary (" prev ", Ġ"\ u 2 5 c 0 \ ufe 0 f "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠButton . primary (" next ", Ġ"\ u 2 5 b 6 \ ufe 0 f ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). await () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġevent . message . edit Message Embed s ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġform Embed ( data [ requests [ event . user . id ] !!. pageNumber ], Ġrequests [ event . user . id ] !!. pageNumber ) ĊĠĠĠĠĠĠĠ Ġ). await () ĊĊĠĠĠĠĠĠĠ Ġtimeout Ġ= Ġexecutor . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 1 . minutes ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent . hook . edit Original Components (). await () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġhandle Next ( event : ĠButton Interaction Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrequests [ event . user . id ] !!. pageNumber Ġ+= Ġ 1 ĊĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġrequest Results [ event . user . id ]?. get ( requests [ event . user . id ]?. banner Type ) !! ĊĊĠĠĠĠĠĠĠ Ġif Ġ( data . size Ġ<= Ġrequests [ event . user . id ] !!. pageNumber Ġ+ Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent . hook . edit Original Components (). setAction Row ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠButton . primary (" prev ", Ġ"\ u 2 5 c 0 \ ufe 0 f "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠButton . primary (" next ", Ġ"\ u 2 5 b 6 \ ufe 0 f "). as Disabled () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). await () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent . hook . edit Original Components (). setAction Row ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠButton . primary (" prev ", Ġ"\ u 2 5 c 0 \ ufe 0 f "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠButton . primary (" next ", Ġ"\ u 2 5 b 6 \ ufe 0 f ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). await () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġevent . message . edit Message Embed s ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġform Embed ( data [ requests [ event . user . id ] !!. pageNumber ], Ġrequests [ event . user . id ] !!. pageNumber ) ĊĠĠĠĠĠĠĠ Ġ). await () ĊĊĠĠĠĠĠĠĠ Ġtimeout Ġ= Ġexecutor . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 1 . minutes ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent . hook . edit Original Components (). await () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġform Embed ( wish Data : ĠW ish Data , Ġpage : ĠInt ): ĠMessage Embed Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠdateFormat Ġ= ĠDateTime Formatter . of Pattern (" yyyy - MM - dd ĠHH : mm : ss ") ĊĠĠĠĠĠĠĠ Ġval Ġtarget DateFormat Ġ= ĠDateTime Formatter . of Pattern (" MM / dd / yyyy ") ĊĊĠĠĠĠĠĠĠ Ġreturn ĠEmbed Builder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġ" History Ġfor ĠUID Ġ${ wish Data . list . last (). uid }" ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= ĠStringBuilder (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwish Data . list . forEach Ġ{ Ġwish Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpull Date Ġ= ĠLocalDate . parse ( wish . time , ĠdateFormat ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpull Time Ġ= Ġpull Date . format ( target DateFormat ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend Line (" ` [$ pull Time ]` Ġ${ wish . rank Type } âĺ ħ Ġ- Ġ${ wish . name }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. toString () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfooter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġ" Page Ġ$ page " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. build () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ@ Throws ( Command Exception :: class ) ĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġrequest Wish Data ( hr : ĠHistory Request , ĠuserId : ĠUser ID , Ġhttp : ĠOk HttpClient ): ĠW ishes Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġw ishes : ĠMutable Map < Banner Type , ĠList < Wish Data >> Ġ= Ġmutable Map Of () ĊĊĠĠĠĠĠĠĠ Ġval Ġmapper Ġ= ĠJson Mapper . builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Module ( Kotlin Module . Builder (). configure ( Kotlin Feature . Strict Null Checks , Ġtrue ). build ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġenum Values < Banner Type >(). forEach Ġ{ Ġbanner Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpages : ĠMutable List < Wish Data > Ġ= Ġmutable ListOf () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġlast Wish Id Ġ= Ġ" 0 " ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMake Ġa Ġrequest Ġat Ġleast Ġevery Ġ 5 0 0 ms Ġto Ġavoid Ġgetting Ġrate - limited . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 5 0 0 L ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinitial Request Url Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append (" https :// hk 4 e - api - os . mi ho yo . com / event / g acha _ info / api / get G acha Log ?") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append (" auth key _ ver = 1 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append ("& sign _ type = 2 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append ("& auth _ appid = webview _ g acha ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append ("& init _ type =${ banner . value }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append ("& lang = en ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append ("& auth key =${ hr . auth Key }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append ("& g acha _ type =${ banner . value }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append ("& page = 1 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append ("& size = 1 2 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append ("& end _ id =${ last Wish Id }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toString () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinitial Request Ġ= ĠRequest . Builder (). url ( initial Request Url ). build () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġhttp . new Call ( initial Request ). execute (). use Ġ{ Ġinitial Response Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! initial Response . is Successful ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠCommand Exception (" Failed Ġto Ġrequest Ġdata Ġfrom ĠAPI . ĠGot Ġcode Ġ${ initial Response . code }", Ġ 1 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinitial History Ġ= Ġmapper . readValue < History >( initial Response . body !!. string ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( initial History . data Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠCommand Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Wish Ġdata Ġis Ġnull , ĠAPI Ġreturned Ġcode Ġ${ initial History . ret code }, Ġfor Ġreason : Ġ${ initial History . message }", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinitial History . ret code ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpages . add ( 0 , Ġinitial History . data ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġpage Index Ġ= Ġ 1 ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMake Ġa Ġrequest Ġat Ġleast Ġevery Ġ 5 0 0 ms Ġto Ġavoid Ġgetting Ġrate - limited . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 5 0 0 L ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapi Url Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append (" https :// hk 4 e - api - os . mi ho yo . com / event / g acha _ info / api / get G acha Log ?") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append (" auth key _ ver = 1 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append ("& sign _ type = 2 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append ("& auth _ appid = webview _ g acha ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append ("& init _ type =${ banner . value }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append ("& lang = en ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append ("& auth key =${ hr . auth Key }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append ("& g acha _ type =${ banner . value }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append ("& page =${ page Index Ġ+ Ġ 1 }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append ("& size = 1 2 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append ("& end _ id =${ last Wish Id }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toString () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= ĠRequest . Builder (). url ( api Url ). build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġhttp . new Call ( request ). execute () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! response . is Successful ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠCommand Exception (" Failed Ġto Ġrequest Ġdata Ġfrom ĠAPI . ĠGot Ġcode Ġ${ response . code }", Ġ 1 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhistory Ġ= Ġmapper . readValue < History >( response . body !!. string ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( history . data Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠCommand Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Wish Ġdata Ġis Ġnull , ĠAPI Ġreturned Ġcode Ġ${ history . ret code }, Ġfor Ġreason : Ġ${ history . message }", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhistory . ret code ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpages . add ( page Index , Ġhistory . data ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pages [ page Index ]. list . isEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Wish Id Ġ= Ġpages [ page Index ]. list . last (). id ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage Index ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġw ishes [ banner ] Ġ= Ġpages ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠCache Ġthe Ġresult , Ġfor Ġfuture Ġuse ĊĠĠĠĠĠĠĠ Ġval Ġcached Wish Ġ= Ġmapper . writeValue AsString ( Cached Wish ( w ishes )) ĊĊĠĠĠĠĠĠĠ ĠW ish . cache s [ userId ] Ġ= Ġcached Wish ĊĊĠĠĠĠĠĠĠ Ġtransaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠW ish Table . update ({ ĠW ish Table . userId Ġeq ĠuserId Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit [ cached Wish Json ] Ġ= Ġcached Wish ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġw ishes ĊĠĠĠ Ġ} Ċ }