Skip to content

Commit f6e5326

Browse files
authored
Implements an option to toggle private messages (#26)
2 parents 7556ebc + 75774f6 commit f6e5326

File tree

10 files changed

+185
-1
lines changed

10 files changed

+185
-1
lines changed

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import pro.cloudnode.smp.cloudnodemsg.command.ReplyCommand;
1111
import pro.cloudnode.smp.cloudnodemsg.command.UnIgnoreCommand;
1212
import pro.cloudnode.smp.cloudnodemsg.listener.AsyncChatListener;
13+
import pro.cloudnode.smp.cloudnodemsg.command.ToggleMessageCommand;
1314

1415
import java.util.Objects;
1516

@@ -33,6 +34,7 @@ public void onEnable() {
3334
Objects.requireNonNull(getCommand("reply")).setExecutor(new ReplyCommand());
3435
Objects.requireNonNull(getCommand("ignore")).setExecutor(new IgnoreCommand());
3536
Objects.requireNonNull(getCommand("unignore")).setExecutor(new UnIgnoreCommand());
37+
Objects.requireNonNull(getCommand("togglemsg")).setExecutor(new ToggleMessageCommand());
3638

3739
getServer().getPluginManager().registerEvents(new AsyncChatListener(), this);
3840
}

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

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,19 @@ public final class Permission {
2727
* Player's messages are immune to ignoring
2828
*/
2929
public final static @NotNull String IGNORE_BYPASS = "cloudnodemsg.ignore.bypass";
30+
31+
/**
32+
* Allows using the /togglemsg command
33+
*/
34+
public final static @NotNull String TOGGLE = "cloudnodemsg.toggle";
35+
36+
/**
37+
* Allows using the /togglemsg command for others
38+
*/
39+
public final static @NotNull String TOGGLE_OTHER = "cloudnodemsg.toggle.other";
40+
41+
/**
42+
* Allows to send private message even when the target have their private messages toggled
43+
*/
44+
public final static @NotNull String TOGGLE_BYPASS = "cloudnodemsg.toggle.bypass";
3045
}

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

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,40 @@ public PluginConfig(final @NotNull FileConfiguration config) {
115115
return Objects.requireNonNull(config.getString("console-name"));
116116
}
117117

118+
public @NotNull Component toggleDisable() {
119+
return MiniMessage.miniMessage().deserialize(Objects.requireNonNull(config.getString("toggle.disable.message")));
120+
}
121+
122+
/**
123+
* Player's private messages have been toggled off
124+
* <p>Placeholders:</p>
125+
* <ul><li>{@code <player>} - the player's username</li></ul>
126+
*
127+
* @param player the player's username
128+
*/
129+
public @NotNull Component toggleDisableOther(final @NotNull String player) {
130+
return MiniMessage.miniMessage().deserialize(Objects.requireNonNull(config.getString("toggle.disable.other")),
131+
Placeholder.unparsed("player", player)
132+
);
133+
}
134+
135+
public @NotNull Component toggleEnable() {
136+
return MiniMessage.miniMessage().deserialize(Objects.requireNonNull(config.getString("toggle.enable.message")));
137+
}
138+
139+
/**
140+
* Player's private messages have been toggled on
141+
* <p>Placeholders:</p>
142+
* <ul><li>{@code <player>} - the player's username</li></ul>
143+
*
144+
* @param player the player's username
145+
*/
146+
public @NotNull Component toggleEnableOther(final @NotNull String player) {
147+
return MiniMessage.miniMessage().deserialize(Objects.requireNonNull(config.getString("toggle.enable.other")),
148+
Placeholder.unparsed("player", player)
149+
);
150+
}
151+
118152
/**
119153
* No permission
120154
*/
@@ -208,5 +242,18 @@ public PluginConfig(final @NotNull FileConfiguration config) {
208242
Placeholder.unparsed("player", player)
209243
);
210244
}
245+
246+
/**
247+
* Target player have disabled their incoming private messages.
248+
* <p>Placeholders:</p>
249+
* <ul><li>{@code <player>} - the player's username</li></ul>
250+
*
251+
* @param player The player's username
252+
*/
253+
public @NotNull Component incomingDisabled(final @NotNull String player) {
254+
return MiniMessage.miniMessage().deserialize(Objects.requireNonNull(config.getString("errors.incoming-disabled")),
255+
Placeholder.unparsed("player", player)
256+
);
257+
}
211258
}
212259

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import pro.cloudnode.smp.cloudnodemsg.error.MessageYourselfError;
1111
import pro.cloudnode.smp.cloudnodemsg.error.NoPermissionError;
1212
import pro.cloudnode.smp.cloudnodemsg.error.PlayerNotFoundError;
13+
import pro.cloudnode.smp.cloudnodemsg.error.PlayerHasIncomingDisabledError;
1314
import pro.cloudnode.smp.cloudnodemsg.message.Message;
1415

