package Ġcom . l ur ker bot . game Time Ċ Ċ import Ġcom . l ur ker bot . discord User . User Tracker Ċ import Ġdev . k ord . common . entity . Activity Type Ċ import Ġdev . k ord . core . event . gateway . Ready Event Ċ import Ġdev . k ord . core . event . user . Presence Update Event Ċ import Ġkotlinx . coroutines . flow . collect Indexed Ċ import Ġmu . Kotlin Logging Ċ Ċ class ĠGame Time Tracker ( private Ġval Ġgame Timer : ĠGame Timer , Ġprivate Ġval Ġuser Tracker : ĠUser Tracker ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠKotlin Logging . logger Ġ{} ĊĊĠĠĠ Ġsuspend Ġfun Ġinitialize ( ready Event : ĠReady Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġguild s Ġ= Ġready Event . get Guild s () ĊĊĠĠĠĠĠĠĠ Ġguild s . collect Indexed Ġ{ Ġ_, Ġguild Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġguild . members . collect Indexed Ġ{ Ġ_, Ġmember Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( user Tracker . user Is Being Tracked ( member . id . toString ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgame Activity Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmember . get Presence OrNull ()?. activities ?. first OrNull Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . type Ġ== ĠActivity Type . Game ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( game Activity Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġto Record Ġ= ĠTime Record . from Activity ( member . id . toString (), Ġgame Activity ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgame Timer . begin Logging ( member . id . toString (), Ġguild . id . toString (), Ġto Record ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġprocess Event ( event : ĠPres ence Update Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġuser Ġ= Ġevent . getUser () ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! user Tracker . user Is Being Tracked ( user . id . value . toString ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! user . is Bot ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Game Ġ= Ġevent . presence . activities . first OrNull Ġ{ Ġit . type Ġ== ĠActivity Type . Game Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġold Game Ġ= Ġevent . old ?. activities ?. first OrNull Ġ{ Ġit . type Ġ== ĠActivity Type . Game Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Game Ġ== Ġnull Ġ|| Ġ!( current Game . same Activity As ( old Game ))) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgame Timer . end Logging ( user . id . value . toString (), Ġevent . guild Id . value . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Game Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġto Record Ġ= ĠTime Record . from Activity ( user . id . value . toString (), Ġcurrent Game ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgame Timer . begin Logging ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser . id . value . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent . guild Id . value . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Record ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( event . presence . activities . size Ġ> Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" Multiple Ġactivities : Ġ${ event . presence . activities }" Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