Skip to content

Commit 1ba07b2

Browse files
committed
ignore & unignore command
1 parent b7955f9 commit 1ba07b2

File tree

10 files changed

+197
-1
lines changed

10 files changed

+197
-1
lines changed

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,11 @@
44
import org.bukkit.metadata.MetadataValue;
55
import org.bukkit.plugin.java.JavaPlugin;
66
import org.jetbrains.annotations.NotNull;
7+
import pro.cloudnode.smp.cloudnodemsg.command.IgnoreCommand;
78
import pro.cloudnode.smp.cloudnodemsg.command.MainCommand;
89
import pro.cloudnode.smp.cloudnodemsg.command.MessageCommand;
910
import pro.cloudnode.smp.cloudnodemsg.command.ReplyCommand;
11+
import pro.cloudnode.smp.cloudnodemsg.command.UnIgnoreCommand;
1012

1113
import java.util.Objects;
1214

@@ -28,6 +30,8 @@ public void onEnable() {
2830
Objects.requireNonNull(getCommand("cloudnodemsg")).setExecutor(new MainCommand());
2931
Objects.requireNonNull(getCommand("message")).setExecutor(new MessageCommand());
3032
Objects.requireNonNull(getCommand("reply")).setExecutor(new ReplyCommand());
33+
Objects.requireNonNull(getCommand("ignore")).setExecutor(new IgnoreCommand());
34+
Objects.requireNonNull(getCommand("unignore")).setExecutor(new UnIgnoreCommand());
3135
}
3236

3337
@Override

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,9 @@ public final class Permission {
1717
* Allows sending messages to vanished players
1818
*/
1919
public final static @NotNull String SEND_VANISHED = "cloudnodemsg.send.vanished";
20+
21+
/**
22+
* Allows ignoring and unignoring players
23+
*/
24+
public final static @NotNull String IGNORE = "cloudnodemsg.ignore";
2025
}

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

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,32 @@ public PluginConfig(final @NotNull FileConfiguration config) {
5757
);
5858
}
5959

60+
/**
61+
* Player has successfully been ignored
62+
* <p>Placeholders:</p>
63+
* <ul><li>{@code <player>} - the username of the player</li></ul>
64+
*
65+
* @param player The username of the player
66+
*/
67+
public @NotNull Component ignored(final @NotNull String player) {
68+
return MiniMessage.miniMessage().deserialize(Objects.requireNonNull(config.getString("ignored")),
69+
Placeholder.unparsed("player", player)
70+
);
71+
}
72+
73+
/**
74+
* Player has successfully been unignored
75+
* <p>Placeholders:</p>
76+
* <ul><li>{@code <player>} - the username of the player</li></ul>
77+
*
78+
* @param player The username of the player
79+
*/
80+
public @NotNull Component unignored(final @NotNull String player) {
81+
return MiniMessage.miniMessage().deserialize(Objects.requireNonNull(config.getString("unignored")),
82+
Placeholder.unparsed("player", player)
83+
);
84+
}
85+
6086
/**
6187
* Command usage format
6288
* <p>Placeholders:</p>
@@ -136,5 +162,25 @@ public PluginConfig(final @NotNull FileConfiguration config) {
136162
Placeholder.unparsed("player", player)
137163
);
138164
}
165+
166+
/**
167+
* Only players can use this command
168+
*/
169+
public @NotNull Component notPlayer() {
170+
return MiniMessage.miniMessage().deserialize(Objects.requireNonNull(config.getString("errors.not-player")));
171+
}
172+
173+
/**
174+
* That player is not ignored
175+
* <p>Placeholders:</p>
176+
* <ul><li>{@code <player>} - the player's username</li></ul>
177+
*
178+
* @param player The player's username
179+
*/
180+
public @NotNull Component notIgnored(final @NotNull String player) {
181+
return MiniMessage.miniMessage().deserialize(Objects.requireNonNull(config.getString("errors.not-ignored")),
182+
Placeholder.unparsed("player", player)
183+
);
184+
}
139185
}
140186

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import org.jetbrains.annotations.NotNull;
88

