Skip to content

Commit 61e7ad7

Browse files
committed
Registered default permissions
1 parent 1a012df commit 61e7ad7

13 files changed

Lines changed: 131 additions & 96 deletions

README.md

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -130,22 +130,22 @@ Reload the plugin configuration.
130130

131131
Here is a list of the permissions used by this plugin.
132132

133-
| Permission | Description | Recommended Group |
134-
|------------------------------|-------------------------------------------------------------------------|-------------------|
135-
| `cloudnodemsg.use` | Allows using the `/msg` and `/r` commands | default |
136-
| `cloudnodemsg.team` | Allows using the `/teammsg` command | default |
137-
| `cloudnodemsg.send.vanished` | Allows sending messages to vanished players | admin |
138-
| `cloudnodemsg.ignore` | Allows using the `/ignore` and `/unignore` commands | default |
139-
| `cloudnodemsg.ignore.bypass` | Makes your private messages visible, even if the recipient ignored you | admin |
140-
| `cloudnodemsg.toggle` | Allows you to use the `/togglemsg` command | default |
141-
| `cloudnodemsg.toggle.other` | Allows you to toggle msg for another player using `/togglemsg <player>` | admin |
142-
| `cloudnodemsg.toggle.bypass` | Allows you to send messages to players with disabled DMs | admin |
143-
| `cloudnodemsg.spy` | Players with this permission see ALL private messages and team messages | admin |
133+
| Permission | Description | Default |
134+
|------------------------------|------------------------------------------------------------------------------------------------------------------|----------|
135+
| `cloudnodemsg.use` | Allows access to the private message ([`/msg`](#msg-player-message) and reply ([`/r`](#reply-message) commands | everyone |
136+
| `cloudnodemsg.team` | Allows access to the team message command ([`/teammsg`](#teammsg) | everyone |
137+
| `cloudnodemsg.ignore` | Allows access to the [`/ignore`](#ignore-player) and [`/unignore`](#unignore-player) commands | everyone |
138+
| `cloudnodemsg.ignore.bypass` | Prevents the sender’s messages from being ignored | none |
139+
| `cloudnodemsg.toggle` | Allows toggling receiving private messages on and off with [`/togglemsg`](#togglemsg) | everyone |
140+
| `cloudnodemsg.toggle.other` | Allows toggling receiving private messages on and off for others with [`/togglemsg <player>`](#togglemsg-player) | OP |
141+
| `cloudnodemsg.toggle.bypass` | Allows sending private messages to recipients who have toggled them off | OP |
142+
| `cloudnodemsg.send.vanished` | Allows sending messages to vanished recipients | OP |
143+
| `cloudnodemsg.spy` | Makes you see all private and team messages sent between all players | none |
144144

145145
## Release Cycle
146146

147147
CloudnodeMSG follows a weekly **time-based release schedule**,
148-
with new features or changes typically released every **Tuesday**.
148+
with new features or changes typically released on **Tuesday**.
149149

150150
When we merge critical bug fixes, we may publish out-of-band releases on any day of the week.
151151

pom.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,5 +64,11 @@
6464
<version>2.11.7</version>
6565
<scope>provided</scope>
6666
</dependency>
67+
<dependency>
68+
<groupId>org.jspecify</groupId>
69+
<artifactId>jspecify</artifactId>
70+
<version>1.0.0</version>
71+
<scope>compile</scope>
72+
</dependency>
6773
</dependencies>
6874
</project>

src/main/java/pro/cloudnode/smp/cloudnodemsg/Message.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,8 @@ public void send(final @NotNull Context context) throws InvalidPlayerError {
5757
final @NotNull Optional<@NotNull Player> senderPlayer = Optional.ofNullable(this.sender.getPlayer());
5858
final @NotNull Optional<@NotNull Player> recipientPlayer = Optional.ofNullable(this.recipient.getPlayer());
5959

60-
if (!recipient.getUniqueId().equals(console.getUniqueId()) && recipientPlayer.isEmpty() || (recipientPlayer.isPresent() && senderPlayer.isPresent() && CloudnodeMSG.isVanished(recipientPlayer.get()) && !senderPlayer.get().hasPermission(Permission.SEND_VANISHED))) {
60+
if (!recipient.getUniqueId().equals(console.getUniqueId()) && recipientPlayer.isEmpty() || (recipientPlayer.isPresent() && senderPlayer.isPresent() && CloudnodeMSG.isVanished(recipientPlayer.get()) && !senderPlayer.get().hasPermission(
61+
Permissions.SEND_VANISHED))) {
6162
if (context == Context.CHANNEL) {
6263
final @NotNull Player player = Objects.requireNonNull(sender.getPlayer());
6364
Message.exitChannel(player);
@@ -73,15 +74,15 @@ public void send(final @NotNull Context context) throws InvalidPlayerError {
7374
}
7475

7576
if (recipientPlayer.isPresent() && senderPlayer.isPresent() && !Message.isIncomingEnabled(recipientPlayer.get()) && !senderPlayer
76-
.get().hasPermission(Permission.TOGGLE_BYPASS)) {
77+
.get().hasPermission(Permissions.TOGGLE_BYPASS)) {
7778
new PlayerHasIncomingDisabledError(recipientPlayer.get().getName()).send(senderPlayer.get());
7879
return;
7980
}
8081

8182
sendSpyMessage(sender, recipient, message);
8283
sendMessage(sender, CloudnodeMSG.getInstance().config().outgoing(senderUsername, recipientUsername, message));
8384
if ((recipientPlayer.isPresent() && Message.isIgnored(recipientPlayer.get(), sender)) && (senderPlayer.isPresent() && !senderPlayer
84-
.get().hasPermission(Permission.IGNORE_BYPASS))) return;
85+
.get().hasPermission(Permissions.IGNORE_BYPASS))) return;
8586
sendMessage(recipient, CloudnodeMSG.getInstance().config()
8687
.incoming(senderUsername, recipientUsername, message));
8788

@@ -114,7 +115,7 @@ public static void sendSpyMessage(final @NotNull OfflinePlayer sender, final @No
114115
.getInstance().config().consoleName() : Optional.ofNullable(recipient.getName())
115116
.orElse("Unknown Player");
116117
for (final @NotNull Player player : CloudnodeMSG.getInstance().getServer().getOnlinePlayers()) {
117-
if (!player.hasPermission(Permission.SPY) || player.getUniqueId().equals(sender.getUniqueId()) || player
118+
if (!player.hasPermission(Permissions.SPY) || player.getUniqueId().equals(sender.getUniqueId()) || player
118119
.getUniqueId().equals(recipient.getUniqueId())) continue;
119120
sendMessage(player, CloudnodeMSG.getInstance().config().spy(senderName, recipientName, message));
120121
}

src/main/java/pro/cloudnode/smp/cloudnodemsg/Permission.java

Lines changed: 0 additions & 55 deletions
This file was deleted.
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
package pro.cloudnode.smp.cloudnodemsg;
2+
3+
import org.bukkit.Bukkit;
4+
import org.bukkit.permissions.Permission;
5+
import org.bukkit.permissions.PermissionDefault;
6+
import org.jspecify.annotations.NullMarked;
7+
8+
@NullMarked
9+
public final class Permissions {
10+
private static final String NAME = "cloudnodemsg";
11+
12+
public static final Permission USE = create(
13+
"use",
14+
"Allows access to the private message (/msg) and reply (/r) commands",
15+
PermissionDefault.TRUE
16+
);
17+
18+
public static final Permission USE_TEAM = create(
19+
"use.team",
20+
"Allows access to the team message command (/teammsg)",
21+
PermissionDefault.TRUE
22+
);
23+
24+
public static final Permission IGNORE = create(
25+
"ignore",
26+
"Allows access to the /ignore and /unignore commands",
27+
PermissionDefault.TRUE
28+
);
29+
30+
public static final Permission IGNORE_BYPASS = create(
31+
"ignore.bypass",
32+
"Prevents the sender’s messages from being ignored"
33+
);
34+
35+
public static final Permission TOGGLE = create(
36+
"toggle",
37+
"Allows toggling receiving private messages on and off with /togglemsg",
38+
PermissionDefault.TRUE
39+
);
40+
41+
public static final Permission TOGGLE_OTHER = create(
42+
"toggle.other",
43+
"Allows toggling receiving private messages on and off for others with /togglemsg <player>",
44+
PermissionDefault.OP
45+
);
46+
47+
public static final Permission TOGGLE_BYPASS = create(
48+
"toggle.bypass",
49+
"Allows sending private messages to recipients who have toggled them off",
50+
PermissionDefault.OP
51+
);
52+
53+
public static final Permission SEND_VANISHED = create(
54+
"send.vanished",
55+
"Allows sending messages to vanished recipients",
56+
PermissionDefault.OP
57+
);
58+
59+
public static final Permission SPY = create(
60+
"spy",
61+
"Makes you see all private and team messages sent between all players"
62+
);
63+
64+
public static final Permission RELOAD = create(
65+
"reload",
66+
"Allows access to the /cloudnodemsg reload command",
67+
PermissionDefault.OP
68+
);
69+
70+
private static Permission create(final String node, final String description) {
71+
return new Permission(String.format("%s.%s", NAME, node), description);
72+
}
73+
74+
private static Permission create(
75+
final String node,
76+
final String description,
77+
final PermissionDefault permissionDefault
78+
) {
79+
final var permission = create(node, description);
80+
permission.setDefault(permissionDefault);
81+
Bukkit.getPluginManager().addPermission(permission);
82+
return permission;
83+
}
84+
}

src/main/java/pro/cloudnode/smp/cloudnodemsg/command/IgnoreCommand.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import org.jetbrains.annotations.NotNull;
77
import org.jetbrains.annotations.Nullable;
88
import pro.cloudnode.smp.cloudnodemsg.CloudnodeMSG;
9-
import pro.cloudnode.smp.cloudnodemsg.Permission;
9+
import pro.cloudnode.smp.cloudnodemsg.Permissions;
1010
import pro.cloudnode.smp.cloudnodemsg.error.CannotIgnoreError;
1111
import pro.cloudnode.smp.cloudnodemsg.error.NeverJoinedError;
1212
import pro.cloudnode.smp.cloudnodemsg.error.NoPermissionError;
@@ -23,7 +23,7 @@ public final class IgnoreCommand extends Command {
2323

2424
@Override
2525
public boolean run(final @NotNull CommandSender sender, final @NotNull String label, @NotNull String @NotNull [] args) {
26-
if (!sender.hasPermission(Permission.IGNORE)) return new NoPermissionError().send(sender);
26+
if (!sender.hasPermission(Permissions.IGNORE)) return new NoPermissionError().send(sender);
2727
if (!(sender instanceof final @NotNull Player player)) return new NotPlayerError().send(sender);
2828
if (args.length == 0) return sendMessage(player, CloudnodeMSG.getInstance().config().usage(label, usage));
2929
final @NotNull OfflinePlayer target = CloudnodeMSG.getInstance().getServer().getOfflinePlayer(args[0]);
@@ -33,7 +33,7 @@ public boolean run(final @NotNull CommandSender sender, final @NotNull String la
3333
}
3434

3535
public static boolean ignore(final @NotNull Player player, final @NotNull OfflinePlayer target) {
36-
if (target.isOnline() && Objects.requireNonNull(target.getPlayer()).hasPermission(Permission.IGNORE_BYPASS))
36+
if (target.isOnline() && Objects.requireNonNull(target.getPlayer()).hasPermission(Permissions.IGNORE_BYPASS))
3737
return new CannotIgnoreError(Optional.ofNullable(target.getName()).orElse("Unknown Player")).send(player);
3838
if (!target.isOnline() && !target.hasPlayedBefore())
3939
return new NeverJoinedError(Optional.ofNullable(target.getName()).orElse("Unknown Player")).send(player);
@@ -50,7 +50,7 @@ public static boolean unignore(final @NotNull Player player, final @NotNull Offl
5050

5151
@Override
5252
public @Nullable List<@NotNull String> onTabComplete(final @NotNull CommandSender sender, final @NotNull org.bukkit.command.Command command, final @NotNull String label, final @NotNull String @NotNull [] args) {
53-
if (args.length == 1 && sender.hasPermission(Permission.IGNORE) && sender instanceof Player) return null;
53+
if (args.length == 1 && sender.hasPermission(Permissions.IGNORE) && sender instanceof Player) return null;
5454
return new ArrayList<>();
5555
}
5656
}

src/main/java/pro/cloudnode/smp/cloudnodemsg/command/MainCommand.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import org.bukkit.command.CommandSender;
77
import org.jetbrains.annotations.NotNull;
88
import pro.cloudnode.smp.cloudnodemsg.CloudnodeMSG;
9-
import pro.cloudnode.smp.cloudnodemsg.Permission;
9+
import pro.cloudnode.smp.cloudnodemsg.Permissions;
1010
import pro.cloudnode.smp.cloudnodemsg.error.NoPermissionError;
1111

1212
import java.util.ArrayList;
@@ -31,15 +31,15 @@ private boolean info(final @NotNull CommandSender sender) {
3131
}
3232

3333
private boolean reload(final @NotNull CommandSender sender) {
34-
if (!sender.hasPermission(Permission.RELOAD)) return new NoPermissionError().send(sender);
34+
if (!sender.hasPermission(Permissions.RELOAD)) return new NoPermissionError().send(sender);
3535
CloudnodeMSG.getInstance().reload();
3636
return sendMessage(sender, CloudnodeMSG.getInstance().config().reloaded());
3737
}
3838

3939
@Override
4040
public @NotNull List<@NotNull String> onTabComplete(final @NotNull CommandSender sender, final @NotNull org.bukkit.command.Command command, final @NotNull String label, final @NotNull String @NotNull [] args) {
4141
final @NotNull List<@NotNull String> completions = new ArrayList<>();
42-
if (args.length == 1) if (sender.hasPermission(Permission.RELOAD) && "reload".startsWith(args[0].toLowerCase()))
42+
if (args.length == 1) if (sender.hasPermission(Permissions.RELOAD) && "reload".startsWith(args[0].toLowerCase()))
4343
completions.add("reload");
4444
return completions;
4545
}

src/main/java/pro/cloudnode/smp/cloudnodemsg/command/MessageCommand.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import org.jetbrains.annotations.Nullable;
88
import pro.cloudnode.smp.cloudnodemsg.CloudnodeMSG;
99
import pro.cloudnode.smp.cloudnodemsg.Message;
10-
import pro.cloudnode.smp.cloudnodemsg.Permission;
10+
import pro.cloudnode.smp.cloudnodemsg.Permissions;
1111
import pro.cloudnode.smp.cloudnodemsg.error.InvalidPlayerError;
1212
import pro.cloudnode.smp.cloudnodemsg.error.MessageYourselfError;
1313
import pro.cloudnode.smp.cloudnodemsg.error.NoPermissionError;
@@ -25,7 +25,7 @@ public final class MessageCommand extends Command {
2525

2626
@Override
2727
public boolean run(final @NotNull CommandSender sender, final @NotNull String label, @NotNull String @NotNull [] args) {
28-
if (!sender.hasPermission(Permission.USE)) return new NoPermissionError().send(sender);
28+
if (!sender.hasPermission(Permissions.USE)) return new NoPermissionError().send(sender);
2929
if (args.length == 0)
3030
return sendMessage(sender, CloudnodeMSG.getInstance().config().usage(label, sender instanceof Player ? usage : usageConsole));
3131
if (args.length == 1 && !(sender instanceof Player)) return sendMessage(sender, CloudnodeMSG.getInstance().config()
@@ -44,7 +44,7 @@ public boolean run(final @NotNull CommandSender sender, final @NotNull String la
4444
return sendMessage(player, CloudnodeMSG.getInstance().config().channelClosed(player.getName(), Optional.ofNullable(recipientOffline.getName()).orElse("Unknown Player"), label));
4545
}
4646
}
47-
if (recipient.isEmpty() || (CloudnodeMSG.isVanished(recipient.get()) && !player.hasPermission(Permission.SEND_VANISHED))) return new PlayerNotFoundError(args[0]).send(player);
47+
if (recipient.isEmpty() || (CloudnodeMSG.isVanished(recipient.get()) && !player.hasPermission(Permissions.SEND_VANISHED))) return new PlayerNotFoundError(args[0]).send(player);
4848
if (!Message.isIncomingEnabled(recipient.get())) return new PlayerHasIncomingDisabledError(recipient.get().getName()).send(player);
4949
Message.createChannel(player, recipient.get());
5050
return sendMessage(player, CloudnodeMSG.getInstance().config().channelCreated(player.getName(), recipient.get().getName(), label));
@@ -62,7 +62,7 @@ public boolean run(final @NotNull CommandSender sender, final @NotNull String la
6262

6363
@Override
6464
public @Nullable List<@NotNull String> onTabComplete(final @NotNull CommandSender sender, final @NotNull org.bukkit.command.Command command, final @NotNull String label, final @NotNull String @NotNull [] args) {
65-
if (!sender.hasPermission(Permission.USE)) return new ArrayList<>();
65+
if (!sender.hasPermission(Permissions.USE)) return new ArrayList<>();
6666
// `null` works for list of players
6767
if (args.length == 1) return null;
6868
return new ArrayList<>();

src/main/java/pro/cloudnode/smp/cloudnodemsg/command/ReplyCommand.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import org.jetbrains.annotations.NotNull;
66
import pro.cloudnode.smp.cloudnodemsg.CloudnodeMSG;
77
import pro.cloudnode.smp.cloudnodemsg.Message;
8-
import pro.cloudnode.smp.cloudnodemsg.Permission;
8+
import pro.cloudnode.smp.cloudnodemsg.Permissions;
99
import pro.cloudnode.smp.cloudnodemsg.error.InvalidPlayerError;
1010
import pro.cloudnode.smp.cloudnodemsg.error.NoPermissionError;
1111
import pro.cloudnode.smp.cloudnodemsg.error.NobodyReplyError;
@@ -19,7 +19,7 @@ public final class ReplyCommand extends Command {
1919

2020
@Override
2121
public boolean run(final @NotNull CommandSender sender, final @NotNull String label, @NotNull String @NotNull [] args) {
22-
if (!sender.hasPermission(Permission.USE)) return new NoPermissionError().send(sender);
22+
if (!sender.hasPermission(Permissions.USE)) return new NoPermissionError().send(sender);
2323
if (args.length == 0) return sendMessage(sender, CloudnodeMSG.getInstance().config().usage(label, usage));
2424

2525
final @NotNull Optional<@NotNull OfflinePlayer> recipient = Message.getReplyTo(Message.offlinePlayer(sender));

0 commit comments

Comments
 (0)