package Ġdev . sch la ubi . mik bot . game . api . events Ċ Ċ import Ġdev . k ord . common . annotation . K ord Unsafe Ċ import Ġdev . k ord . core . behavior . channel . create Message Ċ import Ġdev . k ord . core . behavior . interaction . follow up . edit Ċ import Ġdev . k ord . core . behavior . interaction . respond Ep hemeral Ċ import Ġdev . k ord . core . behavior . interaction . response . create Ep hemeral Follow up Ċ import Ġdev . k ord . core . event . interaction . Component Interaction Create Event Ċ import Ġdev . k ord . core . on Ċ import Ġdev . sch la ubi . mik bot . game . api .* Ċ Ċ @ Opt In ( K ord Unsafe :: class ) Ċ internal Ġfun Ġ< T Ġ: ĠPlayer > ĠAbstract Game < T >. interaction Handler () Ġ= Ġk ord . on < Component Interaction Create Event >( this ) Ġ{ ĊĠĠĠ Ġif Ġ( interaction . message . id Ġ!= Ġwelcome Message . id ) Ġreturn @ on ĊĊĠĠĠ Ġwhen Ġ( interaction . component Id ) Ġ{ ĊĠĠĠĠĠĠĠ Ġstart Game Button Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( interaction . user Ġ!= Ġhost ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinteraction . respond Ep hemeral Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Ġ= Ġ" Only Ġthe Ġowner Ġcan Ġstart Ġthe Ġgame !" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ on ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( players . size Ġ! in Ġsafe Range ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinteraction . respond Ep hemeral Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcount Ġ= Ġif Ġ( player Range . first Ġ== Ġplayer Range . last ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer Range . first . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( player Range . last Ġ== ĠInt . MAX _ VALUE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" at Ġleast Ġ${ player Range . first }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ player Range . first } Ġ- Ġ${ player Range . last }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Ġ= Ġ" There Ġneed Ġto Ġbe Ġ$ count Ġplayers Ġin Ġthis Ġgame , Ġto Ġstart !" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ on ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAdd Ġhost Ġto Ġcontrolled Ġgames ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( host Player Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDo ing Ġit Ġlike Ġthis , Ġprevents Ġan Ġauto - cast Ġfrom ĠGame < T > Ġto ĠGame < Nothing > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( this Ġas ? ĠControl led Game <* >) ?. supports Auto Join Ġ== Ġtrue ) Ġreturn @ on ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġack Ġ= Ġinteraction . defer Ep hemeral Response Unsafe () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Player Ġ= Ġobtain New Player ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinteraction . user , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġack , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġack . create Ep hemeral Follow up Ġ{ Ġcontent Ġ= Ġ" Loading Ġ..." Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinteraction . locale ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayers . add ( new Player ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo Update Welcome Message () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinteraction . defer Ep hemeral Message Update () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Start () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġleave Game Button Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinteraction . defer Ep hemeral Message Update () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthread . remove User ( interaction . user . id ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġjoin Game Button Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( players . size Ġ== Ġsafe Range . last ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinteraction . respond Ep hemeral Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Ġ= Ġtranslate (" game . join . full ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ on ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthread . add User ( interaction . user . id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexisting Player Ġ= Ġinteraction . game Player ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( existing Player Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Re join ( this , Ġexisting Player ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġack Ġ= Ġinteraction . defer Ep hemeral Response Unsafe () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġloading Ġ= Ġack . create Ep hemeral Follow up Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Ġ= Ġ" Waiting Ġfor Ġgame Ġto Ġstart " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġplayer Ġ= Ġobtain New Player ( interaction . user , Ġack , Ġloading , Ġinteraction . locale ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayers . add ( player ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Join ( ack , Ġplayer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo Update Welcome Message () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġres end Controls Button Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġplayer Ġ= Ġinteraction . game Player Ġas ? ĠControl led Player Ġ?: Ġreturn @ on ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġack Ġ= Ġinteraction . defer Ep hemeral Message Update () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfirmed Ġ= Ġplayer . confirmation Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Ġ= Ġtranslate Intern ally ( player , Ġ" game . res end _ controls . confirm ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer . controls . edit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Ġ= Ġtranslate Intern ally ( player , Ġ" game . controls . reset ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomponents Ġ= Ġmutable ListOf () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( confirmed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthread . create Message Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtranslate Intern ally ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" game . res end _ controls . bl ame ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" games ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf (" interaction . user . mention ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. pin () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer . res end Controls ( ack ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġon Interaction () ĊĠĠĠ Ġ} Ċ } Ċ