package Ġcom . lean forge . s occ ero . read iness Ċ Ċ import Ġcom . lean forge . game . slack . Slack Action Ċ import Ġcom . lean forge . game . slack . Slack Actions Ċ import Ġcom . lean forge . game . slack . Slack Message Ċ import Ġcom . lean forge . game . slack . Slack Service Ċ import Ġcom . lean forge . s occ ero . read iness . domain . Read iness Ċ import Ġcom . lean forge . s occ ero . read iness . domain . Read iness Message Ċ import Ġcom . lean forge . s occ ero . read iness . repo . Read iness Message Repository Ċ import Ġcom . lean forge . s occ ero . read iness . repo . Read iness Repository Ċ import Ġcom . lean forge . s occ ero . updater . Update Mark Service Ċ import Ġcom . lean forge . s occ ero . updater . domain . Update Mark Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġorg . springframework . beans . factory . annotation . Autowired Ċ import Ġorg . springframework . stereotype . Service Ċ import Ġjava . time . Instant Ċ import Ġjava . time . temporal . Ch rono Unit Ċ Ċ interface ĠRead iness Service Ġ{ ĊĠĠĠ Ġfun Ġmark Ready ( slack Message : ĠSlack Message , Ġslack Id : ĠString ) ĊĠĠĠ Ġfun Ġmark Busy ( slack Message : ĠSlack Message , Ġslack Id : ĠString ) ĊĠĠĠ Ġfun Ġmark Ready ( slack Id : ĠString ) ĊĠĠĠ Ġfun Ġmark Busy ( slack Id : ĠString ) ĊĠĠĠ Ġfun Ġis Ready ( slack Id : ĠString ): ĠBoolean ĊĠĠĠ Ġfun Ġsend Generic Read iness Message ( channelId : ĠString ) ĊĠĠĠ Ġfun Ġtry Send Personal Read iness Message ( userId : ĠString ) ĊĠĠĠ Ġfun Ġtry Send M ate Read iness Message ( userId : ĠString ) ĊĠĠĠ Ġfun Ġtry Send Opp onent Read iness Message ( userId : ĠString ) ĊĠĠĠ Ġfun Ġmark Every one Busy () ĊĠĠĠ Ġfun Ġready Players () Ġ: ĠSet < String > Ċ } Ċ Ċ @ Service Ċ class ĠDefault Read iness Service Ġ@ Autowired Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġread iness Repository : ĠRead iness Repository , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġread iness Message Repository : ĠRead iness Message Repository , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġupdate Mark Service : ĠUpdate Mark Service , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġslack Service : ĠSlack Service ) Ġ: ĠRead iness Service Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠLoggerFactory . getLogger ( java Class ) ĊĊĠĠĠ Ġoverride Ġfun Ġmark Ready ( slack Message : ĠSlack Message , Ġslack Id : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! is Read iness Message ( slack Message )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġmark Ready ( slack Id ) ĊĠĠĠĠĠĠĠ Ġtry Send Personal Read iness Message ( slack Id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġmark Busy ( slack Message : ĠSlack Message , Ġslack Id : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! is Read iness Message ( slack Message )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġmark Busy ( slack Id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġmark Ready ( slack Id : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġread iness Repository . save ( Read iness ( slack Id , ĠRead iness . State . READY )) ĊĠĠĠĠĠĠĠ Ġslack Service . send Direct Message ( slack Id , Ġ" Your Ġstatus Ġis Ġchanged Ġto : Ġ: low _ brightness :") ĊĠĠĠĠĠĠĠ Ġupdate Mark Service . mark For Update ( Update Mark . Type . LE AG UE _ READ INESS ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġmark Busy ( slack Id : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġread iness Repository . save ( Read iness ( slack Id , ĠRead iness . State . BUSY )) ĊĠĠĠĠĠĠĠ Ġslack Service . send Direct Message ( slack Id , Ġ" Your Ġstatus Ġis Ġchanged Ġto : Ġ: black _ small _ square :") ĊĠĠĠĠĠĠĠ Ġupdate Mark Service . mark For Update ( Update Mark . Type . LE AG UE _ READ INESS ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġis Ready ( slack Id : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġread iness Ġ= Ġread iness Repository . findOne ( slack Id ) Ġ?: Ġreturn Ġfalse ; ĊĊĠĠĠĠĠĠĠ Ġreturn Ġread iness . state Ġ== ĠRead iness . State . READY ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsend Generic Read iness Message ( channelId : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġslack Service . send Channel Message ( channelId , Ġ"_ Remember Ġto Ġupdate Ġyour Ġstatus _", Ġready Actions (" state ")) ĊĠĠĠĠĠĠĠ Ġread iness Message Repository . save ( Read iness Message ( message . timestamp , Ġmessage . channelId )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġtry Send Personal Read iness Message ( userId : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Send Personal Read iness Message ( userId , Ġ" You Ġare Ġready . ĠGreat Ġjob . ĠIn Ġcase Ġthis Ġis Ġno Ġlonger Ġtrue , Ġclick Ġ` busy ` Ġbutton :") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġtry Send M ate Read iness Message ( userId : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Send Personal Read iness Message ( userId , Ġ" Your Ġm ate Ġis Ġready . ĠMaybe Ġyou Ġcan Ġjoin Ġhim ?") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġtry Send Opp onent Read iness Message ( userId : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Send Personal Read iness Message ( userId , Ġ" Your Ġopponent Ġis Ġready !") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtry Send Personal Read iness Message ( userId : ĠString , Ġmsg : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast Message Ġ= Ġread iness Message Repository . find Top By UserId OrderBy Created On Desc ( userId ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Old En ough Ġ= Ġlast Message ?. created On ?. is Before ( Instant . now (). minus ( 2 4 , ĠCh rono Unit . HOUR S )) Ġ?: Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Old En ough ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġslack Service . send Direct Message ( userId , Ġmsg , Ġready Actions (" personal State ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġread iness Message Repository . save ( Read iness Message ( message . timestamp , Ġmessage . channelId , ĠuserId )) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" Can 't Ġsend Ġa Ġmessage ", Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Read iness Message ( message : ĠSlack Message ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġread iness Message Repository . exists By Slack Channel Id And Slack MessageId ( message . channelId , Ġmessage . timestamp ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġmark Every one Busy () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġall Busy Ġ= Ġread iness Repository . findAll By State ( Read iness . State . READY ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . copy ( state Ġ= ĠRead iness . State . BUSY ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toList () ĊĠĠĠĠĠĠĠ Ġif Ġ( all Busy . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ; ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġread iness Repository . save ( all Busy ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġready Players () Ġ: ĠSet < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġread iness Repository ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. findAll By State ( Read iness . State . READY ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . slack Id Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toSet () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġready Actions ( action Name : ĠString ): ĠSlack Actions Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠSlack Actions ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Your Ġstatus ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Are Ġyou Ġready Ġto Ġplay Ġa Ġgame ?", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" You Ġcan 't Ġuse Ġbuttons , Ġbut Ġyou Ġcan Ġadd Ġ: heavy _ plus _ sign : Ġreaction Ġinstead .", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"# 3 AA 3 E 3 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSlack Action . button ( action Name , Ġ" I 'm Ġready !", Ġ" ready "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSlack Action . button ( action Name , Ġ" Sorry , ĠI 'm Ġbusy ...", Ġ" busy ") ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