/* Ċ Ġ* ĠMIT ĠLicense Ċ Ġ* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 7 ĠFre der ik ĠAr . ĠM ikk els en Ċ Ġ* Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ċ Ġ* Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ċ Ġ* Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ċ Ġ* Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ċ Ġ* Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ċ Ġ* Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ġall Ċ Ġ* Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR Ċ Ġ* ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , Ċ Ġ* ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE Ċ Ġ* ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER Ċ Ġ* ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , Ċ Ġ* ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN ĠTHE Ċ Ġ* ĠSOFTWARE . Ċ Ġ*/ Ċ Ċ package Ġf red boat . command . mod eration Ċ Ċ import Ġcom . f red boat . sentinel . Sent inel Exchange s Ċ import Ġcom . f red boat . sentinel . entities . Mod Request Ċ import Ġcom . f red boat . sentinel . entities . Mod RequestType Ċ import Ġf red boat . messaging . internal . Context Ċ import Ġf red boat . perms . Permission Ċ import Ġf red boat . util . Discord Util Ċ import Ġf red boat . util . TextUtils Ċ import Ġf red boat . util . extension . escape And Def use Ċ import Ġkotlinx . coroutines . reactive . await First Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġorg . springframework . amqp . core . Message Delivery Mode Ċ import Ġreactor . core . publisher . Mono Ċ Ċ /** Ċ Ġ* ĠCreated Ġby Ġnap ster Ġon Ġ 1 9 . 0 4 . 1 7 . Ċ Ġ* Ċ Ġ* Ċ Ġ* ĠK ick Ġa Ġuser . Ċ Ġ*/ Ċ class ĠK ick Command ( name : ĠString , Ġvar arg Ġaliases : ĠString ) Ġ: ĠDiscord Mod eration Command ( name , Ġ* aliases ) Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġmod Action ( args : ĠDiscord Mod eration Command . Mod Action Info ): ĠMono < Unit > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( args . target Member Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// we Ġshould Ġnot Ġreach Ġthis Ġplace Ġdue Ġto Ġrequires Member () Ġ= Ġtrue Ġimplementation ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . warn (" Requested Ġkick Ġaction Ġfor Ġnull Ġmember . ĠThis Ġlooks Ġlike Ġa Ġbug . ĠReturn ing ĠMono . ĠUser Ġinput :\ n {}", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġargs . context . msg . content ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠMono . empty () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġargs . context . sentinel . generic Mono Send And Receive < String , ĠUnit >( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexchange Ġ= ĠSentinel Exchange s . REQUEST S , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Ġ= ĠMod Request ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġguild Id Ġ= Ġargs . context . guild . id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠuserId Ġ= Ġargs . target User . id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= ĠMod RequestType . K ICK , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreason Ġ= Ġargs . formatted Reason ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrouting Key Ġ= Ġargs . context . routing Key , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmay Be Empty Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelivery Mode Ġ= ĠMessage Delivery Mode . PER SIST ENT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransform Ġ= Ġ{} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġrequires Member (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue Ġ// can 't Ġkick Ġnon - members ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonSuccess ( args : ĠDiscord Mod eration Command . Mod Action Info ): Ġ() Ġ-> ĠUnit Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsuccess Output Ġ= Ġ( args . context . i 1 8 n Format (" kick Success ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġargs . target User . as Mention Ġ+ Ġ" Ġ" Ġ+ ĠText Utils . escape And Def use ( args . target AsString ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ"\ n " Ġ+ ĠText Utils . escape And Def use ( args . plain Reason )) ĊĠĠĠĠĠĠĠ Ġreturn Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġargs . context . reply WithName ( success Output ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Fail ( args : ĠDiscord Mod eration Command . Mod Action Info ): Ġ( t : ĠThrowable ) Ġ-> ĠUnit Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġescaped Target Name Ġ= ĠText Utils . escape And Def use ( args . target AsString ()) ĊĠĠĠĠĠĠĠ Ġreturn Ġ{ Ġt Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= Ġargs . context ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . error (" Failed Ġto Ġkick Ġuser ", Ġt ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . reply WithName ( context . i 1 8 n Format (" kick Fail ", ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġargs . target User . as Mention Ġ+ Ġ" Ġ" Ġ+ Ġescaped Target Name )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġcheck Authorization With Feedback ( args : ĠDiscord Mod eration Command . Mod Action Info ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= Ġargs . context ĊĠĠĠĠĠĠĠ Ġval Ġtarget Ġ= Ġargs . target Member ĊĠĠĠĠĠĠĠ Ġval Ġmod Ġ= Ġcontext . member ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! context . check Invoker Permissions With Feedback ( Permission . K ICK _ MEMBER S )) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ(! context . check Self Permissions With Feedback ( Permission . K ICK _ MEMBER S )) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( target Ġ== Ġnull ) Ġreturn Ġtrue ĊĊĠĠĠĠĠĠĠ Ġif Ġ( mod Ġ== Ġtarget ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . reply WithName ( context . i 1 8 n (" kick Fail Self ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( target . is Owner ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . reply WithName ( context . i 1 8 n (" kick Fail Owner ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( target Ġ== Ġtarget . guild . self Member ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . reply WithName ( context . i 1 8 n (" kick Fail My self ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġmod Role Ġ= ĠDiscord Util . get Highest Role Position ( mod ). await First () ĊĠĠĠĠĠĠĠ Ġval Ġtarget Role Ġ= ĠDiscord Util . get Highest Role Position ( target ). await First () ĊĠĠĠĠĠĠĠ Ġval Ġself Role Ġ= ĠDiscord Util . get Highest Role Position ( mod . guild . self Member ). await First () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( mod Role Ġ<= Ġtarget Role Ġ&& Ġ! mod . is Owner ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . reply WithName ( context . i 1 8 n Format (" mod Fail User Hierarchy ", Ġtarget . effective Name . escape And Def use ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( self Role Ġ<= Ġtarget Role ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . reply WithName ( context . i 1 8 n Format (" mod Fail Bot Hierarchy ", Ġtarget . effective Name . escape And Def use ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdm For Target ( args : ĠDiscord Mod eration Command . Mod Action Info ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġargs . context . i 1 8 n Format (" mod Action Target Dm Kick ed ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"** ${ TextUtils . escape Markdown ( args . context . guild . name )} ** ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText Utils . asString ( args . context . user )) Ġ+ Ġ"\ n " Ġ+ Ġargs . plain Reason ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġhelp ( context : ĠContext ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ(" { 0 }{ 1 } Ġ< user >\ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ"{ 0 }{ 1 } Ġ< user > Ġ< reason >\ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ"#" Ġ+ Ġcontext . i 1 8 n (" help Kick Command ")) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlog Ġ= ĠLoggerFactory . getLogger ( Kick Command :: class . java ) ĊĠĠĠ Ġ} Ċ } Ċ