package Ġdev . sch la ubi . mik bot . game . api Ċ Ċ import Ġcom . kot l ind is cord . k ord . extensions . Discord Relay ed Exception Ċ import Ġcom . kot l ind is cord . k ord . extensions . components . components Ċ import Ġcom . kot l ind is cord . k ord . extensions . components . public Button Ċ import Ġcom . kot l ind is cord . k ord . extensions . types . respond Ċ import Ġdev . k ord . common . Locale Ċ import Ġdev . k ord . common . entity . ButtonStyle Ċ import Ġdev . k ord . common . k Locale Ċ import Ġdev . k ord . core . K ord Ċ import Ġdev . k ord . core . behavior . User Behavior Ċ import Ġdev . k ord . core . behavior . channel . as Channel Of Ċ import Ġdev . k ord . core . behavior . channel . create Embed Ċ import Ġdev . k ord . core . behavior . channel . threads . edit Ċ import Ġdev . k ord . core . behavior . edit Ċ import Ġdev . k ord . core . behavior . interaction . follow up . edit Ċ import Ġdev . k ord . core . behavior . interaction . response . Ep hemeral Message Interaction Response Behavior Ċ import Ġdev . k ord . core . entity . Message Ċ import Ġdev . k ord . core . entity . User Ċ import Ġdev . k ord . core . entity . channel . Text Channel Ċ import Ġdev . k ord . core . entity . interaction . Component Interaction Ċ import Ġdev . k ord . core . entity . interaction . follow up . Follow up Message Ċ import Ġdev . k ord . core . event . interaction . Component Interaction Create Event Ċ import Ġdev . k ord . rest . builder . message . Embed Builder Ċ import Ġdev . k ord . rest . builder . message . modify . Message Modify Builder Ċ import Ġdev . k ord . rest . builder . message . modify . User Message Modify Builder Ċ import Ġdev . k ord . rest . builder . message . modify . action Row Ċ import Ġdev . k ord . rest . builder . message . modify . embed Ċ import Ġdev . k ord . x . emoji . E moj is Ċ import Ġdev . sch la ubi . mik bot . game . api . events . interaction Handler Ċ import Ġdev . sch la ubi . mik bot . game . api . events . watch Thread Ċ import Ġdev . sch la ubi . mik bot . game . api . module . Game Module Ċ import Ġdev . sch la ubi . mik bot . plugin . api . util . convertTo ISO Ċ import Ġdev . sch la ubi . std x . coroutines . suspend Lazy Ċ import Ġkotlinx . coroutines .* Ċ import Ġmu . Kotlin Logging Ċ import Ġorg . k oin . core . component . K oin Component Ċ import Ġorg . lit ote . km ongo . coroutine . Coroutine Collection Ċ import Ġkotlin . coroutines . Coroutine Context Ċ import Ġkotlin . time . Duration . Companion . minutes Ċ Ċ private Ġval ĠLOG Ġ= ĠKotlin Logging . logger Ġ{ Ġ} Ċ Ċ const Ġval Ġres end Controls Button Ġ= Ġ" res end _ controls " Ċ Ċ /** Ċ Ġ* ĠAbstract Ġimplementation Ġof Ġa Ġgame . Ċ Ġ* Ċ Ġ* Ġ@ param ĠT Ġthe Ġ[ Player ] Ġtype Ċ Ġ* Ġ@ property Ġwelcome Message Ġthe Ġ[ Message ] Ġat Ġthe Ġtop Ġof Ġthe Ġthread Ċ Ġ* Ġ@ property Ġwon Players Ġa Ġlist Ġof Ġ[ T ] Ġwith Ġall Ġwon Ġplayers Ċ Ġ* Ġ@ property Ġk ord Ġthe Ġk ord Ġinstance Ġto Ġuse Ċ Ġ*/ Ċ abstract Ġclass ĠAbstract Game < T Ġ: ĠPlayer >( ĊĠĠĠ Ġval Ġhost : ĠUser Behavior , ĊĠĠĠ Ġoverride Ġval Ġmodule : ĠGame Module < T , ĠAbstract Game < T >> Ċ ) Ġ: ĠK oin Component , ĠCor outine Scope , ĠGame < T > Ġ{ ĊĠĠĠ Ġoverride Ġval Ġplayers : ĠMutable List < T > Ġ= Ġmutable ListOf () ĊĊĠĠĠ Ġoverride Ġval Ġcoroutine Context : ĠCor outine Context Ġ= ĊĠĠĠĠĠĠĠ ĠDispatch ers . IO Ġ+ ĠSuper visor Job () Ġ+ ĠCor outine ExceptionHandler Ġ{ Ġcoroutine Context , Ġthrowable Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . error ( throwable ) Ġ{ Ġ" An Ġerror Ġoccurred Ġin ĠGame Ġ$ coroutine Context Ġ" Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġprotected Ġval Ġleft Players Ġ= Ġmutable ListOf < T >() ĊĊĠĠĠ Ġabstract Ġval Ġplayer Range : ĠInt Range ĊĠĠĠ Ġoverride Ġval Ġlocale Ġ= Ġsuspend Lazy Ġ{ ĊĠĠĠĠĠĠĠ Ġthread . get Guild (). preferred Locale . k Locale . convertTo ISO (). as Java Locale () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġabstract Ġval Ġwelcome Message : ĠMessage ĊĠĠĠ Ġabstract Ġval Ġwon Players : ĠList < T > ĊĠĠĠ Ġopen Ġval Ġis El igible For Stats Ġ= Ġtrue ĊĠĠĠ Ġval Ġhost Player : ĠT ? ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġplayers . first OrNull Ġ{ Ġit . user Ġ== Ġhost Ġ} ĊĠĠĠ Ġprivate Ġval Ġstats Collection : ĠCor outine Collection < User Game Stats > Ġget () Ġ= Ġmodule . game Stats ĊĠĠĠ Ġval Ġk ord : ĠK ord Ġget () Ġ= Ġhost . k ord ĊĠĠĠ Ġprivate Ġvar Ġgame Job : ĠJob ? Ġ= Ġnull ĊĊĠĠĠ Ġval Ġsafe Range Ġget () Ġ= Ġif Ġ( host Player Ġ== Ġnull ) Ġ( player Range . first Ġ- Ġ 1 ) Ġuntil Ġplayer Range . last Ġelse Ġplayer Range ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWhether Ġthe Ġgame Ġis Ġrunning Ġor Ġnot . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġrunning Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġ[ Player ] Ġwho Ġtriggered Ġthis Ġinteraction Ġif Ġany . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval ĠComponent Interaction . game Player : ĠT ? ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġplayers . first OrNull Ġ{ Ġit . user Ġ== Ġuser Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġsilent End Ġ= Ġfalse ĊĊĠĠĠ Ġval ĠUser Behavior . game Player : ĠT ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġplayers . first Ġ{ Ġit . user . id Ġ== Ġid Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġinteraction Handler () ĊĠĠĠĠĠĠĠ Ġwatch Thread () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRequire Ġthe Ġgame Ġto Ġbe Ġstarted Ġto Ġdo Ġthis . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġfun Ġrequire Running () Ġ= Ġcheck ( running ) Ġ{ Ġ" Game Ġhas Ġto Ġbe Ġstarted Ġto Ġperform Ġthis Ġaction " Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠEvent Ġhandler Ġfor Ġcustom Ġevents Ġon Ġ[ welcome Message ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġsuspend Ġfun ĠComponent Interaction Create Event . on Interaction () Ġ= ĠUnit ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdds Ġthe Ġwelcome Ġmessage Ġcontent Ġto Ġthis Ġembed Ġbuilder Ġ( add Ġgame Ġstate Ġto Ġembed ). ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġopen Ġsuspend Ġfun ĠEmbed Builder . add Welcome Message () Ġ= ĠUnit ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠEvent Ġhandler Ġcalled Ġif Ġ[ event ] Ġmade Ġ[ player ] Ġre join . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġsuspend Ġfun Ġon Re join ( event : ĠComponent Interaction Create Event , Ġplayer : ĠT ) Ġ= ĠUnit ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠEvent Ġhandler Ġcalled Ġwhen Ġ[ player ] Ġjoined Ġthe Ġgame . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġsuspend Ġfun Ġon Join ( ack : ĠEp hemeral Message Interaction Response Behavior , Ġplayer : ĠT ) Ġ= ĠUnit ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRemoves Ġ[ player ] Ġfrom Ġthe Ġgame . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġdo Remove Player ( player : ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġplayers . remove ( player ) ĊĠĠĠĠĠĠĠ Ġleft Players . add ( player ) ĊĠĠĠĠĠĠĠ Ġremove Player ( player ) ĊĠĠĠĠĠĠĠ Ġif Ġ( running Ġ&& Ġplayers . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo End () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdditional Ġremove Ġlogic . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġopen Ġsuspend Ġfun Ġremove Player ( player : ĠT ) Ġ= ĠUnit ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreates Ġa Ġnew Ġplayer Ġfor Ġ[ user ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġack Ġthe Ġ[ Ep hemeral Message Interaction Response Behavior ] Ġfor Ġthe Ġtriggering Ġinteraction ĊĠĠĠĠ Ġ* Ġ@ param Ġloading Ġthe Ġ[ Follow up Message ] Ġfor Ġthe Ġuser Ġwho Ġjoined ĊĠĠĠĠ Ġ* Ġ@ param Ġuser Locale Ġthe Ġlocale ĠDiscord Ġincluded Ġin Ġthe Ġinteraction ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġabstract Ġsuspend Ġfun Ġobtain New Player ( ĊĠĠĠĠĠĠĠ Ġuser : ĠUser , ĊĠĠĠĠĠĠĠ Ġack : ĠEp hemeral Message Interaction Response Behavior , ĊĠĠĠĠĠĠĠ Ġloading : ĠFollow up Message , ĊĠĠĠĠĠĠĠ Ġuser Locale : ĠLocale ? ĊĠĠĠ Ġ): ĠT ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUpdates Ġthe Ġwelcome Ġmessage . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġdo Update Welcome Message () Ġ{ ĊĠĠĠĠĠĠĠ Ġwelcome Message . edit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this @ Abstract Game Ġis ĠControl led Game <* >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Res end Controls Button () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( running ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Welcome Message () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġembed Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġwelcome Message . embed s . first OrNull ()?. title ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Welcome Message () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsupports Control led Auto Join Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( this @ Abstract Game Ġas ? ĠControl led Game <* >) ?. supports Auto Join Ġ== Ġtrue Ġ&& Ġhost Player Ġ== Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnormal Players Ġ= Ġplayers . map Ġ{ Ġit . user . mention Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġplayers Ġ= Ġif Ġ( supports Control led Auto Join ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnormal Players Ġ+ Ġ" (${ host . mention })" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnormal Players ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġ" Players " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġplayers . join ToString (", Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgame UI ( this @ Abstract Game ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdds Ġadditional Ġproperties Ġto Ġthe Ġwelcome Ġmessage . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġopen Ġsuspend Ġfun ĠMessage Modify Builder . update Welcome Message () Ġ= ĠUnit ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠStarts Ġthe Ġgame . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdo Start () Ġ{ ĊĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrunning Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine Scope Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this @ Abstract Game Ġis ĠControl led Game <* >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwelcome Message . edit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Res end Controls Button () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgame Job Ġ= Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Game () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! silent End ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo End () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGame Ġfunction Ġsus p ends Ġfor Ġthe Ġwhole Ġgame . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġabstract Ġsuspend Ġfun Ġrun Game () ĊĊĠĠĠ Ġprotected Ġopen Ġsuspend Ġfun Ġend () Ġ= ĠUnit ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠEnd s Ġthe Ġgame . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Suppress (" Suspend Function On Coroutine Scope ") Ġ// Ġwe Ġdon 't Ġwant Ġthis Ġto Ġhave Ġthe Ġsame Ġcontext ĊĠĠĠ Ġsuspend Ġfun Ġdo End ( ab rupt : ĠBoolean Ġ= Ġfalse ) Ġ= Ġcoroutine Scope Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( game Job ?. isActive Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgame Job !!. cancel () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( running ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Stats () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrunning Ġ= Ġ! ab rupt ĊĠĠĠĠĠĠĠ Ġsilent End Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġval Ġplayers Copy Ġ= Ġplayers ĊĠĠĠĠĠĠĠ Ġif Ġ( this @ Abstract Game Ġis ĠControl led Game <* >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayers Copy . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( it Ġas ĠControl led Player ). controls . edit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomponents Ġ= Ġmutable ListOf () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Ġ= Ġtranslate Intern ally ( it , Ġ" game . controls . ended ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġend () ĊĠĠĠĠĠĠĠ Ġmodule . unregister Game ( thread . id ) ĊĊĠĠĠĠĠĠĠ Ġwelcome Message . edit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcomponents Ġ= Ġmutable ListOf () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġembed Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġ" Win ners : Ġ" ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( running Ġ&& Ġwon Players . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepeat ( 3 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwinner ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Winner Game card () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġ" The Ġgame Ġended Ġa br upt ly " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Embed ( this @ edit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! ab rupt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre match Logic () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodify End Message () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 2 . minutes ) Ġ// Ġdelay Ġso Ġusers Ġcan Ġdiscuss Ġgame Ġend Ġand Ġclick Ġthe Ġstats Ġbutton ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwelcome Message . edit Ġ{ Ġcomponents Ġ= Ġmutable ListOf () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthread . edit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreason Ġ= Ġ" Game Ġended " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarchived Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcancel () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun ĠUser Message Modify Builder . re match Logic () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuspend Ġfun Ġ< P Ġ: ĠPlayer , ĠG Ġ: ĠAbstract Game < P >> ĠRem atch able < P , ĠG >. re match UI () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcomponents ( 1 . minutes ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpublic Button Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlabel Ġ= Ġ" Rem atch " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġ" re match " ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwelcome Message . edit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Row Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinteraction Button ( ButtonStyle . Primary , Ġ" re match ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlabel Ġ= Ġ" Rem atch " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgame Thread Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthread . parent . as Channel Of < Text Channel >(). start Public Thread ( re match Thread Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgame Thread . add User ( user . id ) Ġ// ĠAdd Ġcreator ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgame Message Ġ= Ġgame Thread . create Embed Ġ{ Ġdescription Ġ= Ġ" The Ġgame Ġwill Ġbegin Ġshortly " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgame Message . pin ( reason Ġ= Ġ" Game ĠWelcome Ġmessage ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgame Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre match ( game Thread , Ġgame Message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ignored : ĠDiscord Relay ed Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ action ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodule . register Game ( game Thread . id , Ġgame ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgame . players . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgame Thread . add User ( it . user . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgame . welcome Message . edit Ġ{ Ġcomponents Ġ= Ġmutable ListOf () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrespond Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" A Ġre match Ġhas Ġbeen Ġstarted Ġhere Ġ(${ game Thread . mention }), Ġif Ġyou Ġdon 't Ġwant Ġto Ġparticip ate , Ġjust Ġleave " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgame . do Start () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( this @ Abstract Game Ġis ĠRem atch able < *, Ġ* >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Abstract Game . re match UI () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAllows Ġediting Ġof Ġthe Ġfinal Ġembed . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġopen Ġsuspend Ġfun ĠEmbed Builder . add Winner Game card () Ġ= ĠUnit ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdds Ġadditional ĠUI Ġto Ġthe Ġend Ġembed . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġopen Ġsuspend Ġfun ĠEmbed Builder . end Embed ( message Modify Builder : ĠMessage Modify Builder ) Ġ= ĠUnit ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġupdate Stats () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! is El igible For Stats ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠWin ning Ġagainst Ġyourself , Ġdoesn 't Ġcount ĊĠĠĠĠĠĠĠ Ġif Ġ(( players . size Ġ+ Ġleft Players . size ) Ġ== Ġ 1 ) Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġwinner Ġ= Ġwon Players . first OrNull () ĊĠĠĠĠĠĠĠ Ġif Ġ( winner Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate ( winner ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcopy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwins Ġ= Ġwins Ġ+ Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġratio Ġ= Ġ( wins Ġ+ Ġ 1 ). toDouble (). div ( wins Ġ+ Ġlosses . coerce At Least ( 1 )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Games Play ed Ġ= Ġtotal Games Play ed Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ(( players Ġ+ Ġleft Players ) Ġ- Ġwinner ). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcopy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlosses Ġ= Ġlosses Ġ+ Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġratio Ġ= Ġwins . toDouble (). div (( losses Ġ+ Ġ 1 ) Ġ+ Ġwins ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Games Play ed Ġ= Ġtotal Games Play ed Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun ĠMessage Modify Builder . modify End Message () Ġ= ĠUnit ĊĊĠĠĠ Ġprivate Ġfun ĠEmbed Builder . winner ( place Index : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġplayer Ġ= Ġwon Players . get OrNull ( place Index ) Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġmed al Ġ= Ġwhen Ġ( place Index ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> ĠE moj is . first Place ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> ĠE moj is . second Place ĊĠĠĠĠĠĠĠĠĠĠĠĠ 2 Ġ-> ĠE moj is . third Place ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġdescription Ġ+= Ġ"${ med al ?. toString () Ġ?: Ġ( place Index Ġ+ Ġ 1 ). toString ()} ${ player . user . mention }" ĊĠĠĠ Ġ} Ċ } Ċ