Skip to content

Commit bb3ae64

Browse files
committed
that's what we call "memory leak" here - YHT
1 parent 528a9a6 commit bb3ae64

File tree

10 files changed

+252
-15
lines changed

10 files changed

+252
-15
lines changed

pom.xml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,6 @@
6666
<id>sonatype</id>
6767
<url>https://oss.sonatype.org/content/groups/public/</url>
6868
</repository>
69-
7069
</repositories>
7170

7271
<dependencies>

src/main/java/adhdmc/simplepms/SimplePMs.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import org.bukkit.plugin.java.JavaPlugin;
1313

1414
import java.util.HashSet;
15+
import java.util.Objects;
1516

1617
public final class SimplePMs extends JavaPlugin {
1718

@@ -45,12 +46,13 @@ public static boolean isPapiEnabled() {
4546
}
4647

4748
private void registerCommands() {
48-
this.getCommand("msg").setExecutor(new PrivateMessage());
49-
this.getCommand("reply").setExecutor(new ReplyCommand());
50-
this.getCommand("socialspy").setExecutor(new SocialSpyCommand());
51-
this.getCommand("spmreload").setExecutor(new ReloadCommand());
49+
Objects.requireNonNull(this.getCommand("msg")).setExecutor(new PrivateMessage());
50+
Objects.requireNonNull(this.getCommand("reply")).setExecutor(new ReplyCommand());
51+
Objects.requireNonNull(this.getCommand("socialspy")).setExecutor(new SocialSpyCommand());
52+
Objects.requireNonNull(this.getCommand("spmreload")).setExecutor(new ReloadCommand());
5253
}
5354

55+
5456
private static final HashSet<Player> spyingPlayers = new HashSet<>();
5557

5658
public static HashSet<Player> getSpyingPlayers() {

src/main/java/adhdmc/simplepms/config/LocaleConfig.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,19 @@ private LocaleConfig() {
2323
reloadLocale();
2424
}
2525

26+
/**
27+
* Gets the LocaleConfig instance, instantiates it if it has not been already
28+
* @return LocaleConfig
29+
*/
2630
public static LocaleConfig getInstance() {
2731
if (instance == null) instance = new LocaleConfig();
2832
return instance;
2933
}
3034

35+
/**
36+
* gets the Locale config
37+
* @return FileConfiguration
38+
*/
3139
public FileConfiguration getLocale() { return localeConfig; }
3240

3341
/**

src/main/java/adhdmc/simplepms/events/PrivateMessageEvent.java

Lines changed: 41 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,19 @@
77
import org.bukkit.event.HandlerList;
88
import org.jetbrains.annotations.NotNull;
99

10+
import java.util.Collections;
1011
import java.util.HashSet;
12+
import java.util.Set;
1113

14+
/**
15+
* Called when a private message is sent
16+
*/
1217
public class PrivateMessageEvent extends Event implements Cancellable {
18+
private final CommandSender initiator;
19+
private final CommandSender recipient;
20+
private final String messageContent;
21+
private final HashSet<Player> spyingPlayers;
22+
private boolean cancelled;
1323
private static final HandlerList handlers = new HandlerList();
1424
public PrivateMessageEvent(CommandSender initiator, CommandSender recipient, String messageContent, HashSet<Player> spyingPlayers) {
1525
this.initiator = initiator;
@@ -21,36 +31,59 @@ public PrivateMessageEvent(CommandSender initiator, CommandSender recipient, Str
2131
public @NotNull HandlerList getHandlers() {
2232
return handlers;
2333
}
34+
35+
/**
36+
* Gets the handlerList for this event
37+
* @return HandlerList
38+
*/
2439
public static HandlerList getHandlerList() {
2540
return handlers;
2641
}
2742

28-
private CommandSender initiator;
29-
private CommandSender recipient;
30-
private String messageContent;
31-
private HashSet<Player> spyingPlayers;
32-
private boolean cancelled;
33-
43+
/**
44+
* Gets the CommandSender who sent the message
45+
* @return CommandSender
46+
*/
3447
public CommandSender getInitiator() {
3548
return initiator;
3649
}
3750

51+
/**
52+
* Gets the CommandSender who is to receive the message
53+
* @return CommandSender
54+
*/
3855
public CommandSender getRecipient() {
3956
return recipient;
4057
}
4158

59+
/**
60+
* Gets the content of the message being sent
61+
* @return String
62+
*/
4263
public String getMessageContent() {
4364
return messageContent;
4465
}
4566

46-
public HashSet<Player> getSpyingPlayers() {
47-
return spyingPlayers;
67+
/**
68+
* Gets the list of players who currently have SocialSpy toggled on
69+
* @return {@code Set<Player>}
70+
*/
71+
public Set<Player> getSpyingPlayers() {
72+
return Collections.unmodifiableSet(spyingPlayers);
4873
}
4974

75+
/**
76+
* Checks whether this event has been cancelled
77+
* @return boolean
78+
*/
5079
public boolean isCancelled() {
5180
return cancelled;
5281
}
5382

83+
/**
84+
* Sets whether this event should be cancelled
85+
* @param cancel boolean
86+
*/
5487
public void setCancelled(boolean cancel) {
5588
cancelled = cancel;
5689
}

src/main/java/adhdmc/simplepms/handling/MessageHandling.java

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,23 @@ public static MessageHandling getInstance() {
2626
NamespacedKey lastMessaged = SPMKey.LAST_MESSAGED.getKey();
2727
Component consoleChatComponent = SimplePMs.getMiniMessage().deserialize(Message.CONSOLE_FORMAT.getMessage());
2828
Component consoleSpyComponent = SimplePMs.getMiniMessage().deserialize(Message.CONSOLE_FORMAT_SPY.getMessage());
29+
30+
/**
31+
* Calls the message event and handles socialspy for a message between 2 players.
32+
* <br>Sends messageContent to Resolvers.
33+
* <br>Uses Message keys:
34+
* <ul><li>RECEIVING_FORMAT
35+
* <li>SENDING_FORMAT
36+
* <li>SPY_FORMAT</ul>
37+
* @param initiator Player
38+
* @param recipient Player
39+
* @param messageContent String
40+
*/
2941
public void playerSenderAndReceiver(Player initiator, Player recipient, String messageContent) {
3042
// Calls private message event so other plugins can interact with this
3143
PrivateMessageEvent event = new PrivateMessageEvent(initiator, recipient, messageContent, spyingPlayers);
3244
Bukkit.getServer().getPluginManager().callEvent(event);
45+
if (event.isCancelled()) return;
3346
initiator.getPersistentDataContainer().set(lastMessaged, PersistentDataType.STRING, recipient.getName());
3447
recipient.getPersistentDataContainer().set(lastMessaged, PersistentDataType.STRING, initiator.getName());
3548
initiator.sendMessage(Resolvers.getInstance().parseMessagePlayerToPlayer(Message.SENDING_FORMAT.getMessage(), initiator, recipient, messageContent));
@@ -41,10 +54,24 @@ public void playerSenderAndReceiver(Player initiator, Player recipient, String m
4154
}
4255
}
4356

57+
/**
58+
* Calls the message event and handles socialspy for a message sent by the console, and received by a player
59+
* <br>Sends messageContent to Resolvers.
60+
* <br>Uses Message keys:
61+
* <ul><li>RECEIVING_FORMAT
62+
* <li>SENDING_FORMAT
63+
* <li>CONSOLE_FORMAT
64+
* <li>SPY_FORMAT
65+
* <li>CONSOLE_FORMAT_SPY</ul>
66+
* @param initiator CommandSender
67+
* @param recipient Player
68+
* @param messageContent String
69+
*/
4470
public void consoleSenderPlayerReceiver(CommandSender initiator, Player recipient, String messageContent) {
4571
// Call Event
4672
PrivateMessageEvent event = new PrivateMessageEvent(initiator, recipient, messageContent, spyingPlayers);
4773
Bukkit.getServer().getPluginManager().callEvent(event);
74+
if (event.isCancelled()) return;
4875
recipient.getPersistentDataContainer().set(lastMessaged, PersistentDataType.STRING, Message.PDC_CONSOLE.getMessage());
4976
recipient.sendMessage(Resolvers.getInstance().parseMessageConsoleToPlayer(Message.RECEIVING_FORMAT.getMessage(), consoleChatComponent, recipient, messageContent));
5077
initiator.sendMessage(Resolvers.getInstance().parseMessageConsoleToPlayer(Message.SENDING_FORMAT.getMessage(), consoleChatComponent, recipient, messageContent));
@@ -57,6 +84,19 @@ public void consoleSenderPlayerReceiver(CommandSender initiator, Player recipien
5784
}
5885

5986

87+
/**
88+
* Calls the message event and handles socialspy for a message sent by a player to the console.
89+
* <br>Sends messageContent to Resolvers.
90+
* <br>Uses Message keys:
91+
* <ul><li>ERROR_PLAYER_COMMAND
92+
* <li>SENDING_FORMAT
93+
* <li>CONSOLE_FORMAT
94+
* <li>SPY_FORMAT
95+
* <li>CONSOLE_FORMAT_SPY</ul>
96+
* @param initiator CommandSender
97+
* @param messageContent String
98+
*/
99+
60100
public void playerSenderConsoleReceiver(CommandSender initiator, String messageContent) {
61101
if (!(initiator instanceof Player initiatingPlayer)){
62102
initiator.sendMessage(Resolvers.getInstance().parsePluginPrefix(Message.ERROR_PLAYER_COMMAND.getMessage()));
@@ -65,6 +105,7 @@ public void playerSenderConsoleReceiver(CommandSender initiator, String messageC
65105
// Call Event
66106
PrivateMessageEvent event = new PrivateMessageEvent(initiator, Bukkit.getConsoleSender(), messageContent, spyingPlayers);
67107
Bukkit.getServer().getPluginManager().callEvent(event);
108+
if (event.isCancelled()) return;
68109
initiatingPlayer.getPersistentDataContainer().set(lastMessaged, PersistentDataType.STRING, Message.PDC_CONSOLE.getMessage());
69110
initiatingPlayer.sendMessage(Resolvers.getInstance().parseMessagePlayerToConsole(Message.SENDING_FORMAT.getMessage(), initiatingPlayer, consoleChatComponent, messageContent));
70111
for (Player spy : spyingPlayers) {

src/main/java/adhdmc/simplepms/handling/Resolvers.java

Lines changed: 58 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,20 @@ public static Resolvers getInstance() {
4141
});
4242
}
4343

44+
45+
/**
46+
* Parses a message between 2 players. Will parse PAPI placeholders if placeholderAPI is on the server
47+
* Uses the default placeholders:
48+
* <ul><li>{@code <plugin_prefix>}
49+
* <li>{@code <target>}
50+
* <li>{@code <initiator>}
51+
* <li>{@code <message>}</ul>
52+
* @param message String
53+
* @param initiator Player
54+
* @param target Player
55+
* @param messageContent String
56+
* @return Component
57+
*/
4458
public Component parseMessagePlayerToPlayer(String message, Player initiator, Player target, String messageContent){
4559
if (papiEnabled) {
4660
return miniMessage.deserialize(message,
@@ -59,6 +73,20 @@ public Component parseMessagePlayerToPlayer(String message, Player initiator, Pl
5973
}
6074
}
6175

76+
/**
77+
* Parses a message from the console to a player. Will parse PAPI placeholders if placeholderAPI is on the server
78+
* Uses the default placeholders:
79+
* <ul><li>{@code <plugin_prefix>}
80+
* <li>{@code <target>}
81+
* <li>{@code <initiator>}
82+
* <li>{@code <message>}</ul>
83+
* @param message String
84+
* @param initiator Component
85+
* @param target Player
86+
* @param messageContent String
87+
* @return Component
88+
*/
89+
6290
public Component parseMessageConsoleToPlayer(String message, Component initiator, Player target, String messageContent){
6391
if (papiEnabled) {
6492
return miniMessage.deserialize(message,
@@ -76,6 +104,20 @@ public Component parseMessageConsoleToPlayer(String message, Component initiator
76104
}
77105
}
78106

107+
/**
108+
* Parses a message from a Player to the Console. Will parse PAPI placeholders if placeholderAPI is on the server
109+
* Uses the default placeholders:
110+
* <ul><li>{@code <plugin_prefix>}
111+
* <li>{@code <target>}
112+
* <li>{@code <initiator>}
113+
* <li>{@code <message>}</ul>
114+
* @param message String
115+
* @param initiator Player
116+
* @param target Component
117+
* @param messageContent String
118+
* @return Component
119+
*/
120+
79121
public Component parseMessagePlayerToConsole(String message, Player initiator, Component target, String messageContent){
80122
if(papiEnabled) {
81123
return miniMessage.deserialize(message,
@@ -93,12 +135,27 @@ public Component parseMessagePlayerToConsole(String message, Player initiator, C
93135
}
94136
}
95137

96-
138+
/**
139+
* Parses the placeholder for the plugin prefix from the given message
140+
* Uses the default placeholders:
141+
* <ul><li>{@code <plugin_prefix>}</ul>
142+
* @param message String
143+
* @return Component
144+
*/
97145
public Component parsePluginPrefix(String message) {
98146
return miniMessage.deserialize(message,
99147
Placeholder.parsed("plugin_prefix", Message.PLUGIN_PREFIX.getMessage()));
100148
}
101149

150+
/**
151+
* Parses the plugin prefix and an additional placeholder, using the provided 'placeholderName' and 'string'
152+
* Uses the default placeholders:
153+
* <ul><li>{@code <plugin_prefix>}</ul>
154+
* @param message String
155+
* @param placeholderName String
156+
* @param string String
157+
* @return Component
158+
*/
102159
public Component parsePluginPrefixAndString(String message,String placeholderName, String string) {
103160
return miniMessage.deserialize(message,
104161
Placeholder.parsed("plugin_prefix", Message.PLUGIN_PREFIX.getMessage()),

src/main/java/adhdmc/simplepms/listeners/LoginListener.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import org.bukkit.NamespacedKey;
88
import org.bukkit.entity.Player;
99
import org.bukkit.event.EventHandler;
10+
import org.bukkit.event.EventPriority;
1011
import org.bukkit.event.Listener;
1112
import org.bukkit.event.player.PlayerLoginEvent;
1213
import org.bukkit.persistence.PersistentDataContainer;
@@ -18,7 +19,11 @@ public class LoginListener implements Listener {
1819
private final HashSet<Player> spyingPlayers = SimplePMs.getSpyingPlayers();
1920
private final NamespacedKey spyToggle = SPMKey.SPY_TOGGLE.getKey();
2021

21-
@EventHandler
22+
/**
23+
* Adds players to the 'spyingPlayers' set on login. Requires the social spy permission, and having toggled socialspy on
24+
* @param loginEvent PlayerLoginEvent
25+
*/
26+
@EventHandler(priority = EventPriority.NORMAL)
2227
public void onPlayerLogin(PlayerLoginEvent loginEvent) {
2328
Bukkit.getScheduler().runTaskLater(SimplePMs.getInstance(), ()-> {
2429
Player player = loginEvent.getPlayer();
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package adhdmc.simplepms.listeners;
2+
3+
import adhdmc.simplepms.SimplePMs;
4+
import org.bukkit.entity.Player;
5+
import org.bukkit.event.EventHandler;
6+
import org.bukkit.event.EventPriority;
7+
import org.bukkit.event.Listener;
8+
import org.bukkit.event.player.PlayerQuitEvent;
9+
10+
import java.util.HashSet;
11+
12+
public class QuitListener implements Listener {
13+
private final HashSet<Player> spyingPlayers = SimplePMs.getSpyingPlayers();
14+
15+
/**
16+
* Clears players from spyingPlayers when they quit the game
17+
* @param quitEvent PlayerQuitEvent
18+
*/
19+
@EventHandler(priority = EventPriority.NORMAL)
20+
public void onPlayerQuit(PlayerQuitEvent quitEvent) {
21+
Player player = quitEvent.getPlayer();
22+
spyingPlayers.remove(player);
23+
}
24+
}

0 commit comments

Comments
 (0)