package Ġnet . b jo ern pe ters en . music bot . api . auth Ċ Ċ import Ġmu . Kotlin Logging Ċ import Ġnet . b jo ern pe ters en . music bot . internal . auth . Temp User Database Ċ import Ġnet . b jo ern pe ters en . music bot . spi . auth . User Database Ċ import Ġjavax . inject . Inject Ċ import Ġjavax . inject . Singleton Ċ Ċ /** Ċ Ġ* ĠMan ages Ġall Ġusers Ġ( guest Ġand Ġfull ) Ġand Ġcreates / ver ifies Ġtheir Ġtokens . Ċ Ġ*/ Ċ @ Singleton Ċ @ Suppress (" Too Many Functions ") Ċ class ĠUser Manager Ġ@ Inject Ġprivate Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġuser Database : ĠUser Database , ĊĠĠĠ Ġprivate Ġval Ġtemp User Database : ĠTemp User Database Ċ ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠKotlin Logging . logger Ġ{ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreates Ġa Ġtemporary / guest Ġuser . ĠThis Ġuser Ġis Ġonly Ġvalid Ġfor Ġthe Ġduration Ġof Ġthe Ġcurrent ĊĠĠĠĠ Ġ* Ġbot Ġlifetime . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġname Ġthe Ġunique Ġname Ġof Ġthe Ġnew Ġuser ĊĠĠĠĠ Ġ* Ġ@ param Ġid Ġan Ġauto - generated Ġpassword Ġfor Ġthe Ġuser Ġ( for Ġexample Ġa ĠUUID ) ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġgenerated Ġuser ĊĠĠĠĠ Ġ* Ġ@ throws ĠDuplicate User Exception Ġif Ġa Ġuser Ġwith Ġthat Ġname Ġalready Ġexists ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Suppress (" unused ") ĊĠĠĠ Ġ@ Throws ( Duplicate User Exception :: class ) ĊĠĠĠ Ġfun Ġcreate Temporary User ( name : ĠString , Ġid : ĠString ): ĠUser Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Bot User . name . equals ( name , Ġignore Case Ġ= Ġtrue )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠDuplicate User Exception (" Invalid Ġusername ") ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO Ġcreate Ġ" has User " Ġmethod Ġin ĠDatabase ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetUser ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠDuplicate User Exception (" User Ġalready Ġexists : Ġ$ name ") ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( expected : ĠUser NotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtemp User Database . insert User ( name , Ġid ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGets Ġa Ġuser Ġby Ġthe Ġspecified Ġname . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġname Ġthe Ġunique Ġname Ġidentifying Ġthe Ġuser ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġuser Ġwith Ġthat Ġname Ġ( possibly Ġwith Ġdifferent Ġcapital ization ) ĊĠĠĠĠ Ġ* Ġ@ throws ĠUser NotFoundException Ġif Ġno Ġsuch Ġuser Ġexists ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( User NotFoundException :: class ) ĊĠĠĠ Ġfun ĠgetUser ( name : ĠString ): ĠUser Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Bot User . name . equals ( name , Ġignore Case Ġ= Ġtrue )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠBot User ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtemp User Database . find User ( name ) Ġ?: Ġuser Database . find User ( name ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUpdates Ġthe Ġspecified Ġuser 's Ġpassword . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġthe Ġuser Ġis Ġa Ġguest , Ġthis Ġwill Ġmake Ġthem Ġa Ġfull Ġuser . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġuser Ġthe Ġuser Ġname ĊĠĠĠĠ Ġ* Ġ@ param Ġpassword Ġthe Ġnew Ġpassword ĊĠĠĠĠ Ġ* Ġ@ return Ġa Ġnew , Ġvalid Ġuser Ġobject ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Suppress (" unused ") ĊĠĠĠ Ġfun Ġupdate User ( user : ĠUser , Ġpassword : ĠString ): ĠFull User Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( password . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Empty Ġpassword ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġhash Ġ= ĠCrypto . hash ( password ) ĊĠĠĠĠĠĠĠ Ġreturn ĠFull User ( user . name , Ġuser . permissions , Ġhash ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( user Ġis ĠGuest User ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser Database . insert User ( it , Ġhash ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠDuplicate User Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Full Ġand Ġguest Ġuser Ġwith Ġsame Ġname Ġexist !", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp User Database . delete User ( user . name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser Database . update Password ( it . name , Ġhash ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUpdates Ġa Ġuser 's Ġpermissions . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġuser Ġthe Ġuser Ġwhose Ġpermissions Ġshould Ġbe Ġupdated ĊĠĠĠĠ Ġ* Ġ@ param Ġpermissions Ġthe Ġnew Ġset Ġof Ġpermissions ĊĠĠĠĠ Ġ* Ġ@ return Ġa Ġnew Ġuser Ġobject Ġwith Ġthe Ġnew Ġpermissions ĊĠĠĠĠ Ġ* Ġ@ throws ĠIllegalArgumentException Ġif Ġthe Ġspecified Ġuser Ġis Ġnot Ġa Ġfull Ġuser ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġupdate Permissions ( user : ĠUser , Ġpermissions : ĠSet < Permission >): ĠFull User Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( user Ġ! is ĠFull User ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Can 't Ġset Ġpermissions Ġfor Ġguest Ġuser ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġuser Database . update Permissions ( user . name , Ġpermissions ) ĊĠĠĠĠĠĠĠ Ġreturn Ġuser Database . find User ( user . name ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPer manently Ġdeletes Ġa Ġuser . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠAfter Ġcalling Ġthis Ġmethod , Ġanyone Ġis Ġfree Ġto Ġcreate Ġa Ġnew Ġuser Ġwith Ġthat Ġname . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġuser Ġthe Ġuser Ġto Ġdelete ĊĠĠĠĠ Ġ* Ġ@ throws ĠIllegalArgumentException Ġif Ġthe Ġspecified Ġuser Ġis Ġthe Ġ[ Bot User ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Suppress (" unused ") ĊĠĠĠ Ġfun Ġdelete User ( user : ĠUser ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( user ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBot User Ġ-> Ġthrow ĠIllegalArgumentException (" Can 't Ġdelete ĠBot User ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠFull User Ġ-> Ġuser Database . delete User ( user . name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠGuest User Ġ-> Ġtemp User Database . delete User ( user . name ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGets Ġall Ġ** full ** Ġusers . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThe Ġresult Ġ** does Ġnot ** Ġcontain Ġany Ġtemporary Ġusers , Ġbecause Ġthis Ġmethod Ġshould Ġbe Ġused ĊĠĠĠĠ Ġ* Ġto Ġdisplay Ġusers Ġwhose Ġpermissions Ġmay Ġbe Ġedited . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġa Ġset Ġof Ġall Ġusers ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Suppress (" unused ") ĊĠĠĠ Ġfun Ġget Users (): ĠSet < Full User > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġuser Database . get Users () ĊĠĠĠ Ġ} Ċ } Ċ