package Ġmemory Ċ Ċ import Ġcom . google . gson . Gson Builder Ċ import Ġcom . google . gson . Json Element Ċ import Ġcom . google . gson . JsonObject Ċ import Ġcommon . functions Ċ import Ġentities . members . Member Ċ import Ġkotlinx . coroutines . experimental . delay Ċ import Ġkotlinx . coroutines . experimental . run Blocking Ċ import Ġsh iro . Sh iro Ċ Ċ import Ġjava . util . concurrent . Concurrent HashMap Ċ Ċ object Ġdb _ users Ġ{ ĊĊĠĠĠ Ġvar Ġmembers Ġ= ĠConcurrent HashMap < String , ĠMember >() ĊĊĠĠĠ Ġfun Ġremove ( reference : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmembers . remove ( reference ) ĊĠĠĠ Ġ} ĊĊĊĊĠĠĠ Ġ/* Ġ============================================================================= ĊĠĠĠĠĠĠĠ ĠCON VEN I ENCE ĠFUNCTIONS ĊĠĠĠ Ġ================================================================= =============== Ġ*/ ĊĠĠĠ Ġfun Ġrestore ( m : Member ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmembers . put ( m . reference , Ġm ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġfun Ġregister ( m : Member ): Member ? Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġm 1 : Member ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ Ġm 1 Ġ= Ġfetch Register ( m ) Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġm 1 ĊĠĠĠ Ġ} ĊĠĠĠ Ġfun Ġlogin ( username : String , Ġpassword : String ): Member ? Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġm : Member ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ Ġm Ġ= Ġfetch Login ( username , Ġpassword ) Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġm ĊĠĠĠ Ġ} ĊĠĠĠ Ġfun Ġget ( reference : ĠString ?): ĠMember ? Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġm : Member ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ Ġm Ġ= Ġfetch By Reference ( reference ) Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġm ĊĠĠĠ Ġ} ĊĠĠĠ Ġfun ĠgetBy Username ( username : ĠString ?): Member ? { ĊĠĠĠĠĠĠĠ Ġvar Ġm : Member ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ Ġm Ġ= Ġfetch By Username ( username ) Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġm ĊĠĠĠ Ġ} ĊĊĊĊĠĠĠ Ġsuspend Ġfun Ġfetch Register ( m : Member ): ĠMember ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( getBy Username ( m . username ) Ġ!= Ġnull Ġ) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġ// ĠTODO Ġregister Ġin Ġthe ĠDB ĊĊĠĠĠĠĠĠĠ Ġm . reference Ġ= Ġunique Id () ĊĠĠĠĠĠĠĠ Ġmembers . put ( m . reference , Ġm ) ĊĠĠĠĠĠĠĠ Ġreturn Ġm ĊĠĠĠ Ġ} ĊĠĠĠ Ġsuspend Ġfun Ġfetch Login ( username : String , Ġpassword : String ): Member ? Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠTODO Ġthe Ġtrip Ġto Ġthe ĠDB , Ġfor Ġnow Ġreturn Ġa Ġnew Ġmember ĊĠĠĠĠĠĠĠ Ġ// ĠTODO ĠI Ġdon 't Ġlike Ġthe Ġidea Ġof Ġstoring Ġthe Ġpassword Ġin Ġmemory , ĊĠĠĠĠĠĠĠ Ġ// ĠTODO Ġthis ĠMUST Ġbe Ġfixed Ġwhen Ġevent Ġstore Ġis Ġimplemented ĊĊĠĠĠĠĠĠĠ Ġval Ġm Ġ= ĠgetBy Username ( username ) Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġmatch Ġ= Ġif ( Sh iro . exists ) ĠSh iro . validate Password ( password , Ġm . password ) Ġelse Ġpassword Ġ== Ġm . password ĊĠĠĠĠĠĠĠ Ġif Ġ(! match ) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġreturn Ġm ĊĠĠĠ Ġ} ĊĠĠĠ Ġsuspend Ġprivate Ġfun Ġfetch By Reference ( reference : ĠString ?): ĠMember ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( reference Ġ== Ġnull ) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġif Ġ( members . containsKey ( reference )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmembers [ reference ] ĊĊĠĠĠĠĠĠĠ Ġ// TODO Ġif Ġdoesn 't Ġexist Ġin Ġmemory , Ġtry Ġto Ġfetch Ġfrom ĠDB ĊĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĠĠĠ Ġsuspend Ġfun Ġfetch By Username ( username : ĠString ?): Member ? { ĊĠĠĠĠĠĠĠ Ġif Ġ( username Ġ== Ġnull ) Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġfor Ġ(( _, Ġmember ) Ġin Ġmembers ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( member . username Ġ== Ġusername ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmember ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// TODO Ġif Ġdoesn 't Ġexist Ġin Ġmemory , Ġtry Ġto Ġfetch Ġfrom ĠDB ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġunique Id (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġ// TODO Ġget Ġit Ġfrom Ġthe Ġserver ĊĠĠĠĠĠĠĠ Ġvar Ġreference Ġ= Ġfunctions . a Unique Reference ĊĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġf Ġ= Ġmembers . containsKey ( reference ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! f ) Ġf Ġ= Ġmembers . containsKey ( reference ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( f ) Ġreference Ġ= Ġfunctions . a Unique Reference ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! f ) Ġbreak ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġreference ĊĠĠĠ Ġ} Ċ } Ċ