package Ġde . an ura . bot . teams peak Ċ Ċ import Ġcom . github . the h oly w aff le . teams peak 3 . TS 3 Api Ċ import Ġcom . github . the h oly w aff le . teams peak 3 . TS 3 Config Ċ import Ġcom . github . the h oly w aff le . teams peak 3 . TS 3 Query Ċ import Ġcom . github . the h oly w aff le . teams peak 3 . api . event . TS 3 EventType Ċ import Ġcom . github . the h oly w aff le . teams peak 3 . api . exception . TS 3 Command FailedException Ċ import Ġcom . github . the h oly w aff le . teams peak 3 . api . reconnect . Connection Handler Ċ import Ġcom . github . the h oly w aff le . teams peak 3 . api . reconnect . Re connect Strategy Ċ import Ġde . an ura . bot . config . AppConfig Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġkotlin . system . exit Process Ċ Ċ object ĠTs Bot Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġapp Config Ġ= ĠApp Config . teams peak ĊĠĠĠ Ġprivate Ġvar Ġconnected Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠLoggerFactory . getLogger ( java Class ) ĊĠĠĠ Ġprivate Ġvar Ġfirst Join Ġ= Ġtrue ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġquery : ĠTS 3 Query ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġevent Listener : ĠEvent Listener ĊĠĠĠ Ġval Ġapi : ĠTS 3 Api Ġby Ġlazy Ġ{ Ġquery . api Ġ} ĊĠĠĠ Ġvar Ġquery Channel : ĠInt Ġ= Ġ- 1 ĊĠĠĠ Ġvar Ġquery ClientId : ĠInt Ġ= Ġ- 1 ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġconnect () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġconnect () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= ĠTS 3 Config () ĊĊĠĠĠĠĠĠĠ Ġconfig . set Host ( app Config . host ) ĊĠĠĠĠĠĠĠ Ġconfig . set Query Port ( app Config . port ) ĊĠĠĠĠĠĠĠ Ġconfig . set Re connect Strategy ( Re connect Strategy . linear Backoff ()) ĊĠĠĠĠĠĠĠ Ġconfig . set F lood Rate ( app Config . f lood Rate ) ĊĊĠĠĠĠĠĠĠ Ġconfig . setConnection Handler ( object Ġ: ĠConnection Handler Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Connect ( query : ĠTS 3 Query ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapi Ġ= Ġif Ġ( query ?. api Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquery . api ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" There 's Ġno ĠTeams peak Ġquery Ġwhile Ġconnecting ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAuth entic ating ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapi . login ( app Config . user , Ġapp Config . password ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠTS 3 Command FailedException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġthe Ġcredentials Ġare Ġrejected , Ġwe Ġstop Ġthe Ġbot ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Can 't Ġconnect Ġto Ġthe ĠTeams peak Ġserver , Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" because Ġthe Ġcredentials Ġwere Ġrejected ", Ġapp Config . virtual server ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnected Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( first Join ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexit Process ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSelect ing Ġthe Ġcorrect Ġvirtual Ġserver ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapi . select Virtual Server ById ( app Config . virtual server ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠTS 3 Command FailedException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġa Ġserver Ġwith Ġthe Ġid Ġdoesn 't Ġexists , Ġwe Ġstop Ġthe Ġbot ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Can 't Ġconnect Ġto Ġthe ĠTeams peak Ġserver , Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" because Ġthere 's Ġno Ġvir ta ul Ġserver Ġwith Ġthe Ġid Ġ'{} '", Ġapp Config . virtual server ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnected Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( first Join ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexit Process ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapi . set Nick name ( app Config . nickname ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnected Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" Connected Ġto Ġthe ĠTeams peak Ġserver Ġ(${ app Config . host }) ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRegister ing Ġevents ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapi . register Event ( TS 3 EventType . TEXT _ PRIVATE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapi . register Event ( TS 3 EventType . CHANNEL ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquery ClientId Ġ= Ġapi . who Am I (). id ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMoving Ġthe Ġquery Ġclient Ġto Ġthe Ġchannel , Ġif Ġit 's Ġset Ġand Ġfound ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġquery Channel Ġ= Ġapi . getChannel ByName Exact ( app Config . channel , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( query Channel Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapi . move Query ( query Channel ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" Joined Ġthe Ġchannel Ġ'${ app Config . channel }' ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTs Bot . query Channel Ġ= Ġquery Channel . id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn (" Couldn 't Ġfind Ġthe Ġchannel Ġ'${ app Config . channel }'. ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPop ulating Ġthe Ġcache Ġwith Ġclient Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapi . clients . forEach Ġ{ Ġclient Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent Listener . populate Cache ( client ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTime Manager . load ( client . unique Identifier ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( first Join ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThis Ġmust Ġbe Ġdone Ġin Ġa Ġthread , Ġotherwise Ġit Ġwould Ġblock Ġthe Ġwhole Ġts 3 Ġapi ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThread . sleep ( 1 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" Adding Ġmissing Ġtime Ġ& Ġgame Ġgroups Ġto Ġall Ġonline Ġusers ...") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSteam Connector . set All Clients Groups () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTime Groups . check All Clients () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. start () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfirst Join Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Disconnect ( query : ĠTS 3 Query ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnected Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent Listener . clear Cache () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTime Manager . save All ( true ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" Lost Ġconnection Ġto Ġthe ĠTeams peak Ġserver Ġ(${ app Config . host }) ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġ// ĠBuilding Ġthe Ġquery Ġobject Ġusing Ġthe Ġconfiguration ĊĠĠĠĠĠĠĠ Ġquery Ġ= ĠTS 3 Query ( config ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠCreating Ġthe ĠEvent Listener Ġ& Ġregistering Ġit ĊĠĠĠĠĠĠĠ Ġevent Listener Ġ= ĠEvent Listener ( this , Ġquery ) ĊĠĠĠĠĠĠĠ Ġquery . api . add TS 3 Listeners ( event Listener ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠConnect ing Ġto Ġthe Ġteams peak Ġserver ĊĠĠĠĠĠĠĠ Ġquery . connect () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdisconnect () Ġ{ ĊĠĠĠĠĠĠĠ Ġquery . exit () ĊĠĠĠĠĠĠĠ ĠTime Manager . save All ( true ) ĊĠĠĠĠĠĠĠ Ġlogger . info (" Disconnected Ġfrom Ġthe ĠTeams peak Ġserver Ġ(${ app Config . host }) ") ĊĠĠĠ Ġ} Ċ Ċ }