package Ġcom . bo gd an . co def or ces watcher . features . users . redux . requests Ċ Ċ import Ġcom . bo gd an . co def or ces watcher . Cw App Ċ import Ġcom . bo gd an . co def or ces watcher . R Ċ import Ġcom . bo gd an . co def or ces watcher . features . users . models . User Ċ import Ġcom . bo gd an . co def or ces watcher . network . get Users Ċ import Ġcom . bo gd an . co def or ces watcher . network . models . Error Ċ import Ġcom . bo gd an . co def or ces watcher . network . models . Users Request Result Ċ import Ġcom . bo gd an . co def or ces watcher . redux . Request Ċ import Ġcom . bo gd an . co def or ces watcher . redux . actions . Toast Action Ċ import Ġcom . bo gd an . co def or ces watcher . room . Database Client Ċ import Ġcom . bo gd an . co def or ces watcher . store Ċ import Ġorg . re kotlin . Action Ċ Ċ enum Ġclass ĠSource ( val Ġis Toast Needed : ĠBoolean ) Ġ{ ĊĠĠĠ ĠUSER ( true ), ĠBRO ADCAST ( false ), ĠBACK GROUND ( false ) Ċ } Ċ Ċ class ĠUsers Requests Ġ{ ĊĊĠĠĠ Ġclass ĠFetch Users ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġsource : ĠSource ĊĠĠĠ Ġ) Ġ: ĠRequest () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġsuspend Ġfun Ġexecute () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġusers : ĠList < User > Ġ= ĠDatabase Client . user Dao . getAll () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġresult Ġ= Ġget Users ( get Handles ( users ), Ġtrue )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠUsers Request Result . Failure Ġ-> Ġdispatch Error ( result . error ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠUsers Request Result . Success Ġ-> Ġstore . dispatch ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSuccess ( result . users , Ġget Difference AndUpdate ( users , Ġresult . users ), Ġsource ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġdispatch Error ( error : ĠError ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġno Connection Error Ġ= ĠC w App . app . resources . getString ( R . string . no _ connection ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfetching Users Error Ġ= ĠC w App . app . resources . getString ( R . string . failed _ to _ fetch _ users ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠError . INTER NET Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstore . dispatch ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFailure ( if Ġ( source . is Toast Needed ) Ġno Connection Error Ġelse Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠError . RESPONSE Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstore . dispatch ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFailure ( if Ġ( source . is Toast Needed ) Ġfetching Users Error Ġelse Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġget Difference AndUpdate ( users : ĠList < User >, Ġupdated Users : ĠList < User >): ĠList < Pair < String , ĠInt >> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdifference : ĠMutable List < Pair < String , ĠInt >> Ġ= Ġmutable ListOf () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( user Ġin Ġupdated Users ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġusers . find Ġ{ Ġit . handle Ġ== Ġuser . handle Ġ} ?. let Ġ{ Ġfound User Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser . id Ġ= Ġfound User . id ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( found User . rating Changes Ġ!= Ġuser . rating Changes ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser . rating Changes . last OrNull ()?. let Ġ{ Ġrating Change Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdelta Ġ= Ġrating Change . new Rating Ġ- Ġrating Change . old Rating ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdifference . add ( Pair ( user . handle , Ġdelta )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDatabase Client . user Dao . update ( user ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdifference ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġget Handles ( room UserList : ĠList < User >): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġhandles Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( element Ġin Ġroom UserList ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandles Ġ+= Ġelement . handle Ġ+ Ġ";" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġhandles ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠSuccess ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġusers : ĠList < User >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnotification Data : ĠList < Pair < String , ĠInt >>, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsource : ĠSource ĊĠĠĠĠĠĠĠ Ġ) Ġ: ĠAction ĊĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠFailure ( override Ġval Ġmessage : ĠString ?) Ġ: ĠToast Action ĊĠĠĠ Ġ} Ċ Ċ }