55import org .bukkit .OfflinePlayer ;
66import org .bukkit .command .CommandSender ;
77import org .bukkit .entity .Player ;
8+ import org .bukkit .persistence .PersistentDataContainer ;
89import org .bukkit .persistence .PersistentDataType ;
910import org .jetbrains .annotations .NotNull ;
1011import org .jetbrains .annotations .Nullable ;
1112import pro .cloudnode .smp .cloudnodemsg .CloudnodeMSG ;
1213import pro .cloudnode .smp .cloudnodemsg .error .InvalidPlayerError ;
1314
15+ import java .util .Arrays ;
16+ import java .util .HashSet ;
1417import java .util .Objects ;
1518import java .util .Optional ;
1619import java .util .UUID ;
@@ -32,10 +35,11 @@ public void send() throws InvalidPlayerError {
3235 final @ NotNull String recipientUsername = playerOrServerUsername (this .recipient );
3336
3437 sendMessage (sender , CloudnodeMSG .getInstance ().config ().outgoing (senderUsername , recipientUsername , message ));
38+ setReplyTo (sender , recipient );
39+
40+ if (recipient .isOnline () && Message .isIgnored (Objects .requireNonNull (recipient .getPlayer ()), sender )) return ;
3541 sendMessage (recipient , CloudnodeMSG .getInstance ().config ()
3642 .incoming (senderUsername , recipientUsername , message ));
37-
38- setReplyTo (sender , recipient );
3943 setReplyTo (recipient , sender );
4044 }
4145
@@ -78,4 +82,51 @@ public static void removeReplyTo(final @NotNull OfflinePlayer player) {
7882 else if (player .isOnline ())
7983 Objects .requireNonNull (player .getPlayer ()).getPersistentDataContainer ().remove (REPLY_TO );
8084 }
85+
86+ public static final @ NotNull NamespacedKey IGNORED_PLAYERS = new NamespacedKey (CloudnodeMSG .getInstance (), "ignored" );
87+
88+ /**
89+ * Get UUID set of ignored players from PDC string
90+ *
91+ * @param player The player
92+ */
93+ public static @ NotNull HashSet <@ NotNull UUID > getIgnored (final @ NotNull Player player ) {
94+ final @ NotNull Optional <@ NotNull String > str = Optional .ofNullable (player .getPersistentDataContainer ().get (IGNORED_PLAYERS , PersistentDataType .STRING ));
95+ return str .map (s -> new HashSet <>(Arrays .stream (s .split (";" )).filter (e -> !e .isEmpty ()).map (UUID ::fromString ).toList ()))
96+ .orElseGet (HashSet ::new );
97+ }
98+
99+ /**
100+ * Check if a player is ignored
101+ *
102+ * @param player The player
103+ * @param ignored The ignored player
104+ */
105+ public static boolean isIgnored (final @ NotNull Player player , final @ NotNull OfflinePlayer ignored ) {
106+ return getIgnored (player ).contains (ignored .getUniqueId ());
107+ }
108+
109+ /**
110+ * Ignore a player
111+ *
112+ * @param player The player
113+ * @param ignore The player to ignore
114+ */
115+ public static void ignore (final @ NotNull Player player , final @ NotNull OfflinePlayer ignore ) {
116+ final @ NotNull HashSet <@ NotNull UUID > ignoredPlayers = getIgnored (player );
117+ ignoredPlayers .add (ignore .getUniqueId ());
118+ player .getPersistentDataContainer ().set (IGNORED_PLAYERS , PersistentDataType .STRING , String .join (";" , ignoredPlayers .stream ().map (UUID ::toString ).toList ()));
119+ }
120+
121+ /**
122+ * Unignore a player
123+ *
124+ * @param player The player
125+ * @param ignored The player to unignore
126+ */
127+ public static void unignore (final @ NotNull Player player , final @ NotNull OfflinePlayer ignored ) {
128+ final @ NotNull HashSet <@ NotNull UUID > ignoredPlayers = getIgnored (player );
129+ ignoredPlayers .remove (ignored .getUniqueId ());
130+ player .getPersistentDataContainer ().set (IGNORED_PLAYERS , PersistentDataType .STRING , String .join (";" , ignoredPlayers .stream ().map (UUID ::toString ).toList ()));
131+ }
81132}
0 commit comments