refactor: split god classes, fix OCP/ISP/SRP, migrate commands to BaseCommand hierarchy

This commit is contained in:
loki5512344 2026-07-05 13:22:48 +02:00
parent 793924c9ba
commit 90c3cac5cf
244 changed files with 1677 additions and 1570 deletions

View file

@ -11,6 +11,7 @@ import com.loki.lochat.gradient.GradientModule;
import com.loki.lochat.integrations.DiscordIntegration;
import com.loki.lochat.managers.AutoMessageManager;
import com.loki.lochat.managers.CustomCommandManager;
import org.bukkit.Bukkit;
import org.bukkit.plugin.java.JavaPlugin;
@ -82,9 +83,15 @@ public final class LoChat extends JavaPlugin {
configManager.reload();
messageConfig.reload();
autoMessageManager.reload();
if (gradientModule != null) gradientModule.reload();
if (customCommandManager != null) customCommandManager.reload();
if (discordIntegration != null) discordIntegration.reload();
if (gradientModule != null) {
gradientModule.reload();
}
if (customCommandManager != null) {
customCommandManager.reload();
}
if (discordIntegration != null) {
discordIntegration.reload();
}
if (serviceRegistry != null) {
try {
serviceRegistry.get(PunishmentService.class).save();

View file

@ -1,6 +1,7 @@
package com.loki.lochat.api.filter;
import com.loki.lochat.data.model.ChatMessage;
import org.bukkit.entity.Player;
/**

View file

@ -1,6 +1,7 @@
package com.loki.lochat.api.service;
import net.kyori.adventure.text.Component;
import org.bukkit.entity.Player;
import java.util.Optional;

View file

@ -1,6 +1,7 @@
package com.loki.lochat.api.service;
import com.loki.lochat.data.model.MuteData;
import org.bukkit.entity.Player;
import java.util.List;

View file

@ -2,6 +2,7 @@ package com.loki.lochat.api.service;
import com.loki.lochat.data.model.BanRecord;
import com.loki.lochat.data.model.WarnEntry;
import net.kyori.adventure.text.Component;
import java.util.List;

View file

@ -1,9 +1,9 @@
package com.loki.lochat.commands;
import com.loki.lochat.LoChat;
import com.loki.lochat.commands.admin.broadcast.*;
import com.loki.lochat.commands.admin.chat.*;
import com.loki.lochat.commands.admin.system.*;
import com.loki.lochat.commands.admin.broadcast.*;
import com.loki.lochat.commands.chat.*;
import com.loki.lochat.commands.messaging.*;
import com.loki.lochat.commands.moderation.ban.*;
@ -11,6 +11,7 @@ import com.loki.lochat.commands.moderation.mute.*;
import com.loki.lochat.commands.moderation.warn.*;
import com.loki.lochat.commands.nick.*;
import com.loki.lochat.commands.rp.*;
import org.bukkit.command.PluginCommand;
import java.util.HashMap;
@ -94,7 +95,9 @@ public class CommandManager {
PluginCommand cmd = plugin.getCommand(name);
if (cmd != null) {
cmd.setExecutor((org.bukkit.command.CommandExecutor) executor);
if (executor instanceof org.bukkit.command.TabCompleter tc) cmd.setTabCompleter(tc);
if (executor instanceof org.bukkit.command.TabCompleter tc) {
cmd.setTabCompleter(tc);
}
} else {
plugin.getLogger().warning("[LoChat] Команда '" + name + "' не найдена в plugin.yml!");
}

View file

@ -1,6 +1,7 @@
package com.loki.lochat.commands;
import com.loki.lochat.managers.CustomCommandManager;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;

View file

@ -3,7 +3,9 @@ package com.loki.lochat.commands;
import com.loki.lochat.LoChat;
import com.loki.lochat.managers.CustomCommandManager;
import com.loki.lochat.utils.format.ChatFormatter;
import net.kyori.adventure.text.Component;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;

View file

@ -2,8 +2,10 @@ package com.loki.lochat.commands.admin.broadcast;
import com.loki.lochat.LoChat;
import com.loki.lochat.utils.format.ChatFormatter;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.title.Title;
import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
@ -38,8 +40,9 @@ public class AnnounceCommand implements CommandExecutor {
for (Player player : Bukkit.getOnlinePlayers()) {
player.sendMessage(formatted);
if (plugin.getConfigManager().isAnnouncementActionBarEnabled())
if (plugin.getConfigManager().isAnnouncementActionBarEnabled()) {
player.sendActionBar(formatted);
}
if (plugin.getConfigManager().isAnnouncementTitleEnabled()) {
player.showTitle(Title.title(
ChatFormatter.parse(plugin.getConfigManager().getAnnouncementTitleHeader()),

View file

@ -3,6 +3,7 @@ package com.loki.lochat.commands.admin.broadcast;
import com.loki.lochat.LoChat;
import com.loki.lochat.integrations.DiscordIntegration;
import com.loki.lochat.utils.format.ChatFormatter;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
@ -29,22 +30,34 @@ public class DiscordCommand implements CommandExecutor, TabCompleter {
sender.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().get("errors.no-permission")));
return true;
}
if (args.length == 0) { sendHelp(sender); return true; }
if (args.length == 0) {
sendHelp(sender);
return true;
}
switch (args[0].toLowerCase()) {
case "status" -> sender.sendMessage(ChatFormatter.parse(discord.isEnabled() ? "&#9878C9Discord &#7858E9включён" : "&#9878C9Discord &#CF6679отключён"));
case "reload" -> {
try { discord.reload(); sender.sendMessage(ChatFormatter.parse("&#9878C9Discord &#7858E9перезагружен")); }
catch (Exception e) { sender.sendMessage(ChatFormatter.parse("&#CF6679Ошибка: " + e.getMessage())); }
try {
discord.reload();
sender.sendMessage(ChatFormatter.parse("&#9878C9Discord &#7858E9перезагружен"));
} catch (Exception e) {
sender.sendMessage(ChatFormatter.parse("&#CF6679Ошибка: " + e.getMessage()));
}
}
case "test" -> {
if (!discord.isEnabled()) { sender.sendMessage(ChatFormatter.parse("&#CF6679Discord отключён")); return true; }
if (!discord.isEnabled()) {
sender.sendMessage(ChatFormatter.parse("&#CF6679Discord отключён"));
return true;
}
String msg = args.length > 1 ? String.join(" ", Arrays.copyOfRange(args, 1, args.length)) : "Тест от " + sender.getName();
sender.sendMessage(ChatFormatter.parse("&#B798A8Отправка..."));
java.util.concurrent.CompletableFuture.runAsync(() -> {
discord.sendTestMessage(msg, sender.getName());
if (sender instanceof org.bukkit.entity.Player p)
if (sender instanceof org.bukkit.entity.Player p) {
p.getScheduler().run(plugin, t -> sender.sendMessage(ChatFormatter.parse("&#9878C9Отправлено &#7858E9✓")), null);
else sender.sendMessage(ChatFormatter.parse("&#9878C9Отправлено &#7858E9✓"));
} else {
sender.sendMessage(ChatFormatter.parse("&#9878C9Отправлено &#7858E9✓"));
}
});
}
default -> sendHelp(sender);
@ -58,8 +71,12 @@ public class DiscordCommand implements CommandExecutor, TabCompleter {
@Override
public @Nullable List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, @NotNull String[] args) {
if (!sender.hasPermission("lochat.discord.admin")) return null;
if (args.length == 1) return List.of("status", "reload", "test");
if (!sender.hasPermission("lochat.discord.admin")) {
return null;
}
if (args.length == 1) {
return List.of("status", "reload", "test");
}
return null;
}
}

View file

@ -3,6 +3,7 @@ package com.loki.lochat.commands.admin.chat;
import com.loki.lochat.LoChat;
import com.loki.lochat.api.service.MessagingService;
import com.loki.lochat.utils.format.ChatFormatter;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;

View file

@ -2,6 +2,7 @@ package com.loki.lochat.commands.admin.chat;
import com.loki.lochat.LoChat;
import com.loki.lochat.utils.format.ChatFormatter;
import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
@ -21,7 +22,9 @@ public class ClearChatCommand implements CommandExecutor {
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
int lines = plugin.getConfigManager().getAppearanceConfig().getClearLines();
for (Player player : Bukkit.getOnlinePlayers()) {
for (int i = 0; i < lines; i++) player.sendMessage("");
for (int i = 0; i < lines; i++) {
player.sendMessage("");
}
if (plugin.getConfigManager().isClearChatMessageEnabled()) {
player.sendMessage(ChatFormatter.parse(
plugin.getConfigManager().getClearChatMessage().replace("{player}", sender.getName())));

View file

@ -2,6 +2,7 @@ package com.loki.lochat.commands.admin.chat;
import com.loki.lochat.LoChat;
import com.loki.lochat.utils.format.ChatFormatter;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
@ -31,10 +32,19 @@ public class ClearChatConfigCommand implements CommandExecutor, TabCompleter {
return true;
}
switch (args[0].toLowerCase()) {
case "enable" -> { plugin.getConfigManager().setClearChatMessageEnabled(true); sender.sendMessage(ChatFormatter.parse("&#9878C9Сообщение очистки &#7858E9включено")); }
case "disable" -> { plugin.getConfigManager().setClearChatMessageEnabled(false); sender.sendMessage(ChatFormatter.parse("&#9878C9Сообщение очистки &#B798A8отключено")); }
case "enable" -> {
plugin.getConfigManager().setClearChatMessageEnabled(true);
sender.sendMessage(ChatFormatter.parse("&#9878C9Сообщение очистки &#7858E9включено"));
}
case "disable" -> {
plugin.getConfigManager().setClearChatMessageEnabled(false);
sender.sendMessage(ChatFormatter.parse("&#9878C9Сообщение очистки &#B798A8отключено"));
}
case "message" -> {
if (args.length < 2) { sender.sendMessage(ChatFormatter.parse("&#CF6679Укажите текст!")); return true; }
if (args.length < 2) {
sender.sendMessage(ChatFormatter.parse("&#CF6679Укажите текст!"));
return true;
}
String msg = String.join(" ", Arrays.copyOfRange(args, 1, args.length));
plugin.getConfigManager().setClearChatMessage(msg);
sender.sendMessage(ChatFormatter.parse("&#9878C9Сообщение установлено: &f" + msg));
@ -50,8 +60,10 @@ public class ClearChatConfigCommand implements CommandExecutor, TabCompleter {
@Override
public @Nullable List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, @NotNull String[] args) {
if (args.length == 1) return List.of("enable", "disable", "message", "status").stream()
.filter(s -> s.startsWith(args[0].toLowerCase())).toList();
if (args.length == 1) {
return List.of("enable", "disable", "message", "status").stream()
.filter(s -> s.startsWith(args[0].toLowerCase())).toList();
}
return null;
}
}

View file

@ -4,6 +4,7 @@ import com.google.common.io.ByteArrayDataOutput;
import com.google.common.io.ByteStreams;
import com.loki.lochat.LoChat;
import com.loki.lochat.utils.format.ChatFormatter;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;

View file

@ -2,6 +2,7 @@ package com.loki.lochat.commands.admin.system;
import com.loki.lochat.LoChat;
import com.loki.lochat.utils.format.ChatFormatter;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
@ -54,9 +55,15 @@ public class LoChatCommand implements CommandExecutor, TabCompleter {
@Override
public @Nullable List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, @NotNull String[] args) {
if (!sender.hasPermission("lochat.admin")) return new ArrayList<>();
if (args.length == 1) return List.of("reload", "commands").stream().filter(s -> s.startsWith(args[0].toLowerCase())).toList();
if (args.length == 2 && args[0].equalsIgnoreCase("commands")) return List.of("reload");
if (!sender.hasPermission("lochat.admin")) {
return new ArrayList<>();
}
if (args.length == 1) {
return List.of("reload", "commands").stream().filter(s -> s.startsWith(args[0].toLowerCase())).toList();
}
if (args.length == 2 && args[0].equalsIgnoreCase("commands")) {
return List.of("reload");
}
return new ArrayList<>();
}
}

View file

@ -2,6 +2,7 @@ package com.loki.lochat.commands.admin.system;
import com.loki.lochat.LoChat;
import com.loki.lochat.utils.format.ChatFormatter;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;

View file

@ -1,6 +1,7 @@
package com.loki.lochat.commands.base;
import com.loki.lochat.LoChat;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.jetbrains.annotations.NotNull;

View file

@ -1,6 +1,7 @@
package com.loki.lochat.commands.base;
import com.loki.lochat.LoChat;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;

View file

@ -1,6 +1,7 @@
package com.loki.lochat.commands.base;
import com.loki.lochat.LoChat;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;

View file

@ -3,7 +3,9 @@ package com.loki.lochat.commands.chat;
import com.loki.lochat.LoChat;
import com.loki.lochat.api.service.ChatService;
import com.loki.lochat.utils.format.ChatFormatter;
import net.kyori.adventure.text.minimessage.MiniMessage;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;

View file

@ -3,7 +3,9 @@ package com.loki.lochat.commands.chat;
import com.loki.lochat.LoChat;
import com.loki.lochat.api.service.ChatService;
import com.loki.lochat.utils.format.ChatFormatter;
import net.kyori.adventure.text.minimessage.MiniMessage;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;

View file

@ -3,6 +3,7 @@ package com.loki.lochat.commands.messaging;
import com.loki.lochat.LoChat;
import com.loki.lochat.api.service.MessagingService;
import com.loki.lochat.utils.format.ChatFormatter;
import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
@ -22,13 +23,28 @@ public class IgnoreCommand implements CommandExecutor {
@Override
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
if (!(sender instanceof Player player)) { sender.sendMessage(plugin.getConfigManager().getMessagesConfig().getPlayerOnly()); return true; }
if (args.length == 0) { player.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().getInvalidUsage("/ignore <ник>"))); return true; }
if (!(sender instanceof Player player)) {
sender.sendMessage(plugin.getConfigManager().getMessagesConfig().getPlayerOnly());
return true;
}
if (args.length == 0) {
player.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().getInvalidUsage("/ignore <ник>")));
return true;
}
Player target = Bukkit.getPlayer(args[0]);
if (target == null) { player.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().getPlayerNotFound())); return true; }
if (target.equals(player)) { player.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().get("ignore.self"))); return true; }
if (messagingService.isIgnoring(player.getUniqueId(), target.getUniqueId())) { player.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().get("ignore.already-ignored"))); return true; }
if (target == null) {
player.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().getPlayerNotFound()));
return true;
}
if (target.equals(player)) {
player.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().get("ignore.self")));
return true;
}
if (messagingService.isIgnoring(player.getUniqueId(), target.getUniqueId())) {
player.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().get("ignore.already-ignored")));
return true;
}
messagingService.addIgnore(player.getUniqueId(), target.getUniqueId());
player.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().get("ignore.added", "{player}", target.getName())));

View file

@ -4,6 +4,7 @@ import com.loki.lochat.LoChat;
import com.loki.lochat.api.service.MessagingService;
import com.loki.lochat.utils.format.ChatFormatter;
import com.loki.lochat.utils.player.PlayerUtil;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
@ -25,15 +26,23 @@ public class IgnoreListCommand implements CommandExecutor {
@Override
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
if (!(sender instanceof Player player)) { sender.sendMessage(plugin.getConfigManager().getMessagesConfig().getPlayerOnly()); return true; }
if (!(sender instanceof Player player)) {
sender.sendMessage(plugin.getConfigManager().getMessagesConfig().getPlayerOnly());
return true;
}
Set<UUID> ignored = messagingService.getIgnoredPlayers(player.getUniqueId());
if (ignored.isEmpty()) { player.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().get("ignore.list-empty"))); return true; }
if (ignored.isEmpty()) {
player.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().get("ignore.list-empty")));
return true;
}
player.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().get("ignore.list-header")));
for (UUID uuid : ignored) {
String name = PlayerUtil.getPlayerName(uuid);
if (name != null) player.sendMessage(ChatFormatter.parse("&#9878C9◆ &f" + name));
if (name != null) {
player.sendMessage(ChatFormatter.parse("&#9878C9◆ &f" + name));
}
}
player.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().get("ignore.list-footer").replace("{count}", String.valueOf(ignored.size()))));
return true;

View file

@ -4,6 +4,7 @@ import com.loki.lochat.LoChat;
import com.loki.lochat.api.service.MessagingService;
import com.loki.lochat.utils.format.ChatFormatter;
import com.loki.lochat.utils.player.PlayerUtil;
import org.bukkit.Bukkit;
import org.bukkit.Sound;
import org.bukkit.command.Command;
@ -28,17 +29,31 @@ public class MsgCommand implements CommandExecutor {
sender.sendMessage(plugin.getConfigManager().getMessagesConfig().getPlayerOnly());
return true;
}
if (!plugin.getConfigManager().isPmEnabled()) return true;
if (!plugin.getConfigManager().isPmEnabled()) {
return true;
}
if (args.length < 2) {
player.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().getInvalidUsage("/msg <ник> <сообщение>")));
return true;
}
Player target = Bukkit.getPlayer(args[0]);
if (target == null) { player.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().get("pm.player-offline"))); return true; }
if (target.equals(player)) { player.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().get("pm.self"))); return true; }
if (messagingService.isIgnoring(target.getUniqueId(), player.getUniqueId())) { player.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().get("pm.ignored"))); return true; }
if (messagingService.isIgnoring(player.getUniqueId(), target.getUniqueId())) { player.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().get("pm.ignored"))); return true; }
if (target == null) {
player.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().get("pm.player-offline")));
return true;
}
if (target.equals(player)) {
player.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().get("pm.self")));
return true;
}
if (messagingService.isIgnoring(target.getUniqueId(), player.getUniqueId())) {
player.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().get("pm.ignored")));
return true;
}
if (messagingService.isIgnoring(player.getUniqueId(), target.getUniqueId())) {
player.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().get("pm.ignored")));
return true;
}
String message = String.join(" ", java.util.Arrays.copyOfRange(args, 1, args.length));
sendPm(player, target, message);
@ -50,12 +65,15 @@ public class MsgCommand implements CommandExecutor {
target.sendMessage(ChatFormatter.formatPmReceivedNew(plugin.getMessageConfig().getPmFormatReceived(), sender, target, message));
if (plugin.getConfigManager().isPmSoundEnabled()) {
Sound sound = PlayerUtil.parseSound(plugin.getConfigManager().getPmSoundType(), null);
if (sound != null) target.playSound(target.getLocation(), sound, 1.0f, 1.0f);
if (sound != null) {
target.playSound(target.getLocation(), sound, 1.0f, 1.0f);
}
}
messagingService.broadcastPM(sender, target, message);
messagingService.setLastConversation(sender.getUniqueId(), target.getUniqueId());
messagingService.setLastConversation(target.getUniqueId(), sender.getUniqueId());
if (plugin.getConfigManager().isPmLogEnabled())
if (plugin.getConfigManager().isPmLogEnabled()) {
plugin.getLogger().info("[PM] " + sender.getName() + " -> " + target.getName() + ": " + message);
}
}
}

View file

@ -4,6 +4,7 @@ import com.loki.lochat.LoChat;
import com.loki.lochat.api.service.MessagingService;
import com.loki.lochat.utils.format.ChatFormatter;
import com.loki.lochat.utils.player.PlayerUtil;
import org.bukkit.Bukkit;
import org.bukkit.Sound;
import org.bukkit.command.Command;
@ -31,30 +32,44 @@ public class ReplyCommand implements CommandExecutor {
sender.sendMessage(plugin.getConfigManager().getMessagesConfig().getPlayerOnly());
return true;
}
if (!plugin.getConfigManager().isPmEnabled()) return true;
if (!plugin.getConfigManager().isPmEnabled()) {
return true;
}
if (args.length == 0) {
player.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().getInvalidUsage("/reply <сообщение>")));
return true;
}
Optional<UUID> lastUuid = messagingService.getLastConversation(player.getUniqueId());
if (lastUuid.isEmpty()) { player.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().get("pm.no-reply"))); return true; }
if (lastUuid.isEmpty()) {
player.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().get("pm.no-reply")));
return true;
}
Player target = Bukkit.getPlayer(lastUuid.get());
if (target == null) { player.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().get("pm.player-offline"))); return true; }
if (messagingService.isIgnoring(target.getUniqueId(), player.getUniqueId())) { player.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().get("pm.ignored"))); return true; }
if (target == null) {
player.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().get("pm.player-offline")));
return true;
}
if (messagingService.isIgnoring(target.getUniqueId(), player.getUniqueId())) {
player.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().get("pm.ignored")));
return true;
}
String message = String.join(" ", args);
player.sendMessage(ChatFormatter.formatPmSentNew(plugin.getMessageConfig().getPmFormatSent(), player, target, message));
target.sendMessage(ChatFormatter.formatPmReceivedNew(plugin.getMessageConfig().getPmFormatReceived(), player, target, message));
if (plugin.getConfigManager().isPmSoundEnabled()) {
Sound sound = PlayerUtil.parseSound(plugin.getConfigManager().getPmSoundType(), null);
if (sound != null) target.playSound(target.getLocation(), sound, 1.0f, 1.0f);
if (sound != null) {
target.playSound(target.getLocation(), sound, 1.0f, 1.0f);
}
}
messagingService.broadcastPM(player, target, message);
messagingService.setLastConversation(target.getUniqueId(), player.getUniqueId());
if (plugin.getConfigManager().isPmLogEnabled())
if (plugin.getConfigManager().isPmLogEnabled()) {
plugin.getLogger().info("[PM] " + player.getName() + " -> " + target.getName() + ": " + message);
}
return true;
}
}

View file

@ -3,6 +3,7 @@ package com.loki.lochat.commands.messaging;
import com.loki.lochat.LoChat;
import com.loki.lochat.api.service.MessagingService;
import com.loki.lochat.utils.format.ChatFormatter;
import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
@ -22,12 +23,24 @@ public class UnignoreCommand implements CommandExecutor {
@Override
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
if (!(sender instanceof Player player)) { sender.sendMessage(plugin.getConfigManager().getMessagesConfig().getPlayerOnly()); return true; }
if (args.length == 0) { player.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().getInvalidUsage("/unignore <ник>"))); return true; }
if (!(sender instanceof Player player)) {
sender.sendMessage(plugin.getConfigManager().getMessagesConfig().getPlayerOnly());
return true;
}
if (args.length == 0) {
player.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().getInvalidUsage("/unignore <ник>")));
return true;
}
Player target = Bukkit.getPlayer(args[0]);
if (target == null) { player.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().getPlayerNotFound())); return true; }
if (!messagingService.isIgnoring(player.getUniqueId(), target.getUniqueId())) { player.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().get("ignore.not-ignored"))); return true; }
if (target == null) {
player.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().getPlayerNotFound()));
return true;
}
if (!messagingService.isIgnoring(player.getUniqueId(), target.getUniqueId())) {
player.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().get("ignore.not-ignored")));
return true;
}
messagingService.removeIgnore(player.getUniqueId(), target.getUniqueId());
player.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().get("ignore.removed", "{player}", target.getName())));

View file

@ -7,6 +7,7 @@ import com.loki.lochat.config.MessagesConfig;
import com.loki.lochat.data.model.BanRecord;
import com.loki.lochat.utils.format.ChatFormatter;
import com.loki.lochat.utils.player.PlayerUtil;
import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
@ -78,7 +79,9 @@ public class BanCommand implements CommandExecutor, TabCompleter {
if (timeStr == null && isTimeFormat(args[i])) {
timeStr = args[i];
} else {
if (reasonBuilder.length() > 0) reasonBuilder.append(" ");
if (reasonBuilder.length() > 0) {
reasonBuilder.append(" ");
}
reasonBuilder.append(args[i]);
}
}
@ -98,7 +101,9 @@ public class BanCommand implements CommandExecutor, TabCompleter {
String reason = reasonBuilder.length() > 0 ? reasonBuilder.toString() : msg.getModerationDefaultReason();
String finalName = PlayerUtil.getPlayerName(targetUuid);
if (finalName == null) finalName = targetName;
if (finalName == null) {
finalName = targetName;
}
punishmentService.ban(targetUuid, finalName, durationMs, reason, sender.getName());
@ -126,8 +131,11 @@ public class BanCommand implements CommandExecutor, TabCompleter {
@NotNull String alias, @NotNull String[] args) {
List<String> c = new ArrayList<>();
if (args.length == 1) {
for (Player p : Bukkit.getOnlinePlayers())
if (p.getName().toLowerCase().startsWith(args[0].toLowerCase())) c.add(p.getName());
for (Player p : Bukkit.getOnlinePlayers()) {
if (p.getName().toLowerCase().startsWith(args[0].toLowerCase())) {
c.add(p.getName());
}
}
} else if (args.length == 2) {
c.addAll(List.of("1h", "1d", "7d", "30d", "perm"));
}

View file

@ -5,6 +5,7 @@ import com.loki.lochat.api.service.PunishmentService;
import com.loki.lochat.config.MessagesConfig;
import com.loki.lochat.utils.format.ChatFormatter;
import com.loki.lochat.utils.player.PlayerUtil;
import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
@ -56,7 +57,9 @@ public class UnbanCommand implements CommandExecutor, TabCompleter {
}
String name = PlayerUtil.getPlayerName(uuid);
if (name == null) name = args[0];
if (name == null) {
name = args[0];
}
punishmentService.unban(uuid);
sender.sendMessage(ChatFormatter.parse(msg.getUnbanConfirm().replace("{player}", name)));
@ -70,7 +73,9 @@ public class UnbanCommand implements CommandExecutor, TabCompleter {
if (args.length == 1) {
String p = args[0].toLowerCase();
for (Player pl : Bukkit.getOnlinePlayers()) {
if (pl.getName().toLowerCase().startsWith(p)) out.add(pl.getName());
if (pl.getName().toLowerCase().startsWith(p)) {
out.add(pl.getName());
}
}
}
return out;

View file

@ -3,6 +3,7 @@ package com.loki.lochat.commands.moderation.mute;
import com.loki.lochat.LoChat;
import com.loki.lochat.api.service.MuteService;
import com.loki.lochat.data.model.MuteData;
import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
@ -30,16 +31,28 @@ public class MuteBlameCommand implements CommandExecutor, TabCompleter {
@Override
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
if (!sender.hasPermission("lochat.muteblame")) { sender.sendMessage(plugin.getMessageConfig().getComponent("errors.no-permission")); return true; }
if (args.length < 1) { sender.sendMessage("&#CF6679Использование: /lmuteblame <модератор>"); return true; }
if (!sender.hasPermission("lochat.muteblame")) {
sender.sendMessage(plugin.getMessageConfig().getComponent("errors.no-permission"));
return true;
}
if (args.length < 1) {
sender.sendMessage("&#CF6679Использование: /lmuteblame <модератор>");
return true;
}
List<MuteData.MuteHistoryEntry> mutes = muteService.getMutesByOperator(args[0]);
if (mutes.isEmpty()) { sender.sendMessage("&#9878C9Модератор &#7858E9" + args[0] + " &#9878C9не выдавал мутов"); return true; }
if (mutes.isEmpty()) {
sender.sendMessage("&#9878C9Модератор &#7858E9" + args[0] + " &#9878C9не выдавал мутов");
return true;
}
sender.sendMessage("&#7858E9▬▬▬▬▬ &#B798A8Муты от &#9878C9" + args[0] + " &#9878C9(" + mutes.size() + "&#9878C9) &#7858E9▬▬▬▬▬");
int idx = 1;
for (MuteData.MuteHistoryEntry e : mutes) {
if (idx > 15) { sender.sendMessage("&#B798A8...и ещё " + (mutes.size() - 15) + " записей"); break; }
if (idx > 15) {
sender.sendMessage("&#B798A8...и ещё " + (mutes.size() - 15) + " записей");
break;
}
String status = e.unmuted ? "&#9878C9Размучен" : (e.duration == 0 ? "&#CF6679Активен (навсегда)" :
System.currentTimeMillis() > e.mutedAt + e.duration ? "&#B798A8Истёк" : "&#CF6679Активен");
sender.sendMessage("&#9878C9" + idx + ". &f" + (e.playerName != null ? e.playerName : "???") + " &#B798A8— " + status);
@ -53,7 +66,13 @@ public class MuteBlameCommand implements CommandExecutor, TabCompleter {
@Override
public @Nullable List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, @NotNull String[] args) {
List<String> c = new ArrayList<>();
if (args.length == 1) for (Player p : Bukkit.getOnlinePlayers()) if (p.getName().toLowerCase().startsWith(args[0].toLowerCase())) c.add(p.getName());
if (args.length == 1) {
for (Player p : Bukkit.getOnlinePlayers()) {
if (p.getName().toLowerCase().startsWith(args[0].toLowerCase())) {
c.add(p.getName());
}
}
}
return c;
}
}

View file

@ -4,6 +4,7 @@ import com.loki.lochat.LoChat;
import com.loki.lochat.api.service.MuteService;
import com.loki.lochat.config.MessagesConfig;
import com.loki.lochat.utils.format.ChatFormatter;
import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
@ -62,7 +63,9 @@ public class MuteCommand implements CommandExecutor, TabCompleter {
} else if (timeStr == null && isTimeFormat(arg)) {
timeStr = arg;
} else {
if (reasonBuilder.length() > 0) reasonBuilder.append(" ");
if (reasonBuilder.length() > 0) {
reasonBuilder.append(" ");
}
reasonBuilder.append(arg);
}
}
@ -78,12 +81,17 @@ public class MuteCommand implements CommandExecutor, TabCompleter {
long duration;
if (timeStr == null || timeStr.isEmpty()) {
duration = sender instanceof Player p ? muteService.getMaxDuration(p) : 0;
if (duration == -1) duration = muteService.parseTime(hm.getDefaultMuteDuration());
if (duration == -1) {
duration = muteService.parseTime(hm.getDefaultMuteDuration());
}
} else if (timeStr.equalsIgnoreCase("perm") || timeStr.equals("0")) {
duration = 0;
} else {
duration = muteService.parseTime(timeStr);
if (duration < 0) { sender.sendMessage(ChatFormatter.parse(hm.getMuteTimeHelp())); return true; }
if (duration < 0) {
sender.sendMessage(ChatFormatter.parse(hm.getMuteTimeHelp()));
return true;
}
}
if (sender instanceof Player p && !muteService.canMuteForDuration(p, duration)) {
@ -94,8 +102,14 @@ public class MuteCommand implements CommandExecutor, TabCompleter {
}
UUID targetUUID = com.loki.lochat.utils.player.PlayerUtil.findPlayerUUID(targetName);
if (targetUUID == null) { sender.sendMessage(plugin.getMessageConfig().getComponent("errors.player-not-found")); return true; }
if (muteService.isMuted(targetUUID)) { sender.sendMessage(ChatFormatter.parse("&#CF6679Игрок уже замучен!")); return true; }
if (targetUUID == null) {
sender.sendMessage(plugin.getMessageConfig().getComponent("errors.player-not-found"));
return true;
}
if (muteService.isMuted(targetUUID)) {
sender.sendMessage(ChatFormatter.parse("&#CF6679Игрок уже замучен!"));
return true;
}
Player target = Bukkit.getPlayer(targetUUID);
String finalName = com.loki.lochat.utils.player.PlayerUtil.getPlayerName(targetUUID);
@ -116,7 +130,11 @@ public class MuteCommand implements CommandExecutor, TabCompleter {
if (silent) {
String msgText = hm.getPlayerMutedSilent().replace("{player}", finalName).replace("{time}", timeDisplay);
for (Player p : Bukkit.getOnlinePlayers()) if (p.hasPermission("lochat.mute.see-silent")) p.sendMessage(ChatFormatter.parse(msgText));
for (Player p : Bukkit.getOnlinePlayers()) {
if (p.hasPermission("lochat.mute.see-silent")) {
p.sendMessage(ChatFormatter.parse(msgText));
}
}
} else {
String broadcastMsg = (duration == 0 ? hm.getPlayerMutedPermanent() : hm.getPlayerMuted())
.replace("{player}", finalName).replace("{time}", timeDisplay).replace("{reason}", reason);
@ -141,8 +159,11 @@ public class MuteCommand implements CommandExecutor, TabCompleter {
@NotNull String alias, @NotNull String[] args) {
List<String> c = new ArrayList<>();
if (args.length == 1) {
for (Player p : Bukkit.getOnlinePlayers())
if (p.getName().toLowerCase().startsWith(args[0].toLowerCase())) c.add(p.getName());
for (Player p : Bukkit.getOnlinePlayers()) {
if (p.getName().toLowerCase().startsWith(args[0].toLowerCase())) {
c.add(p.getName());
}
}
} else if (args.length == 2) {
c.addAll(List.of("10m", "30m", "1h", "6h", "12h", "1d", "7d", "30d", "perm", "-s"));
} else if (args.length == 3) {

View file

@ -3,6 +3,7 @@ package com.loki.lochat.commands.moderation.mute;
import com.loki.lochat.LoChat;
import com.loki.lochat.api.service.MuteService;
import com.loki.lochat.data.model.MuteData;
import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
@ -31,15 +32,29 @@ public class MuteHistoryCommand implements CommandExecutor, TabCompleter {
@Override
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
if (!sender.hasPermission("lochat.mutehistory")) { sender.sendMessage(plugin.getMessageConfig().getComponent("errors.no-permission")); return true; }
if (args.length < 1) { sender.sendMessage("&#CF6679Использование: /lmutehistory <ник>"); return true; }
if (!sender.hasPermission("lochat.mutehistory")) {
sender.sendMessage(plugin.getMessageConfig().getComponent("errors.no-permission"));
return true;
}
if (args.length < 1) {
sender.sendMessage("&#CF6679Использование: /lmutehistory <ник>");
return true;
}
UUID uuid = com.loki.lochat.utils.player.PlayerUtil.findPlayerUUID(args[0]);
if (uuid == null) uuid = muteService.getUUIDByName(args[0]);
if (uuid == null) { sender.sendMessage(plugin.getMessageConfig().getComponent("errors.player-not-found")); return true; }
if (uuid == null) {
uuid = muteService.getUUIDByName(args[0]);
}
if (uuid == null) {
sender.sendMessage(plugin.getMessageConfig().getComponent("errors.player-not-found"));
return true;
}
List<MuteData.MuteHistoryEntry> history = muteService.getPlayerHistory(uuid);
if (history.isEmpty()) { sender.sendMessage("&#9878C9У &#7858E9" + args[0] + " &#9878C9нет истории мутов"); return true; }
if (history.isEmpty()) {
sender.sendMessage("&#9878C9У &#7858E9" + args[0] + " &#9878C9нет истории мутов");
return true;
}
sender.sendMessage("&#7858E9▬▬▬▬▬ &#B798A8История мутов &#9878C9" + args[0] + " &#9878C9(" + history.size() + "&#9878C9) &#7858E9▬▬▬▬▬");
int idx = 1;
@ -50,17 +65,26 @@ public class MuteHistoryCommand implements CommandExecutor, TabCompleter {
sender.sendMessage("&#9878C9" + idx + ". &f" + fmt.format(new Date(e.mutedAt)) + " &#B798A8— " + status);
sender.sendMessage(" &#B798A8Длительность: &f" + (e.duration == 0 ? "навсегда" : muteService.formatTime(e.duration)));
sender.sendMessage(" &#B798A8Причина: &f" + (e.reason != null ? e.reason : "—") + " &#B798A8Выдал: &#7858E9" + e.mutedBy);
if (e.unmuted && e.unmutedBy != null)
if (e.unmuted && e.unmutedBy != null) {
sender.sendMessage(" &#B798A8Размутил: &#7858E9" + e.unmutedBy + " &f(" + fmt.format(new Date(e.unmutedAt)) + ")");
}
}
if (history.size() > 10) {
sender.sendMessage("&#B798A8...и ещё " + (history.size() - 10) + " записей");
}
if (history.size() > 10) sender.sendMessage("&#B798A8...и ещё " + (history.size() - 10) + " записей");
return true;
}
@Override
public @Nullable List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, @NotNull String[] args) {
List<String> c = new ArrayList<>();
if (args.length == 1) for (Player p : Bukkit.getOnlinePlayers()) if (p.getName().toLowerCase().startsWith(args[0].toLowerCase())) c.add(p.getName());
if (args.length == 1) {
for (Player p : Bukkit.getOnlinePlayers()) {
if (p.getName().toLowerCase().startsWith(args[0].toLowerCase())) {
c.add(p.getName());
}
}
}
return c;
}
}

View file

@ -3,6 +3,7 @@ package com.loki.lochat.commands.moderation.mute;
import com.loki.lochat.LoChat;
import com.loki.lochat.api.service.MuteService;
import com.loki.lochat.data.model.MuteData;
import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
@ -27,10 +28,16 @@ public class MuteListCommand implements CommandExecutor {
@Override
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
if (!sender.hasPermission("lochat.mutelist")) { sender.sendMessage(plugin.getMessageConfig().getComponent("errors.no-permission")); return true; }
if (!sender.hasPermission("lochat.mutelist")) {
sender.sendMessage(plugin.getMessageConfig().getComponent("errors.no-permission"));
return true;
}
Map<UUID, MuteData> mutes = muteService.getActiveMutes();
if (mutes.isEmpty()) { sender.sendMessage("&#9878C9Нет активных мутов"); return true; }
if (mutes.isEmpty()) {
sender.sendMessage("&#9878C9Нет активных мутов");
return true;
}
sender.sendMessage("&#7858E9▬▬▬▬▬ &#B798A8Активные муты &#9878C9(" + mutes.size() + "&#9878C9) &#7858E9▬▬▬▬▬");
int i = 1;

View file

@ -3,6 +3,7 @@ package com.loki.lochat.commands.moderation.mute;
import com.loki.lochat.LoChat;
import com.loki.lochat.api.service.MuteService;
import com.loki.lochat.utils.format.ChatFormatter;
import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
@ -28,14 +29,23 @@ public class UnmuteCommand implements CommandExecutor, TabCompleter {
@Override
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
if (!sender.hasPermission("lochat.unmute")) { sender.sendMessage(plugin.getMessageConfig().getComponent("errors.no-permission")); return true; }
if (args.length < 1) { sender.sendMessage(ChatFormatter.parse("&#CF6679Использование: /unmute <ник> [-s]")); return true; }
if (!sender.hasPermission("lochat.unmute")) {
sender.sendMessage(plugin.getMessageConfig().getComponent("errors.no-permission"));
return true;
}
if (args.length < 1) {
sender.sendMessage(ChatFormatter.parse("&#CF6679Использование: /unmute <ник> [-s]"));
return true;
}
String targetName = null;
boolean silent = false;
for (String a : args) {
if (a.equalsIgnoreCase("-s")) silent = true;
else if (targetName == null) targetName = a;
if (a.equalsIgnoreCase("-s")) {
silent = true;
} else if (targetName == null) {
targetName = a;
}
}
if (silent && !sender.hasPermission("lochat.mute.silent")) {
sender.sendMessage(ChatFormatter.parse(plugin.getConfigManager().getMessagesConfig().getNoSilentUnmutePermission()));
@ -43,7 +53,10 @@ public class UnmuteCommand implements CommandExecutor, TabCompleter {
}
UUID uuid = com.loki.lochat.utils.player.PlayerUtil.findPlayerUUID(targetName);
if (uuid == null) { sender.sendMessage(plugin.getMessageConfig().getComponent("errors.player-not-found")); return true; }
if (uuid == null) {
sender.sendMessage(plugin.getMessageConfig().getComponent("errors.player-not-found"));
return true;
}
String name = com.loki.lochat.utils.player.PlayerUtil.getPlayerName(uuid);
Player target = Bukkit.getPlayer(uuid);
@ -51,10 +64,16 @@ public class UnmuteCommand implements CommandExecutor, TabCompleter {
if (muteService.unmute(uuid, op)) {
sender.sendMessage(ChatFormatter.parse("&#9878C9Игрок &#7858E9" + name + " &#9878C9размучен"));
if (target != null) target.sendMessage(ChatFormatter.parse("&#9878C9Вы были &#7858E9размучены!"));
if (target != null) {
target.sendMessage(ChatFormatter.parse("&#9878C9Вы были &#7858E9размучены!"));
}
if (silent) {
String msg = "&#B798A8[&#9878C9ТИХО&#B798A8] &#7858E9" + name + " &#B798A8размучен &#9878C9(" + op + ")";
for (Player p : Bukkit.getOnlinePlayers()) if (p.hasPermission("lochat.mute.see-silent")) p.sendMessage(ChatFormatter.parse(msg));
for (Player p : Bukkit.getOnlinePlayers()) {
if (p.hasPermission("lochat.mute.see-silent")) {
p.sendMessage(ChatFormatter.parse(msg));
}
}
} else {
Bukkit.broadcast(ChatFormatter.parse("&#9878C9Игрок &#7858E9" + name + " &#9878C9размучен модератором &#7858E9" + op));
}
@ -67,8 +86,15 @@ public class UnmuteCommand implements CommandExecutor, TabCompleter {
@Override
public @Nullable List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, @NotNull String[] args) {
List<String> c = new ArrayList<>();
if (args.length == 1) for (Player p : Bukkit.getOnlinePlayers()) if (p.getName().toLowerCase().startsWith(args[0].toLowerCase())) c.add(p.getName());
else if (args.length == 2) c.add("-s");
if (args.length == 1) {
for (Player p : Bukkit.getOnlinePlayers()) {
if (p.getName().toLowerCase().startsWith(args[0].toLowerCase())) {
c.add(p.getName());
}
}
} else if (args.length == 2) {
c.add("-s");
}
return c;
}
}

View file

@ -5,6 +5,7 @@ import com.loki.lochat.api.service.PunishmentService;
import com.loki.lochat.config.MessagesConfig;
import com.loki.lochat.utils.format.ChatFormatter;
import com.loki.lochat.utils.player.PlayerUtil;
import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
@ -55,7 +56,9 @@ public class SilentWarnCommand implements CommandExecutor, TabCompleter {
? String.join(" ", java.util.Arrays.copyOfRange(args, 1, args.length))
: msg.getModerationDefaultReason();
String name = PlayerUtil.getPlayerName(targetUuid);
if (name == null) name = args[0];
if (name == null) {
name = args[0];
}
punishmentService.addWarn(targetUuid, name, mod, reason, true);
@ -77,7 +80,9 @@ public class SilentWarnCommand implements CommandExecutor, TabCompleter {
if (args.length == 1) {
String p = args[0].toLowerCase();
for (Player pl : Bukkit.getOnlinePlayers()) {
if (pl.getName().toLowerCase().startsWith(p)) out.add(pl.getName());
if (pl.getName().toLowerCase().startsWith(p)) {
out.add(pl.getName());
}
}
}
return out;

View file

@ -5,6 +5,7 @@ import com.loki.lochat.api.service.PunishmentService;
import com.loki.lochat.config.MessagesConfig;
import com.loki.lochat.utils.format.ChatFormatter;
import com.loki.lochat.utils.player.PlayerUtil;
import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
@ -58,7 +59,9 @@ public class WarnCommand implements CommandExecutor, TabCompleter {
String mod = sender.getName();
String reason = buildReason(msg, args, 1);
String name = PlayerUtil.getPlayerName(targetUuid);
if (name == null) name = args[0];
if (name == null) {
name = args[0];
}
Player targetOnline = Bukkit.getPlayer(targetUuid);
if (targetOnline != null && targetOnline.hasPermission("lochat.bypass.warn")) {
@ -82,7 +85,9 @@ public class WarnCommand implements CommandExecutor, TabCompleter {
}
StringBuilder sb = new StringBuilder();
for (int i = from; i < args.length; i++) {
if (sb.length() > 0) sb.append(" ");
if (sb.length() > 0) {
sb.append(" ");
}
sb.append(args[i]);
}
return sb.toString();
@ -95,7 +100,9 @@ public class WarnCommand implements CommandExecutor, TabCompleter {
if (args.length == 1) {
String p = args[0].toLowerCase();
for (Player pl : Bukkit.getOnlinePlayers()) {
if (pl.getName().toLowerCase().startsWith(p)) out.add(pl.getName());
if (pl.getName().toLowerCase().startsWith(p)) {
out.add(pl.getName());
}
}
}
return out;

View file

@ -3,8 +3,10 @@ package com.loki.lochat.commands.nick;
import com.loki.lochat.LoChat;
import com.loki.lochat.api.service.NickService;
import com.loki.lochat.utils.format.ChatFormatter;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
@ -84,8 +86,12 @@ public class NickCommand implements CommandExecutor, TabCompleter {
public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
List<String> c = new ArrayList<>();
if (args.length == 1) {
if ("reset".startsWith(args[0].toLowerCase())) c.add("reset");
if (sender instanceof Player p) nickService.getNickname(p.getUniqueId()).ifPresent(c::add);
if ("reset".startsWith(args[0].toLowerCase())) {
c.add("reset");
}
if (sender instanceof Player p) {
nickService.getNickname(p.getUniqueId()).ifPresent(c::add);
}
}
return c;
}

View file

@ -8,6 +8,7 @@ import com.loki.lochat.data.model.MuteData;
import com.loki.lochat.data.model.WarnEntry;
import com.loki.lochat.utils.format.ChatFormatter;
import com.loki.lochat.utils.player.PlayerUtil;
import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
@ -55,7 +56,9 @@ public class PlayerInfoCommand implements CommandExecutor, TabCompleter {
}
String name = PlayerUtil.getPlayerName(uuid);
if (name == null) name = args[0];
if (name == null) {
name = args[0];
}
Player target = Bukkit.getPlayer(uuid);
@ -129,7 +132,9 @@ public class PlayerInfoCommand implements CommandExecutor, TabCompleter {
if (args.length == 1) {
String p = args[0].toLowerCase();
for (Player pl : Bukkit.getOnlinePlayers()) {
if (pl.getName().toLowerCase().startsWith(p)) out.add(pl.getName());
if (pl.getName().toLowerCase().startsWith(p)) {
out.add(pl.getName());
}
}
}
return out;

View file

@ -4,7 +4,9 @@ import com.loki.lochat.LoChat;
import com.loki.lochat.api.service.PlayerService;
import com.loki.lochat.commands.base.PlayerCommand;
import com.loki.lochat.utils.format.ChatFormatter;
import net.kyori.adventure.text.Component;
import org.bukkit.command.Command;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
@ -26,7 +28,9 @@ public class DoCommand extends PlayerCommand {
@Override
protected boolean executePlayerCommand(@NotNull Player player, @NotNull Command command,
@NotNull String label, @NotNull String[] args) {
if (!requirePermission(player, "lochat.rp.do")) return true;
if (!requirePermission(player, "lochat.rp.do")) {
return true;
}
int cooldown = plugin.getConfigManager().getInt("rp.cooldowns.do", 0);
if (cooldown > 0 && playerService.isOnCooldown(player.getUniqueId(), "rp_do", cooldown)) {
@ -54,7 +58,9 @@ public class DoCommand extends PlayerCommand {
int radius = plugin.getConfigManager().getInt("rp.radius", 100);
RpUtil.sendToRadius(player, message, radius);
if (cooldown > 0) playerService.setCooldown(player.getUniqueId(), "rp_do");
if (cooldown > 0) {
playerService.setCooldown(player.getUniqueId(), "rp_do");
}
plugin.getLogger().info("[DO] " + player.getName() + ": " + description);
return true;
}

View file

@ -4,7 +4,9 @@ import com.loki.lochat.LoChat;
import com.loki.lochat.api.service.PlayerService;
import com.loki.lochat.commands.base.PlayerCommand;
import com.loki.lochat.utils.format.ChatFormatter;
import net.kyori.adventure.text.Component;
import org.bukkit.command.Command;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
@ -26,7 +28,9 @@ public class MeCommand extends PlayerCommand {
@Override
protected boolean executePlayerCommand(@NotNull Player player, @NotNull Command command,
@NotNull String label, @NotNull String[] args) {
if (!requirePermission(player, "lochat.rp.me")) return true;
if (!requirePermission(player, "lochat.rp.me")) {
return true;
}
int cooldown = plugin.getConfigManager().getInt("rp.cooldowns.me", 0);
if (cooldown > 0 && playerService.isOnCooldown(player.getUniqueId(), "rp_me", cooldown)) {
@ -54,7 +58,9 @@ public class MeCommand extends PlayerCommand {
int radius = plugin.getConfigManager().getInt("rp.radius", 100);
RpUtil.sendToRadius(player, message, radius);
if (cooldown > 0) playerService.setCooldown(player.getUniqueId(), "rp_me");
if (cooldown > 0) {
playerService.setCooldown(player.getUniqueId(), "rp_me");
}
plugin.getLogger().info("[ME] " + player.getName() + ": " + action);
return true;
}

View file

@ -4,7 +4,9 @@ import com.loki.lochat.LoChat;
import com.loki.lochat.commands.base.PlayerCommand;
import com.loki.lochat.config.RatConfig;
import com.loki.lochat.utils.format.ChatFormatter;
import net.kyori.adventure.text.Component;
import org.bukkit.command.Command;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
@ -29,7 +31,9 @@ public class RollCommand extends PlayerCommand {
@Override
protected boolean executePlayerCommand(@NotNull Player player, @NotNull Command command,
@NotNull String label, @NotNull String[] args) {
if (!requirePermission(player, "lochat.rp.roll")) return true;
if (!requirePermission(player, "lochat.rp.roll")) {
return true;
}
int max = RatConfig.ROLL_DEFAULT_MAX;

View file

@ -2,8 +2,10 @@ package com.loki.lochat.commands.rp;
import com.loki.lochat.LoChat;
import com.loki.lochat.utils.player.DistanceUtil;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
@ -34,7 +36,8 @@ public final class RpUtil {
if (plugin.getGradientModule() != null && plugin.getGradientModule().isEnabled()) {
return plugin.getGradientModule().getFormattedName(player);
}
} catch (Exception ignored) {}
} catch (Exception ignored) {
}
// Пробуем взять displayName (может содержать градиент от NickService)
Component displayName = player.displayName();

View file

@ -4,7 +4,9 @@ import com.loki.lochat.LoChat;
import com.loki.lochat.api.service.PlayerService;
import com.loki.lochat.commands.base.PlayerCommand;
import com.loki.lochat.utils.format.ChatFormatter;
import net.kyori.adventure.text.Component;
import org.bukkit.command.Command;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
@ -29,7 +31,9 @@ public class TryCommand extends PlayerCommand {
@Override
protected boolean executePlayerCommand(@NotNull Player player, @NotNull Command command,
@NotNull String label, @NotNull String[] args) {
if (!requirePermission(player, "lochat.rp.try")) return true;
if (!requirePermission(player, "lochat.rp.try")) {
return true;
}
int cooldown = plugin.getConfigManager().getInt("rp.cooldowns.try", 0);
if (cooldown > 0 && playerService.isOnCooldown(player.getUniqueId(), "rp_try", cooldown)) {
@ -64,7 +68,9 @@ public class TryCommand extends PlayerCommand {
int radius = plugin.getConfigManager().getInt("rp.radius", 100);
RpUtil.sendToRadius(player, message, radius);
if (cooldown > 0) playerService.setCooldown(player.getUniqueId(), "rp_try");
if (cooldown > 0) {
playerService.setCooldown(player.getUniqueId(), "rp_try");
}
plugin.getLogger().info("[TRY] " + player.getName() + ": " + action + " -> " + (success ? "SUCCESS" : "FAIL"));
return true;
}

View file

@ -2,9 +2,9 @@ package com.loki.lochat.config;
import org.bukkit.plugin.Plugin;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.HashMap;
/**
* Конфигурация внешнего вида чата (config/appearance.yml)
@ -48,19 +48,43 @@ public class AppearanceConfig extends BaseConfig {
return config.getString("prefixes." + chatType + "." + key, defaultValue);
}
public String getGlobalEmoji() { return getPrefixValue("global", "emoji", "🌍"); }
public String getGlobalText() { return getPrefixValue("global", "text", "GLOBAL"); }
public List<String> getGlobalColors() { return config.getStringList("prefixes.global.colors"); }
public String getGlobalSeparatorText() { return getPrefixValue("global", "separator.text", " ▶ "); }
public String getGlobalSeparatorColor() { return getPrefixValue("global", "separator.color", "#FFD700"); }
public String getGlobalMessageColor() { return getPrefixValue("global", "message-color", "#FFFFFF"); }
public String getGlobalEmoji() {
return getPrefixValue("global", "emoji", "🌍");
}
public String getGlobalText() {
return getPrefixValue("global", "text", "GLOBAL");
}
public List<String> getGlobalColors() {
return config.getStringList("prefixes.global.colors");
}
public String getGlobalSeparatorText() {
return getPrefixValue("global", "separator.text", " ▶ ");
}
public String getGlobalSeparatorColor() {
return getPrefixValue("global", "separator.color", "#FFD700");
}
public String getGlobalMessageColor() {
return getPrefixValue("global", "message-color", "#FFFFFF");
}
public String getLocalEmoji() { return getPrefixValue("local", "emoji", ""); }
public String getLocalText() { return getPrefixValue("local", "text", "LOCAL"); }
public List<String> getLocalColors() { return config.getStringList("prefixes.local.colors"); }
public String getLocalSeparatorText() { return getPrefixValue("local", "separator.text", " ▶ "); }
public String getLocalSeparatorColor() { return getPrefixValue("local", "separator.color", "#FFFFFF"); }
public String getLocalMessageColor() { return getPrefixValue("local", "message-color", "#FFFFFF"); }
public String getLocalEmoji() {
return getPrefixValue("local", "emoji", "");
}
public String getLocalText() {
return getPrefixValue("local", "text", "LOCAL");
}
public List<String> getLocalColors() {
return config.getStringList("prefixes.local.colors");
}
public String getLocalSeparatorText() {
return getPrefixValue("local", "separator.text", " ▶ ");
}
public String getLocalSeparatorColor() {
return getPrefixValue("local", "separator.color", "#FFFFFF");
}
public String getLocalMessageColor() {
return getPrefixValue("local", "message-color", "#FFFFFF");
}
// ========== ФОРМАТ СООБЩЕНИЙ ==========
@ -74,36 +98,72 @@ public class AppearanceConfig extends BaseConfig {
// ========== HOVER ЭФФЕКТЫ ==========
public boolean isHoverEnabled() { return config.getBoolean("hover.enabled", true); }
public List<String> getHoverFormat() { return config.getStringList("hover.format"); }
public boolean isHoverEnabled() {
return config.getBoolean("hover.enabled", true);
}
public List<String> getHoverFormat() {
return config.getStringList("hover.format");
}
// ========== ЭМОДЗИ ==========
public Map<String, String> getEmojis() { return new HashMap<>(emojiCache); }
public String getEmoji(String key) { return emojiCache.get(key); }
public Map<String, String> getEmojis() {
return new HashMap<>(emojiCache);
}
public String getEmoji(String key) {
return emojiCache.get(key);
}
// ========== НАСТРОЙКИ ЧАТА ==========
public int getLocalRadius() { return config.getInt("chat.local_radius", 100); }
public int getClearLines() { return config.getInt("chat.clear_lines", 100); }
public int getMinMessageLength() { return config.getInt("chat.min_message_length", 1); }
public int getMaxMessageLength() { return config.getInt("chat.max_message_length", 2000); }
public int getLocalRadius() {
return config.getInt("chat.local_radius", 100);
}
public int getClearLines() {
return config.getInt("chat.clear_lines", 100);
}
public int getMinMessageLength() {
return config.getInt("chat.min_message_length", 1);
}
public int getMaxMessageLength() {
return config.getInt("chat.max_message_length", 2000);
}
private String getChatColor(String type, String defaultColor) {
return config.getString("chat.colors." + type, defaultColor);
}
public String getNobodyHeardColor() { return getChatColor("nobody_heard", "#FFA726"); }
public String getErrorColor() { return getChatColor("error", "#FF6B6B"); }
public String getSuccessColor() { return getChatColor("success", "#6BCB77"); }
public String getWarningColor() { return getChatColor("warning", "#FFA726"); }
public String getInfoColor() { return getChatColor("info", "#87CEEB"); }
public String getNobodyHeardColor() {
return getChatColor("nobody_heard", "#FFA726");
}
public String getErrorColor() {
return getChatColor("error", "#FF6B6B");
}
public String getSuccessColor() {
return getChatColor("success", "#6BCB77");
}
public String getWarningColor() {
return getChatColor("warning", "#FFA726");
}
public String getInfoColor() {
return getChatColor("info", "#87CEEB");
}
// ========== DISCORD ==========
public String getDiscordEmoji(String event) { return config.getString("discord.emojis." + event, ""); }
public String getDiscordEventTitle(String event) { return config.getString("discord.event_titles." + event, ""); }
public String getDefaultAvatarUrl() { return config.getString("discord.avatar_urls.default", "https://mc-heads.net/avatar/minecraft/64"); }
public String getPlayerAvatarUrl() { return config.getString("discord.avatar_urls.player", "https://mc-heads.net/avatar/{player}/64"); }
public String getDefaultEmbedColor() { return config.getString("discord.default_embed_color", "5865F2"); }
public String getDiscordEmoji(String event) {
return config.getString("discord.emojis." + event, "");
}
public String getDiscordEventTitle(String event) {
return config.getString("discord.event_titles." + event, "");
}
public String getDefaultAvatarUrl() {
return config.getString("discord.avatar_urls.default", "https://mc-heads.net/avatar/minecraft/64");
}
public String getPlayerAvatarUrl() {
return config.getString("discord.avatar_urls.player", "https://mc-heads.net/avatar/{player}/64");
}
public String getDefaultEmbedColor() {
return config.getString("discord.default_embed_color", "5865F2");
}
}

View file

@ -1,9 +1,8 @@
package com.loki.lochat.config;
import com.loki.lochat.LoChat;
import com.loki.lochat.config.core.ConfigLoader;
import com.loki.lochat.config.core.ConfigAccessor;
import org.bukkit.configuration.file.FileConfiguration;
import com.loki.lochat.config.core.ConfigLoader;
import java.util.List;

View file

@ -2,7 +2,9 @@ package com.loki.lochat.config;
import com.loki.lochat.LoChat;
import com.loki.lochat.utils.format.ChatFormatter;
import net.kyori.adventure.text.Component;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;

View file

@ -1,6 +1,7 @@
package com.loki.lochat.config.core;
import com.loki.lochat.utils.format.ChatFormatter;
import org.bukkit.configuration.file.FileConfiguration;
import java.util.List;

View file

@ -15,6 +15,7 @@ import com.loki.lochat.listener.ModerationListener;
import com.loki.lochat.listener.PlayerEventListener;
import com.loki.lochat.managers.AutoMessageManager;
import com.loki.lochat.managers.CustomCommandManager;
import org.bukkit.Bukkit;
/**

View file

@ -3,13 +3,14 @@ package com.loki.lochat.core;
import com.loki.lochat.LoChat;
import com.loki.lochat.api.service.MessagingService;
import com.loki.lochat.api.service.MuteService;
import com.loki.lochat.api.service.PunishmentService;
import com.loki.lochat.api.service.NickService;
import com.loki.lochat.api.service.PlayerService;
import com.loki.lochat.api.service.PunishmentService;
import com.loki.lochat.core.registry.ServiceRegistry;
import com.loki.lochat.gradient.GradientModule;
import com.loki.lochat.integrations.DiscordIntegration;
import com.loki.lochat.managers.AutoMessageManager;
import org.bukkit.event.HandlerList;
/**
@ -59,7 +60,9 @@ public class PluginShutdown {
* Сохранить все данные через сервисы
*/
private void saveAllData(ServiceRegistry serviceRegistry) {
if (serviceRegistry == null) return;
if (serviceRegistry == null) {
return;
}
// Статистика игроков
PlayerService playerService = serviceRegistry.get(PlayerService.class);

View file

@ -10,6 +10,7 @@ import com.loki.lochat.core.service.mute.MuteHistoryManager;
import com.loki.lochat.core.service.mute.strategies.ChatMuteStrategy;
import com.loki.lochat.core.service.mute.strategies.MuteStrategy;
import com.loki.lochat.core.service.mute.strategies.VoiceMuteStrategy;
import org.bukkit.plugin.java.JavaPlugin;
import java.io.File;
@ -21,6 +22,9 @@ import java.util.List;
*/
public class ServiceFactory {
private ServiceFactory() {
}
/**
* Создать MuteService со всеми зависимостями
*/

View file

@ -1,6 +1,7 @@
package com.loki.lochat.core.filter;
import com.loki.lochat.core.filter.filters.*;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;
@ -80,24 +81,32 @@ public class AdvancedMessageFilter {
// 2. Мат
if (config.getBoolean("filters.swear.enabled", true) && !canBypassFilter(player, "swear")) {
FilterResult swear = swearFilter.filter(player, message);
if (!swear.allowed()) return swear;
if (!swear.allowed()) {
return swear;
}
message = swear.filteredMessage();
}
// 3. URL фильтры
if (config.getBoolean("filters.advertising.enabled", true)) {
FilterResult r = urlFilter.filterUrls(player, message);
if (!r.allowed()) return r;
if (!r.allowed()) {
return r;
}
message = r.filteredMessage();
r = urlFilter.filterHiddenUrls(player, message);
if (!r.allowed()) return r;
if (!r.allowed()) {
return r;
}
}
// 4. IP
if (config.getBoolean("filters.ip.enabled", true)) {
FilterResult r = urlFilter.filterIPs(player, message);
if (!r.allowed()) return r;
if (!r.allowed()) {
return r;
}
message = r.filteredMessage();
}
@ -109,13 +118,17 @@ public class AdvancedMessageFilter {
// 6. Anti-flood
if (config.getBoolean("filters.flood.enabled", true) && !canBypassFilter(player, "flood")) {
FilterResult r = floodFilter.filter(player);
if (!r.allowed()) return r;
if (!r.allowed()) {
return r;
}
}
// 7. Anti-spam
if (config.getBoolean("filters.spam.enabled", true) && !canBypassFilter(player, "spam")) {
FilterResult r = spamFilter.filter(player, message);
if (!r.allowed()) return r;
if (!r.allowed()) {
return r;
}
}
return FilterResult.ok(message);

View file

@ -3,6 +3,7 @@ package com.loki.lochat.core.filter;
import com.loki.lochat.api.filter.MessageFilter;
import com.loki.lochat.api.service.PlayerService;
import com.loki.lochat.data.model.ChatMessage;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;

View file

@ -5,6 +5,7 @@ import com.loki.lochat.api.service.MuteService;
import com.loki.lochat.config.MessagesConfig;
import com.loki.lochat.data.model.ChatMessage;
import com.loki.lochat.utils.format.ChatFormatter;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;

View file

@ -1,6 +1,7 @@
package com.loki.lochat.core.filter.filters;
import com.loki.lochat.core.filter.FilterResult;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.Player;

View file

@ -1,6 +1,7 @@
package com.loki.lochat.core.filter.filters;
import com.loki.lochat.core.filter.FilterResult;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.Player;
@ -41,15 +42,21 @@ public class SpamFilter {
// Добавляем в историю (храним последние 10)
history.addLast(message);
if (history.size() > 10) history.pollFirst();
if (history.size() > 10) {
history.pollFirst();
}
return FilterResult.ok(null);
}
private int similarity(String a, String b) {
if (a.equals(b)) return 100;
if (a.equals(b)) {
return 100;
}
int maxLen = Math.max(a.length(), b.length());
if (maxLen == 0) return 100;
if (maxLen == 0) {
return 100;
}
int dist = levenshtein(
a.toLowerCase().substring(0, Math.min(a.length(), 50)),
@ -60,7 +67,9 @@ public class SpamFilter {
private int levenshtein(String a, String b) {
int[] dp = new int[b.length() + 1];
for (int j = 0; j <= b.length(); j++) dp[j] = j;
for (int j = 0; j <= b.length(); j++) {
dp[j] = j;
}
for (int i = 1; i <= a.length(); i++) {
int prev = dp[0];

View file

@ -1,6 +1,7 @@
package com.loki.lochat.core.filter.filters;
import com.loki.lochat.core.filter.FilterResult;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;

View file

@ -1,11 +1,11 @@
package com.loki.lochat.core.filter.filters;
import com.loki.lochat.core.filter.FilterResult;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.Player;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

View file

@ -5,6 +5,7 @@ import com.loki.lochat.config.ConfigManager;
import com.loki.lochat.config.MessageConfig;
import com.loki.lochat.core.factory.ServiceFactory;
import com.loki.lochat.core.service.*;
import org.bukkit.plugin.java.JavaPlugin;
import java.util.HashMap;

View file

@ -3,10 +3,12 @@ package com.loki.lochat.core.service;
import com.loki.lochat.api.service.ChatService;
import com.loki.lochat.core.registry.ServiceRegistry;
import com.loki.lochat.renderer.EnhancedChatRenderer;
import com.loki.lochat.utils.player.DistanceUtil;
import com.loki.lochat.utils.platform.FoliaUtil;
import com.loki.lochat.utils.format.ChatFormatter;
import com.loki.lochat.utils.platform.FoliaUtil;
import com.loki.lochat.utils.player.DistanceUtil;
import net.kyori.adventure.text.Component;
import org.bukkit.Bukkit;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player;
@ -97,12 +99,15 @@ public class ChatServiceImpl implements ChatService {
// ──────────────────────────────────────────────────────────────────────────
private void loadDisabled() {
if (!playersFile.exists()) return;
if (!playersFile.exists()) {
return;
}
YamlConfiguration cfg = YamlConfiguration.loadConfiguration(playersFile);
for (String uuidStr : cfg.getStringList("global-chat-disabled")) {
try {
globalChatDisabled.add(UUID.fromString(uuidStr));
} catch (IllegalArgumentException ignored) {}
} catch (IllegalArgumentException ignored) {
}
}
}
@ -123,7 +128,9 @@ public class ChatServiceImpl implements ChatService {
private void ensureDir() {
File dir = playersFile.getParentFile();
if (!dir.exists()) dir.mkdirs();
if (!dir.exists()) {
dir.mkdirs();
}
}
private Component toComponent(Object message) {

View file

@ -3,6 +3,7 @@ package com.loki.lochat.core.service;
import com.loki.lochat.api.service.MentionService;
import com.loki.lochat.config.ConfigManager;
import com.loki.lochat.utils.player.PlayerUtil;
import org.bukkit.Bukkit;
import org.bukkit.Sound;
import org.bukkit.entity.Player;
@ -113,8 +114,12 @@ public class MentionServiceImpl implements MentionService {
@Override
public void notifyIfMentioned(String message, Player viewer, Player sender) {
if (viewer.equals(sender)) return;
if (!configManager.isMentionSoundEnabled()) return;
if (viewer.equals(sender)) {
return;
}
if (!configManager.isMentionSoundEnabled()) {
return;
}
if (isPlayerMentioned(message, viewer)) {
String soundName = configManager.getMentionSoundType();

View file

@ -1,13 +1,14 @@
package com.loki.lochat.core.service;
import com.loki.lochat.api.filter.MessageFilter;
import com.loki.lochat.api.service.PlayerService;
import com.loki.lochat.api.service.MessageService;
import com.loki.lochat.api.service.MuteService;
import com.loki.lochat.api.service.PlayerService;
import com.loki.lochat.core.filter.CooldownFilter;
import com.loki.lochat.core.filter.MuteFilter;
import com.loki.lochat.core.registry.ServiceRegistry;
import com.loki.lochat.data.model.ChatMessage;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;

View file

@ -5,7 +5,9 @@ import com.loki.lochat.config.MessageConfig;
import com.loki.lochat.core.service.messaging.IgnoreService;
import com.loki.lochat.core.service.messaging.PrivateMessageService;
import com.loki.lochat.core.service.messaging.SpyService;
import net.kyori.adventure.text.Component;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;

View file

@ -7,6 +7,7 @@ import com.loki.lochat.core.service.mute.MutePermissionChecker;
import com.loki.lochat.core.service.mute.strategies.MuteStrategy;
import com.loki.lochat.data.model.MuteData;
import com.loki.lochat.utils.format.TimeFormatter;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;
@ -82,12 +83,18 @@ public class MuteServiceImpl implements MuteService {
@Override
public boolean isMuted(UUID uuid) {
if (uuid == null) return false;
if (uuid == null) {
return false;
}
MuteData data = storage.get(uuid);
if (data == null) return false;
if (data == null) {
return false;
}
if (!isExpired(data)) return true;
if (!isExpired(data)) {
return true;
}
// Мут истек - удаляем
storage.remove(uuid);
@ -104,8 +111,12 @@ public class MuteServiceImpl implements MuteService {
@Override
public long getRemainingTime(UUID uuid) {
MuteData data = storage.get(uuid);
if (data == null) return 0;
if (data.getEndTime() == 0) return -1;
if (data == null) {
return 0;
}
if (data.getEndTime() == 0) {
return -1;
}
return Math.max(0, data.getEndTime() - System.currentTimeMillis());
}

View file

@ -3,8 +3,10 @@ package com.loki.lochat.core.service;
import com.loki.lochat.api.service.NickService;
import com.loki.lochat.config.RatConfig;
import com.loki.lochat.utils.format.ChatFormatter;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer;
import org.bukkit.Bukkit;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;

View file

@ -2,6 +2,7 @@ package com.loki.lochat.core.service;
import com.loki.lochat.api.service.PlayerService;
import com.loki.lochat.utils.platform.FoliaUtil;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.plugin.java.JavaPlugin;
@ -47,7 +48,9 @@ public class PlayerServiceImpl implements PlayerService {
Map<UUID, Long> cooldowns = getCooldownMap(type);
Long lastTime = cooldowns.get(player);
if (lastTime == null) return false;
if (lastTime == null) {
return false;
}
long elapsed = (System.currentTimeMillis() - lastTime) / 1000;
return elapsed < cooldownSeconds;
@ -58,7 +61,9 @@ public class PlayerServiceImpl implements PlayerService {
Map<UUID, Long> cooldowns = getCooldownMap(type);
Long lastTime = cooldowns.get(player);
if (lastTime == null) return 0;
if (lastTime == null) {
return 0;
}
long elapsed = (System.currentTimeMillis() - lastTime) / 1000;
return Math.max(0, cooldownSeconds - (int) elapsed);
@ -89,6 +94,8 @@ public class PlayerServiceImpl implements PlayerService {
case "global" -> globalChatCount.incrementAndGet();
case "local" -> localChatCount.incrementAndGet();
case "pm" -> pmCount.incrementAndGet();
default -> {
}
}
}
@ -152,6 +159,8 @@ public class PlayerServiceImpl implements PlayerService {
private void ensureDir() {
File dir = statsFile.getParentFile();
if (!dir.exists()) dir.mkdirs();
if (!dir.exists()) {
dir.mkdirs();
}
}
}

View file

@ -7,10 +7,12 @@ import com.loki.lochat.api.service.PunishmentService;
import com.loki.lochat.config.MessagesConfig;
import com.loki.lochat.data.model.BanRecord;
import com.loki.lochat.data.model.WarnEntry;
import com.loki.lochat.utils.platform.FoliaUtil;
import com.loki.lochat.utils.format.ChatFormatter;
import com.loki.lochat.utils.format.TimeFormatter;
import com.loki.lochat.utils.platform.FoliaUtil;
import net.kyori.adventure.text.Component;
import org.bukkit.plugin.java.JavaPlugin;
import java.io.*;
@ -48,7 +50,9 @@ public class PunishmentServiceImpl implements PunishmentService {
@Override
public List<WarnEntry> getWarns(UUID uuid) {
List<WarnEntry> list = warns.get(uuid);
if (list == null) return List.of();
if (list == null) {
return List.of();
}
synchronized (list) {
return List.copyOf(list);
}
@ -81,8 +85,12 @@ public class PunishmentServiceImpl implements PunishmentService {
@Override
public boolean isBanned(UUID uuid) {
BanRecord b = bans.get(uuid);
if (b == null) return false;
if (b.isPermanent()) return true;
if (b == null) {
return false;
}
if (b.isPermanent()) {
return true;
}
if (b.isExpired()) {
bans.remove(uuid, b);
saveAsync();
@ -93,7 +101,9 @@ public class PunishmentServiceImpl implements PunishmentService {
@Override
public BanRecord getActiveBan(UUID uuid) {
if (!isBanned(uuid)) return null;
if (!isBanned(uuid)) {
return null;
}
return bans.get(uuid);
}
@ -153,11 +163,15 @@ public class PunishmentServiceImpl implements PunishmentService {
}
private void load() {
if (!dataFile.exists()) return;
if (!dataFile.exists()) {
return;
}
try (Reader r = new InputStreamReader(new FileInputStream(dataFile), java.nio.charset.StandardCharsets.UTF_8)) {
Type type = new TypeToken<PunishmentSnapshot>() {}.getType();
Type type = new TypeToken<PunishmentSnapshot>() { }.getType();
PunishmentSnapshot snap = gson.fromJson(r, type);
if (snap == null) return;
if (snap == null) {
return;
}
if (snap.warns != null) {
for (Map.Entry<String, List<WarnEntry>> e : snap.warns.entrySet()) {
try {
@ -173,7 +187,9 @@ public class PunishmentServiceImpl implements PunishmentService {
BanRecord br = e.getValue();
if (br != null) {
br.uuid = id;
if (!br.isPermanent() && br.isExpired()) continue;
if (!br.isPermanent() && br.isExpired()) {
continue;
}
bans.put(id, br);
}
} catch (IllegalArgumentException ignored) {

View file

@ -1,6 +1,7 @@
package com.loki.lochat.core.service.messaging;
import com.loki.lochat.utils.platform.FoliaUtil;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.plugin.java.JavaPlugin;
@ -36,15 +37,21 @@ public class IgnoreService {
public boolean addIgnore(UUID player, UUID target) {
Set<UUID> ignored = ignoreMap.computeIfAbsent(player, k -> ConcurrentHashMap.newKeySet());
boolean added = ignored.add(target);
if (added) saveAsync();
if (added) {
saveAsync();
}
return added;
}
public boolean removeIgnore(UUID player, UUID target) {
Set<UUID> ignored = ignoreMap.get(player);
if (ignored == null) return false;
if (ignored == null) {
return false;
}
boolean removed = ignored.remove(target);
if (removed) saveAsync();
if (removed) {
saveAsync();
}
return removed;
}
@ -63,7 +70,9 @@ public class IgnoreService {
}
public void load() {
if (!ignoreFile.exists()) return;
if (!ignoreFile.exists()) {
return;
}
YamlConfiguration config = YamlConfiguration.loadConfiguration(ignoreFile);
for (String key : config.getKeys(false)) {

View file

@ -2,8 +2,10 @@ package com.loki.lochat.core.service.messaging;
import com.loki.lochat.config.MessageConfig;
import com.loki.lochat.utils.format.ChatFormatter;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
@ -53,7 +55,9 @@ public class SpyService {
}
public void sendToSpies(Player sender, Component message, boolean isGlobal) {
if (spyEnabled.isEmpty()) return;
if (spyEnabled.isEmpty()) {
return;
}
String chatType = isGlobal ? "Global" : "Local";
String plainMessage = PlainTextComponentSerializer.plainText().serialize(message);

View file

@ -5,6 +5,7 @@ import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;
import com.loki.lochat.data.model.MuteData;
import com.loki.lochat.utils.platform.FoliaUtil;
import org.bukkit.plugin.java.JavaPlugin;
import java.io.*;
@ -59,7 +60,7 @@ public class MuteDataStorage {
}
try (Reader reader = new FileReader(dataFile)) {
Type type = new TypeToken<Map<String, MuteData>>() {}.getType();
Type type = new TypeToken<Map<String, MuteData>>() { }.getType();
Map<String, MuteData> loaded = gson.fromJson(reader, type);
if (loaded != null) {
loaded.forEach((key, value) -> {

View file

@ -1,6 +1,7 @@
package com.loki.lochat.core.service.mute;
import com.loki.lochat.utils.format.TimeFormatter;
import org.bukkit.entity.Player;
/**

View file

@ -57,7 +57,9 @@ public class VoiceMuteStrategy implements MuteStrategy {
}
private void muteVoiceChat(UUID uuid, boolean mute) {
if (voicechatService == null) return;
if (voicechatService == null) {
return;
}
try {
Player player = Bukkit.getPlayer(uuid);

View file

@ -31,7 +31,9 @@ public class BanRecord {
}
public boolean isExpired() {
if (isPermanent()) return false;
if (isPermanent()) {
return false;
}
return System.currentTimeMillis() >= until;
}
}

View file

@ -11,6 +11,7 @@ import com.loki.lochat.gradient.listeners.GradientGUIListener;
import com.loki.lochat.gradient.listeners.GradientPlayerListener;
import com.loki.lochat.gradient.service.GradientService;
import com.loki.lochat.gradient.service.PrefixService;
import org.black_ixx.playerpoints.PlayerPoints;
import org.black_ixx.playerpoints.PlayerPointsAPI;
import org.bukkit.Bukkit;
@ -113,7 +114,9 @@ public class GradientModule {
* Получает отформатированное имя игрока (префикс + ник с градиентом)
*/
public String getFormattedName(Player player) {
if (!enabled) return player.getName();
if (!enabled) {
return player.getName();
}
GradientPlayerData data = dataManager.getPlayerData(player.getUniqueId());
return prefixService.getFullName(player, data);
@ -123,7 +126,9 @@ public class GradientModule {
* Получает отформатированное имя для TAB плагина
*/
public String getFormattedNameForTab(Player player) {
if (!enabled) return player.getName();
if (!enabled) {
return player.getName();
}
GradientPlayerData data = dataManager.getPlayerData(player.getUniqueId());
return prefixService.getFullNameForTab(player, data);
@ -133,7 +138,9 @@ public class GradientModule {
* Получает только градиентный ник (без префикса)
*/
public String getGradientNick(Player player) {
if (!enabled) return player.getName();
if (!enabled) {
return player.getName();
}
GradientPlayerData data = dataManager.getPlayerData(player.getUniqueId());
return GradientService.applyGradient(player, player.getName(), data);
@ -143,7 +150,9 @@ public class GradientModule {
* Получает префикс игрока (кастомный или LuckPerms) с градиентом
*/
public String getPrefix(Player player) {
if (!enabled) return "";
if (!enabled) {
return "";
}
GradientPlayerData data = dataManager.getPlayerData(player.getUniqueId());
return prefixService.getPrefix(player, data);
@ -153,7 +162,9 @@ public class GradientModule {
* Получает суффикс игрока из LuckPerms с градиентом
*/
public String getSuffix(Player player) {
if (!enabled) return "";
if (!enabled) {
return "";
}
GradientPlayerData data = dataManager.getPlayerData(player.getUniqueId());
return prefixService.getLuckPermsSuffix(player, data);
@ -163,7 +174,9 @@ public class GradientModule {
* Получает только LuckPerms префикс
*/
public String getLuckPermsPrefix(Player player) {
if (!enabled) return "";
if (!enabled) {
return "";
}
GradientPlayerData data = dataManager.getPlayerData(player.getUniqueId());
return prefixService.getLuckPermsPrefix(player, data);

View file

@ -8,6 +8,7 @@ import com.loki.lochat.gradient.config.GradientMessages;
import com.loki.lochat.gradient.data.GradientPlayerData;
import com.loki.lochat.gradient.util.DisplayNameUtil;
import com.loki.lochat.utils.platform.FoliaUtil;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.command.Command;
@ -125,7 +126,9 @@ public class GradientAdminCommand implements CommandExecutor, TabCompleter {
@Override
public @Nullable List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command,
@NotNull String alias, @NotNull String[] args) {
if (!sender.hasPermission("gradient.admin")) return new ArrayList<>();
if (!sender.hasPermission("gradient.admin")) {
return new ArrayList<>();
}
if (args.length == 1) {
return Arrays.asList("reload", "info", "setcolor", "setprefix", "coloron", "coloroff",

View file

@ -3,6 +3,7 @@ package com.loki.lochat.gradient.commands;
import com.loki.lochat.config.RatConfig;
import com.loki.lochat.gradient.GradientModule;
import com.loki.lochat.gradient.commands.handlers.color.*;
import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;

View file

@ -2,6 +2,7 @@ package com.loki.lochat.gradient.commands;
import com.loki.lochat.gradient.GradientModule;
import com.loki.lochat.gradient.commands.handlers.prefix.*;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;

View file

@ -6,6 +6,7 @@ import com.loki.lochat.gradient.data.GradientPlayerData;
import com.loki.lochat.gradient.util.DisplayNameUtil;
import com.loki.lochat.gradient.util.GradientUtil;
import com.loki.lochat.utils.platform.FoliaUtil;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.command.CommandSender;

View file

@ -5,6 +5,7 @@ import com.loki.lochat.gradient.config.GradientMessages;
import com.loki.lochat.gradient.data.GradientPlayerData;
import com.loki.lochat.gradient.util.DisplayNameUtil;
import com.loki.lochat.utils.platform.FoliaUtil;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.command.CommandSender;
@ -38,7 +39,9 @@ public class PrefixCommandHandler {
StringBuilder prefixBuilder = new StringBuilder();
for (int i = 2; i < args.length; i++) {
if (i > 2) prefixBuilder.append(" ");
if (i > 2) {
prefixBuilder.append(" ");
}
prefixBuilder.append(args[i]);
}
String prefix = prefixBuilder.toString();

View file

@ -6,6 +6,7 @@ import com.loki.lochat.gradient.config.GradientConfig;
import com.loki.lochat.gradient.data.GradientPlayerData;
import com.loki.lochat.gradient.gui.GradientConfirmGUI;
import com.loki.lochat.utils.platform.FoliaUtil;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;

View file

@ -4,6 +4,7 @@ import com.loki.lochat.gradient.GradientModule;
import com.loki.lochat.gradient.data.GradientPlayerData;
import com.loki.lochat.gradient.util.DisplayNameUtil;
import com.loki.lochat.utils.platform.FoliaUtil;
import org.bukkit.entity.Player;
/**

View file

@ -4,6 +4,7 @@ import com.loki.lochat.gradient.GradientModule;
import com.loki.lochat.gradient.data.GradientPlayerData;
import com.loki.lochat.gradient.util.DisplayNameUtil;
import com.loki.lochat.utils.platform.FoliaUtil;
import org.bukkit.entity.Player;
/**

View file

@ -4,6 +4,7 @@ import com.loki.lochat.gradient.GradientModule;
import com.loki.lochat.gradient.data.GradientPlayerData;
import com.loki.lochat.gradient.util.DisplayNameUtil;
import com.loki.lochat.utils.platform.FoliaUtil;
import org.bukkit.entity.Player;
import java.util.ArrayList;

View file

@ -8,6 +8,7 @@ import com.loki.lochat.gradient.data.GradientPlayerData;
import com.loki.lochat.gradient.gui.GradientConfirmGUI;
import com.loki.lochat.gradient.util.GradientUtil;
import com.loki.lochat.utils.platform.FoliaUtil;
import org.bukkit.entity.Player;
import java.util.ArrayList;

View file

@ -4,6 +4,7 @@ import com.loki.lochat.gradient.GradientModule;
import com.loki.lochat.gradient.data.GradientPlayerData;
import com.loki.lochat.gradient.util.DisplayNameUtil;
import com.loki.lochat.utils.platform.FoliaUtil;
import org.bukkit.entity.Player;
/**

View file

@ -4,6 +4,7 @@ import com.loki.lochat.gradient.GradientModule;
import com.loki.lochat.gradient.data.GradientPlayerData;
import com.loki.lochat.gradient.util.DisplayNameUtil;
import com.loki.lochat.utils.platform.FoliaUtil;
import org.bukkit.entity.Player;
/**

View file

@ -4,6 +4,7 @@ import com.loki.lochat.gradient.GradientModule;
import com.loki.lochat.gradient.data.GradientPlayerData;
import com.loki.lochat.gradient.util.DisplayNameUtil;
import com.loki.lochat.utils.platform.FoliaUtil;
import org.bukkit.entity.Player;
/**

View file

@ -7,6 +7,7 @@ import com.loki.lochat.gradient.config.GradientMessages;
import com.loki.lochat.gradient.data.GradientPlayerData;
import com.loki.lochat.gradient.gui.GradientConfirmGUI;
import com.loki.lochat.utils.platform.FoliaUtil;
import org.bukkit.entity.Player;
import java.util.regex.Pattern;
@ -80,7 +81,9 @@ public class PrefixSetHandler implements PrefixSubCommandHandler {
}
private int calculatePrice(Player player, GradientConfig cfg, GradientPlayerData data) {
if (player.hasPermission("gradient.bypass.cost")) return 0;
if (player.hasPermission("gradient.bypass.cost")) {
return 0;
}
return (cfg.isPrefixOneTimePurchase() && data.isPrefixPurchased()) ? 0 : cfg.getPrefixPrice();
}

View file

@ -1,7 +1,9 @@
package com.loki.lochat.gradient.config;
import com.loki.lochat.utils.format.ChatFormatter;
import net.kyori.adventure.text.Component;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;

View file

@ -1,6 +1,7 @@
package com.loki.lochat.gradient.data;
import com.loki.lochat.gradient.config.GradientConfig;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.plugin.java.JavaPlugin;
@ -64,7 +65,9 @@ public class GradientDataManager {
private void loadYamlData() {
File dataFile = new File(plugin.getDataFolder(), "gradient-data.yml");
if (!dataFile.exists()) return;
if (!dataFile.exists()) {
return;
}
FileConfiguration data = YamlConfiguration.loadConfiguration(dataFile);
for (String uuidStr : data.getKeys(false)) {
@ -118,7 +121,9 @@ public class GradientDataManager {
public void savePlayerData(UUID uuid) {
GradientPlayerData data = cache.get(uuid);
if (data == null) return;
if (data == null) {
return;
}
if (useSqlite && sqliteConnection != null) {
try (PreparedStatement stmt = sqliteConnection.prepareStatement(

View file

@ -3,10 +3,12 @@ package com.loki.lochat.gradient.gui;
import com.loki.lochat.config.RatConfig;
import com.loki.lochat.gradient.GradientModule;
import com.loki.lochat.gradient.util.GradientUtil;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
import net.kyori.adventure.text.format.TextDecoration;
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.entity.Player;
@ -49,7 +51,9 @@ public final class GradientConfirmGUI implements InventoryHolder {
}
private void initInventory() {
if (inventory != null) return;
if (inventory != null) {
return;
}
this.inventory = Bukkit.createInventory(this, 27,
Component.text("Подтверждение", NamedTextColor.DARK_GRAY));
setupItems();
@ -128,7 +132,7 @@ public final class GradientConfirmGUI implements InventoryHolder {
boolean useLegacyForPreview = true;
// Если нет кастомного префикса - используем LuckPerms префикс
if ((prefixToUse == null || prefixToUse.isEmpty())) {
if (prefixToUse == null || prefixToUse.isEmpty()) {
String lpPrefix = module.getPrefixService().getLuckPermsPrefix(player, data);
if (lpPrefix != null && !lpPrefix.isEmpty()) {
// Конвертируем LP префикс в legacy формат
@ -163,7 +167,9 @@ public final class GradientConfirmGUI implements InventoryHolder {
* Конвертирует MiniMessage теги в legacy формат
*/
private String convertToLegacy(String text) {
if (text == null) return "";
if (text == null) {
return "";
}
// Конвертируем <#RRGGBB> в &#RRGGBB
return text.replaceAll("<#([A-Fa-f0-9]{6})>", "&#$1");
}
@ -172,7 +178,9 @@ public final class GradientConfirmGUI implements InventoryHolder {
* Убирает цветовые коды из строки
*/
private String stripColors(String text) {
if (text == null) return "";
if (text == null) {
return "";
}
return text.replaceAll("(?i)(§x(§[0-9a-f]){6}|§[0-9a-fk-or]|&[0-9a-fk-or]|&#[0-9a-f]{6}|<[^>]+>)", "");
}

View file

@ -7,6 +7,7 @@ import com.loki.lochat.gradient.data.GradientPlayerData;
import com.loki.lochat.gradient.gui.GradientConfirmGUI;
import com.loki.lochat.gradient.util.DisplayNameUtil;
import com.loki.lochat.utils.platform.FoliaUtil;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
@ -31,15 +32,21 @@ public class GradientGUIListener implements Listener {
@EventHandler
public void onInventoryClick(InventoryClickEvent event) {
if (!(event.getInventory().getHolder() instanceof GradientConfirmGUI gui)) return;
if (!(event.getInventory().getHolder() instanceof GradientConfirmGUI gui)) {
return;
}
event.setCancelled(true);
if (!(event.getWhoClicked() instanceof Player player) || !player.equals(gui.getPlayer())) return;
if (!(event.getWhoClicked() instanceof Player player) || !player.equals(gui.getPlayer())) {
return;
}
switch (event.getRawSlot()) {
case RatConfig.GUI_CONFIRM_SLOT -> handleConfirm(player, gui);
case RatConfig.GUI_CANCEL_SLOT -> handleCancel(player);
default -> {
}
}
}
@ -76,7 +83,6 @@ public class GradientGUIListener implements Listener {
data.setPrefixEnabled(true);
data.setPrefixPurchased(true);
data.setLastPrefixChange(System.currentTimeMillis());
// Сохраняем существующие цвета если они есть
if (gui.getColors() != null && !gui.getColors().isEmpty()) {
data.setColors(gui.getColors());
data.setColorEnabled(true);
@ -84,6 +90,8 @@ public class GradientGUIListener implements Listener {
msg.send(player, price > 0 ? "prefix-success" : "prefix-success-free",
"price", String.valueOf(price));
}
default -> {
}
}
FoliaUtil.runEntityTask(module.getPlugin(), player,

View file

@ -2,6 +2,7 @@ package com.loki.lochat.gradient.listeners;
import com.loki.lochat.gradient.GradientModule;
import com.loki.lochat.utils.platform.FoliaUtil;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;

View file

@ -2,6 +2,7 @@ package com.loki.lochat.gradient.service;
import com.loki.lochat.gradient.data.GradientPlayerData;
import com.loki.lochat.gradient.util.GradientUtil;
import org.bukkit.entity.Player;
import java.util.List;
@ -11,6 +12,9 @@ import java.util.List;
*/
public class GradientService {
private GradientService() {
}
/**
* Применяет градиент к тексту если у игрока есть цвета
*/

View file

@ -2,10 +2,12 @@ package com.loki.lochat.gradient.service;
import com.loki.lochat.gradient.config.GradientConfig;
import com.loki.lochat.gradient.data.GradientPlayerData;
import net.luckperms.api.LuckPerms;
import net.luckperms.api.LuckPermsProvider;
import net.luckperms.api.cacheddata.CachedMetaData;
import net.luckperms.api.model.user.User;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
@ -128,9 +130,13 @@ public class PrefixService {
}
StringBuilder result = new StringBuilder();
if (!prefix.isEmpty()) result.append(prefix).append(" ");
if (!prefix.isEmpty()) {
result.append(prefix).append(" ");
}
result.append(nick);
if (!suffix.isEmpty()) result.append(" ").append(suffix);
if (!suffix.isEmpty()) {
result.append(" ").append(suffix);
}
return result.toString();
}
@ -149,9 +155,13 @@ public class PrefixService {
}
StringBuilder result = new StringBuilder();
if (!prefix.isEmpty()) result.append(prefix).append(" ");
if (!prefix.isEmpty()) {
result.append(prefix).append(" ");
}
result.append(nick);
if (!suffix.isEmpty()) result.append(" ").append(suffix);
if (!suffix.isEmpty()) {
result.append(" ").append(suffix);
}
return result.toString();
}

View file

@ -3,7 +3,9 @@ package com.loki.lochat.gradient.util;
import com.loki.lochat.gradient.GradientModule;
import com.loki.lochat.gradient.config.GradientConfig;
import com.loki.lochat.gradient.data.GradientPlayerData;
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
import org.bukkit.entity.Player;
import java.util.regex.Matcher;
@ -38,7 +40,9 @@ public final class DisplayNameUtil {
* Конвертирует MiniMessage <#RRGGBB> формат в §x§R§R§G§G§B§B для display name
*/
private static String convertMiniMessageToLegacy(String text) {
if (text == null) return "";
if (text == null) {
return "";
}
// Конвертируем <#RRGGBB> в §x§R§R§G§G§B§B
Pattern pattern = Pattern.compile("<#([0-9a-fA-F]{6})>");
@ -59,7 +63,9 @@ public final class DisplayNameUtil {
}
public static String buildColoredPrefix(GradientModule module, GradientPlayerData data) {
if (!data.hasPrefix() || !data.isPrefixEnabled()) return null;
if (!data.hasPrefix() || !data.isPrefixEnabled()) {
return null;
}
GradientConfig cfg = module.getConfig();
// ✅ FIX: Убрал stripTrailing() чтобы сохранить пробел из prefix-format

View file

@ -25,7 +25,9 @@ public final class GradientUtil {
char[] chars = text.toCharArray();
int length = chars.length;
if (length == 0) return text;
if (length == 0) {
return text;
}
StringBuilder result = new StringBuilder();
@ -61,9 +63,15 @@ public final class GradientUtil {
}
private static Color interpolateMultiColor(Color[] colors, double ratio) {
if (colors.length == 1) return colors[0];
if (ratio <= 0) return colors[0];
if (ratio >= 1) return colors[colors.length - 1];
if (colors.length == 1) {
return colors[0];
}
if (ratio <= 0) {
return colors[0];
}
if (ratio >= 1) {
return colors[colors.length - 1];
}
double scaledRatio = ratio * (colors.length - 1);
int index = (int) scaledRatio;
@ -128,7 +136,9 @@ public final class GradientUtil {
char[] chars = text.toCharArray();
int length = chars.length;
if (length == 0) return text;
if (length == 0) {
return text;
}
StringBuilder result = new StringBuilder();

View file

@ -2,6 +2,7 @@ package com.loki.lochat.integrations;
import com.loki.lochat.integrations.discord.DiscordConfig;
import com.loki.lochat.integrations.discord.DiscordMessageService;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;
@ -40,7 +41,9 @@ public class DiscordIntegration {
}
public void sendChatMessage(Player player, String message, boolean isGlobal) {
if (!enabled || !config.isChatEnabled()) return;
if (!enabled || !config.isChatEnabled()) {
return;
}
if (config.isGlobalOnly() && !isGlobal) {
return;
@ -50,22 +53,30 @@ public class DiscordIntegration {
}
public void sendPlayerJoin(Player player) {
if (!enabled || !config.isEventEnabled("join")) return;
if (!enabled || !config.isEventEnabled("join")) {
return;
}
messageService.sendPlayerJoin(player);
}
public void sendPlayerQuit(Player player) {
if (!enabled || !config.isEventEnabled("quit")) return;
if (!enabled || !config.isEventEnabled("quit")) {
return;
}
messageService.sendPlayerQuit(player);
}
public void sendPlayerDeath(Player player, String deathMessage) {
if (!enabled || !config.isEventEnabled("death")) return;
if (!enabled || !config.isEventEnabled("death")) {
return;
}
messageService.sendPlayerDeath(player, deathMessage);
}
public void sendTestMessage(String message, String senderName) {
if (!enabled) return;
if (!enabled) {
return;
}
messageService.sendTestMessage(message, senderName);
}

View file

@ -2,6 +2,7 @@ package com.loki.lochat.integrations;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import org.bukkit.plugin.java.JavaPlugin;
import java.io.IOException;
@ -78,10 +79,18 @@ public class DiscordWebhook {
private JsonObject buildEmbed(String title, String description, String color,
String thumbnailUrl, JsonArray fields) {
JsonObject embed = new JsonObject();
if (title != null) embed.addProperty("title", title);
if (description != null) embed.addProperty("description", description);
if (color != null) embed.addProperty("color", Integer.parseInt(color, 16));
if (fields != null) embed.add("fields", fields);
if (title != null) {
embed.addProperty("title", title);
}
if (description != null) {
embed.addProperty("description", description);
}
if (color != null) {
embed.addProperty("color", Integer.parseInt(color, 16));
}
if (fields != null) {
embed.add("fields", fields);
}
if (thumbnailUrl != null) {
JsonObject thumb = new JsonObject();
thumb.addProperty("url", thumbnailUrl);
@ -106,13 +115,19 @@ public class DiscordWebhook {
return CompletableFuture.supplyAsync(() -> {
for (int attempt = 1; attempt <= retryAttempts; attempt++) {
try {
if (sendWebhookSync(json.toString())) return true;
if (sendWebhookSync(json.toString())) {
return true;
}
} catch (Exception e) {
plugin.getLogger().warning("Discord webhook attempt " + attempt + " failed: " + e.getMessage());
}
if (attempt < retryAttempts) {
try { Thread.sleep(retryDelay); }
catch (InterruptedException e) { Thread.currentThread().interrupt(); break; }
try {
Thread.sleep(retryDelay);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
break;
}
}
}
plugin.getLogger().severe("Failed to send Discord webhook after " + retryAttempts + " attempts");
@ -134,8 +149,13 @@ public class DiscordWebhook {
os.write(jsonPayload.getBytes(StandardCharsets.UTF_8));
}
int code = conn.getResponseCode();
if (code == 204) return true;
if (code == 429) { plugin.getLogger().warning("Discord webhook rate limited (429)"); return false; }
if (code == 204) {
return true;
}
if (code == 429) {
plugin.getLogger().warning("Discord webhook rate limited (429)");
return false;
}
plugin.getLogger().warning("Discord webhook returned code: " + code);
return false;
} finally {
@ -144,12 +164,22 @@ public class DiscordWebhook {
}
public boolean isValid() {
if (webhookUrl == null || webhookUrl.trim().isEmpty()) return false;
if (webhookUrl == null || webhookUrl.trim().isEmpty()) {
return false;
}
String url = webhookUrl.trim();
if (!url.startsWith("https://discord.com/api/webhooks/") &&
!url.startsWith("https://discordapp.com/api/webhooks/")) return false;
if (url.length() < 50) return false;
try { URI.create(url); } catch (IllegalArgumentException e) { return false; }
!url.startsWith("https://discordapp.com/api/webhooks/")) {
return false;
}
if (url.length() < 50) {
return false;
}
try {
URI.create(url);
} catch (IllegalArgumentException e) {
return false;
}
return true;
}
}

View file

@ -2,6 +2,7 @@ package com.loki.lochat.integrations;
import com.loki.lochat.LoChat;
import com.loki.lochat.api.service.MuteService;
import org.bukkit.entity.Player;
/**

View file

@ -4,7 +4,7 @@ import com.loki.lochat.LoChat;
import com.loki.lochat.api.service.ChatService;
import com.loki.lochat.api.service.MessagingService;
import com.loki.lochat.gradient.GradientModule;
import me.clip.placeholderapi.expansion.PlaceholderExpansion;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player;
@ -14,6 +14,8 @@ import org.jetbrains.annotations.Nullable;
import java.util.Optional;
import java.util.UUID;
import me.clip.placeholderapi.expansion.PlaceholderExpansion;
public class PlaceholderAPIHook extends PlaceholderExpansion {
private final LoChat plugin;
@ -48,7 +50,9 @@ public class PlaceholderAPIHook extends PlaceholderExpansion {
@Override
public @Nullable String onRequest(OfflinePlayer player, @NotNull String params) {
if (player == null) return "";
if (player == null) {
return "";
}
UUID uuid = player.getUniqueId();
GradientModule gradient = plugin.getGradientModule();
@ -58,7 +62,9 @@ public class PlaceholderAPIHook extends PlaceholderExpansion {
case "global_enabled" -> String.valueOf(!chatService.isGlobalChatDisabled(uuid));
case "last_pm" -> {
Optional<UUID> lastOpt = messagingService.getLastConversation(uuid);
if (lastOpt.isEmpty()) yield "";
if (lastOpt.isEmpty()) {
yield "";
}
var lastPlayer = Bukkit.getOfflinePlayer(lastOpt.get());
yield lastPlayer.getName() != null ? lastPlayer.getName() : "";
}
@ -68,7 +74,9 @@ public class PlaceholderAPIHook extends PlaceholderExpansion {
// Используем TAB формат §x§R§R§G§G§B§B для совместимости с TAB плагином
case "gradient_full", "full" -> {
Player onlinePlayer = player.getPlayer();
if (onlinePlayer == null) yield player.getName() != null ? player.getName() : "";
if (onlinePlayer == null) {
yield player.getName() != null ? player.getName() : "";
}
// Если gradient модуль выключен — берём только LuckPerms префикс + ник
if (gradient == null || !gradient.isEnabled()) {
@ -80,7 +88,9 @@ public class PlaceholderAPIHook extends PlaceholderExpansion {
}
case "gradient_name", "name" -> {
Player onlinePlayer = player.getPlayer();
if (onlinePlayer == null) yield player.getName() != null ? player.getName() : "";
if (onlinePlayer == null) {
yield player.getName() != null ? player.getName() : "";
}
if (gradient == null || !gradient.isEnabled()) {
yield player.getName();
@ -89,16 +99,24 @@ public class PlaceholderAPIHook extends PlaceholderExpansion {
}
case "gradient_prefix", "prefix" -> {
Player onlinePlayer = player.getPlayer();
if (onlinePlayer == null) yield "";
if (onlinePlayer == null) {
yield "";
}
if (gradient == null || !gradient.isEnabled()) yield "";
if (gradient == null || !gradient.isEnabled()) {
yield "";
}
yield gradient.getPrefix(onlinePlayer);
}
case "lp_prefix" -> {
Player onlinePlayer = player.getPlayer();
if (onlinePlayer == null) yield "";
if (onlinePlayer == null) {
yield "";
}
if (gradient == null || !gradient.isEnabled()) yield "";
if (gradient == null || !gradient.isEnabled()) {
yield "";
}
yield gradient.getLuckPermsPrefix(onlinePlayer);
}
default -> null;

View file

@ -1,6 +1,7 @@
package com.loki.lochat.integrations;
import com.loki.lochat.LoChat;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;
@ -57,7 +58,9 @@ public class SkinsRestorerHook {
* @return URL текстуры или null
*/
public String getPlayerSkinTexture(Player player) {
if (!enabled) return null;
if (!enabled) {
return null;
}
try {
Object property = getSkinDataMethod.invoke(skinsAPI, player.getName());

Some files were not shown because too many files have changed in this diff Show more