1516
import java.util.ArrayList;
@@ -32,6 +33,7 @@ public boolean run(final @NotNull CommandSender sender, final @NotNull String la
3233
if (recipient.isEmpty() || (CloudnodeMSG.isVanished(recipient.get()) && !sender.hasPermission(Permission.SEND_VANISHED))) return new PlayerNotFoundError(args[0]).send(sender);
3334
if (sender instanceof final @NotNull Player player && recipient.get().getUniqueId().equals(player.getUniqueId()))
3435
return new MessageYourselfError().send(sender);
36+
if (!Message.isIncomingEnabled(recipient.get()) && !sender.hasPermission(Permission.TOGGLE_BYPASS)) return new PlayerHasIncomingDisabledError(recipient.get().getName()).send(sender);
3537

3638
try {
3739
new Message(Message.offlinePlayer(sender), recipient.get(), String.join(" ", Arrays.copyOfRange(args, 1, args.length))).send();

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import pro.cloudnode.smp.cloudnodemsg.error.NoPermissionError;
1010
import pro.cloudnode.smp.cloudnodemsg.error.NobodyReplyError;
1111
import pro.cloudnode.smp.cloudnodemsg.error.ReplyOfflineError;
12+
import pro.cloudnode.smp.cloudnodemsg.error.PlayerHasIncomingDisabledError;
1213
import pro.cloudnode.smp.cloudnodemsg.message.Message;
1314

1415
import java.util.ArrayList;
@@ -26,6 +27,7 @@ public boolean run(final @NotNull CommandSender sender, final @NotNull String la
2627

2728
final @NotNull Optional<@NotNull OfflinePlayer> recipient = Message.getReplyTo(Message.offlinePlayer(sender));
2829
if (recipient.isEmpty()) return new NobodyReplyError().send(sender);
30+
if (!Message.isIncomingEnabled(Objects.requireNonNull(recipient.get().getPlayer())) && !sender.hasPermission(Permission.TOGGLE_BYPASS)) return new PlayerHasIncomingDisabledError(Objects.requireNonNull(recipient.get().getName())).send(sender);
2931
if (
3032
!recipient.get().getUniqueId().equals(Message.console.getUniqueId())
3133
&& (
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package pro.cloudnode.smp.cloudnodemsg.command;
2+
3+
import org.bukkit.OfflinePlayer;
4+
import org.bukkit.command.CommandSender;
5+
import org.bukkit.entity.Player;
6+
import org.jetbrains.annotations.NotNull;
7+
import org.jetbrains.annotations.Nullable;
8+
import pro.cloudnode.smp.cloudnodemsg.CloudnodeMSG;
9+
import pro.cloudnode.smp.cloudnodemsg.Permission;
10+
import pro.cloudnode.smp.cloudnodemsg.error.NeverJoinedError;
11+
import pro.cloudnode.smp.cloudnodemsg.error.NoPermissionError;
12+
import pro.cloudnode.smp.cloudnodemsg.error.NotPlayerError;
13+
import pro.cloudnode.smp.cloudnodemsg.message.Message;
14+
15+
import java.util.ArrayList;
16+
import java.util.List;
17+
import java.util.Optional;
18+
19+
public final class ToggleMessageCommand extends Command {
20+
@Override
21+
public boolean run(@NotNull CommandSender sender, @NotNull String label, @NotNull String[] args) {
22+
if (!sender.hasPermission(Permission.TOGGLE) || (args.length == 1 && !sender.hasPermission(Permission.TOGGLE_OTHER)))
23+
return new NoPermissionError().send(sender);
24+
if (args.length == 1) {
25+
final @NotNull OfflinePlayer recipient = CloudnodeMSG.getInstance().getServer().getOfflinePlayer(args[0]);
26+
27+
if (recipient.getPlayer() == null)
28+
return new NeverJoinedError(Optional.ofNullable(recipient.getName()).orElse("Unknown Player")).send(sender);
29+
30+
if (Message.isIncomingEnabled(recipient.getPlayer())) {
31+
Message.incomingDisable(recipient.getPlayer());
32+
return sendMessage(sender, CloudnodeMSG.getInstance().config().toggleDisableOther(Optional.of(recipient.getPlayer().getName()).orElse("Unknown Player")));
33+
}
34+
35+
Message.incomingEnable(recipient.getPlayer());
36+
return sendMessage(sender, CloudnodeMSG.getInstance().config().toggleEnableOther(Optional.of(recipient.getPlayer().getName()).orElse("Unknown Player")));
37+
}
38+
if (!(sender instanceof final @NotNull Player player)) return new NotPlayerError().send(sender);
39+
40+
if (Message.isIncomingEnabled(player)) {
41+
Message.incomingDisable(player);
42+
return sendMessage(sender, CloudnodeMSG.getInstance().config().toggleDisable());
43+
}
44+
45+
Message.incomingEnable(player);
46+
return sendMessage(sender, CloudnodeMSG.getInstance().config().toggleEnable());
47+
}
48+
49+
@Override
50+
public @Nullable List<String> onTabComplete(@NotNull CommandSender sender, org.bukkit.command.@NotNull Command command, @NotNull String s, @NotNull String[] strings) {
51+
if (sender.hasPermission(Permission.TOGGLE_OTHER))
52+
return null;
53+
return new ArrayList<>();
54+
}
55+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package pro.cloudnode.smp.cloudnodemsg.error;
2+
3+
import org.jetbrains.annotations.NotNull;
4+
import pro.cloudnode.smp.cloudnodemsg.CloudnodeMSG;
5+
6+
public class PlayerHasIncomingDisabledError extends Error {
7+
public PlayerHasIncomingDisabledError(final @NotNull String player) {
8+
super(CloudnodeMSG.getInstance().config().incomingDisabled(player));
9+
}
10+
}

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

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import org.bukkit.OfflinePlayer;
66
import org.bukkit.command.CommandSender;
77
import org.bukkit.entity.Player;
8-
import org.bukkit.persistence.PersistentDataContainer;
98
import org.bukkit.persistence.PersistentDataType;
109
import org.jetbrains.annotations.NotNull;
1110
import org.jetbrains.annotations.Nullable;
@@ -134,4 +133,33 @@ public static void unignore(final @NotNull Player player, final @NotNull Offline
134133
ignoredPlayers.remove(ignored.getUniqueId());
135134
player.getPersistentDataContainer().set(IGNORED_PLAYERS, PersistentDataType.STRING, String.join(";", ignoredPlayers.stream().map(UUID::toString).toList()));
136135
}
136+
137+
public static final @NotNull NamespacedKey INCOMING_ENABLED = new NamespacedKey(CloudnodeMSG.getInstance(), "incoming_enabled");
138+
139+
/**
140+
* Allows player to receive private messages
141+
*
142+
* @param player The player
143+
*/
144+
public static void incomingEnable(final @NotNull Player player) {
145+
player.getPersistentDataContainer().set(INCOMING_ENABLED, PersistentDataType.BOOLEAN, true);
146+
}
147+
148+
/**
149+
* Denies player to receive private messages
150+
*
151+
* @param player The player
152+
*/
153+
public static void incomingDisable(final @NotNull Player player) {
154+
player.getPersistentDataContainer().set(INCOMING_ENABLED, PersistentDataType.BOOLEAN, false);
155+
}
156+
157+
/**
158+
* Check if a player allows private messages
159+
*
160+
* @param player The player
161+
*/
162+
public static boolean isIncomingEnabled(final @NotNull Player player) {
163+
return player.getPersistentDataContainer().getOrDefault(INCOMING_ENABLED, PersistentDataType.BOOLEAN, true);
164+
}
137165
}

src/main/resources/config.yml

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,20 @@ usage: "<yellow>(!) Usage:</yellow> <white>/<command> <usage></white>"
3030
# Plugin reloaded
3131
reloaded: "<green>(!) Plugin successfully reloaded.</green>"
3232

33+
toggle:
34+
disable:
35+
# Disable private messages
36+
message: "<yellow>(!) You've disabled private messages. Run again to re-enable.</yellow>"
37+
# Placeholders:
38+
# <player> - the player's username
39+
other: "<green>(!) Disabled private messages for <gray><player></gray>.</green>"
40+
enable:
41+
# Enable private messages
42+
message: "<green>(!) You can now receive private messages again.</green>"
43+
# Placeholders:
44+
# <player> - the player's username
45+
other: "<green>(!) Re-enabled private messages for <gray><player></gray>.</green>"
46+
3347
# Error messages
3448
errors:
3549
# No permission
@@ -69,3 +83,8 @@ errors:
6983
# Placeholders:
7084
# <player> - the player's username
7185
never-joined: "<red>(!) <gray><player></gray> has never joined this server.</red>"
86+
87+
# Target player have disabled their incoming private messages.
88+
# Placeholders:
89+
# <player> - the player's username
90+
incoming-disabled: "<red>(!) You cannot message <gray><player></gray> because they have disabled private messages.</red>"

src/main/resources/plugin.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,3 +23,7 @@ commands:
2323
description: Unignore a player
2424
usage: /<command> <player>
2525
aliases: [ "unblock" ]
26+
togglemsg:
27+
description: Toggles private messages from a player
28+
usage: /<command> <player>
29+
aliases: [ "toggledms", "togglepms" ]

0 commit comments

Comments
 (0)