package Ġy ug en . rest Ċ Ċ import Ġio . github . bucket 4 j .* Ċ import Ġokhttp 3 . Ok HttpClient Ċ import Ġokhttp 3 . Request Ċ import Ġokhttp 3 . RequestBody Ċ import Ġokhttp 3 . Response Ċ import Ġy ug en . Y ug en Options Ċ import Ġy ug en . util . await Ċ import Ġy ug en . util . getLogger Ċ import Ġjava . time . Duration Ċ import Ġjava . time . Instant Ċ Ċ /** Ċ Ġ* ĠDiscord ĠAPI Ġroutes . Ċ Ġ*/ Ċ internal Ġobject ĠRoutes Ġ{ ĊĠĠĠ Ġprivate Ġval Ġok Http Ġ= ĠOk HttpClient . Builder (). add Network Interceptor ( UserAgent Interceptor ()). build () ĊĠĠĠ Ġprivate Ġval Ġrate limit Buckets Ġ= Ġmutable Map Of < String , ĠBlock ing Bucket >() ĊĊĠĠĠ Ġval ĠGet Gateway Ġ= ĠRoute (" GET ", Ġ"/ gateway / bot ") ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠA Ġroute Ġpointing Ġto Ġa Ġ[ url ] Ġusing Ġthe Ġgiven Ġ[ method ] Ġfor Ġthe Ġrequest . ĠThe Ġ[ major Param ] Ġis Ġfor Ġrate limit Ġbucket ĊĠĠĠĠ Ġ* Ġidentification Ġand Ġis Ġnot Ġstrictly Ġnecessary . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġclass ĠRoute ( private Ġval Ġmethod : ĠString , Ġprivate Ġval Ġurl : ĠString , Ġprivate Ġval Ġmajor Param : ĠString ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġlogger Ġ= Ġget Logger () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġrate limit Bucket Identifier : ĠString ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠTurn s Ġthe Ġroute Ġinto Ġa Ġrequest Ġwith Ġthe Ġgiven Ġ[ body ] Ġand Ġ[ params ]. ĠOptionally , Ġa Ġ[ token ] Ġcan Ġbe Ġprovided ĊĠĠĠĠĠĠĠĠ Ġ* Ġfor Ġauthenticated Ġrequests . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġto Request ( params : ĠMap < String , ĠString >? Ġ= Ġnull , Ġbody : ĠRequest Body ? Ġ= Ġnull , Ġtoken : ĠString ? Ġ= Ġnull ): ĠRequest Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= ĠRequest . Builder (). url ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠY ug en Options . api Base Ġ+ Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġformatted Url Ġ= Ġurl ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams ?. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġformatted Url Ġ= Ġformatted Url . replace (" :" Ġ+ Ġit . key , Ġit . value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġformatted Url ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). method ( method , Ġbody ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( token Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest . add Header (" Authorization ", Ġ" Bot Ġ$ token ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġrequest . build () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠExec utes Ġthis Ġroute Ġwith Ġa Ġrate limit . ĠP asses Ġ[ body ], Ġ[ params ], Ġand Ġ[ token ] Ġinto Ġ[ to Request ]. ĠIf Ġthis ĊĠĠĠĠĠĠĠĠ Ġ* Ġroute Ġdoes Ġnot Ġyet Ġhave Ġa Ġrate limit Ġbucket , Ġone Ġwill Ġbe Ġcreated Ġbased Ġon Ġthe Ġrate limit Ġheaders Ġof Ġthe ĊĠĠĠĠĠĠĠĠ Ġ* Ġresponse . ĠThis Ġonly Ġhappens Ġonce . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" Blocking Method In Non Blocking Context ") ĊĠĠĠĠĠĠĠ Ġsuspend Ġfun Ġexecute ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparams : ĠMap < String , ĠString >? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbody : ĠRequest Body ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoken : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ): ĠResponse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . trace (" exec uting Ġroute Ġ$ url ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( rate limit Bucket Identifier Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrate limit Buckets [ rate limit Bucket Identifier ] !!. consume ( 1 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġok Http . new Call ( to Request ( params , Ġbody , Ġtoken )). await () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġbucket Name Ġ= Ġresponse . headers [" x - rate limit - bucket "] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( major Param Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbucket Name Ġ= Ġbucket Name ?. plus ("- ${ params ?. get (" major Param ") !! }") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( rate limit Bucket Identifier Ġ== Ġnull Ġ|| Ġrate limit Bucket Identifier Ġ!= Ġbucket Name ) Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . headers [" x - rate limit - bucket "] Ġ!= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrate limit Bucket Identifier Ġ= Ġbucket Name !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlimit Ġ= Ġresponse . headers [" x - rate limit - limit "] !!. to Long () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġremaining Ġ= Ġresponse . headers [" x - rate limit - remaining "] !!. to Long () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresets At Ġ= ĠInstant . of Epoch Milli ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( response . headers [" x - rate limit - reset "] !!. toFloat () Ġ* Ġ 1 0 0 0 ). to Long () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġduration Ġ= ĠDuration . of Millis ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( response . headers [" x - rate limit - reset - after "] !!. toFloat () Ġ* Ġ 1 0 0 0 ). to Long () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrate limit Buckets [ rate limit Bucket Identifier !! ] Ġ= ĠBucket 4 j . builder (). add Limit ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBand width . classic ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlimit , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRe fill . inter v ally Aligned ( limit , Ġduration , Ġresets At , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). with Initial Tokens ( remaining ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). build (). as Scheduler () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . trace (" lear nt Ġnew Ġbucket Ġ($ rate limit Bucket Identifier ) Ġof Ġ$ limit /${ duration . to Millis ()} ms ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresponse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }