package Ġcom . cy b 3 r ko . m 3 ok otlin Ċ Ċ import Ġio . ktor . client .* Ċ import Ġio . ktor . client . features .* Ċ import Ġio . ktor . client . features . json .* Ċ import Ġio . ktor . client . features . json . serializer .* Ċ import Ġio . ktor . client . request .* Ċ import Ġio . ktor . http .* Ċ import Ġkotlinx . coroutines . isActive Ċ Ċ object ĠM 3 O Ġ{ ĊĠĠĠ Ġprivate Ġconst Ġval ĠBASE _ URL Ġ= Ġ" https :// api . m 3 o . com / v 1 " ĊĠĠĠ Ġprivate Ġconst Ġval ĠBASE _ URL _ STREAM Ġ= Ġ" wss :// api . m 3 o . com / v 1 " ĊĠĠĠ Ġinternal Ġlateinit Ġvar Ġauthorization : ĠPair < String , ĠString > ĊĠĠĠ Ġinternal Ġlateinit Ġvar Ġk tor HttpClient : ĠHttpClient ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġk tor Http Multipart Client : ĠHttpClient ĊĊĠĠĠ Ġfun Ġinitialize ( apiKey : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . initialize () ĊĠĠĠĠĠĠĠ ĠLog . i (" Initializing ĠK tor ĠM 3 O ĠClient ...") ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! Regex ("[ a - zA - Z 0 - 9 ]+ "). matches ( apiKey ) Ġ|| ĠapiKey . length Ġ> Ġ 6 4 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Parameter Exception (" The ĠM 3 O ĠAPI ĠKey Ġcontains Ġinvalid Ġcharacters Ġor Ġdoes Ġnot Ġhave Ġ 4 8 Ġcharacters .") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġauthorization Ġ= Ġ" Authorization " Ġto Ġ" Bearer Ġ$ apiKey " ĊĊĠĠĠĠĠĠĠ Ġk tor HttpClient Ġ= ĠHttpClient Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfollow Redirect s Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect Success Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġinstall ( Json Feature ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġserializer Ġ= ĠKotlin x Serializer ( kotlin x . serialization . json . Json Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpretty Print Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġignore Unknown Keys Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġinstall ( Default Request ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheader ( HttpHeaders . ContentType , ĠContentType . Application . Json ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheader ( HttpHeaders . Authorization , Ġauthorization . second ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠLogging Ġfor Ġdebugging Ċ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġinstall ( Logging ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger Ġ= Ġobject Ġ: ĠLogger Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġlog ( message : ĠString ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i (" Logger ĠK tor Ġ=> Ġ$ message ") Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlevel Ġ= ĠLogLevel . ALL Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠLog . i (" K tor ĠM 3 O ĠClient Ġinitialized .") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġterminate () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(:: ktor HttpClient . isInitialized ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġk tor HttpClient . close () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(:: ktor Http Multipart Client . isInitialized ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġk tor Http Multipart Client . close () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠLog . i (" K tor ĠM 3 O ĠClient Ġterminated .") ĊĠĠĠĠĠĠĠ ĠLog . terminate () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis Initialized (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ(:: ktor HttpClient . isInitialized ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġk tor HttpClient . engine . isActive ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġget K tor Http Multipart Client (): ĠHttpClient Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! :: ktor Http Multipart Client . isInitialized ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġk tor Http Multipart Client Ġ= ĠHttpClient Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinstall ( Default Request ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheader ( HttpHeaders . Authorization , Ġauthorization . second ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠLogging Ġfor Ġdebugging Ċ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinstall ( Logging ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger Ġ= Ġobject Ġ: ĠLogger Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġlog ( message : ĠString ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i (" Logger ĠK tor Ġ=> Ġ$ message ") Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlevel Ġ= ĠLogLevel . ALL Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i (" K tor ĠM 3 O ĠMultip art ĠClient Ġinitialized .") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġk tor Http Multipart Client ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠgetUrl ( service : ĠString , Ġendpoint : ĠString , Ġstream : ĠBoolean Ġ= Ġfalse ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġurl Ġ= Ġif Ġ(! stream ) ĠBASE _ URL Ġelse ĠBASE _ URL _ STREAM ĊĠĠĠĠĠĠĠ Ġreturn Ġ"$ url /$ service /$ endpoint " ĊĠĠĠ Ġ} Ċ }