Skip to content

Commit 88cdb64

Browse files
committed
Merge branch 'main' into 10-add-dm-channels
2 parents 50e55c1 + f6e5326 commit 88cdb64

File tree

10 files changed

+185
-0
lines changed

10 files changed

+185
-0
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
@@ -172,6 +172,40 @@ public PluginConfig(final @NotNull FileConfiguration config) {
172172
return Objects.requireNonNull(config.getString("console-name"));
173173
}
174174

175+
public @NotNull Component toggleDisable() {
176+
return MiniMessage.miniMessage().deserialize(Objects.requireNonNull(config.getString("toggle.disable.message")));
177+
}
178+
179+
/**
180+
* Player's private messages have been toggled off
181+
* <p>Placeholders:</p>
182+
* <ul><li>{@code <player>} - the player's username</li></ul>
183+
*
184+
* @param player the player's username
185+
*/
186+
public @NotNull Component toggleDisableOther(final @NotNull String player) {
187+
return MiniMessage.miniMessage().deserialize(Objects.requireNonNull(config.getString("toggle.disable.other")),
188+
Placeholder.unparsed("player", player)
189+
);
190+
}
191+
192+
public @NotNull Component toggleEnable() {
193+
return MiniMessage.miniMessage().deserialize(Objects.requireNonNull(config.getString("toggle.enable.message")));
194+
}
195+
196+
/**
197+
* Player's private messages have been toggled on
198+
* <p>Placeholders:</p>
199+
* <ul><li>{@code <player>} - the player's username</li></ul>
200+
*
201+
* @param player the player's username
202+
*/
203+
public @NotNull Component toggleEnableOther(final @NotNull String player) {
204+
return MiniMessage.miniMessage().deserialize(Objects.requireNonNull(config.getString("toggle.enable.other")),
205+
Placeholder.unparsed("player", player)
206+
);
207+
}
208+
175209
/**
176210
* No permission
177211
*/
@@ -265,5 +299,18 @@ public PluginConfig(final @NotNull FileConfiguration config) {
265299
Placeholder.unparsed("player", player)
266300
);
267301
}
302+
303+
/**
304+
* Target player have disabled their incoming private messages.
305+
* <p>Placeholders:</p>
306+
* <ul><li>{@code <player>} - the player's username</li></ul>
307+
*
308+
* @param player The player's username
309+
*/
310+
public @NotNull Component incomingDisabled(final @NotNull String player) {
311+
return MiniMessage.miniMessage().deserialize(Objects.requireNonNull(config.getString("errors.incoming-disabled")),
312+
Placeholder.unparsed("player", player)
313+
);
314+
}
268315
}
269316

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

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

1617
import java.util.ArrayList;
@@ -36,6 +37,7 @@ public boolean run(final @NotNull CommandSender sender, final @NotNull String la
3637
if (recipient.isEmpty() || (CloudnodeMSG.isVanished(recipient.get()) && !sender.hasPermission(Permission.SEND_VANISHED))) return new PlayerNotFoundError(args[0]).send(sender);
3738
if (sender instanceof final @NotNull Player player && recipient.get().getUniqueId().equals(player.getUniqueId()))
3839
return new MessageYourselfError().send(sender);
40+
if (!Message.isIncomingEnabled(recipient.get()) && !sender.hasPermission(Permission.TOGGLE_BYPASS)) return new PlayerHasIncomingDisabledError(recipient.get().getName()).send(sender);
3941

4042
if (args.length == 1) {
4143
final @NotNull Player player = (Player) sender;

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 & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,35 @@ public static void unignore(final @NotNull Player player, final @NotNull Offline
153153
player.getPersistentDataContainer().set(IGNORED_PLAYERS, PersistentDataType.STRING, String.join(";", ignoredPlayers.stream().map(UUID::toString).toList()));
154154
}
155155

156+
public static final @NotNull NamespacedKey INCOMING_ENABLED = new NamespacedKey(CloudnodeMSG.getInstance(), "incoming_enabled");
157+
158+
/**
159+
* Allows player to receive private messages
160+
*
161+
* @param player The player
162+
*/
163+
public static void incomingEnable(final @NotNull Player player) {
164+
player.getPersistentDataContainer().set(INCOMING_ENABLED, PersistentDataType.BOOLEAN, true);
165+
}
166+
167+
/**
168+
* Denies player to receive private messages
169+
*
170+
* @param player The player
171+
*/
172+
public static void incomingDisable(final @NotNull Player player) {
173+
player.getPersistentDataContainer().set(INCOMING_ENABLED, PersistentDataType.BOOLEAN, false);
174+
}
175+
176+
/**
177+
* Check if a player allows private messages
178+
*
179+
* @param player The player
180+
*/
181+
public static boolean isIncomingEnabled(final @NotNull Player player) {
182+
return player.getPersistentDataContainer().getOrDefault(INCOMING_ENABLED, PersistentDataType.BOOLEAN, true);
183+
}
184+
156185
/**
157186
* Create DM channel to player
158187
*

src/main/resources/config.yml

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

51+
toggle:
52+
disable:
53+
# Disable private messages
54+
message: "<yellow>(!) You've disabled private messages. Run again to re-enable.</yellow>"
55+
# Placeholders:
56+
# <player> - the player's username
57+
other: "<green>(!) Disabled private messages for <gray><player></gray>.</green>"
58+
enable:
59+
# Enable private messages
60+
message: "<green>(!) You can now receive private messages again.</green>"
61+
# Placeholders:
62+
# <player> - the player's username
63+
other: "<green>(!) Re-enabled private messages for <gray><player></gray>.</green>"
64+
5165
# Error messages
5266
errors:
5367
# No permission
@@ -87,3 +101,8 @@ errors:
87101
# Placeholders:
88102
# <player> - the player's username
89103
never-joined: "<red>(!) <gray><player></gray> has never joined this server.</red>"
104+
105+
# Target player have disabled their incoming private messages.
106+
# Placeholders:
107+
# <player> - the player's username
108+
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)