package Ġro cks . w aff le . tele kt . dispatcher Ċ Ċ import Ġcom . k iz iton wo se . time . seconds Ċ import Ġio . ktor . application . call Ċ import Ġio . ktor . application . install Ċ import Ġio . ktor . features . X Forwarded Header Support Ċ import Ġio . ktor . features . origin Ċ import Ġio . ktor . http . HttpStatusCode Ċ import Ġio . ktor . request . receive Text Ċ import Ġio . ktor . response . respond Ċ import Ġio . ktor . routing . post Ċ import Ġio . ktor . routing . routing Ċ import Ġio . ktor . server . engine . Application Engine Ċ import Ġio . ktor . server . engine . Application Engine Factory Ċ import Ġio . ktor . server . engine . embedded Server Ċ import Ġio . ktor . server . netty . Net ty Ċ import Ġkotlinx . coroutines .* Ċ import Ġkotlinx . coroutines . channels . actor Ċ import Ġkotlinx . serialization . json . Json Ċ import Ġkotlinx . serialization . json . Json Configuration Ċ import Ġmu . Kotlin Logging Ċ import Ġro cks . w aff le . tele kt . bot . Bot Ċ import Ġro cks . w aff le . tele kt . exceptions . Polling Was Already Started Ċ import Ġro cks . w aff le . tele kt . exceptions . Polling Was Already Stopped Ċ import Ġro cks . w aff le . tele kt . exceptions . Webhook Was Already Started Ċ import Ġro cks . w aff le . tele kt . exceptions . Webhook Was Already Stopped Ċ import Ġro cks . w aff le . tele kt . fsm . Base Storage Ċ import Ġro cks . w aff le . tele kt . fsm . Disabled Storage Ċ import Ġro cks . w aff le . tele kt . fsm . FSM Context Ċ import Ġro cks . w aff le . tele kt . types .* Ċ import Ġro cks . w aff le . tele kt . types . enums . Allowed Update Ċ import Ġro cks . w aff le . tele kt . util . ip . Ip V 4 Ċ import Ġro cks . w aff le . tele kt . util . ip . Ip V 4 Mask Ċ import Ġro cks . w aff le . tele kt . util . ip . check Ip Ċ import Ġro cks . w aff le . tele kt . util . ip . ip V 4 Mask Ċ import Ġjava . util . concurrent . TimeUnit ĊĊ Ċ @ kotlin . Experimental Unsigned Types Ċ class ĠK tor Dispatcher ( ĊĠĠĠ Ġval Ġbot : ĠBot , ĊĠĠĠ Ġprivate Ġval Ġstorage : ĠBase Storage Ġ= ĠDisabled Storage , ĊĠĠĠ Ġval Ġwebhook Config : ĠWeb hook Config Ġ= ĠWeb hook Config () Ċ ) Ġ: ĠDispatcher Ġ{ ĊĠĠĠ Ġprivate Ġval Ġjob Ġ= ĠJob () ĊĠĠĠ Ġprivate Ġval Ġscope Ġ= ĠCor outine Scope ( Dispatch ers . Default Ġ+ Ġjob ) ĊĊĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠKotlin Logging . logger Ġ{} ĊĊĠĠĠ Ġdata Ġclass ĠWeb hook Config ( ĊĠĠĠĠĠĠĠ Ġval Ġserver : ĠApplication Engine Factory < *, Ġ*> Ġ= ĠNet ty , ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠNetworks Ġw itch Ġare Ġallowed Ġto Ġtrigger Ġwebhook . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠPass Ġempty Ġlist Ġto Ġallow Ġany ĠIP Ġ( not Ġrecommended ). ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġallowed Ip : ĠList < Pair < Ip V 4 , ĠIp V 4 Mask >> Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNetworks Ġfrom Ġtele gram Ġdocs Ġ( last Ġcheck : ĠMay Ġ 3 1 , Ġ 2 0 1 9 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIp V 4 ( 1 4 9 u , Ġ 1 5 4 u , Ġ 1 6 0 u , Ġ 0 u ) Ġto Ġip V 4 Mask ( 2 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIp V 4 ( 9 1 u , Ġ 1 0 8 u , Ġ 4 u , Ġ 0 u ) Ġto Ġip V 4 Mask ( 2 2 ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ// < editor - fold Ġdesc =" handlers "> ĊĠĠĠ Ġprivate Ġval Ġmessage Handlers : ĠHand lers < Message > Ġ= ĠHand lers () ĊĠĠĠ Ġprivate Ġval Ġedited Message Handlers : ĠHand lers < Message > Ġ= ĠHand lers () ĊĠĠĠ Ġprivate Ġval Ġchannel Post Handlers : ĠHand lers < Message > Ġ= ĠHand lers () ĊĠĠĠ Ġprivate Ġval Ġedited Channel Post Handlers : ĠHand lers < Message > Ġ= ĠHand lers () ĊĠĠĠ Ġprivate Ġval Ġinline Query Handlers : ĠHand lers < Inline Query > Ġ= ĠHand lers () ĊĠĠĠ Ġprivate Ġval Ġchosen Inline Result Handlers : ĠHand lers < Ch osen Inline Result > Ġ= ĠHand lers () ĊĠĠĠ Ġprivate Ġval Ġcallback Query Handlers : ĠHand lers < Callback Query > Ġ= ĠHand lers () ĊĠĠĠ Ġprivate Ġval Ġshipping Query Handlers : ĠHand lers < Shipping Query > Ġ= ĠHand lers () ĊĠĠĠ Ġprivate Ġval Ġpre Checkout Query Handlers : ĠHand lers < Pre Checkout Query > Ġ= ĠHand lers () ĊĠĠĠ Ġprivate Ġval Ġpoll Handlers : ĠHand lers < Poll > Ġ= ĠHand lers () ĊĠĠĠ Ġ// </ editor - fold > ĊĊĠĠĠ Ġ// < editor - fold Ġdesc =" handlers - registration "> ĊĠĠĠ Ġoverride Ġfun Ġmessage Handler ( ĊĠĠĠĠĠĠĠ Ġvar arg Ġfilters : ĠFilter < Message >, ĊĠĠĠĠĠĠĠ Ġname : ĠString ?, ĊĠĠĠĠĠĠĠ Ġblock : Ġsuspend ĠHandler Scope .( Message ) Ġ-> ĠUnit ĊĠĠĠ Ġ): ĠUnit Ġ= ĊĠĠĠĠĠĠĠ Ġmessage Handlers . register (* filters , Ġhandler Ġ= Ġblock , Ġname Ġ= Ġname ) ĊĊĠĠĠ Ġoverride Ġfun Ġedited MessageHandler ( ĊĠĠĠĠĠĠĠ Ġvar arg Ġfilters : ĠFilter < Message >, ĊĠĠĠĠĠĠĠ Ġname : ĠString ?, ĊĠĠĠĠĠĠĠ Ġblock : Ġsuspend ĠHandler Scope .( Message ) Ġ-> ĠUnit ĊĠĠĠ Ġ): ĠUnit Ġ= ĊĠĠĠĠĠĠĠ Ġedited Message Handlers . register (* filters , Ġhandler Ġ= Ġblock , Ġname Ġ= Ġname ) ĊĊĠĠĠ Ġoverride Ġfun Ġchannel Post Handler ( ĊĠĠĠĠĠĠĠ Ġvar arg Ġfilters : ĠFilter < Message >, ĊĠĠĠĠĠĠĠ Ġname : ĠString ?, ĊĠĠĠĠĠĠĠ Ġblock : Ġsuspend ĠHandler Scope .( Message ) Ġ-> ĠUnit ĊĠĠĠ Ġ): ĠUnit Ġ= ĊĠĠĠĠĠĠĠ Ġchannel Post Handlers . register (* filters , Ġhandler Ġ= Ġblock , Ġname Ġ= Ġname ) ĊĊĠĠĠ Ġoverride Ġfun Ġedited Channel Post Handler ( ĊĠĠĠĠĠĠĠ Ġvar arg Ġfilters : ĠFilter < Message >, ĊĠĠĠĠĠĠĠ Ġname : ĠString ?, ĊĠĠĠĠĠĠĠ Ġblock : Ġsuspend ĠHandler Scope .( Message ) Ġ-> ĠUnit ĊĠĠĠ Ġ): ĠUnit Ġ= ĊĠĠĠĠĠĠĠ Ġedited Channel Post Handlers . register (* filters , Ġhandler Ġ= Ġblock , Ġname Ġ= Ġname ) ĊĊĠĠĠ Ġoverride Ġfun Ġinline Query Handler ( ĊĠĠĠĠĠĠĠ Ġvar arg Ġfilters : ĠFilter < Inline Query >, ĊĠĠĠĠĠĠĠ Ġname : ĠString ?, ĊĠĠĠĠĠĠĠ Ġblock : Ġsuspend ĠHandler Scope .( Inline Query ) Ġ-> ĠUnit ĊĠĠĠ Ġ): ĠUnit Ġ= ĊĠĠĠĠĠĠĠ Ġinline Query Handlers . register (* filters , Ġhandler Ġ= Ġblock , Ġname Ġ= Ġname ) ĊĊĠĠĠ Ġoverride Ġfun Ġchosen Inline Result Handler ( ĊĠĠĠĠĠĠĠ Ġvar arg Ġfilters : ĠFilter < Ch osen Inline Result >, ĊĠĠĠĠĠĠĠ Ġname : ĠString ?, ĊĠĠĠĠĠĠĠ Ġblock : Ġsuspend ĠHandler Scope .( Ch osen Inline Result ) Ġ-> ĠUnit ĊĠĠĠ Ġ): ĠUnit Ġ= ĊĠĠĠĠĠĠĠ Ġchosen Inline Result Handlers . register (* filters , Ġhandler Ġ= Ġblock , Ġname Ġ= Ġname ) ĊĊĠĠĠ Ġoverride Ġfun Ġcallback Query Handler ( ĊĠĠĠĠĠĠĠ Ġvar arg Ġfilters : ĠFilter < Callback Query >, ĊĠĠĠĠĠĠĠ Ġname : ĠString ?, ĊĠĠĠĠĠĠĠ Ġblock : Ġsuspend ĠHandler Scope .( Callback Query ) Ġ-> ĠUnit ĊĠĠĠ Ġ): ĠUnit Ġ= ĊĠĠĠĠĠĠĠ Ġcallback Query Handlers . register (* filters , Ġhandler Ġ= Ġblock , Ġname Ġ= Ġname ) ĊĊĠĠĠ Ġoverride Ġfun Ġshipping Query Handler ( ĊĠĠĠĠĠĠĠ Ġvar arg Ġfilters : ĠFilter < Shipping Query >, ĊĠĠĠĠĠĠĠ Ġname : ĠString ?, ĊĠĠĠĠĠĠĠ Ġblock : Ġsuspend ĠHandler Scope .( Shipping Query ) Ġ-> ĠUnit ĊĠĠĠ Ġ): ĠUnit Ġ= ĊĠĠĠĠĠĠĠ Ġshipping Query Handlers . register (* filters , Ġhandler Ġ= Ġblock , Ġname Ġ= Ġname ) ĊĊĠĠĠ Ġoverride Ġfun Ġpre Checkout Query Handler ( ĊĠĠĠĠĠĠĠ Ġvar arg Ġfilters : ĠFilter < Pre Checkout Query >, ĊĠĠĠĠĠĠĠ Ġname : ĠString ?, ĊĠĠĠĠĠĠĠ Ġblock : Ġsuspend ĠHandler Scope .( Pre Checkout Query ) Ġ-> ĠUnit ĊĠĠĠ Ġ): ĠUnit Ġ= ĊĠĠĠĠĠĠĠ Ġpre Checkout Query Handlers . register (* filters , Ġhandler Ġ= Ġblock , Ġname Ġ= Ġname ) ĊĊĠĠĠ Ġoverride Ġfun Ġpoll Handler ( ĊĠĠĠĠĠĠĠ Ġvar arg Ġfilters : ĠFilter < Poll >, ĊĠĠĠĠĠĠĠ Ġname : ĠString ?, ĊĠĠĠĠĠĠĠ Ġblock : Ġsuspend ĠHandler Scope .( Poll ) Ġ-> ĠUnit ): ĠUnit Ġ= ĊĠĠĠĠĠĠĠ Ġpoll Handlers . register (* filters , Ġhandler Ġ= Ġblock , Ġname Ġ= Ġname ) ĊĠĠĠ Ġ// </ editor - fold > ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġskip Updates () Ġ{ ĊĠĠĠĠĠĠĠ Ġbot . get Updates (- 1 , Ġtimeout Ġ= Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġlogger . info (" Skipped Ġall Ġupdates ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// < editor - fold Ġdesc =" process Ġupdates "> ĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġprocess Updates ( updates : ĠList < Update >) Ġ= Ġcoroutine Scope Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( update Ġin Ġupdates ) Ġlaunch Ġ{ Ġprocess Update ( update ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠProcess Ġsingle Ġupdate Ġobject Ġ*/ ĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġprocess Update ( update : ĠUpdate ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuspend Ġfun Ġ< T Ġ: ĠTelegram Event > ĠHand lers < T >. notify _( t : ĠT , Ġget FSM Info : ĠT . () Ġ-> ĠPair < Long , ĠLong >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotify ( Handler Scope ( bot , ĠHandler Context ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( chat , Ġuser ) Ġ= Ġt . getF SM Info () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠF SM Context ( storage , Ġchat , Ġuser ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġt ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġupdate . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ!= Ġnull Ġ-> Ġmessage Handlers . notify _( message ) Ġ{ Ġchat . id Ġto Ġ( from ?. id Ġ?: Ġchat . id ) Ġ/* ĠUser Ġin Ġchat ĠOR Ġchannel Ġstate Ġ*/} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġedited Message Ġ!= Ġnull Ġ-> Ġedited Message Handlers . notify _( edited Message ) Ġ{ Ġchat . id Ġto Ġ( from ?. id Ġ?: Ġchat . id ) Ġ/* ĠUser Ġin Ġchat ĠOR Ġchannel Ġstate Ġ*/} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchannel Post Ġ!= Ġnull Ġ-> Ġchannel Post Handlers . notify _( channel Post ) Ġ{ Ġchat . id Ġto Ġ( from ?. id Ġ?: Ġchat . id ) Ġ/* ĠUser Ġin Ġchat ĠOR Ġchannel Ġstate Ġ*/} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġedited Channel Post Ġ!= Ġnull Ġ-> Ġedited Channel Post Handlers . notify _( edited Channel Post ) Ġ{ Ġchat . id Ġto Ġ( from ?. id Ġ?: Ġchat . id ) Ġ/* ĠUser Ġin Ġchat ĠOR Ġchannel Ġstate Ġ*/} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinline Query Ġ!= Ġnull Ġ-> Ġinline Query Handlers . notify _( inline Query ) Ġ{ Ġfrom . id Ġto Ġfrom . id Ġ/* ĠDM Ġ*/} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchosen Inline Result Ġ!= Ġnull Ġ-> Ġchosen Inline Result Handlers . notify _( chosen Inline Result ) Ġ{ Ġfrom . id Ġto Ġfrom . id Ġ/* ĠDM Ġ*/} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback Query Ġ!= Ġnull Ġ-> Ġcallback Query Handlers . notify _( callback Query ) Ġ{ Ġfrom . id Ġto Ġfrom . id Ġ/* ĠDM Ġ*/} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshipping Query Ġ!= Ġnull Ġ-> Ġshipping Query Handlers . notify _( shipping Query ) Ġ{ Ġfrom . id Ġto Ġfrom . id Ġ/* ĠDM Ġ*/} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpre Checkout Query Ġ!= Ġnull Ġ-> Ġpre Checkout Query Handlers . notify _( pre Checkout Query ) Ġ{ Ġfrom . id Ġto Ġfrom . id Ġ/* ĠDM Ġ*/} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpoll Ġ!= Ġnull Ġ-> Ġpoll Handlers . notify _( poll ) Ġ{ Ġthrow ĠNotImplementedError (" Poll Event Ġdont Ġimplement ĠF SM Ġinfo ") Ġ} Ġ// ĠTODO : Ġit Ġisn 't Ġclean Ġway Ġ: | ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġ// </ editor - fold > ĊĊĠĠĠ Ġ// < editor - fold Ġdesc =" long Ġpolling "> ĊĠĠĠ Ġ@ kotlin x . coroutines . Obsolete Cor outines Api ĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġpoll ( ĊĠĠĠĠĠĠĠ Ġrelax : ĠFloat , ĊĠĠĠĠĠĠĠ Ġreset Webhook : ĠBoolean ?, ĊĠĠĠĠĠĠĠ Ġtimeout : ĠInt , ĊĠĠĠĠĠĠĠ Ġlimit : ĠByte ?, ĊĠĠĠĠĠĠĠ Ġallowed Updates : ĠList < Allowed Update > ?, ĊĠĠĠĠĠĠĠ Ġwait : ĠBoolean ĊĠĠĠ Ġ): ĠUnit Ġ= Ġpolling . start ( relax , Ġreset Webhook , Ġtimeout , Ġlimit , Ġallowed Updates , Ġwait ) ĊĊĠĠĠ Ġ@ kotlin x . coroutines . Obsolete Cor outines Api ĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġstop Polling ( wait : ĠBoolean ): ĠUnit Ġ= Ġpolling . stop ( wait ) ĊĊĊĠĠĠ Ġprivate Ġsealed Ġclass ĠPol ling Signal Ġ{ ĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠStart ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrelax : ĠFloat , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreset Webhook : ĠBoolean ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtimeout : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlimit : ĠByte ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġallowed Updates : ĠList < Allowed Update > ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexception : ĠComp letable Deferred < Exception ? >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstop Callback : ĠComp letable Deferred < Unit > ĊĠĠĠĠĠĠĠ Ġ) Ġ: ĠPol ling Signal () ĊĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠStop ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexception : ĠComp letable Deferred < Exception ? >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoperation End Callback : ĠComp letable Deferred < Unit > ĊĠĠĠĠĠĠĠ Ġ) Ġ: ĠPol ling Signal () ĊĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠClose ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoperation End Callback : ĠComp letable Deferred < Unit > ĊĠĠĠĠĠĠĠ Ġ) Ġ: ĠPol ling Signal () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ kotlin x . coroutines . Obsolete Cor outines Api ĊĠĠĠ Ġprivate Ġinner Ġclass ĠPol ling Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġpolling Control Actor Ġ= Ġscope . actor < Polling Signal > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġstop Callback : ĠComp letable Deferred < Unit >? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġjob : ĠJob ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġloop @ Ġfor Ġ( signal Ġin Ġchannel ) Ġwhen Ġ( signal ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠStart Ġthe Ġhttp Ġserver ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPol ling Signal . Start Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( job Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsignal . exception . complete ( Polling Was Already Started ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġactually , Ġpolling Ġdoesn 't Ġstop , Ġbut Ġwe Ġreturn Ġexception , Ġso Ġit 's ĠOK ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsignal . stop Callback . complete ( Unit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsignal . exception . complete ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop Callback Ġ= Ġsignal . stop Callback ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjob Ġ= Ġget Polling Job ( signal . relax , Ġsignal . reset Webhook , Ġsignal . timeout , Ġsignal . limit , Ġsignal . allowed Updates ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" Start Ġpolling ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠStop Ġthe Ġlong Ġpolling ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPol ling Signal . Stop Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( job Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( exception , Ġend ) Ġ= Ġsignal ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexception . complete ( Polling Was Already Stopped ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend . complete ( Unit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( exception , Ġend ) Ġ= Ġsignal ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexception . complete ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjob . cancel And Join () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn (" Stop Ġpolling ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop Callback ?. complete ( Unit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend . complete ( Unit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠStop Ġlong Ġpolling , Ġclose Ġactor Ġ& Ġend Ġwork ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠShould Ġbe Ġcalled ĠONLY Ġfrom Ġ` K tor Dispatcher . close ()` ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPol ling Signal . Close Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( end ) Ġ= Ġsignal ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjob ?. cancel And Join () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn (" Stop Ġpolling ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop Callback ?. complete ( Unit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ actor . channel . close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend . complete ( Unit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak @ loop ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun ĠCor outine Scope . get Polling Job ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrelax : ĠFloat , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreset Webhook : ĠBoolean ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtimeout : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlimit : ĠByte ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġallowed Updates : ĠList < Allowed Update >? ĊĠĠĠĠĠĠĠ Ġ): ĠJob Ġ= Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġoffset : ĠInt ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( Non C ancellable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( this @ launch . isActive ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupdates Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbot . get Updates ( offset Ġ= Ġoffset , Ġlimit Ġ= Ġlimit , Ġtimeout Ġ= Ġtimeout , Ġallowed Updates Ġ= Ġallowed Updates ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error ( e ) Ġ{ Ġ" Cause Ġexception Ġwhile Ġgetting Ġupdates :" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 1 5 . seconds . in Milliseconds . longValue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( updates . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug Ġ{ Ġ" Received Ġ${ updates . size } Ġupdates " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffset Ġ= Ġupdates . last (). update Id Ġ+ Ġ 1 ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Updates ( updates ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( relax Ġ> Ġ 0 ) Ġdelay ( relax . seconds . in Milliseconds . longValue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġon Ġshutdown , Ġnotify Ġtele gram Ġthat Ġwe Ġhandled Ġlast Ġupdates ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbot . get Updates ( offset Ġ= Ġoffset , Ġlimit Ġ= Ġ 1 , Ġtimeout Ġ= Ġ 0 , Ġallowed Updates Ġ= Ġallowed Updates ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsuspend Ġfun Ġstart ( relax : ĠFloat , Ġreset Webhook : ĠBoolean ?, Ġtimeout : ĠInt , Ġlimit : ĠByte ?, Ġallowed Updates : ĠList < Allowed Update > ?, Ġwait : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexception Ġ= ĠComp letable Deferred < Exception ?> () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġend Ġ= ĠComp letable Deferred < Unit >() ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsend Ġsignal Ġfor Ġpolling Ġstarting ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpolling Control Actor . send ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPol ling Signal . Start ( relax , Ġreset Webhook , Ġtimeout , Ġlimit , Ġallowed Updates , Ġexception , Ġend ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthrow Ġexception Ġif Ġsomething Ġgo Ġwrong ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexception . await ()?. let Ġ{ Ġthrow Ġit Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwait Ġfor Ġthe Ġpolling Ġto Ġstop ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( wait ) Ġend . await () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsuspend Ġfun Ġstop ( wait : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexception Ġ= ĠComp letable Deferred < Exception ?> () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġend Ġ= ĠComp letable Deferred < Unit >() ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsend Ġsignal Ġfor Ġthe Ġpolling Ġto Ġstop ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpolling Control Actor . send ( Polling Signal . Stop ( exception , Ġend )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthrow Ġexception Ġif Ġsomething Ġgo Ġwrong ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexception . await ()?. let Ġ{ Ġthrow Ġit Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwait Ġfor Ġoperation Ġto Ġend ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( wait ) Ġend . await () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsuspend Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclose End Ġ= ĠComp letable Deferred < Unit >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpolling Control Actor . send ( Polling Signal . Close ( close End )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclose End . await () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ kotlin x . coroutines . Obsolete Cor outines Api ĊĠĠĠ Ġprivate Ġval Ġpolling Ġby Ġlazy Ġ{ ĠPol ling () Ġ} ĊĊĠĠĠ Ġ// </ editor - fold > ĊĊĠĠĠ Ġ// < editor - fold Ġdesc =" webhook "> ĊĠĠĠ Ġprivate Ġsealed Ġclass ĠWeb hook Signal Ġ{ ĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠStart ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhost : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġport : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpath : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexception : ĠComp letable Deferred < Exception ? >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstop Callback : ĠComp letable Deferred < Unit > ĊĠĠĠĠĠĠĠ Ġ) Ġ: ĠWeb hook Signal () ĊĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠStop ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexception : ĠComp letable Deferred < Exception ? >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoperation End Callback : ĠComp letable Deferred < Unit > ĊĠĠĠĠĠĠĠ Ġ) Ġ: ĠWeb hook Signal () ĊĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠClose ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoperation End Callback : ĠComp letable Deferred < Unit > ĊĠĠĠĠĠĠĠ Ġ) Ġ: ĠWeb hook Signal () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ kotlin x . coroutines . Obsolete Cor outines Api ĊĠĠĠ Ġprivate Ġinner Ġclass ĠWeb hook Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġwebhook Control Actor Ġ= Ġscope . actor < Webhook Signal > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġserver : ĠApplication Engine ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġstop Callback : ĠComp letable Deferred < Unit >? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjson Ġ= ĠJson ( Json Configuration . Stable . copy ( encode Defaults Ġ= Ġfalse , Ġstrict Mode Ġ= Ġfalse )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġloop @ Ġfor Ġ( signal Ġin Ġchannel ) Ġwhen Ġ( signal ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠStart Ġthe Ġhttp Ġserver ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠWeb hook Signal . Start Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( server Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsignal . exception . complete ( Webhook Was Already Started ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġactually , Ġserver Ġdoesn 't Ġstop , Ġbut Ġwe Ġreturn Ġexception , Ġso Ġit 's ĠOK ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsignal . stop Callback . complete ( Unit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsignal . exception . complete ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop Callback Ġ= Ġsignal . stop Callback ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġserver Ġ= Ġget Server ( port Ġ= Ġsignal . port , Ġhost Ġ= Ġsignal . host , Ġpath Ġ= Ġsignal . path , Ġjson Ġ= Ġjson ). start ( wait Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠStop Ġthe Ġhttp Ġserver ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠWeb hook Signal . Stop Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( server Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( exception , Ġend ) Ġ= Ġsignal ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexception . complete ( Webhook Was Already Stopped ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend . complete ( Unit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( exception , Ġend ) Ġ= Ġsignal ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexception . complete ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġserver . stop ( 5 , Ġ 5 , ĠTimeUnit . SECONDS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġserver Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop Callback ?. complete ( Unit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend . complete ( Unit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠStop Ġthe Ġhttp Ġserver , Ġclose Ġactor Ġ& Ġend Ġwork ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠShould Ġbe Ġcalled ĠONLY Ġfrom Ġ` K tor Dispatcher . close ()` ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠWeb hook Signal . Close Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( end ) Ġ= Ġsignal ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġserver ?. stop ( 1 , Ġ 1 , ĠTimeUnit . SECONDS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop Callback ?. complete ( Unit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ actor . channel . close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend . complete ( Unit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak @ loop ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġget Server ( port : ĠInt , Ġhost : ĠString , Ġpath : ĠString , Ġjson : ĠJson ): ĠApplication Engine Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġembedded Server ( webhook Config . server , Ġport Ġ= Ġport , Ġhost Ġ= Ġhost ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinstall ( X Forwarded Header Support ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrouting Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost ( path ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġallow Ġ= ĠIp V 4 . parse ( call . request . origin . remote Host )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwebhook Config . allowed Ip . isEmpty () Ġ|| Ġwebhook Config . allowed Ip . map Ġ{ Ġ( net , Ġmask ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Ip ( addr Ġ= Ġit , Ġnet Ġ= Ġnet , Ġmask Ġ= Ġmask ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. any Ġ{ Ġa Ġ-> Ġa Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( allow Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtext Ġ= Ġcall . receive Text () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupdate Ġ= Ġjson . parse ( Update . serializer (), Ġtext ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscope . launch Ġ{ Ġprocess Update ( update ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond ( HttpStatusCode . OK , Ġ" OK ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Detected Ġwebhook Ġrequest Ġfrom Ġdis allowed ĠIP Ġ(${ call . request . origin . remote Host }). Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Prob ably Ġsomeone Ġfound Ġout Ġendpoint Ġof Ġyour Ġhttp Ġproxy , Ġthat Ġredirects Ġrequests Ġto Ġbot . Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Consider Ġchanging Ġserver Ġendpoint . Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Or Ġconsider Ġsetting Ġup Ġ` X - Forwarded - For ` Ġheader Ġor Ġadding Ġthis Ġip Ġto Ġ` K tor Dispatcher . Webhook Config . allowed Ip ` Ġif Ġthis Ġis ĠIP Ġof Ġyour ĠHTTP Ġproxy ." ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond ( HttpStatusCode . Unauthorized , Ġ" Unauthorized ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsuspend Ġfun Ġstart ( host : ĠString , Ġport : ĠInt , Ġpath : ĠString , Ġwait : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexception Ġ= ĠComp letable Deferred < Exception ?> () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstop Callback Ġ= ĠComp letable Deferred < Unit >() ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsend Ġsignal Ġfor Ġserver Ġstarting ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwebhook Control Actor . send ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWeb hook Signal . Start ( host , Ġport , Ġpath , Ġexception , Ġstop Callback ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthrow Ġexception Ġif Ġsomething Ġgo Ġwrong ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexception . await ()?. let Ġ{ Ġthrow Ġit Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwait Ġfor Ġthe Ġserver Ġto Ġstop ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( wait ) Ġstop Callback . await () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsuspend Ġfun Ġstop ( wait : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexception Ġ= ĠComp letable Deferred < Exception ?> () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġend Ġ= ĠComp letable Deferred < Unit >() ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsend Ġsignal Ġfor Ġthe Ġserver Ġto Ġstop ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwebhook Control Actor . send ( Webhook Signal . Stop ( exception , Ġend )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthrow Ġexception Ġif Ġsomething Ġgo Ġwrong ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexception . await ()?. let Ġ{ Ġthrow Ġit Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwait Ġfor Ġoperation Ġto Ġend ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( wait ) Ġend . await () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsuspend Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclose End Ġ= ĠComp letable Deferred < Unit >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwebhook Control Actor . send ( Webhook Signal . Close ( close End )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclose End . await () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ kotlin x . coroutines . Obsolete Cor outines Api ĊĠĠĠ Ġprivate Ġval Ġwebhook Ġby Ġlazy Ġ{ ĠWeb hook () Ġ} ĊĊĊĠĠĠ Ġ@ kotlin x . coroutines . Obsolete Cor outines Api ĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġstop Webhook ( wait : ĠBoolean ) Ġ= Ġwebhook . stop ( wait Ġ= Ġwait ) ĊĊĠĠĠ Ġ@ kotlin x . coroutines . Obsolete Cor outines Api ĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġlisten ( host : ĠString , Ġport : ĠInt , Ġpath : ĠString , Ġwait : ĠBoolean ) Ġ= ĊĠĠĠĠĠĠĠ Ġwebhook . start ( host Ġ= Ġhost , Ġport Ġ= Ġport , Ġpath Ġ= Ġpath , Ġwait Ġ= Ġwait ) ĊĠĠĠ Ġ// </ editor - fold > ĊĊĠĠĠ Ġ@ kotlin x . coroutines . Obsolete Cor outines Api ĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠ Ġcoroutine Scope Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Ġ{ Ġpolling . close () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Ġ{ Ġwebhook . close () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjob . complete () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjob . join () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbot . close () ĊĠĠĠ Ġ} Ċ } Ċ