99
public abstract class Command implements TabCompleter, CommandExecutor {
10-
public boolean sendMessage(final @NotNull Audience recipient, final @NotNull Component message) {
10+
public static boolean sendMessage(final @NotNull Audience recipient, final @NotNull Component message) {
1111
recipient.sendMessage(message);
1212
return true;
1313
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
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.NoPermissionError;
11+
import pro.cloudnode.smp.cloudnodemsg.error.NotPlayerError;
12+
import pro.cloudnode.smp.cloudnodemsg.message.Message;
13+
14+
import java.util.ArrayList;
15+
import java.util.List;
16+
import java.util.Optional;
17+
18+
public final class IgnoreCommand extends Command {
19+
public static final @NotNull String usage = "<player>";
20+
21+
@Override
22+
public boolean onCommand(final @NotNull CommandSender sender, final @NotNull org.bukkit.command.Command command, final @NotNull String label, @NotNull String @NotNull [] args) {
23+
if (!sender.hasPermission(Permission.IGNORE)) return new NoPermissionError().send(sender);
24+
if (!(sender instanceof final @NotNull Player player)) return new NotPlayerError().send(sender);
25+
if (args.length == 0) return sendMessage(sender, CloudnodeMSG.getInstance().config().usage(label, usage));
26+
final @NotNull OfflinePlayer target = CloudnodeMSG.getInstance().getServer().getOfflinePlayer(args[0]);
27+
if (Message.isIgnored(player, target)) return unignore(player, target);
28+
return ignore(player, target);
29+
}
30+
31+
public static boolean ignore(final @NotNull Player player, final @NotNull OfflinePlayer target) {
32+
Message.ignore(player, target);
33+
return sendMessage(player, CloudnodeMSG.getInstance().config().ignored(Optional.ofNullable(target.getName()).orElse("Unknown Player")));
34+
}
35+
36+
public static boolean unignore(final @NotNull Player player, final @NotNull OfflinePlayer target) {
37+
Message.unignore(player, target);
38+
return sendMessage(player, CloudnodeMSG.getInstance().config().unignored(Optional.ofNullable(target.getName()).orElse("Unknown Player")));
39+
}
40+
41+
@Override
42+
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) {
43+
if (args.length == 1 && sender.hasPermission(Permission.IGNORE) && sender instanceof Player) return null;
44+
return new ArrayList<>();
45+
}
46+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package pro.cloudnode.smp.cloudnodemsg.command;
2+
3+
import org.bukkit.OfflinePlayer;
4+
import org.bukkit.Server;
5+
import org.bukkit.command.CommandSender;
6+
import org.bukkit.entity.Player;
7+
import org.jetbrains.annotations.NotNull;
8+
import org.jetbrains.annotations.Nullable;
9+
import pro.cloudnode.smp.cloudnodemsg.CloudnodeMSG;
10+
import pro.cloudnode.smp.cloudnodemsg.Permission;
11+
import pro.cloudnode.smp.cloudnodemsg.error.NoPermissionError;
12+
import pro.cloudnode.smp.cloudnodemsg.error.NotIgnoredError;
13+
import pro.cloudnode.smp.cloudnodemsg.error.NotPlayerError;
14+
import pro.cloudnode.smp.cloudnodemsg.message.Message;
15+
16+
import java.util.ArrayList;
17+
import java.util.HashSet;
18+
import java.util.List;
19+
import java.util.Objects;
20+
import java.util.UUID;
21+
22+
public final class UnIgnoreCommand extends Command {
23+
public static final @NotNull String usage = "<player>";
24+
25+
@Override
26+
public boolean onCommand(final @NotNull CommandSender sender, final @NotNull org.bukkit.command.Command command, final @NotNull String label, @NotNull String @NotNull [] args) {
27+
if (!sender.hasPermission(Permission.IGNORE)) return new NoPermissionError().send(sender);
28+
if (!(sender instanceof final @NotNull Player player)) return new NotPlayerError().send(sender);
29+
if (args.length == 0) return sendMessage(sender, CloudnodeMSG.getInstance().config().usage(label, usage));
30+
final @NotNull OfflinePlayer target = CloudnodeMSG.getInstance().getServer().getOfflinePlayer(args[0]);
31+
if (Message.isIgnored(player, target)) return IgnoreCommand.unignore(player, target);
32+
return new NotIgnoredError(args[0]).send(sender);
33+
}
34+
35+
@Override
36+
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) {
37+
if (args.length == 1 && sender.hasPermission(Permission.IGNORE) && sender instanceof final @NotNull Player player) {
38+
final @NotNull HashSet<@NotNull UUID> ignored = Message.getIgnored(player);
39+
final @NotNull Server server = CloudnodeMSG.getInstance().getServer();
40+
return new ArrayList<>(ignored.stream().map(u -> server.getOfflinePlayer(u).getName())
41+
.filter(Objects::nonNull).filter(n -> n.toLowerCase().startsWith(args[0].toLowerCase())).toList());
42+
}
43+
return new ArrayList<>();
44+
}
45+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package pro.cloudnode.smp.cloudnodemsg.error;
2+
3+
import org.jetbrains.annotations.NotNull;
4+
import pro.cloudnode.smp.cloudnodemsg.CloudnodeMSG;
5+
6+
/**
7+
* That player is not ignored
8+
*/
9+
public final class NotIgnoredError extends Error {
10+
public NotIgnoredError(final @NotNull String player) {
11+
super(CloudnodeMSG.getInstance().config().notIgnored(player));
12+
}
13+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package pro.cloudnode.smp.cloudnodemsg.error;
2+
3+
import pro.cloudnode.smp.cloudnodemsg.CloudnodeMSG;
4+
5+
/**
6+
* Only players can use this command
7+
*/
8+
public final class NotPlayerError extends Error {
9+
public NotPlayerError() {
10+
super(CloudnodeMSG.getInstance().config().notPlayer());
11+
}
12+
}

src/main/resources/config.yml

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,15 @@ incoming: '<click:suggest_command:/msg <sender> ><dark_gray>[<#60a5fa><sender></
99
# Same placeholders as incoming
1010
outgoing: '<click:suggest_command:/msg <recipient> ><dark_gray>[<#93c5fd>me</#93c5fd> <white>-></white> <#60a5fa><recipient></#60a5fa>]</dark_gray></click> <reset><#dbeafe><message></#dbeafe>'
1111

12+
# Player has successfully been ignored
13+
# Placeholders:
14+
# <player> - the player's username
15+
ignored: "<green>(!) You will no longer see messages from <gray><player></gray>.</green>"
16+
17+
# Player has successfully been unignored
18+
# Same placeholders as ignored
19+
unignored: "<yellow>(!) You are no longer ignoring <gray><player></gray>.</yellow>"
20+
1221
# Name for console/server that should appear as <sender> or <recipient> in messages
1322
console-name: "Server"
1423

@@ -42,3 +51,11 @@ errors:
4251
# Placeholders:
4352
# <player> - the player's username
4453
reply-offline: "<red>(!) Player <gray><player></gray> is no longer online.</red>"
54+
55+
# Only players can use this command
56+
not-player: "<red>(!) You must be a player to use this command.</red>"
57+
58+
# That player is not ignored
59+
# Placeholders:
60+
# <player> - the player's username
61+
not-ignored: "<red>(!) You are not ignoring that player.</red>"

src/main/resources/plugin.yml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,11 @@ commands:
1515
cloudnodemsg:
1616
description: CloudnodeMSG
1717
usage: /<command>
18+
ignore:
19+
description: Ignore a player
20+
usage: /<command> <player>
21+
aliases: [ "block" ]
22+
unignore:
23+
description: Unignore a player
24+
usage: /<command> <player>
25+
aliases: [ "unblock" ]

0 commit comments

Comments
 (0)