package Ġio . github . dim on ch ik 0 0 3 6 . tc bot Ċ Ċ import Ġcom . google . gson . Gson Ċ import Ġcom . pen grad . telegram bot . Telegram Bot Ċ import Ġcom . pen grad . telegram bot . Updates Listener Ċ import Ġcom . pen grad . telegram bot . model . Update Ċ import Ġcom . pen grad . telegram bot . request . Base Request Ċ import Ġcom . pen grad . telegram bot . request . Get Updates Ċ import Ġcom . pen grad . telegram bot . response . Base Response Ċ import Ġio . mock k . every Ċ import Ġio . mock k . mock k Ċ import Ġkotlinx . coroutines .* Ċ import Ġkotlinx . coroutines . channels . Channel Ċ import Ġorg . jetbrains . team city . rest . Build State Ċ import Ġorg . jetbrains . team city . rest . Build Status Ċ import Ġkotlin . concurrent . thread Ċ import Ġkotlin . test .* Ċ Ċ class ĠTeam City Test Ġ{ ĊĠĠĠ Ġprivate Ġval Ġcreator Id : ĠLong Ġ= Ġ 2 2 7 6 0 5 9 3 0 ĊĠĠĠ Ġprivate Ġval Ġcreator Username Ġ= Ġ" dim on ch ik 0 0 3 6 " ĊĠĠĠ Ġprivate Ġval Ġconfig Ġ= ĠConfig ( ĊĠĠĠĠĠĠĠ Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" bot _ token " Ġto Ġ"< TOKEN >", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" server _ url " Ġto Ġ" https :// team city . jetbrains . com ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" creator _ id " Ġto Ġ"$ creator Id ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" auth _ key " Ġto Ġ" 1 2 3 test " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ) ĊĠĠĠ Ġprivate Ġval Ġsender Ġ= ĠChannel < String >( 1 0 ) ĊĠĠĠ Ġprivate Ġval Ġreceiver Ġ= ĠChannel < Request >( 1 0 ) ĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġreceive Text (): ĠString Ġ= Ġreceiver . receive (). text ĊĊĠĠĠ Ġprivate Ġval Ġbot Ġ= ĠTeam City Telegram Bot ( ĊĠĠĠĠĠĠĠ Ġsender Ġ= ĠMock Telegram Bot ( config . bot Token , Ġreceiver , Ġsender ), ĊĠĠĠĠĠĠĠ Ġcreator Id Ġ= Ġconfig . creator Id , ĊĠĠĠĠĠĠĠ Ġauth Key Ġ= Ġconfig . auth Key , ĊĠĠĠĠĠĠĠ Ġcommands Ġ= ĠALL _ COMMAND S . associate Ġ{ Ġit . name Ġto Ġit Ġ} ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġval Ġmy Random Build s : ĠSet < Team City Build > Ġ= Ġset Of ( ĊĠĠĠĠĠĠĠ Ġcreate Build (), ĊĠĠĠĠĠĠĠ Ġcreate Build ( branch Name Ġ= Ġ" not - rr - branch "), ĊĠĠĠĠĠĠĠ Ġcreate Build ( branch Name Ġ= Ġ" master ", Ġbuild Configuration Id Ġ= Ġ" Kotlin "), ĊĠĠĠĠĠĠĠ Ġcreate Build ( branch Name Ġ= Ġnull ), ĊĠĠĠĠĠĠĠ Ġcreate Build ( state Ġ= ĠBuild State . DELETED , Ġstatus Ġ= Ġnull , Ġcontain Changes Ġ= Ġfalse ) ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġval Ġmy Running Build s : ĠSet < Team City Build > Ġ= Ġmy Random Build s . filter Ġ{ Ġit . state Ġ== ĠBuild State . RUNNING Ġ}. toSet () ĊĊĠĠĠ Ġ@ Before Test ĊĠĠĠ Ġfun Ġstart () Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġservice : ĠTeam City Service Ġ= Ġmock k Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ Ġrunning Build s Ġ} Ġreturns Ġmy Running Build s ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbot . start ( service ) ĊĠĠĠĠĠĠĠ Ġdo Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" Run ", Ġreceive Text ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ After Test ĊĠĠĠ Ġfun Ġstop () Ġ{ ĊĠĠĠĠĠĠĠ Ġbot . stop () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` test Ġlogin `() Ġ= Ġdo Test Ġ{ ĊĠĠĠĠĠĠĠ Ġbot . chat Storage . remove ( creator Id ) ĊĠĠĠĠĠĠĠ Ġbot . user Storage . remove ( creator Id . toInt ()) ĊĠĠĠĠĠĠĠ ĠassertNull ( bot . chat Storage [ creator Id ]) ĊĠĠĠĠĠĠĠ ĠassertNull ( bot . user Storage [ creator Id . toInt ()]) ĊĠĠĠĠĠĠĠ Ġlogin () ĊĠĠĠĠĠĠĠ Ġlogout () ĊĠĠĠĠĠĠĠ ĠassertNotNull ( bot . chat Storage [ creator Id ]) ĊĠĠĠĠĠĠĠ ĠassertNotNull ( bot . user Storage [ creator Id . toInt ()]) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` test Ġbad Ġauth `() Ġ= Ġdo Test Ġ{ ĊĠĠĠĠĠĠĠ Ġinvoke Command (" login ", ĠBot Command . FAILED _ AUTH , Ġ"", Ġ" 1 2 ") ĊĠĠĠĠĠĠĠ ĠassertFalse ( bot . chat Storage . getValue ( creator Id ). is Auth ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` test Ġnot Ġpermitted `() Ġ= Ġdo Test Ġ{ ĊĠĠĠĠĠĠĠ Ġinvoke Command (" filter ", ĠBot Command . NOT _ PER MIT TED ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` test Ġfilter `() Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Filter (" branch ", Ġ" rr / .* ") ĊĠĠĠĠĠĠĠ Ġtest Filter (" build _ configuration ", Ġ" Kotlin _ dev _ Aggregate Branch ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` test Ġinvalid Ġfilter `() Ġ= Ġdo Test ( with Auth Ġ= Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck Invalid Command With Help (" filter ", Ġ"", Ġ" branch ", Ġ" ??? ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` test Ġinvalid Ġfilter Ġcheck `() Ġ= Ġdo Test ( with Auth Ġ= Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck Invalid Command With Help (" filter _ check ", Ġ"", Ġ" branch ", Ġ" ??? ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` test Ġfilter Ġcheck `() Ġ= ĠFilter . FILTER _ NAMES . forEach Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Filter Check ( it , Ġ" pa .. ern ", Ġ" pattern ", Ġtrue ) ĊĠĠĠĠĠĠĠ Ġtest Filter Check ( it , Ġ" master ", Ġ" rr / dd ", Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` test Ġcount `() Ġ= Ġdo Test ( with Auth Ġ= Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcommand Ġ= Ġ" count " ĊĠĠĠĠĠĠĠ Ġcheck Invalid Command With Help ( command , Ġ"", Ġ" ??? ") ĊĠĠĠĠĠĠĠ Ġinvoke Command ( command , Ġmy Running Build s . size . toString (), Ġ" running _ builds ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` test Ġsimple `() Ġ= Ġdo Test ( timeout Ġ= Ġ 5 _ 0 0 0 , Ġwith Auth Ġ= Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuilds Ġ= Ġgenerate Build s ( 1 0 ) ĊĠĠĠĠĠĠĠ Ġcheck Message ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbase Set Ġ= Ġbuilds , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend Action Ġ= Ġbot :: build Info Handler , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbase Transformer Ġ= ĠTeam City Build :: description , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Transformer Ġ= ĠRequest :: text ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` test Ġrunning `() Ġ= Ġdo Test ( with Auth Ġ= Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠ Ġadd Filters (" branch Ġrr / .* ") ĊĊĠĠĠĠĠĠĠ Ġvar Ġrunning Ġ= Ġget Running Build s (" all ") ĊĠĠĠĠĠĠĠ Ġvar Ġexpected Ġ= Ġmy Running Build s . map ( Team City Build :: description ). toSet () ĊĠĠĠĠĠĠĠ ĠassertEquals ( expected , Ġrunning ) ĊĊĠĠĠĠĠĠĠ Ġval Ġfilter Ġ= Ġget Filter () ĊĠĠĠĠĠĠĠ Ġrunning Ġ= Ġget Running Build s ("") ĊĠĠĠĠĠĠĠ Ġexpected Ġ= Ġmy Running Build s . filter ( filter :: matches ). map ( Team City Build :: description ). toSet () ĊĠĠĠĠĠĠĠ ĠassertEquals ( expected , Ġrunning ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġcheck Invalid Command With Help ( command : ĠString , Ġvar arg Ġargs : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhelp Ġ= ĠALL _ COMMAND S . first Ġ{ Ġit . name Ġ== Ġcommand Ġ}. help ĊĠĠĠĠĠĠĠ Ġinvoke Command ( command Ġ= Ġcommand , Ġargs Ġ= Ġ* args , Ġexpected Ġ= Ġhelp ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtest Filter Check ( filter Name : ĠString , Ġpattern : ĠString , Ġtext : ĠString , Ġexpected : ĠBoolean ) Ġ= ĊĠĠĠĠĠĠĠ Ġdo Test ( with Auth Ġ= Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( expected , ĠRegex ( pattern ). matches ( text )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Filters ("$ filter Name Ġ$ pattern ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvoke Command (" filter _ check ", Ġexpected . toString (), Ġ"$ filter Name Ġ$ text ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtest Filter ( filter Name : ĠString , Ġpattern : ĠString ) Ġ= Ġdo Test ( with Auth Ġ= Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġexpected Filter Ġ= ĠFilter () ĊĠĠĠĠĠĠĠ Ġexpected Filter . set Filter ByName ( filter Name , ĠRegex ( pattern )) ĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= Ġmy Random Build s . filter ( expected Filter :: matches ). toSet () ĊĊĠĠĠĠĠĠĠ Ġadd Filters ("$ filter Name Ġ$ pattern ") ĊĠĠĠĠĠĠĠ Ġval Ġactual Filter Ġ= Ġget Filter () ĊĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġmy Random Build s . filter ( actual Filter :: matches ). toSet () ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( expected , Ġactual ) ĊĊĠĠĠĠĠĠĠ Ġcheck Message ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbase Set Ġ= Ġmy Random Build s , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend Action Ġ= Ġbot :: build Info Handler , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbase Transformer Ġ= ĠTeam City Build :: description , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Transformer Ġ= ĠRequest :: text , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbase Filter Ġ= Ġactual Filter :: matches , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Count Ġ= Ġexpected . size ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġadd Filters ( var arg Ġfilters : ĠString ) Ġ= Ġinvoke Command (" filter ", ĠBot Command . SUCCESS , Ġ* filters ) ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġget Running Build s ( filter : ĠString ): ĠSet < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġsender . send ( create Update ( command Ġ= Ġ" running ", Ġtext Or Arguments Ġ= Ġfilter )) ĊĠĠĠĠĠĠĠ Ġreturn Ġreceive Text (). split ("\ n \ n "). toSet () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Filter (): ĠFilter Ġ= Ġbot . chat Storage . getValue ( creator Id ). filter ĊĊĠĠĠ Ġprivate Ġfun Ġreset Filter () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġchat Ġ= Ġbot . chat Storage [ creator Id ] Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġfilter Ġ= Ġchat . filter ĊĠĠĠĠĠĠĠ Ġfor Ġ( name Ġin ĠFilter . FILTER _ NAMES ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( filter . set Filter ByName ( name , ĠFilter . DEFAULT _ FILTER )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġ< T , ĠR > Ġcheck Message ( ĊĠĠĠĠĠĠĠ Ġbase Set : ĠSet < T >, ĊĠĠĠĠĠĠĠ Ġsend Action : Ġ( T ) Ġ-> ĠUnit , ĊĠĠĠĠĠĠĠ Ġbase Transformer : Ġ( T ) Ġ-> ĠR , ĊĠĠĠĠĠĠĠ Ġrequest Transformer : Ġ( Request ) Ġ-> ĠR , ĊĠĠĠĠĠĠĠ Ġbase Filter : Ġ( T ) Ġ-> ĠBoolean Ġ= Ġ{ Ġtrue Ġ}, ĊĠĠĠĠĠĠĠ Ġexpected Count : ĠInt ? Ġ= Ġnull ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ ĠGlobal Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbase Set . forEach ( send Action ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= Ġbase Set . filter ( base Filter ). map ( base Transformer ). toSet () ĊĠĠĠĠĠĠĠ Ġif Ġ( expected Count Ġ!= Ġnull ) ĠassertEquals ( expected Count , Ġexpected . size ) ĊĠĠĠĠĠĠĠ Ġval Ġrequests Ġ= Ġhash Set Of < R >() ĊĠĠĠĠĠĠĠ Ġrepeat ( expected . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequests Ġ+= Ġrequest Transformer ( receiver . receive ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠassertEquals ( expected , Ġrequests ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġinvoke Command ( command : ĠString , Ġexpected : ĠString , Ġvar arg Ġargs : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠassertTrue ( expected . isNotBlank ()) ĊĠĠĠĠĠĠĠ Ġif Ġ( args . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsender . send ( create Update ( command Ġ= Ġcommand )) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( expected , Ġreceive Text ()) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġargs . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsender . send ( create Update ( command Ġ= Ġcommand , Ġtext Or Arguments Ġ= Ġit )) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( expected , Ġreceive Text ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdo Test ( ĊĠĠĠĠĠĠĠ Ġtimeout : ĠLong Ġ= Ġ 3 _ 0 0 0 , ĊĠĠĠĠĠĠĠ Ġwith Auth : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġblock : Ġsuspend ĠCor outine Scope . () Ġ-> ĠUnit ĊĠĠĠ Ġ) Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġreset Filter () ĊĠĠĠĠĠĠĠ Ġwith Timeout ( timeout ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( with Auth ) Ġlogin () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblock () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( with Auth ) Ġlogout () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġlogin () Ġ{ ĊĠĠĠĠĠĠĠ Ġinvoke Command (" login ", ĠBot Command . SUCCESS _ AUTH , Ġ"${ config . auth Key }") ĊĠĠĠĠĠĠĠ ĠassertTrue ( bot . chat Storage . getValue ( creator Id ). is Auth ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġlogout () Ġ{ ĊĠĠĠĠĠĠĠ Ġinvoke Command (" logout ", ĠBot Command . LOG OUT _ MESSAGE ) ĊĠĠĠĠĠĠĠ ĠassertFalse ( bot . chat Storage . getValue ( creator Id ). is Auth ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Build s ( count : ĠInt ): ĠSet < Team City Build > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġset Ġ= Ġhash Set Of < Team City Build >() ĊĠĠĠĠĠĠĠ Ġrepeat ( count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Ġ+= Ġcreate Build () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġset ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġbuild Id Ġ= Ġ 4 2 ĊĠĠĠ Ġprivate Ġfun Ġcreate Build ( ĊĠĠĠĠĠĠĠ Ġstate : ĠBuild State Ġ= ĠBuild State . RUNNING , ĊĠĠĠĠĠĠĠ Ġstatus : ĠBuild Status ? Ġ= ĠBuild Status . SUCCESS , ĊĠĠĠĠĠĠĠ Ġbranch Name : ĠString ? Ġ= Ġ" rr / dim on ch ik 0 0 3 6 / test - team city - bot ", ĊĠĠĠĠĠĠĠ Ġbuild Configuration Id : ĠString Ġ= Ġ" Kotlin _ dev _ Aggregate Branch ", ĊĠĠĠĠĠĠĠ Ġcontain Changes : ĠBoolean Ġ= Ġtrue ĊĠĠĠ Ġ): ĠTeam City Build Ġ{ ĊĠĠĠĠĠĠĠ Ġbuild Id ++ ĊĠĠĠĠĠĠĠ Ġreturn ĠTeam City Build ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġbuild Id . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġ" Be autiful Ġbuild Ġname ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnumber Ġ= Ġ"# 1 . 3 . 3 0 - dev -$ build Id ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbranch Name Ġ= Ġbranch Name , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Author Ġ= Ġif Ġ( contain Changes ) Ġ" dim on ch ik 0 0 3 6 " Ġelse Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatus Ġ= Ġstatus , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= Ġstate , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġurl Ġ= Ġ" https :// github . com / dim on ch ik 0 0 3 6 / team city - telegram - bot /$ build Id ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Configuration Id Ġ= Ġbuild Configuration Id ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Update ( ĊĠĠĠĠĠĠĠ Ġcommand : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġtext Or Arguments : ĠString Ġ= Ġ"", ĊĠĠĠĠĠĠĠ Ġchat Id : ĠLong Ġ= Ġcreator Id , ĊĠĠĠĠĠĠĠ ĠuserId : ĠInt Ġ= Ġcreator Id . toInt (), ĊĠĠĠĠĠĠĠ Ġusername : ĠString Ġ= Ġcreator Username ĊĠĠĠ Ġ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcommand With Args Ġ= Ġif Ġ( text Or Arguments . isEmpty ()) Ġcommand Ġelse Ġ"$ command Ġ$ text Or Arguments " ĊĠĠĠĠĠĠĠ Ġval Ġresult Text Ġ= Ġif Ġ( command Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" "/ $ command With Args ", Ġ" entities ": Ġ[ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" type ":" bot _ command ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" offset ": Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" length ": ${ command . length Ġ+ Ġ 1 } ĊĠĠĠĠĠĠĠ Ġ}] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġtext Or Arguments ĊĠĠĠĠĠĠĠ Ġreturn Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" message ": Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" message _ id ": 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" chat ": Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" id ": Ġ$ chat Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" username ":" $ username " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" from ":{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" id ": Ġ$ userId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" username ":" $ username ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" first _ name ":" D mit ry " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" text ": Ġ$ result Text ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ """ ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġdata Ġclass ĠRequest ( ĊĠĠĠ Ġval Ġchat Id : ĠLong , ĊĠĠĠ Ġval Ġtext : ĠString Ċ ) Ċ Ċ private Ġclass ĠMock Telegram Bot ( ĊĠĠĠ Ġtoken : ĠString , ĊĠĠĠ Ġprivate Ġval Ġout Channel : ĠChannel < Request >, ĊĠĠĠ Ġprivate Ġval Ġin Channel : ĠChannel < String > Ċ ) Ġ: ĊĠĠĠ ĠTelegram Bot ( token ) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġ< T Ġ: ĠBase Request < out ĠBase Request < *, Ġ* >, Ġ*> ?, ĠR Ġ: ĠBase Response ?> Ġexecute ( request : ĠBase Request < T , ĠR >): ĠR Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġrequest . parameters [" text "] Ġas ? ĠString ĊĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġrequest . parameters [" chat _ id "] Ġas ? ĠLong ĊĠĠĠĠĠĠĠ Ġif Ġ( message Ġ!= Ġnull Ġ&& Ġid Ġ!= Ġnull ) Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout Channel . send ( Request ( id , Ġmessage )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠG SON . fromJson ("{ Ġ\" ok \":\" true \" Ġ} Ġ", Ġrequest . response Type ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġremove Get Updates Listener () Ġ= Ġrun Blocking Ġ{ Ġin Channel . send (" stop ") Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠsetUp dates Listener ( listener : ĠUpdates Listener , Ġrequest : ĠGet Updates ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( message Ġin Ġin Channel ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( message Ġ== Ġ" stop ") Ġreturn @ run Blocking ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupdate : ĠUpdate Ġ= ĠG SON . fromJson ( message , ĠUpdate :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . process ( listOf ( update )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġval ĠG SON Ġ= ĠGson () Ċ