fix: encapsulation, star imports, checkstyle warnings (520→41), remove casts

This commit is contained in:
loki5512344 2026-07-05 13:38:47 +02:00
parent 90c3cac5cf
commit 4efccd3968
85 changed files with 466 additions and 291 deletions

View file

@ -1,16 +1,35 @@
package com.loki.lochat.commands; package com.loki.lochat.commands;
import com.loki.lochat.LoChat; import com.loki.lochat.LoChat;
import com.loki.lochat.commands.admin.broadcast.*; import com.loki.lochat.commands.admin.broadcast.AnnounceCommand;
import com.loki.lochat.commands.admin.chat.*; import com.loki.lochat.commands.admin.broadcast.DiscordCommand;
import com.loki.lochat.commands.admin.system.*; import com.loki.lochat.commands.admin.chat.ChatSpyCommand;
import com.loki.lochat.commands.chat.*; import com.loki.lochat.commands.admin.chat.ClearChatCommand;
import com.loki.lochat.commands.messaging.*; import com.loki.lochat.commands.admin.chat.ClearChatConfigCommand;
import com.loki.lochat.commands.moderation.ban.*; import com.loki.lochat.commands.admin.system.LoChatCommand;
import com.loki.lochat.commands.moderation.mute.*; import com.loki.lochat.commands.admin.system.ReloadConfigCommand;
import com.loki.lochat.commands.moderation.warn.*; import com.loki.lochat.commands.chat.GlobalChatCommand;
import com.loki.lochat.commands.nick.*; import com.loki.lochat.commands.chat.LocalChatCommand;
import com.loki.lochat.commands.rp.*; import com.loki.lochat.commands.messaging.IgnoreCommand;
import com.loki.lochat.commands.messaging.IgnoreListCommand;
import com.loki.lochat.commands.messaging.MsgCommand;
import com.loki.lochat.commands.messaging.ReplyCommand;
import com.loki.lochat.commands.messaging.UnignoreCommand;
import com.loki.lochat.commands.moderation.ban.BanCommand;
import com.loki.lochat.commands.moderation.ban.UnbanCommand;
import com.loki.lochat.commands.moderation.mute.MuteBlameCommand;
import com.loki.lochat.commands.moderation.mute.MuteCommand;
import com.loki.lochat.commands.moderation.mute.MuteHistoryCommand;
import com.loki.lochat.commands.moderation.mute.MuteListCommand;
import com.loki.lochat.commands.moderation.mute.UnmuteCommand;
import com.loki.lochat.commands.moderation.warn.SilentWarnCommand;
import com.loki.lochat.commands.moderation.warn.WarnCommand;
import com.loki.lochat.commands.nick.NickCommand;
import com.loki.lochat.commands.nick.PlayerInfoCommand;
import com.loki.lochat.commands.rp.DoCommand;
import com.loki.lochat.commands.rp.MeCommand;
import com.loki.lochat.commands.rp.RollCommand;
import com.loki.lochat.commands.rp.TryCommand;
import org.bukkit.command.PluginCommand; import org.bukkit.command.PluginCommand;

View file

@ -32,7 +32,9 @@ public final class CustomCommand extends Command {
} }
@Override @Override
public @NotNull List<String> tabComplete(@NotNull CommandSender sender, @NotNull String alias, @NotNull String[] args) throws IllegalArgumentException { public @NotNull List<String> tabComplete(@NotNull CommandSender sender, @NotNull String alias, @NotNull
String[] args) throws IllegalArgumentException {
// Базовое автодополнение - можно расширить при необходимости // Базовое автодополнение - можно расширить при необходимости
return new ArrayList<>(); return new ArrayList<>();
} }

View file

@ -70,7 +70,10 @@ public class DiscordCommand implements CommandExecutor, TabCompleter {
} }
@Override @Override
public @Nullable List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, @NotNull String[] args) { public @Nullable List<String> onTabComplete(
@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias,
@NotNull String[] args
) {
if (!sender.hasPermission("lochat.discord.admin")) { if (!sender.hasPermission("lochat.discord.admin")) {
return null; return null;
} }

View file

@ -59,7 +59,10 @@ public class ClearChatConfigCommand implements CommandExecutor, TabCompleter {
} }
@Override @Override
public @Nullable List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, @NotNull String[] args) { public @Nullable List<String> onTabComplete(
@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias,
@NotNull String[] args
) {
if (args.length == 1) { if (args.length == 1) {
return List.of("enable", "disable", "message", "status").stream() return List.of("enable", "disable", "message", "status").stream()
.filter(s -> s.startsWith(args[0].toLowerCase())).toList(); .filter(s -> s.startsWith(args[0].toLowerCase())).toList();

View file

@ -54,7 +54,10 @@ public class LoChatCommand implements CommandExecutor, TabCompleter {
} }
@Override @Override
public @Nullable List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, @NotNull String[] args) { public @Nullable List<String> onTabComplete(
@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias,
@NotNull String[] args
) {
if (!sender.hasPermission("lochat.admin")) { if (!sender.hasPermission("lochat.admin")) {
return new ArrayList<>(); return new ArrayList<>();
} }

View file

@ -44,7 +44,9 @@ public class IgnoreListCommand implements CommandExecutor {
player.sendMessage(ChatFormatter.parse("&#9878C9◆ &f" + name)); player.sendMessage(ChatFormatter.parse("&#9878C9◆ &f" + name));
} }
} }
player.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().get("ignore.list-footer").replace("{count}", String.valueOf(ignored.size())))); player.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().get("ignore.list-footer")
.replace("{count}", String.valueOf(ignored.size()))));
return true; return true;
} }
} }

View file

