Skip to content

Commit df5afcf

Browse files
authored
imporvemnent back
added all performance improvement back with no minimize jar making it again to work
1 parent a619f74 commit df5afcf

File tree

10 files changed

+389
-46
lines changed

10 files changed

+389
-46
lines changed

WeGuardian.iml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
<configuration>
66
<autoDetectTypes>
77
<platformType>PAPER</platformType>
8-
<platformType>ADVENTURE</platformType>
98
</autoDetectTypes>
109
<projectReimportVersion>1</projectReimportVersion>
1110
</configuration>

dependency-reduced-pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<groupId>me.wethink</groupId>
55
<artifactId>WeGuardian</artifactId>
66
<name>WeGuardian</name>
7-
<version>1.0</version>
7+
<version>1.1</version>
88
<build>
99
<resources>
1010
<resource>

pom.xml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
<groupId>me.wethink</groupId>
88
<artifactId>WeGuardian</artifactId>
9-
<version>1.0</version>
9+
<version>1.1</version>
1010
<packaging>jar</packaging>
1111

1212
<name>WeGuardian</name>
@@ -40,7 +40,6 @@
4040
</execution>
4141
</executions>
4242
<configuration>
43-
<minimizeJar>true</minimizeJar>
4443
<relocations>
4544
<relocation>
4645
<pattern>com.zaxxer.hikari</pattern>

