/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 7 / 2 0 2 1 Ġe - voy age urs Ġtechnologies Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġai . to ck . bot . connector . twitter Ċ Ċ import Ġai . to ck . bot . connector . Connector Exception Ċ import Ġai . to ck . bot . connector . twitter . model . AccessToken Ċ import Ġai . to ck . bot . connector . twitter . model . Attachment Ċ import Ġai . to ck . bot . connector . twitter . model . Attachment Media Ċ import Ġai . to ck . bot . connector . twitter . model . Command Ċ import Ġai . to ck . bot . connector . twitter . model . Media Category Ċ import Ġai . to ck . bot . connector . twitter . model . Media Upload Ċ import Ġai . to ck . bot . connector . twitter . model . Request Token Ċ import Ġai . to ck . bot . connector . twitter . model . User Ċ import Ġai . to ck . bot . connector . twitter . model . Webhook Ċ import Ġai . to ck . bot . connector . twitter . model . out coming . Out coming Event Ċ import Ġai . to ck . shared . add Jack son Converter Ċ import Ġai . to ck . shared . create Ċ import Ġai . to ck . shared . error Ċ import Ġai . to ck . shared . long Property Ċ import Ġai . to ck . shared . ret rofit Builder WithTimeout And Logger Ċ import Ġmu . Kotlin Logging Ċ import Ġoauth . sign post . http . Http Parameters Ċ import Ġokhttp 3 . MediaType . Companion . to MediaType Ċ import Ġokhttp 3 . Multipart Body Ċ import Ġokhttp 3 . RequestBody Ċ import Ġretrofit 2 . Call Ċ import Ġretrofit 2 . Response Ċ import Ġretrofit 2 . converter . scal ars . Scalars Converter Factory Ċ import Ġretrofit 2 . http . Body Ċ import Ġretrofit 2 . http . DELETE Ċ import Ġretrofit 2 . http . GET Ċ import Ġretrofit 2 . http . Multipart Ċ import Ġretrofit 2 . http . POST Ċ import Ġretrofit 2 . http . Part Ċ import Ġretrofit 2 . http . Path Ċ import Ġretrofit 2 . http . Query Ċ import Ġse . aker fel dt . okhttp . sign post . Ok Http OAuth Consumer Ċ import Ġse . aker fel dt . okhttp . sign post . Signing Interceptor Ċ import Ġjava . net . URL Decoder Ċ import Ġjava . net . URL Encoder Ċ import Ġjava . util . Base 6 4 Ċ import Ġjava . util . Date Ċ import Ġjava . util . Linked HashMap Ċ import Ġjavax . crypto . Mac Ċ import Ġjavax . crypto . spec . SecretKey Spec Ċ import Ġai . to ck . bot . connector . twitter . model . Tweet Ġas ĠInput Tweet Ċ import Ġai . to ck . bot . connector . twitter . model . out coming . Tweet Ġas ĠOutput Tweet Ċ Ċ /** Ċ Ġ* ĠTwitter Ġclient Ċ Ġ*/ Ċ internal Ġclass ĠTwitter Client ( ĊĠĠĠ Ġval Ġenvironment : ĠString , ĊĠĠĠ Ġval Ġconsumer Key : ĠString , ĊĠĠĠ Ġval Ġconsumer Secret : ĠString , ĊĠĠĠ Ġtoken : ĠString ? Ġ= Ġnull , ĊĠĠĠ Ġsecret : ĠString ? Ġ= Ġnull Ċ ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval ĠBASE _ URL Ġ= Ġ" https :// api . twitter . com " ĊĠĠĠ Ġprivate Ġval ĠBASE _ MEDIA _ URL Ġ= Ġ" https :// upload . twitter . com " ĊĠĠĠ Ġprivate Ġval ĠMED IA _ CHUNK _ SIZE Ġ= Ġ 1 0 2 4 Ġ* Ġ 5 0 0 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ see Ġhttps :// developer . twitter . com / en / docs / basics / authentication / api - reference / authenticate ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinterface ĠOAuth Api Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ@ POST ("/ oauth / request _ token ") ĊĠĠĠĠĠĠĠ Ġfun Ġrequest Token (): ĠCall < String > ĊĊĠĠĠĠĠĠĠ Ġ@ POST ("/ oauth / access _ token ") ĊĠĠĠĠĠĠĠ Ġfun ĠaccessToken (): ĠCall < String > ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ see Ġhttps :// developer . twitter . com / en / docs / accounts - and - users / follow - search - get - users / overview ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinterface ĠUser Api Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ@ GET ("/ 1 . 1 / users / show . json ") ĊĠĠĠĠĠĠĠ Ġfun Ġuser (@ Query (" user _ id ") ĠuserId : ĠString ): ĠCall < User > ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** * ĊĠĠĠĠ Ġ* Ġ@ see Ġhttps :// developer . twitter . com / en / docs / accounts - and - users / subscribe - account - activity / api - reference / aaa - premium # get - account - activity - all - env - name - subscriptions ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinterface ĠAccount Activity Api Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ@ POST ("/ 1 . 1 / account _ activity / all /{ environment }/ web hooks . json ") ĊĠĠĠĠĠĠĠ Ġfun Ġregister Webhook (@ Path (" environment ") Ġenvironment : ĠString , Ġ@ Query (" url ") Ġurl : ĠString ): ĠCall < Webhook > ĊĊĠĠĠĠĠĠĠ Ġ@ POST ("/ 1 . 1 / account _ activity / all /{ environment }/ subscriptions . json ") ĊĠĠĠĠĠĠĠ Ġfun Ġsubscribe (@ Path (" environment ") Ġenvironment : ĠString ): ĠCall < Unit > ĊĊĠĠĠĠĠĠĠ Ġ@ GET ("/ 1 . 1 / account _ activity / all /{ environment }/ subscriptions . json ") ĊĠĠĠĠĠĠĠ Ġfun Ġsubscriptions (@ Path (" environment ") Ġenvironment : ĠString ): ĠCall < Unit > ĊĊĠĠĠĠĠĠĠ Ġ@ DELETE ("/ 1 . 1 / account _ activity / all /{ environment }/ web hooks /{ webhook _ id }. json ") ĊĠĠĠĠĠĠĠ Ġfun Ġunregister Webhook (@ Path (" environment ") Ġenvironment : ĠString , Ġ@ Path (" webhook _ id ") Ġwebhook Id : ĠString ): ĠCall < Unit > ĊĊĠĠĠĠĠĠĠ Ġ@ GET ("/ 1 . 1 / account _ activity / all /{ environment }/ web hooks . json ") ĊĠĠĠĠĠĠĠ Ġfun Ġweb hooks (@ Path (" environment ") Ġenvironment : ĠString ): ĠCall < List < Webhook >> ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ see Ġhttps :// developer . twitter . com / en / docs / direct - messages / sending - and - re ceiving / api - reference ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinterface ĠDirect Message Api Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ@ POST ("/ 1 . 1 / direct _ messages / events / new . json ") ĊĠĠĠĠĠĠĠ Ġfun Ġnew (@ Body ĠOut coming Event : ĠOut coming Event ): ĠCall < Unit > ĊĊĠĠĠĠĠĠĠ Ġ@ GET ("/ 1 . 1 / direct _ messages / events / show . json ") ĊĠĠĠĠĠĠĠ Ġfun Ġshow (): ĠCall < Unit > ĊĊĠĠĠĠĠĠĠ Ġ@ GET ("/ 1 . 1 / direct _ messages / events / list . json ") ĊĠĠĠĠĠĠĠ Ġfun Ġevents (): ĠCall < Unit > ĊĊĠĠĠĠĠĠĠ Ġ@ DELETE ("/ 1 . 1 / direct _ messages / events / destroy . json ") ĊĠĠĠĠĠĠĠ Ġfun Ġdestroy (): ĠCall < Unit > ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ see Ġhttps :// developer . twitter . com / en / docs / media / upload - media / overview ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinterface ĠMedia Api Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ@ POST ("/ 1 . 1 / media / upload . json ") ĊĠĠĠĠĠĠĠ Ġfun Ġinit ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Query (" command ") Ġcommand : ĠCommand Ġ= ĠCommand . INIT , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Query (" total _ bytes ") Ġtotal Bytes : ĠLong , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Query (" media _ type ") Ġmedia TY pe : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Query (" media _ category ") Ġmedia Category : ĠString ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Query (" additional _ owners ") Ġadditional Owners : ĠString ? ĊĠĠĠĠĠĠĠ Ġ): ĠCall < Media Upload > ĊĊĠĠĠĠĠĠĠ Ġ@ Multipart ĊĠĠĠĠĠĠĠ Ġ@ POST ("/ 1 . 1 / media / upload . json ") ĊĠĠĠĠĠĠĠ Ġfun Ġappend ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Query (" command ") Ġcommand : ĠCommand Ġ= ĠCommand . APPEND , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Query (" media _ id ") Ġmedia Id : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Query (" segment _ index ") Ġsegment Index : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Part Ġfile : ĠMultip art Body . Part ĊĠĠĠĠĠĠĠ Ġ): ĠCall < Unit > ĊĊĠĠĠĠĠĠĠ Ġ@ POST ("/ 1 . 1 / media / upload . json ") ĊĠĠĠĠĠĠĠ Ġfun Ġfinalize ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Query (" command ") Ġcommand : ĠCommand Ġ= ĠCommand . FINAL IZE , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Query (" media _ id ") Ġmedia Id : ĠString ĊĠĠĠĠĠĠĠ Ġ): ĠCall < Media Upload > ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠStatus Api Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ@ POST ("/ 1 . 1 / statuses / update . json ") ĊĠĠĠĠĠĠĠ Ġfun Ġstatus ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Query (" status ") Ġstatus Message : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Query (" in _ reply _ to _ status _ id ") Ġreply Status Id : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Query (" auto _ populate _ reply _ metadata ") Ġauto Populate Metadata : ĠString Ġ= Ġ" true ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Query (" enable _ dm commands ") Ġenable DM : ĠString Ġ= Ġ" false " ĊĠĠĠĠĠĠĠ Ġ): ĠCall < Input Tweet > ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠKotlin Logging . logger Ġ{} ĊĊĠĠĠ Ġprivate Ġval Ġaccount Activity Api : ĠAccount Activity Api ĊĊĠĠĠ Ġprivate Ġval Ġdirect Message Api : ĠDirect Message Api ĊĊĠĠĠ Ġprivate Ġval Ġuser Api : ĠUser Api ĊĊĠĠĠ Ġprivate Ġval Ġmedia Api : ĠMedia Api ĊĊĠĠĠ Ġprivate Ġval Ġstatus Api : ĠStatus Api ĊĊĠĠĠ Ġinit Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġtwitter OAuth Consumer Ġ= ĠOk Http OAuth Consumer ( consumer Key , Ġconsumer Secret ) ĊĠĠĠĠĠĠĠ Ġif Ġ( token Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtwitter OAuth Consumer . set Token With Secret ( token , Ġsecret ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġaccount Activity Api Ġ= Ġretrofit Builder WithTimeout And Logger ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlong Property (" to ck _ twitter _ request _ timeout _ ms ", Ġ 3 0 0 0 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintercept ors Ġ= ĠlistOf ( Signing Interceptor ( twitter OAuth Consumer )) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. baseUrl ( BASE _ URL ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Jack son Converter () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. create () ĊĊĠĠĠĠĠĠĠ Ġdirect Message Api Ġ= Ġretrofit Builder WithTimeout And Logger ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlong Property (" to ck _ twitter _ request _ timeout _ ms ", Ġ 3 0 0 0 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintercept ors Ġ= ĠlistOf ( Signing Interceptor ( twitter OAuth Consumer )) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. baseUrl ( BASE _ URL ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Jack son Converter () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. create () ĊĊĠĠĠĠĠĠĠ Ġuser Api Ġ= Ġretrofit Builder WithTimeout And Logger ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlong Property (" to ck _ twitter _ request _ timeout _ ms ", Ġ 3 0 0 0 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintercept ors Ġ= ĠlistOf ( Signing Interceptor ( twitter OAuth Consumer )) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. baseUrl ( BASE _ URL ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Jack son Converter () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. create () ĊĊĠĠĠĠĠĠĠ Ġmedia Api Ġ= Ġretrofit Builder WithTimeout And Logger ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlong Property (" to ck _ twitter _ request _ timeout _ ms ", Ġ 3 0 0 0 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintercept ors Ġ= ĠlistOf ( Signing Interceptor ( twitter OAuth Consumer )) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. baseUrl ( BASE _ MEDIA _ URL ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Jack son Converter () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. create () ĊĊĠĠĠĠĠĠĠ Ġstatus Api Ġ= Ġretrofit Builder WithTimeout And Logger ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlong Property (" to ck _ twitter _ request _ timeout _ ms ", Ġ 3 0 0 0 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintercept ors Ġ= ĠlistOf ( Signing Interceptor ( twitter OAuth Consumer )) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. baseUrl ( BASE _ URL ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Jack son Converter () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. create () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdefault User (): ĠUser Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠUser ("", Ġ"", Ġ"", ĠDate (). time , Ġnull , Ġnull , Ġnull , Ġ"", Ġ"", Ġfalse , Ġfalse , Ġ 0 , Ġ 0 , Ġ 0 , Ġ"", Ġ"") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠResponse <* >. log Error () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġerror Ġ= Ġmessage () ĊĠĠĠĠĠĠĠ Ġval ĠerrorCode Ġ= Ġcode () ĊĠĠĠĠĠĠĠ Ġlogger . warn Ġ{ Ġ" Twitter ĠError Ġ: Ġ$ errorCode Ġ$ error " Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġerror Body Ġ= Ġerror Body ()?. string () ĊĠĠĠĠĠĠĠ Ġlogger . warn Ġ{ Ġ" Twitter ĠError Ġbody Ġ: Ġ$ error Body " Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsplit Query ( query : ĠString ): ĠMap < String , ĠString > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġquery Pairs Ġ= ĠLinkedHashMap < String , ĠString >() ĊĠĠĠĠĠĠĠ Ġval Ġpairs Ġ= Ġquery . split ("& ". to Regex ()). drop Last While Ġ{ Ġit . isEmpty () Ġ}. to Typed Array () ĊĠĠĠĠĠĠĠ Ġfor Ġ( pair Ġin Ġpairs ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġidx Ġ= Ġpair . indexOf (" =") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġquery Pairs [ URL Decoder . decode ( pair . substring ( 0 , Ġidx ), Ġ" UTF - 8 ")] Ġ= ĠURL Decoder . decode ( pair . substring ( idx Ġ+ Ġ 1 ), Ġ" UTF - 8 ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġquery Pairs ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAllows Ġa ĠConsumer Ġapplication Ġto Ġobtain Ġan ĠOAuth ĠRequest ĠToken Ġto Ġrequest Ġuser Ġauthorization ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġrequest Token Ġnull Ġif Ġfailed ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġrequest Token (): ĠRequest Token ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġo Auth Api Consumer Ġ= ĠOk Http OAuth Consumer ( consumer Key , Ġconsumer Secret ) ĊĠĠĠĠĠĠĠ Ġval Ġhttp Parameters Ġ= ĠHttp Parameters () ĊĠĠĠĠĠĠĠ Ġhttp Parameters . put (" oauth _ callback ", Ġ" oob ") ĊĠĠĠĠĠĠĠ Ġo Auth Api Consumer . set Additional Parameters ( http Parameters ) ĊĊĠĠĠĠĠĠĠ Ġval Ġo Auth Api : ĠOAuth Api Ġ= Ġretrofit Builder WithTimeout And Logger ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlong Property (" to ck _ twitter _ request _ timeout _ ms ", Ġ 3 0 0 0 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintercept ors Ġ= ĠlistOf ( Signing Interceptor ( o Auth Api Consumer )) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. baseUrl ( BASE _ URL ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Converter Factory ( Scalars Converter Factory . create ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. create () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġo Auth Api . request Token (). execute () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( response . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . body ()?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug Ġ{ Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġquery Pairs Ġ= Ġsplit Query ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRequest Token ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquery Pairs . get (" oauth _ token ") Ġ?: Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquery Pairs . get (" oauth _ token _ secret ") Ġ?: Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquery Pairs . get (" oauth _ callback _ confirmed ") ?. to Boolean () Ġ?: Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . log Error () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġlog Ġand Ġignore ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAllows Ġa ĠConsumer Ġapplication Ġto Ġuse Ġan ĠOAuth ĠRequest ĠToken Ġto Ġrequest Ġuser Ġauthorization . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġurl Ġfor Ġrequest Ġuser Ġauthorization ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġauthorization Url ( request Token : ĠRequest Token ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ"$ BASE _ URL / oauth / authorize ? oauth _ token =${ request Token . oauth Token }" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAllows Ġa ĠConsumer Ġapplication Ġto Ġuse Ġan ĠOAuth ĠRequest ĠToken Ġto Ġrequest Ġuser Ġauthorization . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġuser ĠaccessToken Ġnull Ġif Ġfailed ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠaccessToken ( request Token : ĠRequest Token , Ġoauth Verifier : ĠString ): ĠAccess Token ? Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġo Auth Api Consumer Ġ= ĠOk Http OAuth Consumer ( consumer Key , Ġconsumer Secret ) ĊĠĠĠĠĠĠĠ Ġo Auth Api Consumer . set Token With Secret ( request Token . oauth Token , Ġrequest Token . oauth Token Secret ) ĊĠĠĠĠĠĠĠ Ġval Ġhttp Parameters Ġ= ĠHttp Parameters () ĊĠĠĠĠĠĠĠ Ġhttp Parameters . put (" oauth _ verifier ", Ġoauth Verifier ) ĊĠĠĠĠĠĠĠ Ġo Auth Api Consumer . set Additional Parameters ( http Parameters ) ĊĊĠĠĠĠĠĠĠ Ġval Ġo Auth Api : ĠOAuth Api Ġ= Ġretrofit Builder WithTimeout And Logger ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlong Property (" to ck _ twitter _ request _ timeout _ ms ", Ġ 3 0 0 0 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintercept ors Ġ= ĠlistOf ( Signing Interceptor ( o Auth Api Consumer )) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. baseUrl ( BASE _ URL ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Converter Factory ( Scalars Converter Factory . create ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. create () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġo Auth Api . accessToken (). execute () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( response . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . body ()?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug Ġ{ Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġquery Pairs Ġ= Ġsplit Query ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAccess Token ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquery Pairs [" oauth _ token "] Ġ?: Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquery Pairs [" oauth _ token _ secret "] Ġ?: Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquery Pairs . get (" user _ id ") Ġ?: Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquery Pairs [" screen _ name "] Ġ?: Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . log Error () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġlog Ġand Ġignore ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRegisters Ġa Ġwebhook ĠURL Ġfor Ġall Ġevent Ġtypes . ĠThe ĠURL Ġwill Ġbe Ġvalidated Ġvia ĠCRC Ġrequest Ġbefore Ġsaving . ĊĠĠĠĠ Ġ* ĠIn Ġcase Ġthe Ġvalidation Ġfailed , Ġreturns Ġcomprehensive Ġerror Ġmessage Ġto Ġthe Ġrequest er . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġwebhook Ġendpoint ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġwebhook Ġor Ġnull Ġif Ġregistration Ġfailed ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġregister Webhook ( url : ĠString ): ĠWeb hook ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġaccount Activity Api . register Webhook ( environment , Ġurl ). execute () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( response . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . body ()?. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug Ġ{ Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . log Error () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġlog Ġand Ġignore ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSub scri bes Ġthe Ġprovided Ġapplication Ġto Ġall Ġevents Ġfor Ġthe Ġprovided Ġenvironment Ġfor Ġall Ġmessage Ġtypes . ĊĠĠĠĠ Ġ* ĠAfter Ġactivation , Ġall Ġevents Ġfor Ġthe Ġrequesting Ġuser Ġwill Ġbe Ġsent Ġto Ġthe Ġapplication âĢĻ s Ġwebhook Ġvia ĠPOST Ġrequest . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠSub scriptions Ġare Ġlimited Ġto Ġa Ġmaximum Ġof Ġ 1 5 Ġunique Ġusers Ġper Ġapplication Ġin Ġthe Ġfree Ġ( sandbox ) Ġtier . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġtrue Ġif ĠSubscription Ġsuccess ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġsubscribe (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġaccount Activity Api . subscribe (" develop "). execute () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! response . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . log Error () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġlog Ġand Ġignore ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠProvides Ġa Ġway Ġto Ġdetermine Ġif Ġa Ġwebhook Ġconfiguration Ġis Ġsubscribed Ġto Ġthe Ġprovided Ġuser âĢĻ s Ġevents . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠIf Ġthe Ġprovided Ġuser Ġcontext Ġhas Ġan Ġactive Ġsubscription Ġwith Ġprovided Ġapplication , Ġreturns Ġtrue . ĊĠĠĠĠ Ġ* Ġfalse Ġif Ġthe Ġuser Ġdoes Ġnot Ġhave Ġan Ġactive Ġsubscription . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġsubscriptions (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġaccount Activity Api . subscriptions (" develop "). execute () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . code () Ġ== Ġ 2 0 4 ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġlog Ġand Ġignore ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRemoves Ġthe Ġwebhook Ġfrom Ġthe Ġprovided Ġapplication 's Ġall Ġactivities Ġconfiguration . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param ĠThe Ġwebhook ĠID Ġcan Ġbe Ġaccessed Ġby Ġmaking Ġa Ġcall Ġto Ġ{@ link ĠTwitter Client # web hooks ()} Ġmethod ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġtrue Ġif Ġsuccess Ġelse Ġfalse ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġunregister Webhook ( webhook Id : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġaccount Activity Api . unregister Webhook ( environment , Ġwebhook Id ). execute () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! response . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . log Error () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġlog Ġand Ġignore ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġa Ġvariety Ġof Ġinformation Ġabout Ġthe Ġuser Ġspecified Ġby Ġthe Ġrequired Ġuser _ id ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġa Ġuser Ġprofile ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġuser ( userId : ĠString ): ĠUser Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġuser Api . user ( userId ). execute () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( response . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . body ()?. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug Ġ{ Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġdefault User () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . log Error () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdefault User () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġlog Ġand Ġignore ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdefault User () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġall Ġenvironments , Ġwebhook ĠURLs Ġand Ġtheir Ġstatuses Ġfor Ġthe Ġauthentic ating Ġapp . ĠCurrently , Ġonly Ġone Ġwebhook ĠURL Ġcan Ġbe Ġregistered Ġto Ġeach Ġenvironment . ĊĠĠĠĠ Ġ* ĠWe Ġmark Ġa ĠURL Ġas Ġinvalid Ġif Ġit Ġfails Ġthe Ġdaily Ġvalidation Ġcheck . ĠIn Ġorder Ġto Ġre - enable Ġthe ĠURL , Ġcall Ġthe Ġupdate Ġendpoint . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠAlternatively , Ġthis Ġendpoint Ġcan Ġbe Ġused Ġwith Ġan Ġenvironment Ġname Ġto Ġonly Ġreturn Ġwebhook ĠURL S Ġfor Ġthe Ġgiven Ġenvironment : ĠGET Ġaccount _ activity / all /: env _ name / web hooks Ġ( see Ġsecond Ġexample ) ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġlist Ġof Ġweb hooks ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġweb hooks (): ĠList < Webhook > Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġaccount Activity Api . web hooks ( environment ). execute () ĊĠĠĠĠĠĠĠ Ġif Ġ( response . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . body ()?. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug Ġ{ Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġempty List () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . log Error () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġempty List () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġlog Ġand Ġignore ĊĠĠĠĠĠĠĠ Ġlogger . error ( e ) ĊĠĠĠĠĠĠĠ Ġempty List () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsend Direct Message ( out coming Event : ĠOut coming Event ): ĠBoolean Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġdirect Message Api . new ( out coming Event ). execute () ĊĠĠĠĠĠĠĠ Ġif Ġ(! response . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . log Error () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġlog Ġand Ġignore ĊĠĠĠĠĠĠĠ Ġlogger . error ( e ) ĊĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsend Tweet ( tweet : ĠOutput Tweet , Ġthread Id : ĠLong ?): ĠBoolean Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġenable DM Ġ= Ġtweet . dm Recipient ID Ġ!= Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġenable Welcome Message Ġ= Ġtweet . welcome Message ID Ġ!= Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġenable Default Message Ġ= Ġtweet . default Message Ġ!= Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġif Ġ( enable DM ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtweet . text Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ġhttps :// twitter . com / messages / compose ? recipient _ id =" Ġ+ Ġtweet . dm Recipient ID Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( if Ġ( enable Welcome Message ) Ġ"& welcome _ message _ id =" Ġ+ Ġtweet . welcome Message ID Ġelse Ġ"") Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( if Ġ( enable Default Message ) Ġ"& text =" Ġ+ ĠURL Encoder . encode ( tweet . default Message , Ġ" UTF - 8 ") Ġelse Ġ"") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtweet . text ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġstatus Api . status ( message , Ġthread Id ?. toString (), Ġenable DM Ġ= Ġenable DM . toString ()). execute () ĊĠĠĠĠĠĠĠ Ġif Ġ(! response . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . log Error () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġlog Ġand Ġignore ĊĠĠĠĠĠĠĠ Ġlogger . error ( e ) ĊĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcreate Attachment ( media Category : ĠMedia Category , ĠcontentType : ĠString , Ġdata : ĠByteArray ): ĠAttachment Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġmedia Upload Init Ġ= Ġupload Media Init ( media Category , ĠcontentType , Ġdata . size . to Long ()) ĊĊĠĠĠĠĠĠĠ Ġupload Media ( data , Ġmedia Upload Init . media Id String ) ĊĊĠĠĠĠĠĠĠ Ġval Ġmedia Upload Ġ= Ġupload Media Finalize ( media Upload Init . media Id String ) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠAttachment ( type Ġ= Ġ" media ", Ġmedia Ġ= ĠAttachment Media ( media Upload . media Id String )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupload Media ( data : ĠByteArray , Ġmedia Id : ĠString ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġvar Ġsegment Index Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġsegment Count Ġ= Ġ( data . size Ġ+ ĠMED IA _ CHUNK _ SIZE Ġ- Ġ 1 ) Ġ/ ĠMED IA _ CHUNK _ SIZE ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( segment Index Ġ< Ġsegment Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart Ġ= Ġsegment Index Ġ* ĠMED IA _ CHUNK _ SIZE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġend Ġ= Ġif Ġ( segment Index Ġ< Ġsegment Count Ġ- Ġ 1 ) ĠMED IA _ CHUNK _ SIZE Ġ* Ġ( segment Index Ġ+ Ġ 1 ) Ġelse Ġdata . size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchunk Ġ= Ġdata . copyOf Range ( start , Ġend ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġappend Ġ= Ġupload Media Append ( media Id , Ġsegment Index , Ġchunk ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! append ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠConnector Exception (" Media Ġupload Ġappend Ġsegment _ index Ġ$ segment Index Ġfailed ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsegment Index ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupload Media Init ( media Category : ĠMedia Category , ĠcontentType : ĠString , Ġtotal Bytes : ĠLong ): ĠMedia Upload Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġmedia Api . init ( Command . INIT , Ġtotal Bytes , ĠcontentType , Ġmedia Category . media Category , Ġnull ). execute () ĊĠĠĠĠĠĠĠ Ġif Ġ( response . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresponse . body ()?. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug Ġ{ Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġthrow ĠConnector Exception (" null Ġbody ") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . log Error () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠConnector Exception (" Media Ġupload Ġinit Ġfailed ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupload Media Append ( media Id : ĠString , Ġsegment Index : ĠInt , Ġchunk : ĠByteArray ): ĠBoolean Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġrequest Chunk : ĠRequest Body Ġ= ĠRequest Body . create ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" application / octet - stream ". to MediaType (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchunk ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġbody Ġ= ĠMultip art Body . Part . create FormData (" media ", Ġ" chunk - segment -$ segment Index ", Ġrequest Chunk ) ĊĊĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġmedia Api . append ( Command . APPEND , Ġmedia Id , Ġsegment Index , Ġbody ). execute () ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! response . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . log Error () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġresponse . is Successful ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupload Media Finalize ( media Id : ĠString ): ĠMedia Upload Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġmedia Api . finalize ( Command . FINAL IZE , Ġmedia Id ). execute () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( response . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresponse . body ()?. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug Ġ{ Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġthrow ĠConnector Exception (" null Ġbody ") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . log Error () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠConnector Exception (" Media Ġupload Ġfinalize Ġfailed ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġb 6 4 H mac SHA 2 5 6 ( payload : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsigning Key Ġ= ĠSecret KeySpec ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconsumer Secret . toByteArray (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" H mac SHA 2 5 6 " ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġmac Ġ= ĠMac . getInstance (" H mac SHA 2 5 6 ") ĊĠĠĠĠĠĠĠ Ġmac . init ( signing Key ) ĊĊĠĠĠĠĠĠĠ Ġval Ġbytes Ġ= Ġmac . do Final ( payload . toByteArray ()) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠString ( Base 6 4 . get Encoder (). encode ( bytes )) ĊĠĠĠ Ġ} Ċ } Ċ