@ file : Opt In ( Experimental Time :: class ) Ċ Ċ package Ġorg . qu ilt mc . community . modes . qu ilt . extensions Ċ Ċ import Ġcom . kot l ind is cord . k ord . extensions . DIS C ORD _ BL UR PLE Ċ import Ġcom . kot l ind is cord . k ord . extensions . DIS C ORD _ FU CH SI A Ċ import Ġcom . kot l ind is cord . k ord . extensions . commands . Arguments Ċ import Ġcom . kot l ind is cord . k ord . extensions . commands . converters . impl . default ing Boolean Ċ import Ġcom . kot l ind is cord . k ord . extensions . extensions . Extension Ċ import Ġcom . kot l ind is cord . k ord . extensions . extensions . ep hemeral Slash Command Ċ import Ġcom . kot l ind is cord . k ord . extensions . time . Timestamp Type Ċ import Ġcom . kot l ind is cord . k ord . extensions . time . to Discord Ċ import Ġcom . kot l ind is cord . k ord . extensions . types . editing Paginator Ċ import Ġcom . kot l ind is cord . k ord . extensions . types . respond Ċ import Ġcom . kot l ind is cord . k ord . extensions . utils . scheduling . Task Ċ import Ġdev . k ord . common . entity . Permission Ċ import Ġdev . k ord . core . entity . Member Ċ import Ġkotlinx . coroutines . flow . filter Ċ import Ġkotlinx . coroutines . flow . toList Ċ import Ġkotlinx . datetime . Clock Ċ import Ġorg . k oin . core . component . inject Ċ import Ġorg . qu ilt mc . community . GU IL DS Ċ import Ġorg . qu ilt mc . community . database . collections . Server Settings Collection Ċ import Ġorg . qu ilt mc . community . has Permission In Main Guild Ċ import Ġkotlin . time . Duration Ċ import Ġkotlin . time . Experimental Time Ċ Ċ private Ġconst Ġval ĠMAX _ PENDING _ DAYS Ġ= Ġ 3 Ċ private Ġconst Ġval ĠMEMBER _ CHUNK _ SIZE Ġ= Ġ 1 0 Ċ Ċ // Ġprivate Ġval ĠTASK _ DELAY Ġ= ĠDuration . hours ( 1 ) Ċ private Ġval ĠMAX _ PENDING _ DURATION Ġ= ĠDuration . days ( MAX _ PENDING _ DAYS ) Ċ Ċ class ĠUser Cleanup Extension Ġ: ĠExtension () Ġ{ ĊĠĠĠ Ġoverride Ġval Ġname : ĠString Ġ= Ġ" user - cleanup " ĊĊĠĠĠ Ġprivate Ġval Ġservers : ĠServer Settings Collection Ġby Ġinject () ĊĊĠĠĠ Ġ// Ġprivate Ġval Ġscheduler Ġ= ĠScheduler () ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġtask : ĠTask ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġsetup () Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġtask Ġ= Ġscheduler . schedule ( TASK _ DELAY , Ġpolling Seconds Ġ= Ġ 6 0 , Ġcallback Ġ= Ġ:: task Run ) ĊĊĠĠĠĠĠĠĠ ĠGU IL DS . forEach Ġ{ Ġguild Id Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġep hemeral Slash Command (:: Cleanup Args ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġ" cleanup - users " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġ" Clean Ġup Ġlikely Ġbot Ġaccounts " ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġguild ( guild Id ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Ġ{ Ġhas Permission In Main Guild ( Permission . Administrator ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(:: task . isInitialized ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtask . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġguild s Ġ= Ġservers . getBy Qu ilt Servers (). toList (). sorted By Ġ{ Ġit . qu ilt Server Type !!. readable Name Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġremoved Ġ= Ġtask Run ( arguments . dry Run ). groupBy Ġ{ Ġit . guild Id Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( removed . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrespond Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Ġ= Ġ" It Ġdoesn 't Ġlook Ġlike Ġthere 's Ġanyone Ġthat Ġneeds Ġto Ġbe Ġremoved ." ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ action ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġediting Paginator Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġdefault Set Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( guild Ġin Ġguild s ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmembers Ġ= Ġremoved [ guild ._ id ] Ġ?: Ġcontinue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( members . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! default Set ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Set Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpages . default Group Ġ= Ġguild . qu ilt Server Type !!. readable Name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmembers . chunk ed ( MEMBER _ CHUNK _ SIZE ). forEach Ġ{ Ġchunk Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage ( guild . qu ilt Server Type !!. readable Name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Ġ= ĠDIS C ORD _ FU CH SI A ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġ" User ĠCleanup : Ġ${ guild . qu ilt Server Type !!. readable Name }" ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( arguments . dry Run ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Ġ= ĠDIS C ORD _ BL UR PLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ+= Ġ" Ġ( dry - run )" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġ"** Mention ** Ġ| Ġ** Tag ** Ġ| Ġ** Join Ġdate ** \ n \ n " ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchunk . forEach Ġ{ Ġmember Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ+= Ġ"${ member . mention } Ġ| Ġ${ member . tag } Ġ| " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ member . joined At . to Discord ( Timestamp Type . Default )}\ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. send () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġtask Run ( dry Run : ĠBoolean Ġ= Ġfalse ): ĠMutable List < Member > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġremoved : ĠMutable List < Member > Ġ= Ġmutable ListOf () ĊĠĠĠĠĠĠĠ Ġval Ġnow Ġ= ĠClock . System . now () ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġguild s Ġ= Ġservers ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. getBy Qu ilt Servers () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toList () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map NotNull Ġ{ Ġk ord . get Guild ( it ._ id ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġguild s . forEach Ġ{ Ġguild Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġguild . members ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . is Pending Ġ&& Ġ( it . joined At Ġ+ ĠMAX _ PENDING _ DURATION ) Ġ<= Ġnow Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toList () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! dry Run ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . kick (" Failed Ġto Ġpass Ġmember Ġscreen ing Ġwithin Ġ$ MAX _ PENDING _ DAYS Ġdays .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremoved Ġ+= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġremoved ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(:: task . isInitialized ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtask . restart () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġun load () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . unload () ĊĊĠĠĠĠĠĠĠ Ġif Ġ(:: task . isInitialized ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtask . cancel () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinner Ġclass ĠCleanup Args Ġ: ĠArguments () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdry Run Ġby Ġdefault ing Boolean ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" dry - run ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Whether Ġto Ġpreview Ġthe Ġmember Ġto Ġkick Ġinstead Ġof Ġactually Ġkick ing Ġthem ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