mirror of
https://github.com/LuckPerms/LuckPerms.git
synced 2024-11-27 21:29:47 +01:00
Add flag to prevent users from being added/removed to/from the first group on a track (#1151)
This commit is contained in:
parent
9e769904bf
commit
ffdeadac8a
@ -98,13 +98,13 @@ public final class ApiTrack implements me.lucko.luckperms.api.Track {
|
||||
@Nonnull
|
||||
@Override
|
||||
public PromotionResult promote(@Nonnull User user, @Nonnull ContextSet contextSet) {
|
||||
return this.handle.promote(ApiUser.cast(user), contextSet, Predicates.alwaysTrue(), null);
|
||||
return this.handle.promote(ApiUser.cast(user), contextSet, Predicates.alwaysTrue(), null, true);
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
@Override
|
||||
public DemotionResult demote(@Nonnull User user, @Nonnull ContextSet contextSet) {
|
||||
return this.handle.demote(ApiUser.cast(user), contextSet, Predicates.alwaysTrue(), null);
|
||||
return this.handle.demote(ApiUser.cast(user), contextSet, Predicates.alwaysTrue(), null, true);
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
|
@ -62,6 +62,8 @@ public class UserDemote extends SubCommand<User> {
|
||||
return CommandResult.NO_PERMISSION;
|
||||
}
|
||||
|
||||
boolean removeFromFirst = !args.remove("--dont-remove-from-first");
|
||||
|
||||
final String trackName = args.get(0).toLowerCase();
|
||||
if (!DataConstraints.TRACK_NAME_TEST.test(trackName)) {
|
||||
Message.TRACK_INVALID_ENTRY.send(sender, trackName);
|
||||
@ -86,7 +88,7 @@ public class UserDemote extends SubCommand<User> {
|
||||
return CommandResult.NO_PERMISSION;
|
||||
}
|
||||
|
||||
DemotionResult result = track.demote(user, context, s -> !ArgumentPermissions.checkArguments(plugin, sender, getPermission().get(), track.getName(), s), sender);
|
||||
DemotionResult result = track.demote(user, context, s -> !ArgumentPermissions.checkArguments(plugin, sender, getPermission().get(), track.getName(), s), sender, removeFromFirst);
|
||||
switch (result.getStatus()) {
|
||||
case NOT_ON_TRACK:
|
||||
Message.USER_TRACK_ERROR_NOT_CONTAIN_GROUP.send(sender, user.getFriendlyName(), track.getName());
|
||||
@ -102,6 +104,11 @@ public class UserDemote extends SubCommand<User> {
|
||||
return CommandResult.LOADING_ERROR;
|
||||
|
||||
case REMOVED_FROM_FIRST_GROUP: {
|
||||
if (!removeFromFirst && !result.getGroupFrom().isPresent()) {
|
||||
Message.USER_DEMOTE_ENDOFTRACK_NOT_REMOVED.send(sender, track.getName(), user.getFriendlyName());
|
||||
return CommandResult.STATE_ERROR;
|
||||
}
|
||||
|
||||
Message.USER_DEMOTE_ENDOFTRACK.send(sender, track.getName(), user.getFriendlyName(), result.getGroupFrom().get());
|
||||
|
||||
ExtendedLogEntry.build().actor(sender).acted(user)
|
||||
|
@ -62,6 +62,8 @@ public class UserPromote extends SubCommand<User> {
|
||||
return CommandResult.NO_PERMISSION;
|
||||
}
|
||||
|
||||
boolean addToFirst = !args.remove("--dont-add-to-first");
|
||||
|
||||
final String trackName = args.get(0).toLowerCase();
|
||||
if (!DataConstraints.TRACK_NAME_TEST.test(trackName)) {
|
||||
Message.TRACK_INVALID_ENTRY.send(sender, trackName);
|
||||
@ -86,7 +88,7 @@ public class UserPromote extends SubCommand<User> {
|
||||
return CommandResult.NO_PERMISSION;
|
||||
}
|
||||
|
||||
PromotionResult result = track.promote(user, context, s -> !ArgumentPermissions.checkArguments(plugin, sender, getPermission().get(), track.getName(), s), sender);
|
||||
PromotionResult result = track.promote(user, context, s -> !ArgumentPermissions.checkArguments(plugin, sender, getPermission().get(), track.getName(), s), sender, addToFirst);
|
||||
switch (result.getStatus()) {
|
||||
case MALFORMED_TRACK:
|
||||
Message.USER_PROMOTE_ERROR_MALFORMED.send(sender, result.getGroupTo().get());
|
||||
@ -102,6 +104,11 @@ public class UserPromote extends SubCommand<User> {
|
||||
return CommandResult.STATE_ERROR;
|
||||
|
||||
case ADDED_TO_FIRST_GROUP: {
|
||||
if (!addToFirst && !result.getGroupTo().isPresent()) {
|
||||
Message.USER_PROMOTE_NOT_ON_TRACK.send(sender, track.getName(), user.getFriendlyName());
|
||||
return CommandResult.STATE_ERROR;
|
||||
}
|
||||
|
||||
Message.USER_TRACK_ADDED_TO_FIRST.send(sender, user.getFriendlyName(), result.getGroupTo().get(), MessageUtils.contextSetToString(plugin.getLocaleManager(), context));
|
||||
|
||||
ExtendedLogEntry.build().actor(sender).acted(user)
|
||||
|
@ -148,13 +148,15 @@ public enum CommandSpec {
|
||||
USER_PROMOTE("Promotes the user up a track",
|
||||
Argument.list(
|
||||
Argument.create("track", true, "the track to promote the user up"),
|
||||
Argument.create("context...", false, "the contexts to promote the user in")
|
||||
Argument.create("context...", false, "the contexts to promote the user in"),
|
||||
Argument.create("--dont-add-to-first", false, "only promote the user if they're already on the track")
|
||||
)
|
||||
),
|
||||
USER_DEMOTE("Demotes the user down a track",
|
||||
Argument.list(
|
||||
Argument.create("track", true, "the track to demote the user down"),
|
||||
Argument.create("context...", false, "the contexts to demote the user in")
|
||||
Argument.create("context...", false, "the contexts to demote the user in"),
|
||||
Argument.create("--dont-remove-from-first", false, "prevent the user from being removed from the first group")
|
||||
)
|
||||
),
|
||||
USER_CLONE("Clone the user",
|
||||
|
@ -374,6 +374,7 @@ public enum Message {
|
||||
USER_TRACK_ERROR_NOT_CONTAIN_GROUP("&b{}&a isn't already in any groups on &b{}&a.", true),
|
||||
|
||||
USER_TRACK_ADDED_TO_FIRST("&b{}&a isn't in any groups on this track, so they were added to the first group, &b{}&a in context {}&a.", true),
|
||||
USER_PROMOTE_NOT_ON_TRACK("&b{}&a isn't in any groups on this track, so was not promoted.", true),
|
||||
USER_PROMOTE_SUCCESS("&aPromoting &b{}&a along track &b{}&a from &b{}&a to &b{}&a in context {}&a.", true),
|
||||
|
||||
USER_PROMOTE_ERROR_ENDOFTRACK("&aThe end of track &b{}&a was reached. Unable to promote &b{}&a.", true),
|
||||
@ -384,6 +385,7 @@ public enum Message {
|
||||
),
|
||||
USER_DEMOTE_SUCCESS("&aDemoting &b{}&a along track &b{}&a from &b{}&a to &b{}&a in context {}&a.", true),
|
||||
USER_DEMOTE_ENDOFTRACK("&aThe end of track &b{}&a was reached, so &b{}&a was removed from &b{}&a.", true),
|
||||
USER_DEMOTE_ENDOFTRACK_NOT_REMOVED("&aThe end of track &b{}&a was reached, but &b{}&a was not removed from the first group.", true),
|
||||
USER_DEMOTE_ERROR_MALFORMED(
|
||||
"{PREFIX}&aThe previous group on the track, &b{}&a, no longer exists. Unable to demote user." + "\n" +
|
||||
"{PREFIX}&aEither create the group, or remove it from the track and try again.",
|
||||
|
@ -270,7 +270,7 @@ public final class Track implements Identifiable<String> {
|
||||
this.plugin.getEventFactory().handleTrackClear(this, before);
|
||||
}
|
||||
|
||||
public PromotionResult promote(User user, ContextSet context, Predicate<String> nextGroupPermissionChecker, @Nullable Sender sender) {
|
||||
public PromotionResult promote(User user, ContextSet context, Predicate<String> nextGroupPermissionChecker, @Nullable Sender sender, boolean addToFirst) {
|
||||
if (getSize() <= 1) {
|
||||
throw new IllegalStateException("Track contains one or fewer groups, unable to promote");
|
||||
}
|
||||
@ -284,6 +284,10 @@ public final class Track implements Identifiable<String> {
|
||||
.collect(Collectors.toList());
|
||||
|
||||
if (nodes.isEmpty()) {
|
||||
if (!addToFirst) {
|
||||
return PromotionResults.addedToFirst(null);
|
||||
}
|
||||
|
||||
String first = getGroups().get(0);
|
||||
|
||||
Group nextGroup = this.plugin.getGroupManager().getIfLoaded(first);
|
||||
@ -332,7 +336,7 @@ public final class Track implements Identifiable<String> {
|
||||
return PromotionResults.success(old, nextGroup.getName());
|
||||
}
|
||||
|
||||
public DemotionResult demote(User user, ContextSet context, Predicate<String> previousGroupPermissionChecker, @Nullable Sender sender) {
|
||||
public DemotionResult demote(User user, ContextSet context, Predicate<String> previousGroupPermissionChecker, @Nullable Sender sender, boolean removeFromFirst) {
|
||||
if (getSize() <= 1) {
|
||||
throw new IllegalStateException("Track contains one or fewer groups, unable to demote");
|
||||
}
|
||||
@ -340,7 +344,7 @@ public final class Track implements Identifiable<String> {
|
||||
// find all groups that are inherited by the user in the exact contexts given and applicable to this track
|
||||
List<Node> nodes = user.enduringData().immutable().get(context.makeImmutable()).stream()
|
||||
.filter(Node::isGroupNode)
|
||||
.filter(node -> node.getValue())
|
||||
.filter(Node::getValue)
|
||||
.filter(node -> containsGroup(node.getGroupName()))
|
||||
.distinct()
|
||||
.collect(Collectors.toList());
|
||||
@ -362,6 +366,10 @@ public final class Track implements Identifiable<String> {
|
||||
}
|
||||
|
||||
if (previous == null) {
|
||||
if (!removeFromFirst) {
|
||||
return DemotionResults.removedFromFirst(null);
|
||||
}
|
||||
|
||||
user.unsetPermission(oldNode);
|
||||
this.plugin.getEventFactory().handleUserDemote(user, this, old, null, sender);
|
||||
return DemotionResults.removedFromFirst(old);
|
||||
|
Loading…
Reference in New Issue
Block a user