@ -13,8 +13,6 @@ import io.papermc.paper.command.brigadier.CommandSourceStack;
import io.papermc.paper.command.brigadier.Commands ;
import io.papermc.paper.command.brigadier.argument.ArgumentTypes ;
import io.papermc.paper.command.brigadier.argument.resolvers.selector.PlayerSelectorArgumentResolver ;
import io.papermc.paper.registry.RegistryKey ;
import org.bukkit.Material ;
import org.bukkit.entity.Player ;
import org.bukkit.inventory.ItemStack ;
import xyz.soukup.ecoCraftCore.messages.Messages ;
@ -33,9 +31,14 @@ public class RegionCommand {
public static LiteralArgumentBuilder < CommandSourceStack > command ( ) {
LiteralArgumentBuilder < CommandSourceStack > confirm = Commands . literal ( "confirm" ) ;
RequiredArgumentBuilder < CommandSourceStack , PlayerSelectorArgumentResolver > playerArgument = Commands . argument ( "player" , ArgumentTypes . player ( ) ) ;
RequiredArgumentBuilder < CommandSourceStack , String > memberArgument = Commands . argument ( "member" , StringArgumentType . word ( ) ) . suggests ( RegionCommand : : memberGroup Suggestions ) ;
RequiredArgumentBuilder < CommandSourceStack , String > memberArgument = Commands . argument ( "member" , StringArgumentType . word ( ) ) . suggests ( RegionCommand : : memberSuggestions ) ;
RequiredArgumentBuilder < CommandSourceStack , String > groupArgument = Commands . argument ( "group" , StringArgumentType . word ( ) ) . suggests ( RegionCommand : : memberGroupSuggestions ) ;
RequiredArgumentBuilder < CommandSourceStack , ItemStack > materialArgument = Commands . argument ( "icon" , ArgumentTypes . itemStack ( ) ) ;
RequiredArgumentBuilder < CommandSourceStack , String > nameArgument = Commands . argument ( "name" , StringArgumentType . word ( ) ) ;
RequiredArgumentBuilder < CommandSourceStack , Integer > weightArgument = Commands . argument ( "weight" , IntegerArgumentType . integer ( ) ) ;
RequiredArgumentBuilder < CommandSourceStack , ItemStack > iconArgument = Commands . argument ( "icon" , ArgumentTypes . itemStack ( ) ) ;
RequiredArgumentBuilder < CommandSourceStack , String > displayNameArgument = Commands . argument ( "display-name" , StringArgumentType . string ( ) ) ;
RequiredArgumentBuilder < CommandSourceStack , String > descriptionArgument = Commands . argument ( "description" , StringArgumentType . greedyString ( ) ) ;
RequiredArgumentBuilder < CommandSourceStack , String > permissionArgument = Commands . argument ( "permission" , StringArgumentType . word ( ) ) . suggests ( RegionCommand : : permissionSuggestions ) ;
LiteralArgumentBuilder < CommandSourceStack > create = Commands . literal ( "create" )
. executes ( RegionCommand : : create ) ;
@ -44,31 +47,251 @@ public class RegionCommand {
. executes ( RegionCommand : : delete )
. then ( confirm . executes ( RegionCommand : : delete ) ) ;
LiteralArgumentBuilder < CommandSourceStack > addMember = Commands . literal ( "add-member " )
LiteralArgumentBuilder < CommandSourceStack > addMember = Commands . literal ( "add" )
. then ( playerArgument . then ( groupArgument . executes ( RegionCommand : : addMember ) ) ) ;
LiteralArgumentBuilder < CommandSourceStack > removeMember = Commands . literal ( "remove-member " )
. then ( play erArgument. executes ( RegionCommand : : removeMember ) ) ;
LiteralArgumentBuilder < CommandSourceStack > removeMember = Commands . literal ( "remove" )
. then ( memb erArgument. executes ( RegionCommand : : removeMember ) ) ;
LiteralArgumentBuilder < CommandSourceStack > member = Commands . literal ( "member" )
. then ( addMember )
. then ( removeMember ) ;
LiteralArgumentBuilder < CommandSourceStack > group = Commands . literal ( "group" ) ;
LiteralArgumentBuilder < CommandSourceStack > groupAdd = Commands . literal ( "create" )
;
LiteralArgumentBuilder < CommandSourceStack > groupRemove = Commands . literal ( "remove" ) ;
LiteralArgumentBuilder < CommandSourceStack > groupCreate = Commands . literal ( "create" )
. then ( nameArgument
. then ( weightArgument
. then ( iconArgument
. then ( displayNameArgument
. then ( descriptionArgument
. executes ( RegionCommand : : createGroup ) ) ) ) ) ) ;
LiteralArgumentBuilder < CommandSourceStack > groupRemove = Commands . literal ( "remove" )
. executes ( RegionCommand : : removeGroup ) ;
LiteralArgumentBuilder < CommandSourceStack > addPermission = Commands . literal ( "add-permission" )
. then ( permissionArgument . executes ( RegionCommand : : addPermission ) ) ;
LiteralArgumentBuilder < CommandSourceStack > removePermission = Commands . literal ( "remove-permission" )
. then ( permissionArgument . executes ( RegionCommand : : removePermission ) ) ;
Commands . literal ( "transfer-ownership" ) . then ( playerArgument
. executes ( RegionCommand : : transferOwnership )
. then ( confirm . executes ( RegionCommand : : transferOwnership ) ) ) ;
LiteralArgumentBuilder < CommandSourceStack > changeIcon = Commands . literal ( "change-icon" )
. then ( iconArgument . executes ( RegionCommand : : changeIcon ) ) ;
LiteralArgumentBuilder < CommandSourceStack > changeDisplayName = Commands . literal ( "change-display-name" )
. then ( displayNameArgument . executes ( RegionCommand : : changeDisplayName ) ) ;
LiteralArgumentBuilder < CommandSourceStack > changeDescription = Commands . literal ( "change-description" )
. then ( descriptionArgument . executes ( RegionCommand : : changeDescription ) ) ;
RequiredArgumentBuilder < CommandSourceStack , String > groupEdit = nameArgument . suggests ( RegionCommand : : memberGroupSuggestions )
. then ( groupRemove )
. then ( addPermission )
. then ( removePermission )
. then ( changeIcon )
. then ( changeDisplayName )
. then ( changeDescription ) ;
LiteralArgumentBuilder < CommandSourceStack > group = Commands . literal ( "group" )
. then ( groupCreate )
. then ( groupEdit ) ;
RequiredArgumentBuilder < CommandSourceStack , Integer > regionEdits = Commands . argument ( "id" , IntegerArgumentType . integer ( 1 , 2147483647 ) )
. suggests ( RegionCommand : : regionIdSuggestions )
. then ( delete )
. then ( member )
. then ( group ) ;
return Commands . literal ( "region" )
. requires ( c - > c . getSender ( ) instanceof Player )
. then ( create )
. then ( regionEdits ) ;
. then ( regionEdits )
. then ( create ) ;
}
private static int changeIcon ( CommandContext < CommandSourceStack > context ) {
Player player = ( Player ) context . getSource ( ) . getSender ( ) ;
int id = context . getArgument ( "id" , Integer . class ) ;
String name = context . getArgument ( "name" , String . class ) ;
ItemStack itemStack = context . getArgument ( "icon" , ItemStack . class ) ;
switch ( RegionManager . changeGroupIconSafely ( id , name , itemStack , player ) ) {
case NOT_EXIST - > Messages . send ( player , "region.command.error.not-exist" ) ;
case NOT_EXIST_GROUP - > Messages . send ( player , "region.command.error.not-exist-group" ) ;
case NO_PERMISSION - > Messages . send ( player , "region.command.error.no-permission" ) ;
case OK - > Messages . send ( player , "region.command.icon-changed" ) ;
}
return 0 ;
}
private static int changeDescription ( CommandContext < CommandSourceStack > context ) {
Player player = ( Player ) context . getSource ( ) . getSender ( ) ;
int id = context . getArgument ( "id" , Integer . class ) ;
String name = context . getArgument ( "name" , String . class ) ;
String description = context . getArgument ( "description" , String . class ) ;
switch ( RegionManager . changeGroupDescriptionSafely ( id , name , description , player ) ) {
case NOT_EXIST - > Messages . send ( player , "region.command.error.not-exist" ) ;
case NOT_EXIST_GROUP - > Messages . send ( player , "region.command.error.not-exist-group" ) ;
case NO_PERMISSION - > Messages . send ( player , "region.command.error.no-permission" ) ;
case OK - > Messages . send ( player , "region.command.description-changed" ) ;
}
return 0 ;
}
private static int changeDisplayName ( CommandContext < CommandSourceStack > context ) {
Player player = ( Player ) context . getSource ( ) . getSender ( ) ;
int id = context . getArgument ( "id" , Integer . class ) ;
String name = context . getArgument ( "name" , String . class ) ;
String displayName = context . getArgument ( "display-name" , String . class ) ;
switch ( RegionManager . changeGroupDisplayNameSafely ( id , name , displayName , player ) ) {
case NOT_EXIST - > Messages . send ( player , "region.command.error.not-exist" ) ;
case NOT_EXIST_GROUP - > Messages . send ( player , "region.command.error.not-exist-group" ) ;
case NO_PERMISSION - > Messages . send ( player , "region.command.error.no-permission" ) ;
case OK - > Messages . send ( player , "region.command.display-name-changed" ) ;
}
return 0 ;
}
private static int transferOwnership ( CommandContext < CommandSourceStack > context ) {
Player player = ( Player ) context . getSource ( ) . getSender ( ) ;
int id = context . getArgument ( "id" , Integer . class ) ;
PlayerSelectorArgumentResolver newOwnerResolver = context . getArgument ( "new-owner" , PlayerSelectorArgumentResolver . class ) ;
Player newOwner ;
try {
newOwner = newOwnerResolver . resolve ( context . getSource ( ) ) . getFirst ( ) ;
} catch ( CommandSyntaxException e ) {
Messages . send ( player , "region.command.error.not-exist" ) ;
return 1 ;
}
if ( ! context . getInput ( ) . endsWith ( "confirm" ) ) {
Messages . send ( player , "region.command.confirm-warning.transfer-ownership" ,
new Replace ( "id" , String . valueOf ( id ) ) ,
new Replace ( "name" , newOwner . getName ( ) ) ) ;
return 1 ;
}
switch ( RegionManager . transferOwnershipSafely ( id , player , newOwner ) ) {
case NO_PERMISSION - > Messages . send ( player , "region.command.error.no-permission" ) ;
case NOT_EXIST - > Messages . send ( player , "region.command.error.not-exist" ) ;
case OK - > Messages . send ( player , "region.command.transferred-ownership" ) ;
}
return 0 ;
}
private static int removePermission ( CommandContext < CommandSourceStack > context ) {
Player player = ( Player ) context . getSource ( ) . getSender ( ) ;
int id = context . getArgument ( "id" , Integer . class ) ;
String name = context . getArgument ( "name" , String . class ) ;
String permission = context . getArgument ( "permission" , String . class ) ;
switch ( RegionManager . removeGroupPermissionSafely ( player , id , name , permission ) ) {
case NOT_EXIST - > Messages . send ( player , "region.command.error.not-exist" ) ;
case NOT_EXIST_GROUP - > Messages . send ( player , "region.command.error.not-exist-group" ) ;
case NOT_EXIST_PERMISSION - > Messages . send ( player , "region.command.error.not-exist-permission" ) ;
case NO_PERMISSION - > Messages . send ( player , "region.command.error.no-permission" ) ;
case OK - > Messages . send ( player , "region.command.removed-permission" ) ;
}
return 0 ;
}
private static int addPermission ( CommandContext < CommandSourceStack > context ) {
Player player = ( Player ) context . getSource ( ) . getSender ( ) ;
int id = context . getArgument ( "id" , Integer . class ) ;
String name = context . getArgument ( "name" , String . class ) ;
String permission = context . getArgument ( "permission" , String . class ) ;
switch ( RegionManager . addGroupPermissionSafely ( player , id , name , permission ) ) {
case NOT_EXIST - > Messages . send ( player , "region.command.error.not-exist" ) ;
case NOT_EXIST_GROUP - > Messages . send ( player , "region.command.error.not-exist-group" ) ;
case NOT_EXIST_PERMISSION - > Messages . send ( player , "region.command.error.not-exist-permission" ) ;
case NO_PERMISSION - > Messages . send ( player , "region.command.error.no-permission" ) ;
case OK - > Messages . send ( player , "region.command.added-permission" ) ;
}
return 0 ;
}
private static int removeGroup ( CommandContext < CommandSourceStack > context ) {
Player player = ( Player ) context . getSource ( ) . getSender ( ) ;
int id = context . getArgument ( "id" , Integer . class ) ;
String name = context . getArgument ( "name" , String . class ) ;
switch ( RegionManager . removeRegionGroupSafely ( id , player , name ) ) {
case NOT_EXIST - > Messages . send ( player , "region.command.error.not-exist" ) ;
case NOT_EXIST_GROUP - > Messages . send ( player , "region.command.error.not-exist-group" ) ;
case NO_PERMISSION - > Messages . send ( player , "region.command.error.no-permission" ) ;
case OK - > Messages . send ( player , "region.command.deleted-group" ) ;
}
return 0 ;
}
private static int createGroup ( CommandContext < CommandSourceStack > context ) {
Player player = ( Player ) context . getSource ( ) . getSender ( ) ;
int id = context . getArgument ( "id" , Integer . class ) ;
String name = context . getArgument ( "name" , String . class ) ;
int weight = context . getArgument ( "weight" , Integer . class ) ;
ItemStack icon = context . getArgument ( "icon" , ItemStack . class ) ;
String displayName = context . getArgument ( "display-name" , String . class ) ;
String description = context . getArgument ( "description" , String . class ) ;
switch ( RegionManager . addRegionGroupSafely ( id , player , name , weight , icon , displayName , description ) ) {
case NOT_EXIST - > Messages . send ( player , "region.command.error.not-exist" ) ;
case NO_PERMISSION - > Messages . send ( player , "region.command.error.no-permission" ) ;
case ALREADY_EXISTS - > Messages . send ( player , "region.command.error.already-exist" ) ;
case OK - > Messages . send ( player , "region.command.created-group" ) ;
}
return 0 ;
}
private static CompletableFuture < Suggestions > permissionSuggestions ( CommandContext < CommandSourceStack > context , SuggestionsBuilder builder ) {
Player player = ( Player ) context . getSource ( ) . getSender ( ) ;
int id = context . getArgument ( "id" , Integer . class ) ;
Region region = Region . findById ( id ) ;
if ( region = = null ) {
return builder . buildFuture ( ) ;
}
String remaining = builder . getRemaining ( ) . toUpperCase ( ) ;
for ( Permission permission : Permission . values ( ) ) {
if ( permission . name ( ) . contains ( remaining ) & & region . hasPermission ( player , permission ) ) {
builder . suggest ( permission . name ( ) ) ;
}
}
return builder . buildFuture ( ) ;
}
private static CompletableFuture < Suggestions > regionIdSuggestions ( CommandContext < CommandSourceStack > context , SuggestionsBuilder builder ) {
Player player = ( Player ) context . getSource ( ) . getSender ( ) ;
Region region = Region . findRegion ( player . getLocation ( ) ) ;
if ( region ! = null ) {
builder . suggest ( region . getId ( ) ) ;
}
return builder . buildFuture ( ) ;
}
private static CompletableFuture < Suggestions > memberGroupSuggestions ( CommandContext < CommandSourceStack > context , SuggestionsBuilder builder ) {
@ -92,14 +315,23 @@ public class RegionCommand {
PermissionGroup senderGroup = regionMember . getPermissionGroup ( ) ;
if ( senderGroup = = null ) {
return builder . buildFuture ( ) ;
}
QueryBuilder < PermissionGroup , Integer > queryBuilder = PermissionGroup . getDao ( ) . queryBuilder ( ) ;
String remaining = builder . getRemaining ( ) . toUpperCase ( ) ;
try {
queryBuilder . selectColumns ( "name" ) ;
queryBuilder . where ( ) . eq ( "region_id" , id ) . and ( ) . lt ( "weight" , senderGroup . getWeight ( ) ) ;
List < PermissionGroup > permissionGroups = queryBuilder . query ( ) ;
for ( PermissionGroup permissionGroup : permissionGroups ) {
if ( permissionGroup . getName ( ) . contains ( remaining ) ) {
builder . suggest ( permissionGroup . getName ( ) ) ;
}
}
} catch ( SQLException e ) {
throw new RuntimeException ( e ) ;
}
@ -108,6 +340,8 @@ public class RegionCommand {
return builder . buildFuture ( ) ;
}
private static CompletableFuture < Suggestions > memberSuggestions ( CommandContext < CommandSourceStack > context , SuggestionsBuilder builder ) {
Player player = ( Player ) context . getSource ( ) . getSender ( ) ;
int id = context . getArgument ( "id" , Integer . class ) ;
@ -117,29 +351,18 @@ public class RegionCommand {
return builder . buildFuture ( ) ;
}
if ( ! region . hasPermission ( player , Permission . MANAGE_MEMBERS ) ) {
return builder . buildFuture ( ) ;
}
RegionMember regionMember = region . getRegionMember ( player ) ;
if ( regionMember = = null ) {
return builder . buildFuture ( ) ;
}
PermissionGroup senderGroup = regionMember . getPermissionGroup ( ) ;
QueryBuilder < RegionMember , Integer > queryBuilder = RegionMember . getDao ( ) . queryBuilder ( ) ;
String remaining = builder . getRemaining ( ) . toUpperCase ( ) ;
try {
queryBuilder . selectColumns ( "member_name" ) ;
queryBuilder . where ( ) . eq ( "region_id" , id ) ;
List < RegionMember > regionMembers = queryBuilder . query ( ) ;
for ( RegionMember member : regionMembers ) {
if ( member . getPermissionGroup ( ) . getWeight ( ) > = senderGroup . getWeight ( ) ) {
continue ;
}
if ( member . getName ( ) . toUpperCase ( ) . contains ( remaining ) ) {
builder . suggest ( member . getName ( ) ) ;
}
}
} catch ( SQLException e ) {
throw new RuntimeException ( e ) ;
}