@ -73,33 +73,13 @@ public class BanCommand implements CommandExecutor, TabCompleter {
return true; return true;
} }
String timeStr = null; DurationResult parsed = parseDuration(sender, args, msg);
StringBuilder reasonBuilder = new StringBuilder(); if (!parsed.valid) {
for (int i = 1; i < args.length; i++) {
if (timeStr == null && isTimeFormat(args[i])) {
timeStr = args[i];
} else {
if (reasonBuilder.length() > 0) {
reasonBuilder.append(" ");
}
reasonBuilder.append(args[i]);
}
}
long durationMs;
if (timeStr == null || timeStr.isEmpty()) {
durationMs = 0;
} else if (timeStr.equalsIgnoreCase("perm") || timeStr.equals("0")) {
durationMs = 0;
} else {
durationMs = muteService.parseTime(timeStr);
if (durationMs < 0) {
sender.sendMessage(ChatFormatter.parse(msg.getInvalidTime()));
return true; return true;
} }
}
String reason = reasonBuilder.length() > 0 ? reasonBuilder.toString() : msg.getModerationDefaultReason(); long durationMs = parsed.durationMs;
String reason = parsed.reason;
String finalName = PlayerUtil.getPlayerName(targetUuid); String finalName = PlayerUtil.getPlayerName(targetUuid);
if (finalName == null) { if (finalName == null) {
finalName = targetName; finalName = targetName;
@ -122,6 +102,39 @@ public class BanCommand implements CommandExecutor, TabCompleter {
return true; return true;
} }
private record DurationResult(long durationMs, String reason, boolean valid) { }
private DurationResult parseDuration(CommandSender sender, String[] args, MessagesConfig msg) {
String timeStr = null;
StringBuilder reasonBuilder = new StringBuilder();
for (int i = 1; i < args.length; i++) {
if (timeStr == null && isTimeFormat(args[i])) {
timeStr = args[i];
} else {
if (reasonBuilder.length() > 0) {
reasonBuilder.append(" ");
}
reasonBuilder.append(args[i]);
}
}
long durationMs;
if (timeStr == null || timeStr.isEmpty()) {
durationMs = 0;
} else if (timeStr.equalsIgnoreCase("perm") || timeStr.equals("0")) {
durationMs = 0;
} else {
durationMs = muteService.parseTime(timeStr);
if (durationMs < 0) {
sender.sendMessage(ChatFormatter.parse(msg.getInvalidTime()));
return new DurationResult(0, "", false);
}
}
String reason = reasonBuilder.length() > 0 ? reasonBuilder.toString() : msg.getModerationDefaultReason();
return new DurationResult(durationMs, reason, true);
}
private boolean isTimeFormat(String s) { private boolean isTimeFormat(String s) {
return s.equalsIgnoreCase("perm") || s.matches("\\d+[dhms]?"); return s.equalsIgnoreCase("perm") || s.matches("\\d+[dhms]?");
} }

View file

@ -56,7 +56,9 @@ public class MuteBlameCommand implements CommandExecutor, TabCompleter {
String status = e.unmuted ? "&#9878C9Размучен" : (e.duration == 0 ? "&#CF6679Активен (навсегда)" : String status = e.unmuted ? "&#9878C9Размучен" : (e.duration == 0 ? "&#CF6679Активен (навсегда)" :
System.currentTimeMillis() > e.mutedAt + e.duration ? "&#B798A8Истёк" : "&#CF6679Активен"); System.currentTimeMillis() > e.mutedAt + e.duration ? "&#B798A8Истёк" : "&#CF6679Активен");
sender.sendMessage("&#9878C9" + idx + ". &f" + (e.playerName != null ? e.playerName : "???") + " &#B798A8— " + status); sender.sendMessage("&#9878C9" + idx + ". &f" + (e.playerName != null ? e.playerName : "???") + " &#B798A8— " + status);
sender.sendMessage(" &f" + fmt.format(new Date(e.mutedAt)) + " &#B798A8Длительность: &f" + (e.duration == 0 ? "навсегда" : muteService.formatTime(e.duration))); sender.sendMessage(" &f" + fmt.format(new Date(e.mutedAt)) + " &#B798A8Длительность: &f" + (e.duration
== 0 ? "навсегда" : muteService.formatTime(e.duration)));
sender.sendMessage(" &#B798A8Причина: &f" + (e.reason != null ? e.reason : "—")); sender.sendMessage(" &#B798A8Причина: &f" + (e.reason != null ? e.reason : "—"));
idx++; idx++;
} }
@ -64,7 +66,10 @@ public class MuteBlameCommand implements CommandExecutor, TabCompleter {
} }
@Override @Override
public @Nullable List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, @NotNull String[] args) { public @Nullable List<String> onTabComplete(
@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias,
@NotNull String[] args
) {
List<String> c = new ArrayList<>(); List<String> c = new ArrayList<>();
if (args.length == 1) { if (args.length == 1) {
for (Player p : Bukkit.getOnlinePlayers()) { for (Player p : Bukkit.getOnlinePlayers()) {

View file

@ -31,6 +31,8 @@ public class MuteCommand implements CommandExecutor, TabCompleter {
this.muteService = plugin.getServiceRegistry().get(MuteService.class); this.muteService = plugin.getServiceRegistry().get(MuteService.class);
} }
private record ParsedArgs(String targetName, long duration, String reason, boolean silent) { }
@Override @Override
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command,
@NotNull String label, @NotNull String[] args) { @NotNull String label, @NotNull String[] args) {
@ -49,7 +51,38 @@ public class MuteCommand implements CommandExecutor, TabCompleter {
return true; return true;
} }
// Парсим аргументы ParsedArgs parsed = parseArgs(sender, args, hm);
if (parsed == null) {
return true;
}
String targetName = parsed.targetName;
long duration = parsed.duration;
String reason = parsed.reason;
boolean silent = parsed.silent;
if (sender instanceof Player p && !muteService.canMuteForDuration(p, duration)) {
long max = muteService.getMaxDuration(p);
sender.sendMessage(ChatFormatter.parse("&#CF6679Нельзя мутить на такой срок! &#B798A8Максимум: &#7858E9" +
(max == 0 ? "навсегда" : muteService.formatTime(max))));
return true;
}
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;
}
doMute(sender, hm, targetUUID, targetName, duration, reason, silent);
return true;
}
private ParsedArgs parseArgs(CommandSender sender, String[] args, MessagesConfig hm) {
String targetName = null; String targetName = null;
String timeStr = null; String timeStr = null;
boolean silent = false; boolean silent = false;
@ -72,45 +105,39 @@ public class MuteCommand implements CommandExecutor, TabCompleter {
if (silent && !sender.hasPermission("lochat.mute.silent")) { if (silent && !sender.hasPermission("lochat.mute.silent")) {
sender.sendMessage(ChatFormatter.parse(hm.getNoSilentMutePermission())); sender.sendMessage(ChatFormatter.parse(hm.getNoSilentMutePermission()));
return true; return null;
} }
String reason = reasonBuilder.length() > 0 ? reasonBuilder.toString() : hm.getDefaultMuteReason(); String reason = reasonBuilder.length() > 0 ? reasonBuilder.toString() : hm.getDefaultMuteReason();
// Длительность long duration = resolveDuration(sender, timeStr, hm);
long duration;
if (timeStr == null || timeStr.isEmpty()) {
duration = sender instanceof Player p ? muteService.getMaxDuration(p) : 0;
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) { if (duration < 0) {
return null;
}
return new ParsedArgs(targetName, duration, reason, silent);
}
private long resolveDuration(CommandSender sender, String timeStr, MessagesConfig hm) {
if (timeStr == null || timeStr.isEmpty()) {
long dur = sender instanceof Player p ? muteService.getMaxDuration(p) : 0;
if (dur == -1) {
dur = muteService.parseTime(hm.getDefaultMuteDuration());
}
return dur;
}
if (timeStr.equalsIgnoreCase("perm") || timeStr.equals("0")) {
return 0;
}
long dur = muteService.parseTime(timeStr);
if (dur < 0) {
sender.sendMessage(ChatFormatter.parse(hm.getMuteTimeHelp())); sender.sendMessage(ChatFormatter.parse(hm.getMuteTimeHelp()));
return true;
} }
return dur;
} }
if (sender instanceof Player p && !muteService.canMuteForDuration(p, duration)) { private void doMute(CommandSender sender, MessagesConfig hm, UUID targetUUID,
long max = muteService.getMaxDuration(p); String targetName, long duration, String reason, boolean silent) {
sender.sendMessage(ChatFormatter.parse("&#CF6679Нельзя мутить на такой срок! &#B798A8Максимум: &#7858E9" +
(max == 0 ? "навсегда" : muteService.formatTime(max))));
return true;
}
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;
}
Player target = Bukkit.getPlayer(targetUUID); Player target = Bukkit.getPlayer(targetUUID);
String finalName = com.loki.lochat.utils.player.PlayerUtil.getPlayerName(targetUUID); String finalName = com.loki.lochat.utils.player.PlayerUtil.getPlayerName(targetUUID);
String op = sender.getName(); String op = sender.getName();
@ -146,8 +173,6 @@ public class MuteCommand implements CommandExecutor, TabCompleter {
String c = voiceCmd.replace("{player}", finalName).replace("{uuid}", targetUUID.toString()); String c = voiceCmd.replace("{player}", finalName).replace("{uuid}", targetUUID.toString());
Bukkit.dispatchCommand(Bukkit.getConsoleSender(), c); Bukkit.dispatchCommand(Bukkit.getConsoleSender(), c);
} }
return true;
} }
private boolean isTimeFormat(String s) { private boolean isTimeFormat(String s) {

View file

@ -76,7 +76,10 @@ public class MuteHistoryCommand implements CommandExecutor, TabCompleter {
} }
@Override @Override
public @Nullable List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, @NotNull String[] args) { public @Nullable List<String> onTabComplete(
@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias,
@NotNull String[] args
) {
List<String> c = new ArrayList<>(); List<String> c = new ArrayList<>();
if (args.length == 1) { if (args.length == 1) {
for (Player p : Bukkit.getOnlinePlayers()) { for (Player p : Bukkit.getOnlinePlayers()) {

View file

@ -84,7 +84,10 @@ public class UnmuteCommand implements CommandExecutor, TabCompleter {
} }
@Override @Override
public @Nullable List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, @NotNull String[] args) { public @Nullable List<String> onTabComplete(
@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias,
@NotNull String[] args
) {
List<String> c = new ArrayList<>(); List<String> c = new ArrayList<>();
if (args.length == 1) { if (args.length == 1) {
for (Player p : Bukkit.getOnlinePlayers()) { for (Player p : Bukkit.getOnlinePlayers()) {

View file

@ -35,7 +35,8 @@ public class DoCommand extends PlayerCommand {
int cooldown = plugin.getConfigManager().getInt("rp.cooldowns.do", 0); int cooldown = plugin.getConfigManager().getInt("rp.cooldowns.do", 0);
if (cooldown > 0 && playerService.isOnCooldown(player.getUniqueId(), "rp_do", cooldown)) { if (cooldown > 0 && playerService.isOnCooldown(player.getUniqueId(), "rp_do", cooldown)) {
int remaining = playerService.getRemainingCooldown(player.getUniqueId(), "rp_do", cooldown); int remaining = playerService.getRemainingCooldown(player.getUniqueId(), "rp_do", cooldown);
String msg = plugin.getConfigManager().getMessagesConfig().getCooldownMessage().replace("{remaining}", String.valueOf(remaining)); String msg = plugin.getConfigManager().getMessagesConfig().getCooldownMessage()
.replace("{remaining}", String.valueOf(remaining));
player.sendMessage(ChatFormatter.parse(msg)); player.sendMessage(ChatFormatter.parse(msg));
return true; return true;
} }

View file

@ -35,7 +35,8 @@ public class MeCommand extends PlayerCommand {
int cooldown = plugin.getConfigManager().getInt("rp.cooldowns.me", 0); int cooldown = plugin.getConfigManager().getInt("rp.cooldowns.me", 0);
if (cooldown > 0 && playerService.isOnCooldown(player.getUniqueId(), "rp_me", cooldown)) { if (cooldown > 0 && playerService.isOnCooldown(player.getUniqueId(), "rp_me", cooldown)) {
int remaining = playerService.getRemainingCooldown(player.getUniqueId(), "rp_me", cooldown); int remaining = playerService.getRemainingCooldown(player.getUniqueId(), "rp_me", cooldown);
String msg = plugin.getConfigManager().getMessagesConfig().getCooldownMessage().replace("{remaining}", String.valueOf(remaining)); String msg = plugin.getConfigManager().getMessagesConfig().getCooldownMessage()
.replace("{remaining}", String.valueOf(remaining));
player.sendMessage(ChatFormatter.parse(msg)); player.sendMessage(ChatFormatter.parse(msg));
return true; return true;
} }

View file

@ -38,7 +38,8 @@ public class TryCommand extends PlayerCommand {
int cooldown = plugin.getConfigManager().getInt("rp.cooldowns.try", 0); int cooldown = plugin.getConfigManager().getInt("rp.cooldowns.try", 0);
if (cooldown > 0 && playerService.isOnCooldown(player.getUniqueId(), "rp_try", cooldown)) { if (cooldown > 0 && playerService.isOnCooldown(player.getUniqueId(), "rp_try", cooldown)) {
int remaining = playerService.getRemainingCooldown(player.getUniqueId(), "rp_try", cooldown); int remaining = playerService.getRemainingCooldown(player.getUniqueId(), "rp_try", cooldown);
String msg = plugin.getConfigManager().getMessagesConfig().getCooldownMessage().replace("{remaining}", String.valueOf(remaining)); String msg = plugin.getConfigManager().getMessagesConfig().getCooldownMessage()
.replace("{remaining}", String.valueOf(remaining));
player.sendMessage(ChatFormatter.parse(msg)); player.sendMessage(ChatFormatter.parse(msg));
return true; return true;
} }

View file

@ -35,9 +35,9 @@ public class AppearanceConfig extends BaseConfig {
*/ */
private void loadEmojiCache() { private void loadEmojiCache() {
emojiCache.clear(); emojiCache.clear();
if (config.isConfigurationSection("emojis")) { if (getConfig().isConfigurationSection("emojis")) {
for (String key : config.getConfigurationSection("emojis").getKeys(false)) { for (String key : getConfig().getConfigurationSection("emojis").getKeys(false)) {
emojiCache.put(key, config.getString("emojis." + key)); emojiCache.put(key, getConfig().getString("emojis." + key));
} }
} }
} }
@ -45,7 +45,7 @@ public class AppearanceConfig extends BaseConfig {
// ========== ПРЕФИКСЫ ========== // ========== ПРЕФИКСЫ ==========
private String getPrefixValue(String chatType, String key, String defaultValue) { private String getPrefixValue(String chatType, String key, String defaultValue) {
return config.getString("prefixes." + chatType + "." + key, defaultValue); return getConfig().getString("prefixes." + chatType + "." + key, defaultValue);
} }
public String getGlobalEmoji() { public String getGlobalEmoji() {
@ -55,7 +55,7 @@ public class AppearanceConfig extends BaseConfig {
return getPrefixValue("global", "text", "GLOBAL"); return getPrefixValue("global", "text", "GLOBAL");
} }
public List<String> getGlobalColors() { public List<String> getGlobalColors() {
return config.getStringList("prefixes.global.colors"); return getConfig().getStringList("prefixes.global.colors");
} }
public String getGlobalSeparatorText() { public String getGlobalSeparatorText() {
return getPrefixValue("global", "separator.text", " ▶ "); return getPrefixValue("global", "separator.text", " ▶ ");
@ -74,7 +74,7 @@ public class AppearanceConfig extends BaseConfig {
return getPrefixValue("local", "text", "LOCAL"); return getPrefixValue("local", "text", "LOCAL");
} }
public List<String> getLocalColors() { public List<String> getLocalColors() {
return config.getStringList("prefixes.local.colors"); return getConfig().getStringList("prefixes.local.colors");
} }
public String getLocalSeparatorText() { public String getLocalSeparatorText() {
return getPrefixValue("local", "separator.text", " ▶ "); return getPrefixValue("local", "separator.text", " ▶ ");
@ -89,20 +89,20 @@ public class AppearanceConfig extends BaseConfig {
// ========== ФОРМАТ СООБЩЕНИЙ ========== // ========== ФОРМАТ СООБЩЕНИЙ ==========
public String getGlobalChatFormat() { public String getGlobalChatFormat() {
return config.getString("chat-format.global", "{emoji} {prefix} {separator} {player} : {message}"); return getConfig().getString("chat-format.global", "{emoji} {prefix} {separator} {player} : {message}");
} }
public String getLocalChatFormat() { public String getLocalChatFormat() {
return config.getString("chat-format.local", "{emoji} {prefix} {separator} {player} : {message}"); return getConfig().getString("chat-format.local", "{emoji} {prefix} {separator} {player} : {message}");
} }
// ========== HOVER ЭФФЕКТЫ ========== // ========== HOVER ЭФФЕКТЫ ==========
public boolean isHoverEnabled() { public boolean isHoverEnabled() {
return config.getBoolean("hover.enabled", true); return getConfig().getBoolean("hover.enabled", true);
} }
public List<String> getHoverFormat() { public List<String> getHoverFormat() {
return config.getStringList("hover.format"); return getConfig().getStringList("hover.format");
} }
// ========== ЭМОДЗИ ========== // ========== ЭМОДЗИ ==========
@ -117,20 +117,20 @@ public class AppearanceConfig extends BaseConfig {
// ========== НАСТРОЙКИ ЧАТА ========== // ========== НАСТРОЙКИ ЧАТА ==========
public int getLocalRadius() { public int getLocalRadius() {
return config.getInt("chat.local_radius", 100); return getConfig().getInt("chat.local_radius", 100);
} }
public int getClearLines() { public int getClearLines() {
return config.getInt("chat.clear_lines", 100); return getConfig().getInt("chat.clear_lines", 100);
} }
public int getMinMessageLength() { public int getMinMessageLength() {
return config.getInt("chat.min_message_length", 1); return getConfig().getInt("chat.min_message_length", 1);
} }
public int getMaxMessageLength() { public int getMaxMessageLength() {
return config.getInt("chat.max_message_length", 2000); return getConfig().getInt("chat.max_message_length", 2000);
} }
private String getChatColor(String type, String defaultColor) { private String getChatColor(String type, String defaultColor) {
return config.getString("chat.colors." + type, defaultColor); return getConfig().getString("chat.colors." + type, defaultColor);
} }
public String getNobodyHeardColor() { public String getNobodyHeardColor() {
@ -152,18 +152,18 @@ public class AppearanceConfig extends BaseConfig {
// ========== DISCORD ========== // ========== DISCORD ==========
public String getDiscordEmoji(String event) { public String getDiscordEmoji(String event) {
return config.getString("discord.emojis." + event, ""); return getConfig().getString("discord.emojis." + event, "");
} }
public String getDiscordEventTitle(String event) { public String getDiscordEventTitle(String event) {
return config.getString("discord.event_titles." + event, ""); return getConfig().getString("discord.event_titles." + event, "");
} }
public String getDefaultAvatarUrl() { public String getDefaultAvatarUrl() {
return config.getString("discord.avatar_urls.default", "https://mc-heads.net/avatar/minecraft/64"); return getConfig().getString("discord.avatar_urls.default", "https://mc-heads.net/avatar/minecraft/64");
} }
public String getPlayerAvatarUrl() { public String getPlayerAvatarUrl() {
return config.getString("discord.avatar_urls.player", "https://mc-heads.net/avatar/{player}/64"); return getConfig().getString("discord.avatar_urls.player", "https://mc-heads.net/avatar/{player}/64");
} }
public String getDefaultEmbedColor() { public String getDefaultEmbedColor() {
return config.getString("discord.default_embed_color", "5865F2"); return getConfig().getString("discord.default_embed_color", "5865F2");
} }
} }

View file

@ -14,8 +14,8 @@ import java.nio.file.Files;
*/ */
public abstract class BaseConfig { public abstract class BaseConfig {
protected final JavaPlugin plugin; protected final JavaPlugin plugin;
protected File configFile; private File configFile;
protected FileConfiguration config; private FileConfiguration config;
private final String fileName; private final String fileName;
private final boolean inConfigFolder; private final boolean inConfigFolder;
@ -112,6 +112,10 @@ public abstract class BaseConfig {
// Переопределяется в подклассах // Переопределяется в подклассах
} }
protected File getConfigFile() {
return configFile;
}
/** /**
* Получить FileConfiguration * Получить FileConfiguration
*/ */

View file

@ -16,146 +16,146 @@ public class FiltersConfig extends BaseConfig {
// ── Капс ──────────────────────────────────────────────────────────────────── // ── Капс ────────────────────────────────────────────────────────────────────
public boolean isCapsEnabled() { public boolean isCapsEnabled() {
return config.getBoolean("caps.enabled", true); return getConfig().getBoolean("caps.enabled", true);
} }
public int getCapsMaxPercent() { public int getCapsMaxPercent() {
return config.getInt("caps.max-percent", 70); return getConfig().getInt("caps.max-percent", 70);
} }
public int getCapsMinLength() { public int getCapsMinLength() {
return config.getInt("caps.min-length", 5); return getConfig().getInt("caps.min-length", 5);
} }
public boolean isCapsAutoLowercase() { public boolean isCapsAutoLowercase() {
return config.getBoolean("caps.auto-lowercase", true); return getConfig().getBoolean("caps.auto-lowercase", true);
} }
public boolean isCapsBlock() { public boolean isCapsBlock() {
return config.getBoolean("caps.block", false); return getConfig().getBoolean("caps.block", false);
} }
// ── Мат ───────────────────────────────────────────────────────────────────── // ── Мат ─────────────────────────────────────────────────────────────────────
public boolean isSwearEnabled() { public boolean isSwearEnabled() {
return config.getBoolean("swear.enabled", true); return getConfig().getBoolean("swear.enabled", true);
} }
public String getSwearAction() { public String getSwearAction() {
return config.getString("swear.action", "replace"); return getConfig().getString("swear.action", "replace");
} }
public String getSwearReplacementChar() { public String getSwearReplacementChar() {
return config.getString("swear.replacement-char", "*"); return getConfig().getString("swear.replacement-char", "*");
} }
public boolean isSwearCheckFragments() { public boolean isSwearCheckFragments() {
return config.getBoolean("swear.check-fragments", true); return getConfig().getBoolean("swear.check-fragments", true);
} }
public boolean isSwearIgnoreCase() { public boolean isSwearIgnoreCase() {
return config.getBoolean("swear.ignore-case", true); return getConfig().getBoolean("swear.ignore-case", true);
} }
public boolean isSwearUseExternalFile() { public boolean isSwearUseExternalFile() {
return config.getBoolean("swear.use-external-file", true); return getConfig().getBoolean("swear.use-external-file", true);
} }
public List<String> getSwearWords() { public List<String> getSwearWords() {
return config.getStringList("swear.words"); return getConfig().getStringList("swear.words");
} }
public String getSwearBlockMessage() { public String getSwearBlockMessage() {
return config.getString("swear.block-message", "&#CF6679Мат запрещён"); return getConfig().getString("swear.block-message", "&#CF6679Мат запрещён");
} }
// ── Реклама ───────────────────────────────────────────────────────────────── // ── Реклама ─────────────────────────────────────────────────────────────────
public boolean isAdvertisingEnabled() { public boolean isAdvertisingEnabled() {
return config.getBoolean("advertising.enabled", true); return getConfig().getBoolean("advertising.enabled", true);
} }
public boolean isBlockHiddenUrls() { public boolean isBlockHiddenUrls() {
return config.getBoolean("advertising.block-hidden-urls", true); return getConfig().getBoolean("advertising.block-hidden-urls", true);
} }
public boolean isBlockDomains() { public boolean isBlockDomains() {
return config.getBoolean("advertising.block-domains", true); return getConfig().getBoolean("advertising.block-domains", true);
} }
public List<String> getWhitelistedDomains() { public List<String> getWhitelistedDomains() {
return config.getStringList("advertising.whitelist"); return getConfig().getStringList("advertising.whitelist");
} }
public List<String> getBlacklistedDomains() { public List<String> getBlacklistedDomains() {
return config.getStringList("advertising.blacklist"); return getConfig().getStringList("advertising.blacklist");
} }
public String getAdvertisingBlockMessage() { public String getAdvertisingBlockMessage() {
return config.getString("advertising.blocked-message", "&#CF6679Реклама запрещена!"); return getConfig().getString("advertising.blocked-message", "&#CF6679Реклама запрещена!");
} }
// ── IP адреса ─────────────────────────────────────────────────────────────── // ── IP адреса ───────────────────────────────────────────────────────────────
public boolean isIpEnabled() { public boolean isIpEnabled() {
return config.getBoolean("ip.enabled", true); return getConfig().getBoolean("ip.enabled", true);
} }
public boolean isIpBlock() { public boolean isIpBlock() {
return config.getBoolean("ip.block", false); return getConfig().getBoolean("ip.block", false);
} }
public String getIpReplacement() { public String getIpReplacement() {
return config.getString("ip.replacement", "[IP скрыт]"); return getConfig().getString("ip.replacement", "[IP скрыт]");
} }
public String getIpBlockMessage() { public String getIpBlockMessage() {
return config.getString("ip.blocked-message", "&#CF6679IP адреса запрещены!"); return getConfig().getString("ip.blocked-message", "&#CF6679IP адреса запрещены!");
} }
// ── Повторяющиеся символы ─────────────────────────────────────────────────── // ── Повторяющиеся символы ───────────────────────────────────────────────────
public boolean isRepeatEnabled() { public boolean isRepeatEnabled() {
return config.getBoolean("repeat.enabled", true); return getConfig().getBoolean("repeat.enabled", true);
} }
public int getRepeatMaxRepeats() { public int getRepeatMaxRepeats() {
return config.getInt("repeat.max-repeats", 3); return getConfig().getInt("repeat.max-repeats", 3);
} }
// ── Флуд ──────────────────────────────────────────────────────────────────── // ── Флуд ────────────────────────────────────────────────────────────────────
public boolean isFloodEnabled() { public boolean isFloodEnabled() {
return config.getBoolean("flood.enabled", true); return getConfig().getBoolean("flood.enabled", true);
} }
public int getFloodMaxMessages() { public int getFloodMaxMessages() {
return config.getInt("flood.max-messages", 5); return getConfig().getInt("flood.max-messages", 5);
} }
public int getFloodTimePeriod() { public int getFloodTimePeriod() {
return config.getInt("flood.time-period", 10); return getConfig().getInt("flood.time-period", 10);
} }
public String getFloodBlockMessage() { public String getFloodBlockMessage() {
return config.getString("flood.block-message", "&#CF6679Не флудите!"); return getConfig().getString("flood.block-message", "&#CF6679Не флудите!");
} }
// ── Спам ──────────────────────────────────────────────────────────────────── // ── Спам ────────────────────────────────────────────────────────────────────
public boolean isSpamEnabled() { public boolean isSpamEnabled() {
return config.getBoolean("spam.enabled", true); return getConfig().getBoolean("spam.enabled", true);
} }
public int getSpamMaxSimilarMessages() { public int getSpamMaxSimilarMessages() {
return config.getInt("spam.max-similar-messages", 3); return getConfig().getInt("spam.max-similar-messages", 3);
} }
public int getSpamSimilarityThreshold() { public int getSpamSimilarityThreshold() {
return config.getInt("spam.similarity-threshold", 80); return getConfig().getInt("spam.similarity-threshold", 80);
} }
public String getSpamBlockMessage() { public String getSpamBlockMessage() {
return config.getString("spam.block-message", "&#CF6679Не отправляйте одинаковые сообщения"); return getConfig().getString("spam.block-message", "&#CF6679Не отправляйте одинаковые сообщения");
} }
} }

View file

@ -14,158 +14,163 @@ public class MessagesConfig extends BaseConfig {
// ── Общие сообщения ──────────────────────────────────────────────────────── // ── Общие сообщения ────────────────────────────────────────────────────────
public String getNoPermission() { public String getNoPermission() {
return config.getString("general.no_permission", "&#CF6679Нет прав!"); return getConfig().getString("general.no_permission", "&#CF6679Нет прав!");
} }
public String getPlayerOnly() { public String getPlayerOnly() {
return config.getString("general.player_only", "&#CF6679Только для игроков!"); return getConfig().getString("general.player_only", "&#CF6679Только для игроков!");
} }
public String getPlayerNotFound() { public String getPlayerNotFound() {
return config.getString("general.player_not_found", "&#CF6679Игрок не найден!"); return getConfig().getString("general.player_not_found", "&#CF6679Игрок не найден!");
} }
// ── Кулдаун ──────────────────────────────────────────────────────────────── // ── Кулдаун ────────────────────────────────────────────────────────────────
public String getCooldownMessage() { public String getCooldownMessage() {
return config.getString("commands.cooldown.message", "&#B798A8Подождите &#7858E9{remaining} &#B798A8сек"); return getConfig().getString("commands.cooldown.message", "&#B798A8Подождите &#7858E9{remaining} &#B798A8сек");
} }
// ── Локальный чат ────────────────────────────────────────────────────────── // ── Локальный чат ──────────────────────────────────────────────────────────
public String getNobodyHeard() { public String getNobodyHeard() {
return config.getString("local_chat.nobody_heard", "&#9878C9Вас никто не услышал &#B798A8— рядом нет игроков"); return getConfig().getString("local_chat.nobody_heard", "&#9878C9Вас никто не услышал &#B798A8— рядом нет игроков");
} }
// ── Мут ──────────────────────────────────────────────────────────────────── // ── Мут ────────────────────────────────────────────────────────────────────
public String getMutedMessage() { public String getMutedMessage() {
return config.getString("mute.muted_message", "&#CF6679Вы замучены! &#B798A8Причина: &#7858E9{reason}&#B798A8. Осталось: &#7858E9{time}"); return getConfig().getString("mute.muted_message", "&#CF6679Вы замучены! &#B798A8Причина: &#7858E9{reason}"
+ "&#B798A8. Осталось: &#7858E9{time}");
} }
public String getMutedPermanent() { public String getMutedPermanent() {
return config.getString("mute.muted_permanent", "&#CF6679Вы замучены навсегда! &#B798A8Причина: &#7858E9{reason}"); return getConfig().getString("mute.muted_permanent", "&#CF6679Вы замучены навсегда! &#B798A8Причина: &#7858E9{reason}");
} }
public String getPlayerMuted() { public String getPlayerMuted() {
return config.getString("mute.player_muted", "&#9878C9Игрок &#7858E9{player} &#9878C9замучен на &#7858E9{time}&#9878C9. Причина: &#B798A8{reason}"); return getConfig().getString("mute.player_muted", "&#9878C9Игрок &#7858E9{player} &#9878C9замучен на"
+ "&#7858E9{time}&#9878C9. Причина: &#B798A8{reason}");
} }
public String getPlayerMutedPermanent() { public String getPlayerMutedPermanent() {
return config.getString("mute.player_muted_permanent", "&#9878C9Игрок &#7858E9{player} &#9878C9замучен навсегда. Причина: &#B798A8{reason}"); return getConfig().getString("mute.player_muted_permanent", "&#9878C9Игрок &#7858E9{player} &#9878C9замучен"
+ "навсегда. Причина: &#B798A8{reason}");
} }
public String getPlayerMutedSilent() { public String getPlayerMutedSilent() {
return config.getString("mute.player_muted_silent", "&#B798A8[&#9878C9ТИХИЙ МУТ&#B798A8] &#7858E9{player} &#B798A8замучен на &#7858E9{time}"); return getConfig().getString("mute.player_muted_silent", "&#B798A8[&#9878C9ТИХИЙ МУТ&#B798A8] &#7858E9{player}"
+ "&#B798A8замучен на &#7858E9{time}");
} }
public String getPlayerUnmuted() { public String getPlayerUnmuted() {
return config.getString("mute.player_unmuted", "&#9878C9Игрок &#7858E9{player} &#9878C9размучен"); return getConfig().getString("mute.player_unmuted", "&#9878C9Игрок &#7858E9{player} &#9878C9размучен");
} }
public String getPlayerNotMuted() { public String getPlayerNotMuted() {
return config.getString("mute.not_muted", "&#B798A8Игрок &#7858E9{player} &#B798A8не замучен"); return getConfig().getString("mute.not_muted", "&#B798A8Игрок &#7858E9{player} &#B798A8не замучен");
} }
public String getPlayerNotMutedSimple() { public String getPlayerNotMutedSimple() {
return config.getString("mute.player_not_muted_simple", "&#CF6679Игрок не замучен!"); return getConfig().getString("mute.player_not_muted_simple", "&#CF6679Игрок не замучен!");
} }
public String getInvalidTime() { public String getInvalidTime() {
return config.getString("mute.invalid_time", "&#CF6679Неверный формат времени!"); return getConfig().getString("mute.invalid_time", "&#CF6679Неверный формат времени!");
} }
public String getAlreadyMuted() { public String getAlreadyMuted() {
return config.getString("mute.already_muted", "&#CF6679Игрок уже замучен!"); return getConfig().getString("mute.already_muted", "&#CF6679Игрок уже замучен!");
} }
public String getNoSilentUnmutePermission() { public String getNoSilentUnmutePermission() {
return config.getString("mute.no_silent_unmute_permission", "&#CF6679Нет права на тихий размут!"); return getConfig().getString("mute.no_silent_unmute_permission", "&#CF6679Нет права на тихий размут!");
} }
public String getNoSilentMutePermission() { public String getNoSilentMutePermission() {
return config.getString("commands.mute.no_silent_permission", "&#CF6679Нет права на тихий мут"); return getConfig().getString("commands.mute.no_silent_permission", "&#CF6679Нет права на тихий мут");
} }
public String getMuteUsage() { public String getMuteUsage() {
return config.getString("commands.mute.usage", "&#B798A8Использование: &#7858E9/mute <ник> [время] [-s] [причина]"); return getConfig().getString("commands.mute.usage", "&#B798A8Использование: &#7858E9/mute <ник> [время] [-s] [причина]");
} }
public String getMuteTimeHelp() { public String getMuteTimeHelp() {
return config.getString("commands.mute.time_help", "&#9878C9Время: &#7858E91d&#9878C9, &#7858E92h&#9878C9, &#7858E930m&#9878C9, &#7858E960s&#9878C9, &#7858E9perm"); return getConfig().getString("commands.mute.time_help", "&#9878C9Время: &#7858E91d&#9878C9, &#7858E92h&#9878C9, &#7858E930m&#9878C9, &#7858E960s&#9878C9, &#7858E9perm");
} }
public String getMuteSilentHelp() { public String getMuteSilentHelp() {
return config.getString("commands.mute.silent_help", "&#B798A8-s &#9878C9— тихий мут (право &#7858E9lochat.mute.silent&#9878C9)"); return getConfig().getString("commands.mute.silent_help", "&#B798A8-s &#9878C9— тихий мут (право"
+ "&#7858E9lochat.mute.silent&#9878C9)");
} }
public String getDefaultMuteReason() { public String getDefaultMuteReason() {
return config.getString("commands.mute.default_reason", "Без причины"); return getConfig().getString("commands.mute.default_reason", "Без причины");
} }
public String getDefaultMuteDuration() { public String getDefaultMuteDuration() {
return config.getString("commands.mute.default_duration", "7d"); return getConfig().getString("commands.mute.default_duration", "7d");
} }
// ── ЛС ───────────────────────────────────────────────────────────────────── // ── ЛС ─────────────────────────────────────────────────────────────────────
public String getNoReplyTarget() { public String getNoReplyTarget() {
return config.getString("private_messages.no_reply_target", "&#CF6679Нет цели для ответа"); return getConfig().getString("private_messages.no_reply_target", "&#CF6679Нет цели для ответа");
} }
public String getPlayerOffline() { public String getPlayerOffline() {
return config.getString("private_messages.player_offline", "&#CF6679Игрок &#7858E9{player} &#CF6679не в сети"); return getConfig().getString("private_messages.player_offline", "&#CF6679Игрок &#7858E9{player} &#CF6679не в сети");
} }
public String getCannotMessageSelf() { public String getCannotMessageSelf() {
return config.getString("private_messages.cannot_message_self", "&#CF6679Нельзя писать самому себе"); return getConfig().getString("private_messages.cannot_message_self", "&#CF6679Нельзя писать самому себе");
} }
// ── Игнор ────────────────────────────────────────────────────────────────── // ── Игнор ──────────────────────────────────────────────────────────────────
public String getPlayerIgnored() { public String getPlayerIgnored() {
return config.getString("ignore.player_ignored", "&#9878C9Игрок &#7858E9{player} &#9878C9добавлен в игнор"); return getConfig().getString("ignore.player_ignored", "&#9878C9Игрок &#7858E9{player} &#9878C9добавлен в игнор");
} }
public String getPlayerUnignored() { public String getPlayerUnignored() {
return config.getString("ignore.player_unignored", "&#9878C9Игрок &#7858E9{player} &#9878C9убран из игнора"); return getConfig().getString("ignore.player_unignored", "&#9878C9Игрок &#7858E9{player} &#9878C9убран из игнора");
} }
public String getAlreadyIgnored() { public String getAlreadyIgnored() {
return config.getString("ignore.already_ignored", "&#B798A8Игрок &#7858E9{player} &#B798A8уже в игноре"); return getConfig().getString("ignore.already_ignored", "&#B798A8Игрок &#7858E9{player} &#B798A8уже в игноре");
} }
public String getNotIgnored() { public String getNotIgnored() {
return config.getString("ignore.not_ignored", "&#B798A8Игрок &#7858E9{player} &#B798A8не в игноре"); return getConfig().getString("ignore.not_ignored", "&#B798A8Игрок &#7858E9{player} &#B798A8не в игноре");
} }
public String getCannotIgnoreSelf() { public String getCannotIgnoreSelf() {
return config.getString("ignore.cannot_ignore_self", "&#CF6679Нельзя игнорировать самого себя"); return getConfig().getString("ignore.cannot_ignore_self", "&#CF6679Нельзя игнорировать самого себя");
} }
public String getIgnoreListEmpty() { public String getIgnoreListEmpty() {
return config.getString("ignore.ignore_list_empty", "&#B798A8Список игнора пуст"); return getConfig().getString("ignore.ignore_list_empty", "&#B798A8Список игнора пуст");
} }
public String getIgnoreListHeader() { public String getIgnoreListHeader() {
return config.getString("ignore.ignore_list_header", "&#B798A8Игнорируемые игроки&#9878C9:"); return getConfig().getString("ignore.ignore_list_header", "&#B798A8Игнорируемые игроки&#9878C9:");
} }
// ── Модерация (варны / баны) ──────────────────────────────────────────────── // ── Модерация (варны / баны) ────────────────────────────────────────────────
public String getModerationDefaultReason() { public String getModerationDefaultReason() {
return config.getString("moderation.default_reason", "Без причины"); return getConfig().getString("moderation.default_reason", "Без причины");
} }
public String getModerationDurationPermanent() { public String getModerationDurationPermanent() {
return config.getString("moderation.duration_permanent", "навсегда"); return getConfig().getString("moderation.duration_permanent", "навсегда");
} }
/** /**
* MiniMessage + legacy &# цвета; плейсхолдеры {reason},{moderator},{duration},{player}; перевод строки \\n * MiniMessage + legacy &# цвета; плейсхолдеры {reason},{moderator},{duration},{player}; перевод строки \\n
*/ */
public String getBanKickMessage() { public String getBanKickMessage() {
return config.getString("moderation.ban_kick_message", defaultBanKick()); return getConfig().getString("moderation.ban_kick_message", defaultBanKick());
} }
private String defaultBanKick() { private String defaultBanKick() {
@ -178,42 +183,44 @@ public class MessagesConfig extends BaseConfig {
} }
public String getWarnReceived() { public String getWarnReceived() {
return config.getString("moderation.warn_received", "&#CF6679⚠ Вам выдано предупреждение! &#B798A8Причина: &#7858E9{reason}"); return getConfig().getString("moderation.warn_received", "&#CF6679⚠ Вам выдано предупреждение! &#B798A8Причина: &#7858E9{reason}");
} }
public String getWarnStaffConfirm() { public String getWarnStaffConfirm() {
return config.getString("moderation.warn_staff_confirm", "&#9878C9Игроку &#7858E9{player} &#9878C9выдан варн. &#B798A8Причина: &#7858E9{reason}"); return getConfig().getString("moderation.warn_staff_confirm", "&#9878C9Игроку &#7858E9{player} &#9878C9выдан"
+ "варн. &#B798A8Причина: &#7858E9{reason}");
} }
public String getSilentWarnStaff() { public String getSilentWarnStaff() {
return config.getString("moderation.silent_warn_staff", "&#B798A8[&#9878C9ТИХИЙ ВАРН&#B798A8] &#7858E9{player}&#9878C9: &#B798A8{reason}"); return getConfig().getString("moderation.silent_warn_staff", "&#B798A8[&#9878C9ТИХИЙ ВАРН&#B798A8] &#7858E9{player}&#9878C9: &#B798A8{reason}");
} }
public String getBanUsage() { public String getBanUsage() {
return config.getString("moderation.ban_usage", "&#B798A8Использование: &#7858E9/lban <ник> [время|perm] [причина]"); return getConfig().getString("moderation.ban_usage", "&#B798A8Использование: &#7858E9/lban <ник> [время|perm] [причина]");
} }
public String getBanConfirm() { public String getBanConfirm() {
return config.getString("moderation.ban_confirm", "&#9878C9Игрок &#7858E9{player} &#9878C9забанен. &#B798A8Срок: &#7858E9{duration}"); return getConfig().getString("moderation.ban_confirm", "&#9878C9Игрок &#7858E9{player} &#9878C9забанен."
+ "&#B798A8Срок: &#7858E9{duration}");
} }
public String getUnbanConfirm() { public String getUnbanConfirm() {
return config.getString("moderation.unban_confirm", "&#9878C9Бан снят с &#7858E9{player}"); return getConfig().getString("moderation.unban_confirm", "&#9878C9Бан снят с &#7858E9{player}");
} }
public String getNotBanned() { public String getNotBanned() {
return config.getString("moderation.not_banned", "&#CF6679Игрок не забанен!"); return getConfig().getString("moderation.not_banned", "&#CF6679Игрок не забанен!");
} }
public String getAlreadyBanned() { public String getAlreadyBanned() {
return config.getString("moderation.already_banned", "&#CF6679Игрок уже забанен!"); return getConfig().getString("moderation.already_banned", "&#CF6679Игрок уже забанен!");
} }
public String getWarnUsage() { public String getWarnUsage() {
return config.getString("moderation.warn_usage", "&#B798A8Использование: &#7858E9/warn <ник> [причина]"); return getConfig().getString("moderation.warn_usage", "&#B798A8Использование: &#7858E9/warn <ник> [причина]");
} }
public String getSilentWarnUsage() { public String getSilentWarnUsage() {
return config.getString("moderation.silent_warn_usage", "&#B798A8Использование: &#7858E9/silentwarn <ник> [причина]"); return getConfig().getString("moderation.silent_warn_usage", "&#B798A8Использование: &#7858E9/silentwarn <ник> [причина]");
} }
} }

View file

@ -14,48 +14,48 @@ public class MuteConfig extends BaseConfig {
// ── Основные настройки ────────────────────────────────────────────────────── // ── Основные настройки ──────────────────────────────────────────────────────
public boolean isEnabled() { public boolean isEnabled() {
return config.getBoolean("enabled", true); return getConfig().getBoolean("enabled", true);
} }
public String getDefaultDuration() { public String getDefaultDuration() {
return config.getString("default-duration", "7d"); return getConfig().getString("default-duration", "7d");
} }
public String getDefaultReason() { public String getDefaultReason() {
return config.getString("default-reason", "Без причины"); return getConfig().getString("default-reason", "Без причины");
} }
public int getMaxHistoryPerPlayer() { public int getMaxHistoryPerPlayer() {
return config.getInt("max-history-per-player", 50); return getConfig().getInt("max-history-per-player", 50);
} }
// ── Права на длительность ─────────────────────────────────────────────────── // ── Права на длительность ───────────────────────────────────────────────────
public boolean isPermissionBasedDuration() { public boolean isPermissionBasedDuration() {
return config.getBoolean("permission-based-duration", true); return getConfig().getBoolean("permission-based-duration", true);
} }
// ── Уведомления ───────────────────────────────────────────────────────────── // ── Уведомления ─────────────────────────────────────────────────────────────
public boolean isNotifyOnMute() { public boolean isNotifyOnMute() {
return config.getBoolean("notify.on-mute", true); return getConfig().getBoolean("notify.on-mute", true);
} }
public boolean isNotifyOnUnmute() { public boolean isNotifyOnUnmute() {
return config.getBoolean("notify.on-unmute", true); return getConfig().getBoolean("notify.on-unmute", true);
} }
public boolean isNotifyOnExpire() { public boolean isNotifyOnExpire() {
return config.getBoolean("notify.on-expire", true); return getConfig().getBoolean("notify.on-expire", true);
} }
// ── Тихий мут ─────────────────────────────────────────────────────────────── // ── Тихий мут ───────────────────────────────────────────────────────────────
public boolean isSilentMuteEnabled() { public boolean isSilentMuteEnabled() {
return config.getBoolean("silent-mute.enabled", true); return getConfig().getBoolean("silent-mute.enabled", true);
} }
public boolean isSilentMuteLogToConsole() { public boolean isSilentMuteLogToConsole() {
return config.getBoolean("silent-mute.log-to-console", true); return getConfig().getBoolean("silent-mute.log-to-console", true);
} }
} }

View file

@ -14,54 +14,54 @@ public class SoundsConfig extends BaseConfig {
// ── Звуки упоминаний ──────────────────────────────────────────────────────── // ── Звуки упоминаний ────────────────────────────────────────────────────────
public boolean isMentionSoundEnabled() { public boolean isMentionSoundEnabled() {
return config.getBoolean("mention.enabled", true); return getConfig().getBoolean("mention.enabled", true);
} }
public String getMentionSound() { public String getMentionSound() {
return config.getString("mention.sound", "BLOCK_NOTE_BLOCK_PLING"); return getConfig().getString("mention.sound", "BLOCK_NOTE_BLOCK_PLING");
} }
public float getMentionVolume() { public float getMentionVolume() {
return (float) config.getDouble("mention.volume", 1.0); return (float) getConfig().getDouble("mention.volume", 1.0);
} }
public float getMentionPitch() { public float getMentionPitch() {
return (float) config.getDouble("mention.pitch", 1.0); return (float) getConfig().getDouble("mention.pitch", 1.0);
} }
// ── Звуки личных сообщений ────────────────────────────────────────────────── // ── Звуки личных сообщений ──────────────────────────────────────────────────
public boolean isPmSoundEnabled() { public boolean isPmSoundEnabled() {
return config.getBoolean("pm.enabled", true); return getConfig().getBoolean("pm.enabled", true);
} }
public String getPmSound() { public String getPmSound() {
return config.getString("pm.sound", "ENTITY_EXPERIENCE_ORB_PICKUP"); return getConfig().getString("pm.sound", "ENTITY_EXPERIENCE_ORB_PICKUP");
} }
public float getPmVolume() { public float getPmVolume() {
return (float) config.getDouble("pm.volume", 1.0); return (float) getConfig().getDouble("pm.volume", 1.0);
} }
public float getPmPitch() { public float getPmPitch() {
return (float) config.getDouble("pm.pitch", 1.0); return (float) getConfig().getDouble("pm.pitch", 1.0);
} }
// ── Звуки команд ──────────────────────────────────────────────────────────── // ── Звуки команд ────────────────────────────────────────────────────────────
public boolean isCommandSoundEnabled() { public boolean isCommandSoundEnabled() {
return config.getBoolean("command.enabled", false); return getConfig().getBoolean("command.enabled", false);
} }
public String getCommandSound() { public String getCommandSound() {
return config.getString("command.sound", "UI_BUTTON_CLICK"); return getConfig().getString("command.sound", "UI_BUTTON_CLICK");
} }
public float getCommandVolume() { public float getCommandVolume() {
return (float) config.getDouble("command.volume", 0.5); return (float) getConfig().getDouble("command.volume", 0.5);
} }
public float getCommandPitch() { public float getCommandPitch() {
return (float) config.getDouble("command.pitch", 1.0); return (float) getConfig().getDouble("command.pitch", 1.0);
} }
} }

View file

@ -173,7 +173,8 @@ public class ConfigAccessor {
} }
public String getDeathPlayerKillFormat() { public String getDeathPlayerKillFormat() {
return config.getString("messages.death.player_kill", "&#CF6679☠ &#B798A8{player} &#7858E9был убит игроком &#B798A8{killer} &#9878C9({weapon})"); return config.getString("messages.death.player_kill", "&#CF6679☠ &#B798A8{player} &#7858E9был убит"
+ "игроком &#B798A8{killer} &#9878C9({weapon})");
} }
public String getDeathMobKillFormat() { public String getDeathMobKillFormat() {

View file

@ -1,6 +1,10 @@
package com.loki.lochat.core.filter; package com.loki.lochat.core.filter;
import com.loki.lochat.core.filter.filters.*; import com.loki.lochat.core.filter.filters.CharacterFilter;
import com.loki.lochat.core.filter.filters.FloodFilter;
import com.loki.lochat.core.filter.filters.SpamFilter;
import com.loki.lochat.core.filter.filters.SwearFilter;
import com.loki.lochat.core.filter.filters.UrlFilter;
import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;

View file

@ -10,7 +10,9 @@ import java.io.BufferedReader;
import java.io.InputStream; import java.io.InputStream;
import java.io.InputStreamReader; import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.*; import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.regex.Pattern; import java.util.regex.Pattern;
public class SwearFilter { public class SwearFilter {

View file

@ -1,10 +1,22 @@
package com.loki.lochat.core.registry; package com.loki.lochat.core.registry;
import com.loki.lochat.api.service.*; import com.loki.lochat.api.service.ChatService;
import com.loki.lochat.api.service.MentionService;
import com.loki.lochat.api.service.MessageService;
import com.loki.lochat.api.service.MessagingService;
import com.loki.lochat.api.service.MuteService;
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.config.ConfigManager; import com.loki.lochat.config.ConfigManager;
import com.loki.lochat.config.MessageConfig; import com.loki.lochat.config.MessageConfig;
import com.loki.lochat.core.factory.ServiceFactory; import com.loki.lochat.core.factory.ServiceFactory;
import com.loki.lochat.core.service.*; import com.loki.lochat.core.service.ChatServiceImpl;
import com.loki.lochat.core.service.MentionServiceImpl;
import com.loki.lochat.core.service.MessageServiceImpl;
import com.loki.lochat.core.service.NickServiceImpl;
import com.loki.lochat.core.service.PlayerServiceImpl;
import com.loki.lochat.core.service.PunishmentServiceImpl;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;

View file

@ -11,7 +11,9 @@ import com.loki.lochat.utils.format.TimeFormatter;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;
import java.util.*; import java.util.List;
import java.util.Map;
import java.util.UUID;
/** /**
* Сервис мутов с использованием Strategy pattern * Сервис мутов с использованием Strategy pattern

View file

@ -15,9 +15,21 @@ import net.kyori.adventure.text.Component;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;
import java.io.*; import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.Writer;
import java.lang.reflect.Type; import java.lang.reflect.Type;
import java.util.*; import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
/** /**
@ -137,11 +149,11 @@ public class PunishmentServiceImpl implements PunishmentService {
for (Map.Entry<UUID, List<WarnEntry>> e : warns.entrySet()) { for (Map.Entry<UUID, List<WarnEntry>> e : warns.entrySet()) {
List<WarnEntry> list = e.getValue(); List<WarnEntry> list = e.getValue();
synchronized (list) { synchronized (list) {
snap.warns.put(e.getKey().toString(), new ArrayList<>(list)); snap.getWarns().put(e.getKey().toString(), new ArrayList<>(list));
} }
} }
for (Map.Entry<UUID, BanRecord> e : bans.entrySet()) { for (Map.Entry<UUID, BanRecord> e : bans.entrySet()) {
snap.bans.put(e.getKey().toString(), e.getValue()); snap.getBans().put(e.getKey().toString(), e.getValue());
} }
try (Writer w = new OutputStreamWriter(new FileOutputStream(dataFile), java.nio.charset.StandardCharsets.UTF_8)) { try (Writer w = new OutputStreamWriter(new FileOutputStream(dataFile), java.nio.charset.StandardCharsets.UTF_8)) {
gson.toJson(snap, w); gson.toJson(snap, w);
@ -172,16 +184,16 @@ public class PunishmentServiceImpl implements PunishmentService {
if (snap == null) { if (snap == null) {
return; return;
} }
if (snap.warns != null) { if (snap.getWarns() != null) {
for (Map.Entry<String, List<WarnEntry>> e : snap.warns.entrySet()) { for (Map.Entry<String, List<WarnEntry>> e : snap.getWarns().entrySet()) {
try { try {
warns.put(UUID.fromString(e.getKey()), Collections.synchronizedList(new ArrayList<>(e.getValue()))); warns.put(UUID.fromString(e.getKey()), Collections.synchronizedList(new ArrayList<>(e.getValue())));
} catch (IllegalArgumentException ignored) { } catch (IllegalArgumentException ignored) {
} }
} }
} }
if (snap.bans != null) { if (snap.getBans() != null) {
for (Map.Entry<String, BanRecord> e : snap.bans.entrySet()) { for (Map.Entry<String, BanRecord> e : snap.getBans().entrySet()) {
try { try {
UUID id = UUID.fromString(e.getKey()); UUID id = UUID.fromString(e.getKey());
BanRecord br = e.getValue(); BanRecord br = e.getValue();
@ -202,7 +214,15 @@ public class PunishmentServiceImpl implements PunishmentService {
} }
private static class PunishmentSnapshot { private static class PunishmentSnapshot {
Map<String, List<WarnEntry>> warns = new HashMap<>(); private Map<String, List<WarnEntry>> warns = new HashMap<>();
Map<String, BanRecord> bans = new HashMap<>(); private Map<String, BanRecord> bans = new HashMap<>();
Map<String, List<WarnEntry>> getWarns() {
return warns;
}
Map<String, BanRecord> getBans() {
return bans;
}
} }
} }

View file

@ -7,7 +7,12 @@ import org.bukkit.plugin.java.JavaPlugin;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.*; import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
/** /**

View file

@ -8,9 +8,16 @@ import com.loki.lochat.utils.platform.FoliaUtil;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;
import java.io.*; import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Reader;
import java.io.Writer;
import java.lang.reflect.Type; import java.lang.reflect.Type;
import java.util.*; import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
/** /**

View file

@ -11,7 +11,11 @@ import java.io.FileReader;
import java.io.FileWriter; import java.io.FileWriter;
import java.io.IOException; import java.io.IOException;
import java.lang.reflect.Type; import java.lang.reflect.Type;
import java.util.*; import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
public class MuteHistoryManager { public class MuteHistoryManager {
@ -33,7 +37,6 @@ public class MuteHistoryManager {
reason, reason,
mutedBy, mutedBy,
System.currentTimeMillis(), System.currentTimeMillis(),
false,
null, null,
0 0
)); ));

View file

@ -78,14 +78,14 @@ public class MuteData {
} // For JSON deserialization } // For JSON deserialization
public MuteHistoryEntry(String playerName, long duration, String reason, public MuteHistoryEntry(String playerName, long duration, String reason,
String mutedBy, long mutedAt, boolean unmuted, String mutedBy, long mutedAt,
String unmutedBy, long unmutedAt) { String unmutedBy, long unmutedAt) {
this.playerName = playerName; this.playerName = playerName;
this.duration = duration; this.duration = duration;
this.reason = reason; this.reason = reason;
this.mutedBy = mutedBy; this.mutedBy = mutedBy;
this.mutedAt = mutedAt; this.mutedAt = mutedAt;
this.unmuted = unmuted; this.unmuted = unmutedBy != null;
this.unmutedBy = unmutedBy; this.unmutedBy = unmutedBy;
this.unmutedAt = unmutedAt; this.unmutedAt = unmutedAt;
} }

View file

@ -2,7 +2,12 @@ package com.loki.lochat.gradient.commands;
import com.loki.lochat.config.RatConfig; import com.loki.lochat.config.RatConfig;
import com.loki.lochat.gradient.GradientModule; import com.loki.lochat.gradient.GradientModule;
import com.loki.lochat.gradient.commands.handlers.color.*; import com.loki.lochat.gradient.commands.handlers.color.ColorCopyHandler;
import com.loki.lochat.gradient.commands.handlers.color.ColorOffHandler;
import com.loki.lochat.gradient.commands.handlers.color.ColorOnHandler;
import com.loki.lochat.gradient.commands.handlers.color.ColorResetHandler;
import com.loki.lochat.gradient.commands.handlers.color.ColorSetHandler;
import com.loki.lochat.gradient.commands.handlers.color.SubCommandHandler;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.command.Command; import org.bukkit.command.Command;
@ -13,7 +18,11 @@ import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import java.util.*; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
/** /**
* Команда /color для установки градиента ника * Команда /color для установки градиента ника

View file

@ -1,7 +1,11 @@
package com.loki.lochat.gradient.commands; package com.loki.lochat.gradient.commands;
import com.loki.lochat.gradient.GradientModule; import com.loki.lochat.gradient.GradientModule;
import com.loki.lochat.gradient.commands.handlers.prefix.*; import com.loki.lochat.gradient.commands.handlers.prefix.PrefixOffHandler;
import com.loki.lochat.gradient.commands.handlers.prefix.PrefixOnHandler;
import com.loki.lochat.gradient.commands.handlers.prefix.PrefixResetHandler;
import com.loki.lochat.gradient.commands.handlers.prefix.PrefixSetHandler;
import com.loki.lochat.gradient.commands.handlers.prefix.PrefixSubCommandHandler;
import org.bukkit.command.Command; import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandExecutor;
@ -11,7 +15,10 @@ import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import java.util.*; import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
/** /**
* Команда /prefix для установки кастомного префикса * Команда /prefix для установки кастомного префикса

View file

@ -8,7 +8,12 @@ import org.bukkit.plugin.java.JavaPlugin;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.sql.*; import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.UUID; import java.util.UUID;

View file

@ -1,6 +1,6 @@
package com.loki.lochat.gradient.util; package com.loki.lochat.gradient.util;
import java.awt.*; import java.awt.Color;
import java.util.List; import java.util.List;
import java.util.regex.Pattern; import java.util.regex.Pattern;

View file

@ -55,71 +55,67 @@ public class PlaceholderAPIHook extends PlaceholderExpansion {
} }
UUID uuid = player.getUniqueId(); UUID uuid = player.getUniqueId();
GradientModule gradient = plugin.getGradientModule();
return switch (params.toLowerCase()) { return switch (params.toLowerCase()) {
case "ignored_count" -> String.valueOf(messagingService.getIgnoredCount(uuid)); case "ignored_count" -> String.valueOf(messagingService.getIgnoredCount(uuid));
case "global_enabled" -> String.valueOf(!chatService.isGlobalChatDisabled(uuid)); case "global_enabled" -> String.valueOf(!chatService.isGlobalChatDisabled(uuid));
case "last_pm" -> { case "last_pm" -> resolveLastPm(player, uuid);
Optional<UUID> lastOpt = messagingService.getLastConversation(uuid);
if (lastOpt.isEmpty()) {
yield "";
}
var lastPlayer = Bukkit.getOfflinePlayer(lastOpt.get());
yield lastPlayer.getName() != null ? lastPlayer.getName() : "";
}
case "spy_enabled" -> String.valueOf(messagingService.isSpying(uuid)); case "spy_enabled" -> String.valueOf(messagingService.isSpying(uuid));
case "gradient_full", "full" -> resolveGradient(player, GradientQuery.FULL);
// Gradient placeholders (совместимость с LoPreff) case "gradient_name", "name" -> resolveGradient(player, GradientQuery.NAME);
// Используем TAB формат §x§R§R§G§G§B§B для совместимости с TAB плагином case "gradient_prefix", "prefix" -> resolveGradient(player, GradientQuery.PREFIX);
case "gradient_full", "full" -> { case "lp_prefix" -> resolveGradient(player, GradientQuery.LP_PREFIX);
Player onlinePlayer = player.getPlayer(); default -> null;
if (onlinePlayer == null) { };
yield player.getName() != null ? player.getName() : "";
} }
// Если gradient модуль выключен — берём только LuckPerms префикс + ник private enum GradientQuery { FULL, NAME, PREFIX, LP_PREFIX }
private String resolveGradient(OfflinePlayer player, GradientQuery query) {
GradientModule gradient = plugin.getGradientModule();
Player onlinePlayer = player.getPlayer();
if (onlinePlayer == null) {
return switch (query) {
case FULL, NAME -> player.getName() != null ? player.getName() : "";
case PREFIX, LP_PREFIX -> "";
};
}
return switch (query) {
case FULL -> {
if (gradient == null || !gradient.isEnabled()) { if (gradient == null || !gradient.isEnabled()) {
yield player.getName() != null ? player.getName() : ""; yield player.getName() != null ? player.getName() : "";
} }
// Используем TAB формат для плейсхолдеров
yield gradient.getFormattedNameForTab(onlinePlayer); yield gradient.getFormattedNameForTab(onlinePlayer);
} }
case "gradient_name", "name" -> { case NAME -> {
Player onlinePlayer = player.getPlayer();
if (onlinePlayer == null) {
yield player.getName() != null ? player.getName() : "";
}
if (gradient == null || !gradient.isEnabled()) { if (gradient == null || !gradient.isEnabled()) {
yield player.getName(); yield player.getName();
} }
yield gradient.getGradientNick(onlinePlayer); yield gradient.getGradientNick(onlinePlayer);
} }
case "gradient_prefix", "prefix" -> { case PREFIX -> {
Player onlinePlayer = player.getPlayer();
if (onlinePlayer == null) {
yield "";
}
if (gradient == null || !gradient.isEnabled()) { if (gradient == null || !gradient.isEnabled()) {
yield ""; yield "";
} }
yield gradient.getPrefix(onlinePlayer); yield gradient.getPrefix(onlinePlayer);
} }
case "lp_prefix" -> { case LP_PREFIX -> {
Player onlinePlayer = player.getPlayer();
if (onlinePlayer == null) {
yield "";
}
if (gradient == null || !gradient.isEnabled()) { if (gradient == null || !gradient.isEnabled()) {
yield ""; yield "";
} }
yield gradient.getLuckPermsPrefix(onlinePlayer); yield gradient.getLuckPermsPrefix(onlinePlayer);
} }
default -> null;
}; };
} }
private String resolveLastPm(OfflinePlayer player, UUID uuid) {
Optional<UUID> lastOpt = messagingService.getLastConversation(uuid);
if (lastOpt.isEmpty()) {
return "";
}
var lastPlayer = Bukkit.getOfflinePlayer(lastOpt.get());
return lastPlayer.getName() != null ? lastPlayer.getName() : "";
}
} }

View file

@ -150,9 +150,7 @@ public class ChatEventListener implements Listener {
private void recordStatistics(LoChat loChat, Player sender, boolean isGlobal) { private void recordStatistics(LoChat loChat, Player sender, boolean isGlobal) {
com.loki.lochat.api.service.PlayerService playerService = com.loki.lochat.api.service.PlayerService playerService =
loChat.getServiceRegistry().get(com.loki.lochat.api.service.PlayerService.class); loChat.getServiceRegistry().get(com.loki.lochat.api.service.PlayerService.class);
if (playerService instanceof com.loki.lochat.core.service.PlayerServiceImpl impl) { playerService.recordMessage(sender.getUniqueId(), isGlobal ? "global" : "local");
impl.recordMessage(sender.getUniqueId(), isGlobal ? "global" : "local");
}
} }
private record ChatMode(boolean isGlobal, String message) { private record ChatMode(boolean isGlobal, String message) {

View file

@ -11,7 +11,11 @@ import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.scheduler.BukkitTask; import org.bukkit.scheduler.BukkitTask;
import java.util.*; import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
import io.papermc.paper.threadedregions.scheduler.ScheduledTask; import io.papermc.paper.threadedregions.scheduler.ScheduledTask;

View file

@ -1,6 +1,8 @@
package com.loki.lochat.renderer; package com.loki.lochat.renderer;
import com.loki.lochat.renderer.components.*; import com.loki.lochat.renderer.components.EmojiComponent;
import com.loki.lochat.renderer.components.GradientBuilder;
import com.loki.lochat.renderer.components.UrlProcessor;
import com.loki.lochat.utils.format.TextFormatter; import com.loki.lochat.utils.format.TextFormatter;
import com.loki.lochat.utils.player.MentionHandler; import com.loki.lochat.utils.player.MentionHandler;
@ -15,6 +17,7 @@ import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;
import java.util.List; import java.util.List;
import java.util.Map;
import io.papermc.paper.chat.ChatRenderer; import io.papermc.paper.chat.ChatRenderer;
@ -63,12 +66,18 @@ public class EnhancedChatRenderer implements ChatRenderer {
Component playerSuffix = buildPlayerSuffix(source); Component playerSuffix = buildPlayerSuffix(source);
Component player = buildPlayerComponent(source); Component player = buildPlayerComponent(source);
return buildFormattedMessage(format, emoji, prefix, separator, playerPrefix, playerSuffix, player, processed); return buildFormattedMessage(format, Map.of(
"emoji", emoji,
"prefix", prefix,
"separator", separator,
"player_prefix", playerPrefix,
"player", player,
"player_suffix", playerSuffix,
"message", processed
));
} }
private Component buildFormattedMessage(String format, Component emoji, Component prefix, private Component buildFormattedMessage(String format, Map<String, Component> parts) {
Component separator, Component playerPrefix, Component playerSuffix,
Component player, Component message) {
Component result = Component.empty(); Component result = Component.empty();
java.util.regex.Pattern pattern = java.util.regex.Pattern.compile("\\{([^}]+)\\}"); java.util.regex.Pattern pattern = java.util.regex.Pattern.compile("\\{([^}]+)\\}");
java.util.regex.Matcher matcher = pattern.matcher(format); java.util.regex.Matcher matcher = pattern.matcher(format);
@ -81,16 +90,7 @@ public class EnhancedChatRenderer implements ChatRenderer {
} }
String placeholder = matcher.group(1); String placeholder = matcher.group(1);
switch (placeholder) { result = result.append(parts.getOrDefault(placeholder, Component.text("{" + placeholder + "}")));
case "emoji" -> result = result.append(emoji);
case "prefix" -> result = result.append(prefix);
case "separator" -> result = result.append(separator);
case "player_prefix" -> result = result.append(playerPrefix);
case "player" -> result = result.append(player);
case "player_suffix" -> result = result.append(playerSuffix);
case "message" -> result = result.append(message);
default -> result = result.append(Component.text("{" + placeholder + "}"));
}
lastEnd = matcher.end(); lastEnd = matcher.end();
} }

View file

@ -70,7 +70,9 @@ public class AdventureManager {
try { try {
// Используем Adventure API // Используем Adventure API
Object playerAudience = audiences.getClass().getMethod("player", Player.class).invoke(audiences, player); Object playerAudience = audiences.getClass().getMethod("player", Player.class).invoke(audiences, player);
playerAudience.getClass().getMethod("sendMessage", Class.forName("net.kyori.adventure.text.Component")).invoke(playerAudience, message); playerAudience.getClass()
.getMethod("sendMessage", Class.forName("net.kyori.adventure.text.Component"))
.invoke(playerAudience, message);
return; return;
} catch (Exception e) { } catch (Exception e) {
// Fallback на legacy // Fallback на legacy

View file

@ -55,7 +55,10 @@ public class FoliaUtil {
// В Folia используем AsyncScheduler для глобальных задач // В Folia используем AsyncScheduler для глобальных задач
long delayMs = delayTicks * 50; // 1 тик = 50мс long delayMs = delayTicks * 50; // 1 тик = 50мс
long periodMs = periodTicks * 50; long periodMs = periodTicks * 50;
Bukkit.getAsyncScheduler().runAtFixedRate(plugin, scheduledTask -> task.run(), delayMs, periodMs, java.util.concurrent.TimeUnit.MILLISECONDS); Bukkit.getAsyncScheduler().runAtFixedRate(
plugin, scheduledTask -> task.run(), delayMs, periodMs,
java.util.concurrent.TimeUnit.MILLISECONDS
);
} else { } else {
// В Paper/Spigot используем обычный scheduler // В Paper/Spigot используем обычный scheduler
Bukkit.getScheduler().runTaskTimerAsynchronously(plugin, task, delayTicks, periodTicks); Bukkit.getScheduler().runTaskTimerAsynchronously(plugin, task, delayTicks, periodTicks);