src/main/java/me/wethink/weGuardian/WeGuardian.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import me.wethink.weGuardian.database.YamlDatabaseManager;
88
import me.wethink.weGuardian.gui.GUIConfigLoader;
99
import me.wethink.weGuardian.gui.PunishmentGUI;
10+
import me.wethink.weGuardian.listeners.AsyncSuggestionsListener;
1011
import me.wethink.weGuardian.listeners.ChatListener;
1112
import me.wethink.weGuardian.listeners.PlayerListener;
1213
import me.wethink.weGuardian.services.CrossServerSyncService;
@@ -153,6 +154,7 @@ private void initializeServices() {
153154
private void initializeListeners() {
154155
getServer().getPluginManager().registerEvents(new PlayerListener(this, databaseManager), this);
155156
getServer().getPluginManager().registerEvents(new ChatListener(this, databaseManager), this);
157+
getServer().getPluginManager().registerEvents(new AsyncSuggestionsListener(this, databaseManager, templateService), this);
156158
}
157159

158160
private void registerCommands() {

src/main/java/me/wethink/weGuardian/database/DatabaseManager.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,8 @@ public interface DatabaseManager {
7878

7979
CompletableFuture<List<String>> searchPlayers(String query);
8080

81+
CompletableFuture<List<PlayerData>> searchPlayersByName(String name);
82+
8183
CompletableFuture<Integer> getTotalPunishments();
8284

8385
CompletableFuture<List<PlayerConnection>> getPlayerConnections(UUID uuid);

src/main/java/me/wethink/weGuardian/database/HikariDatabaseManager.java

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -681,6 +681,44 @@ public CompletableFuture<List<String>> searchPlayers(String query) {
681681
}, executorService);
682682
}
683683

684+
@Override
685+
public CompletableFuture<List<PlayerData>> searchPlayersByName(String name) {
686+
return CompletableFuture.supplyAsync(() -> {
687+
List<PlayerData> results = new ArrayList<>();
688+
String sql = "SELECT uuid, name, ip_address, first_join, last_seen, banned, muted FROM wg_players WHERE name LIKE ? ORDER BY last_seen DESC LIMIT 10";
689+
690+
try (Connection conn = dataSource.getConnection();
691+
PreparedStatement stmt = conn.prepareStatement(sql)) {
692+
693+
stmt.setString(1, "%" + name + "%");
694+
ResultSet rs = stmt.executeQuery();
695+
696+
while (rs.next()) {
697+
UUID uuid = UUID.fromString(rs.getString("uuid"));
698+
String playerName = rs.getString("name");
699+
String ipAddress = rs.getString("ip_address");
700+
LocalDateTime firstJoin = rs.getTimestamp("first_join").toLocalDateTime();
701+
LocalDateTime lastSeen = rs.getTimestamp("last_seen").toLocalDateTime();
702+
boolean banned = rs.getBoolean("banned");
703+
boolean muted = rs.getBoolean("muted");
704+
705+
PlayerData playerData = new PlayerData(uuid, playerName, ipAddress);
706+
playerData.setFirstJoin(firstJoin);
707+
playerData.setLastSeen(lastSeen);
708+
playerData.setBanned(banned);
709+
playerData.setMuted(muted);
710+
711+
results.add(playerData);
712+
}
713+
714+
} catch (SQLException e) {
715+
plugin.getLogger().severe("Failed to search players by name: " + e.getMessage());
716+
}
717+
718+
return results;
719+
}, executorService);
720+
}
721+
684722
@Override
685723
public CompletableFuture<Integer> getTotalPunishments() {
686724
return CompletableFuture.supplyAsync(() -> {

src/main/java/me/wethink/weGuardian/database/YamlDatabaseManager.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -794,6 +794,17 @@ public CompletableFuture<List<String>> searchPlayers(String query) {
794794
);
795795
}
796796

797+
@Override
798+
public CompletableFuture<List<PlayerData>> searchPlayersByName(String name) {
799+
return CompletableFuture.supplyAsync(() ->
800+
playerDataCache.values().stream()
801+
.filter(playerData -> playerData.getPlayerName().toLowerCase().contains(name.toLowerCase()))
802+
.sorted((p1, p2) -> p2.getLastSeen().compareTo(p1.getLastSeen()))
803+
.limit(10)
804+
.collect(Collectors.toList())
805+
);
806+
}
807+
797808
@Override
798809
public CompletableFuture<Integer> getTotalPunishments() {
799810
return CompletableFuture.completedFuture(punishmentCache.size());
Lines changed: 262 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,262 @@
1+
package me.wethink.weGuardian.listeners;
2+
3+
import com.tcoded.folialib.FoliaLib;
4+
import me.wethink.weGuardian.WeGuardian;
5+
import me.wethink.weGuardian.database.DatabaseManager;
6+
import me.wethink.weGuardian.models.PlayerData;
7+
import me.wethink.weGuardian.models.PunishmentTemplate;
8+
import me.wethink.weGuardian.services.TemplateService;
9+
import org.bukkit.Bukkit;
10+
import org.bukkit.command.CommandSender;
11+
import org.bukkit.entity.Player;
12+
import org.bukkit.event.EventHandler;
13+
import org.bukkit.event.EventPriority;
14+
import org.bukkit.event.Listener;
15+
import org.bukkit.event.server.TabCompleteEvent;
16+
17+
import java.util.*;
18+
import java.util.concurrent.ConcurrentHashMap;
19+
import java.util.stream.Collectors;
20+
21+
public class AsyncSuggestionsListener implements Listener {
22+
23+
private final WeGuardian plugin;
24+
private final DatabaseManager databaseManager;
25+
private final TemplateService templateService;
26+
private final FoliaLib foliaLib;
27+
28+
private final Map<String, List<String>> playerSuggestionsCache = new ConcurrentHashMap<>();
29+
private final Map<String, Long> cacheTimestamps = new ConcurrentHashMap<>();
30+
private static final long CACHE_DURATION = 30000;
31+
32+
private final Map<String, List<String>> templateSuggestionsCache = new ConcurrentHashMap<>();
33+
private long lastTemplateCacheUpdate = 0;
34+
private static final long TEMPLATE_CACHE_DURATION = 60000;
35+
36+
public AsyncSuggestionsListener(WeGuardian plugin, DatabaseManager databaseManager, TemplateService templateService) {
37+
this.plugin = plugin;
38+
this.databaseManager = databaseManager;
39+
this.templateService = templateService;
40+
this.foliaLib = plugin.getFoliaLib();
41+
}
42+
43+
@EventHandler(priority = EventPriority.HIGHEST)
44+
public void onTabComplete(TabCompleteEvent event) {
45+
String command = event.getBuffer().toLowerCase().trim();
46+
String[] args = command.split("\\s+");
47+
48+
if (args.length < 2) {
49+
return;
50+
}
51+
52+
String commandName = args[0].substring(1);
53+
String currentArg = args[args.length - 1].toLowerCase();
54+
55+
if (isWeGuardianCommand(commandName)) {
56+
event.getCompletions().clear();
57+
58+
foliaLib.getScheduler().runAsync(task -> {
59+
try {
60+
List<String> suggestions = generateSuggestions(event.getSender(), commandName, args, currentArg);
61+
if (!suggestions.isEmpty()) {
62+
foliaLib.getScheduler().runNextTick(task2 -> {
63+
event.getCompletions().addAll(suggestions);
64+
});
65+
}
66+
} catch (Exception e) {
67+
plugin.getLogger().warning("Error generating async suggestions: " + e.getMessage());
68+
}
69+
});
70+
}
71+
}
72+
73+
private boolean isWeGuardianCommand(String commandName) {
74+
return Arrays.asList(
75+
"ban", "tempban", "mute", "tempmute", "kick", "warn",
76+
"unban", "unmute", "ipban", "ipmute", "history", "checkban",
77+
"banlist", "mutelist", "blame", "alts", "warns", "unwarn",
78+
"banmenu", "tempbanmenu", "mutemenu", "tempmutemenu",
79+
"kickmenu", "warnmenu", "notesmenu", "unbanmenu", "unmutemenu",
80+
"punish", "weguardian"
81+
).contains(commandName);
82+
}
83+
84+
private List<String> generateSuggestions(CommandSender sender, String commandName, String[] args, String currentArg) {
85+
List<String> suggestions = new ArrayList<>();
86+
87+
switch (commandName) {
88+
case "ban", "tempban", "mute", "tempmute", "kick", "warn", "unban", "unmute", "history", "checkban", "blame", "alts", "warns", "unwarn", "punish" -> {
89+
if (args.length == 2) {
90+
suggestions.addAll(getPlayerSuggestions(currentArg, sender));
91+
} else if (args.length > 2) {
92+
suggestions.addAll(getAdvancedSuggestions(sender, commandName, args, currentArg));
93+
}
94+
}
95+
case "ipban", "ipmute" -> {
96+
if (args.length == 2) {
97+
suggestions.addAll(getIPSuggestions(currentArg));
98+
} else if (args.length > 2) {
99+
suggestions.addAll(getReasonSuggestions(currentArg));
100+
}
101+
}
102+
case "banlist", "mutelist" -> {
103+
if (args.length == 2) {
104+
suggestions.addAll(getPaginationSuggestions(currentArg));
105+
}
106+
}
107+
case "weguardian" -> {
108+
if (args.length == 2) {
109+
suggestions.addAll(getMainCommandSuggestions(currentArg));
110+
}
111+
}
112+
}
113+
114+
return suggestions.stream()
115+
.filter(suggestion -> suggestion.toLowerCase().startsWith(currentArg))
116+
.limit(20)
117+
.collect(Collectors.toList());
118+
}
119+
120+
private List<String> getPlayerSuggestions(String currentArg, CommandSender sender) {
121+
String cacheKey = "players_" + currentArg;
122+
123+
if (isCacheValid(cacheKey)) {
124+
List<String> cached = playerSuggestionsCache.get(cacheKey);
125+
if (cached != null) {
126+
return cached;
127+
}
128+
}
129+
130+
List<String> suggestions = new ArrayList<>();
131+
132+
for (Player onlinePlayer : Bukkit.getOnlinePlayers()) {
133+
if (onlinePlayer.getName().toLowerCase().startsWith(currentArg)) {
134+
suggestions.add(onlinePlayer.getName());
135+
}
136+
}
137+
138+
if (suggestions.size() < 10) {
139+
try {
140+
List<PlayerData> offlinePlayers = databaseManager.searchPlayersByName(currentArg).join();
141+
for (PlayerData playerData : offlinePlayers) {
142+
if (playerData.getName().toLowerCase().startsWith(currentArg)) {
143+
suggestions.add(playerData.getName());
144+
}
145+
}
146+
} catch (Exception e) {
147+
plugin.debug("Error fetching offline players for suggestions: %s", e.getMessage());
148+
}
149+
}
150+
151+
playerSuggestionsCache.put(cacheKey, suggestions);
152+
cacheTimestamps.put(cacheKey, System.currentTimeMillis());
153+
154+
return suggestions;
155+
}
156+
157+
private List<String> getAdvancedSuggestions(CommandSender sender, String commandName, String[] args, String currentArg) {
158+
List<String> suggestions = new ArrayList<>();
159+
160+
if (args.length > 3 && args[args.length - 2].equals("-t")) {
161+
return getTemplateSuggestions(currentArg);
162+
}
163+
164+
if (args.length > 3 && args[args.length - 2].equals("-d")) {
165+
return getDurationSuggestions();
166+
}
167+
if (!Arrays.asList(args).contains("-s")) {
168+
suggestions.add("-s");
169+
}
170+
if (!Arrays.asList(args).contains("-t")) {
171+
suggestions.add("-t");
172+
}
173+
if (!Arrays.asList(args).contains("-d") && (commandName.equals("ban") || commandName.equals("mute"))) {
174+
suggestions.add("-d");
175+
}
176+
if (!Arrays.asList(args).contains("--ip") && hasIPPermission(sender, commandName)) {
177+
suggestions.add("--ip");
178+
}
179+
180+
suggestions.addAll(getReasonSuggestions(currentArg));
181+
182+
return suggestions;
183+
}
184+
185+
private List<String> getTemplateSuggestions(String currentArg) {
186+
if (System.currentTimeMillis() - lastTemplateCacheUpdate > TEMPLATE_CACHE_DURATION) {
187+
updateTemplateCache();
188+
}
189+
190+
return templateSuggestionsCache.getOrDefault("all", new ArrayList<>())
191+
.stream()
192+
.filter(template -> template.toLowerCase().startsWith(currentArg))
193+
.collect(Collectors.toList());
194+
}
195+
196+
private void updateTemplateCache() {
197+
try {
198+
Collection<PunishmentTemplate> templates = templateService.getAllTemplates();
199+
List<String> templateNames = templates.stream()
200+
.map(PunishmentTemplate::getName)
201+
.collect(Collectors.toList());
202+
203+
templateSuggestionsCache.put("all", templateNames);
204+
lastTemplateCacheUpdate = System.currentTimeMillis();
205+
} catch (Exception e) {
206+
plugin.debug("Error updating template cache: %s", e.getMessage());
207+
}
208+
}
209+
210+
private List<String> getDurationSuggestions() {
211+
return Arrays.asList("1h", "2h", "6h", "12h", "1d", "2d", "3d", "7d", "14d", "30d", "1w", "2w", "1m", "3m", "6m", "1y");
212+
}
213+
214+
private List<String> getReasonSuggestions(String currentArg) {
215+
return Arrays.asList(
216+
"Hacking", "Griefing", "Toxic behavior", "Spam", "Advertising",
217+
"Inappropriate language", "Cheating", "Rule violation", "X-ray",
218+
"Duping", "Exploiting", "Alt account", "Disrespect", "Harassment",
219+
"Chat abuse", "Excessive caps", "Flooding", "Political discussion"
220+
);
221+
}
222+
223+
private List<String> getIPSuggestions(String currentArg) {
224+
if (currentArg.matches("^\\d{1,3}$")) {
225+
return Arrays.asList(currentArg + ".", currentArg + "0", currentArg + "1", currentArg + "2");
226+
} else if (currentArg.matches("^\\d{1,3}\\.\\d{1,3}$")) {
227+
return Arrays.asList(currentArg + ".", currentArg + "0", currentArg + "1", currentArg + "2");
228+
} else if (currentArg.matches("^\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$")) {
229+
return Arrays.asList(currentArg + ".", currentArg + "0", currentArg + "1", currentArg + "2");
230+
}
231+
return new ArrayList<>();
232+
}
233+
234+
private List<String> getPaginationSuggestions(String currentArg) {
235+
return Arrays.asList("1", "2", "3", "4", "5", "10", "20", "50", "100");
236+
}
237+
238+
private List<String> getMainCommandSuggestions(String currentArg) {
239+
return Arrays.asList("reload", "about", "version", "help");
240+
}
241+
242+
private boolean hasIPPermission(CommandSender sender, String commandName) {
243+
return switch (commandName) {
244+
case "mute", "tempmute" -> sender.hasPermission("weguardian.ipmute");
245+
case "kick" -> sender.hasPermission("weguardian.ipkick");
246+
default -> false;
247+
};
248+
}
249+
250+
private boolean isCacheValid(String cacheKey) {
251+
Long timestamp = cacheTimestamps.get(cacheKey);
252+
return timestamp != null && (System.currentTimeMillis() - timestamp) < CACHE_DURATION;
253+
}
254+
255+
256+
public void clearCache() {
257+
playerSuggestionsCache.clear();
258+
templateSuggestionsCache.clear();
259+
cacheTimestamps.clear();
260+
lastTemplateCacheUpdate = 0;
261+
}
262+
}

0 commit comments

Comments
 (0)