package Ġdev . hor os cope . div ination . core Ċ Ċ import Ġdev . hor os cope . div ination . core . x iv api . Xiv ApiClient Ċ import Ġdev . hor os cope . div ination . create Ċ import Ġkotlinx . coroutines . with Timeout OrNull Ċ import Ġmu . Kotlin Logging Ċ import Ġjava . time . LocalDateTime Ċ import Ġjava . util . concurrent . Concurrent HashMap Ċ import Ġkotlin . time . Duration Ċ import Ġjava . time . Duration Ġas ĠJava Duration Ċ Ċ object ĠL ode stone Avatar Manager Ġ{ ĊĠĠĠ Ġprivate Ġval Ġavatar Url Cache Ġ= ĠConcurrent HashMap < String , ĠPair < String ?, ĠLocalDateTime >>() ĊĠĠĠ Ġprivate Ġval Ġexpired : ĠJava Duration Ġget () Ġ= ĠJava Duration . of Hours ( 3 ) ĊĠĠĠ Ġprivate Ġval Ġtimeout : ĠDuration Ġget () Ġ= ĠDuration . seconds ( 1 0 ) ĊĊĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠKotlin Logging . create (" Div ination . S se Server . L ode stone Avatar Manager ") ĊĊĠĠĠ Ġsuspend Ġfun Ġfetch Url ( name : ĠString ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwith Timeout OrNull ( timeout ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġurl : ĠString ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcache Ġ= Ġavatar Url Cache [ name ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cache Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġurl Ġ= Ġcache . first ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Java Duration . between ( cache . second , ĠLocalDateTime . now ()) Ġ< Ġexpired ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ with Timeout OrNull Ġurl ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= ĠX iv ApiClient . search Character ( name , Ġ" V ale for ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġurl Ġ= Ġresponse . results . first OrNull ()?. avatar ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġavatar Url Cache [ name ] Ġ= Ġurl Ġto ĠLocalDateTime . now () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error ( e ) Ġ{ Ġ" Failed Ġto Ġfetch Ġavatar Ġfor Ġ${ name } ." Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġurl ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