Fix missing features and improve code quality
Features fixed: - Added chat filter functionality (block/warn/censor modes) - Fixed spy command to monitor all chat messages - Added proper spy notifications for global/local chat Code quality improvements: - Created PlayerUtil to eliminate code duplication in player lookup - Refactored ChatListener into smaller, focused methods - Added Constants class to replace magic numbers - Improved SOLID principles compliance - Fixed all compilation warnings All features from README are now implemented and working.
This commit is contained in:
parent
4f7b792633
commit
e616667c78
20 changed files with 250 additions and 99 deletions
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
bin/main/com/loki/lochat/utils/Constants.class
Normal file
BIN
bin/main/com/loki/lochat/utils/Constants.class
Normal file
Binary file not shown.
BIN
bin/main/com/loki/lochat/utils/PlayerUtil.class
Normal file
BIN
bin/main/com/loki/lochat/utils/PlayerUtil.class
Normal file
Binary file not shown.
|
|
@ -39,10 +39,11 @@ spy:
|
||||||
enabled: "CADFШпион режим включен"
|
enabled: "CADFШпион режим включен"
|
||||||
disabled: "CADFШпион режим выключен"
|
disabled: "CADFШпион режим выключен"
|
||||||
format: "󅒐[SPY] {sender} → {receiver}: {message}"
|
format: "󅒐[SPY] {sender} → {receiver}: {message}"
|
||||||
|
chat-format: "󅒐[SPY] {type} {sender}: {message}"
|
||||||
|
|
||||||
filter:
|
filter:
|
||||||
blocked: "CADFСообщение заблокировано (мат)"
|
blocked: "CADFСообщение заблокировано (мат)"
|
||||||
warned: "CADFПредупреждение: не используйте мат!"
|
warning: "CADFПредупреждение: не используйте мат!"
|
||||||
|
|
||||||
cooldown:
|
cooldown:
|
||||||
wait: "CADFПодождите {time} сек перед следующим сообщением"
|
wait: "CADFПодождите {time} сек перед следующим сообщением"
|
||||||
|
|
|
||||||
|
|
@ -19,9 +19,9 @@ public class ClearChatCommand implements CommandExecutor {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
|
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
|
||||||
// Отправляем 100 пустых строк всем игрокам
|
// Отправляем пустые строки всем игрокам для очистки чата
|
||||||
for (Player player : Bukkit.getOnlinePlayers()) {
|
for (Player player : Bukkit.getOnlinePlayers()) {
|
||||||
for (int i = 0; i < 100; i++) {
|
for (int i = 0; i < com.loki.lochat.utils.Constants.CLEAR_CHAT_LINES; i++) {
|
||||||
player.sendMessage("");
|
player.sendMessage("");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,7 @@ import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Команда /mute nick [time] [-s] [причина]
|
* Команда /mute nick [time] [-s] [причина]
|
||||||
|
|
@ -106,24 +107,15 @@ public class MuteCommand implements CommandExecutor, TabCompleter {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Ищем игрока
|
// Ищем игрока
|
||||||
Player target = Bukkit.getPlayer(targetName);
|
UUID targetUUID = com.loki.lochat.utils.PlayerUtil.findPlayerUUID(targetName);
|
||||||
String finalTargetName = targetName;
|
if (targetUUID == null) {
|
||||||
java.util.UUID targetUUID;
|
sender.sendMessage(plugin.getMessageConfig().getComponent("errors.player-not-found"));
|
||||||
|
return true;
|
||||||
if (target == null) {
|
|
||||||
@SuppressWarnings("deprecation")
|
|
||||||
var offlinePlayer = Bukkit.getOfflinePlayer(targetName);
|
|
||||||
if (!offlinePlayer.hasPlayedBefore() && !offlinePlayer.isOnline()) {
|
|
||||||
sender.sendMessage(plugin.getMessageConfig().getComponent("errors.player-not-found"));
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
targetUUID = offlinePlayer.getUniqueId();
|
|
||||||
finalTargetName = offlinePlayer.getName() != null ? offlinePlayer.getName() : targetName;
|
|
||||||
} else {
|
|
||||||
targetUUID = target.getUniqueId();
|
|
||||||
finalTargetName = target.getName();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Player target = Bukkit.getPlayer(targetUUID);
|
||||||
|
String finalTargetName = com.loki.lochat.utils.PlayerUtil.getPlayerName(targetUUID);
|
||||||
|
|
||||||
// Проверяем, не замучен ли уже
|
// Проверяем, не замучен ли уже
|
||||||
if (plugin.getMuteManager().isMuted(targetUUID)) {
|
if (plugin.getMuteManager().isMuted(targetUUID)) {
|
||||||
sender.sendMessage("§cИгрок уже замучен!");
|
sender.sendMessage("§cИгрок уже замучен!");
|
||||||
|
|
|
||||||
|
|
@ -43,22 +43,12 @@ public class MuteHistoryCommand implements CommandExecutor, TabCompleter {
|
||||||
}
|
}
|
||||||
|
|
||||||
String targetName = args[0];
|
String targetName = args[0];
|
||||||
UUID targetUUID = null;
|
|
||||||
|
|
||||||
// Ищем игрока
|
// Ищем игрока
|
||||||
Player target = Bukkit.getPlayer(targetName);
|
UUID targetUUID = com.loki.lochat.utils.PlayerUtil.findPlayerUUID(targetName);
|
||||||
if (target != null) {
|
if (targetUUID == null) {
|
||||||
targetUUID = target.getUniqueId();
|
// Пробуем найти по имени в истории
|
||||||
} else {
|
targetUUID = plugin.getMuteManager().getUUIDByName(targetName);
|
||||||
// Пробуем найти оффлайн игрока
|
|
||||||
@SuppressWarnings("deprecation")
|
|
||||||
var offlinePlayer = Bukkit.getOfflinePlayer(targetName);
|
|
||||||
if (offlinePlayer.hasPlayedBefore() || offlinePlayer.isOnline()) {
|
|
||||||
targetUUID = offlinePlayer.getUniqueId();
|
|
||||||
} else {
|
|
||||||
// Пробуем найти по имени в истории
|
|
||||||
targetUUID = plugin.getMuteManager().getUUIDByName(targetName);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (targetUUID == null) {
|
if (targetUUID == null) {
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,7 @@ import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Команда /unmute nick [-s]
|
* Команда /unmute nick [-s]
|
||||||
|
|
@ -57,24 +58,15 @@ public class UnmuteCommand implements CommandExecutor, TabCompleter {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Ищем игрока
|
// Ищем игрока
|
||||||
Player target = Bukkit.getPlayer(targetName);
|
UUID targetUUID = com.loki.lochat.utils.PlayerUtil.findPlayerUUID(targetName);
|
||||||
String finalTargetName = targetName;
|
if (targetUUID == null) {
|
||||||
java.util.UUID targetUUID;
|
sender.sendMessage(plugin.getMessageConfig().getComponent("errors.player-not-found"));
|
||||||
|
return true;
|
||||||
if (target == null) {
|
|
||||||
@SuppressWarnings("deprecation")
|
|
||||||
var offlinePlayer = Bukkit.getOfflinePlayer(targetName);
|
|
||||||
if (!offlinePlayer.hasPlayedBefore() && !offlinePlayer.isOnline()) {
|
|
||||||
sender.sendMessage(plugin.getMessageConfig().getComponent("errors.player-not-found"));
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
targetUUID = offlinePlayer.getUniqueId();
|
|
||||||
finalTargetName = offlinePlayer.getName() != null ? offlinePlayer.getName() : targetName;
|
|
||||||
} else {
|
|
||||||
targetUUID = target.getUniqueId();
|
|
||||||
finalTargetName = target.getName();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Player target = Bukkit.getPlayer(targetUUID);
|
||||||
|
String finalTargetName = com.loki.lochat.utils.PlayerUtil.getPlayerName(targetUUID);
|
||||||
|
|
||||||
String operatorName = sender.getName();
|
String operatorName = sender.getName();
|
||||||
|
|
||||||
// Размучиваем
|
// Размучиваем
|
||||||
|
|
|
||||||
|
|
@ -154,7 +154,7 @@ public class ConfigManager {
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getLocalRadius() {
|
public int getLocalRadius() {
|
||||||
return config.getInt("chat.local.radius", 100);
|
return config.getInt("chat.local.radius", com.loki.lochat.utils.Constants.DEFAULT_LOCAL_RADIUS);
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getLocalPrefix() {
|
public String getLocalPrefix() {
|
||||||
|
|
|
||||||
|
|
@ -81,60 +81,23 @@ public class ChatListener implements Listener {
|
||||||
String processedPlain = PLAIN.serialize(processedMessage).trim();
|
String processedPlain = PLAIN.serialize(processedMessage).trim();
|
||||||
if (processedPlain.isEmpty()) return;
|
if (processedPlain.isEmpty()) return;
|
||||||
|
|
||||||
|
// ===== FILTER =====
|
||||||
|
processedMessage = applyMessageFilter(player, processedMessage, processedPlain);
|
||||||
|
if (processedMessage == null) return; // Сообщение заблокировано
|
||||||
|
|
||||||
|
processedPlain = PLAIN.serialize(processedMessage);
|
||||||
|
|
||||||
// ===== COOLDOWN =====
|
// ===== COOLDOWN =====
|
||||||
int cooldown = isGlobal
|
if (!checkCooldown(player, chatType)) return;
|
||||||
? plugin.getConfigManager().getGlobalCooldown()
|
|
||||||
: plugin.getConfigManager().getLocalCooldown();
|
|
||||||
|
|
||||||
if (cooldown > 0 && !player.hasPermission("chat.bypass.cooldown")) {
|
|
||||||
if (plugin.getCooldownManager()
|
|
||||||
.isOnCooldown(player.getUniqueId(), chatType, cooldown)) {
|
|
||||||
|
|
||||||
int remaining = plugin.getCooldownManager()
|
|
||||||
.getRemainingCooldown(player.getUniqueId(), chatType, cooldown);
|
|
||||||
|
|
||||||
player.sendMessage(
|
|
||||||
plugin.getMessageConfig()
|
|
||||||
.getComponent("cooldown.wait", "{time}", String.valueOf(remaining))
|
|
||||||
);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ===== ANTI SPAM =====
|
// ===== ANTI SPAM =====
|
||||||
if (!player.hasPermission("chat.bypass.antispam")) {
|
if (!checkAntiSpam(player, processedPlain)) return;
|
||||||
AntiSpamManager.SpamResult result =
|
|
||||||
plugin.getAntiSpamManager()
|
|
||||||
.checkMessage(player.getUniqueId(), processedPlain);
|
|
||||||
|
|
||||||
switch (result) {
|
|
||||||
case TOO_MANY_CAPS -> {
|
|
||||||
player.sendMessage(
|
|
||||||
plugin.getMessageConfig().getComponent("antispam.caps")
|
|
||||||
);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
case REPEAT_CHARS -> {
|
|
||||||
player.sendMessage(
|
|
||||||
plugin.getMessageConfig().getComponent("antispam.repeat")
|
|
||||||
);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
case SIMILAR_MESSAGE -> {
|
|
||||||
player.sendMessage(
|
|
||||||
plugin.getMessageConfig().getComponent("antispam.similar")
|
|
||||||
);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
case ALLOWED -> {
|
|
||||||
// Сообщение прошло проверку, продолжаем
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
plugin.getCooldownManager().setCooldown(player.getUniqueId(), chatType);
|
plugin.getCooldownManager().setCooldown(player.getUniqueId(), chatType);
|
||||||
|
|
||||||
|
// ===== SPY =====
|
||||||
|
plugin.getSpyManager().sendToSpies(player, processedMessage, isGlobal);
|
||||||
|
|
||||||
// ===== SEND =====
|
// ===== SEND =====
|
||||||
if (isGlobal) {
|
if (isGlobal) {
|
||||||
plugin.getChatManager().sendGlobalMessage(player, processedMessage);
|
plugin.getChatManager().sendGlobalMessage(player, processedMessage);
|
||||||
|
|
@ -143,6 +106,98 @@ public class ChatListener implements Listener {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Component applyMessageFilter(Player player, Component message, String plainMessage) {
|
||||||
|
if (!plugin.getConfigManager().isFilterEnabled() || player.hasPermission("chat.bypass.filter")) {
|
||||||
|
return message;
|
||||||
|
}
|
||||||
|
|
||||||
|
String filteredMessage = applyFilter(plainMessage);
|
||||||
|
if (!filteredMessage.equals(plainMessage)) {
|
||||||
|
String action = plugin.getConfigManager().getFilterAction();
|
||||||
|
switch (action.toLowerCase()) {
|
||||||
|
case "block" -> {
|
||||||
|
player.sendMessage(plugin.getMessageConfig().getComponent("filter.blocked"));
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
case "warn" -> {
|
||||||
|
player.sendMessage(plugin.getMessageConfig().getComponent("filter.warning"));
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
case "censor" -> {
|
||||||
|
return Component.text(filteredMessage);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return message;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean checkCooldown(Player player, String chatType) {
|
||||||
|
int cooldown = chatType.equals("global")
|
||||||
|
? plugin.getConfigManager().getGlobalCooldown()
|
||||||
|
: plugin.getConfigManager().getLocalCooldown();
|
||||||
|
|
||||||
|
if (cooldown > 0 && !player.hasPermission("chat.bypass.cooldown")) {
|
||||||
|
if (plugin.getCooldownManager().isOnCooldown(player.getUniqueId(), chatType, cooldown)) {
|
||||||
|
int remaining = plugin.getCooldownManager()
|
||||||
|
.getRemainingCooldown(player.getUniqueId(), chatType, cooldown);
|
||||||
|
|
||||||
|
player.sendMessage(
|
||||||
|
plugin.getMessageConfig()
|
||||||
|
.getComponent("cooldown.wait", "{time}", String.valueOf(remaining))
|
||||||
|
);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean checkAntiSpam(Player player, String message) {
|
||||||
|
if (player.hasPermission("chat.bypass.antispam")) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
AntiSpamManager.SpamResult result = plugin.getAntiSpamManager()
|
||||||
|
.checkMessage(player.getUniqueId(), message);
|
||||||
|
|
||||||
|
switch (result) {
|
||||||
|
case TOO_MANY_CAPS -> {
|
||||||
|
player.sendMessage(plugin.getMessageConfig().getComponent("antispam.caps"));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
case REPEAT_CHARS -> {
|
||||||
|
player.sendMessage(plugin.getMessageConfig().getComponent("antispam.repeat"));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
case SIMILAR_MESSAGE -> {
|
||||||
|
player.sendMessage(plugin.getMessageConfig().getComponent("antispam.similar"));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
case ALLOWED -> {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String applyFilter(String message) {
|
||||||
|
if (!plugin.getConfigManager().isFilterEnabled()) {
|
||||||
|
return message;
|
||||||
|
}
|
||||||
|
|
||||||
|
String filtered = message;
|
||||||
|
String replacement = plugin.getConfigManager().getFilterReplacement();
|
||||||
|
|
||||||
|
for (String word : plugin.getConfigManager().getFilterWords()) {
|
||||||
|
if (word == null || word.trim().isEmpty()) continue;
|
||||||
|
|
||||||
|
// Заменяем слово с учетом регистра и границ слов
|
||||||
|
String pattern = "(?i)\\b" + java.util.regex.Pattern.quote(word.trim()) + "\\b";
|
||||||
|
filtered = filtered.replaceAll(pattern, replacement);
|
||||||
|
}
|
||||||
|
|
||||||
|
return filtered;
|
||||||
|
}
|
||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public void onQuit(PlayerQuitEvent event) {
|
public void onQuit(PlayerQuitEvent event) {
|
||||||
Player player = event.getPlayer();
|
Player player = event.getPlayer();
|
||||||
|
|
|
||||||
|
|
@ -46,6 +46,25 @@ public class SpyManager {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void sendToSpies(Player sender, net.kyori.adventure.text.Component message, boolean isGlobal) {
|
||||||
|
if (spyEnabled.isEmpty()) return;
|
||||||
|
|
||||||
|
String chatType = isGlobal ? "Global" : "Local";
|
||||||
|
String plainMessage = net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer.plainText().serialize(message);
|
||||||
|
String format = plugin.getMessageConfig().get("spy.chat-format",
|
||||||
|
"§7[SPY] §e{type} §7{sender}: §f{message}");
|
||||||
|
|
||||||
|
for (UUID spyUuid : spyEnabled) {
|
||||||
|
Player spy = Bukkit.getPlayer(spyUuid);
|
||||||
|
if (spy != null && spy.isOnline() && !spy.equals(sender)) {
|
||||||
|
spy.sendMessage(ChatFormatter.parse(format
|
||||||
|
.replace("{type}", chatType)
|
||||||
|
.replace("{sender}", sender.getName())
|
||||||
|
.replace("{message}", plainMessage)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void removeSpy(UUID player) {
|
public void removeSpy(UUID player) {
|
||||||
spyEnabled.remove(player);
|
spyEnabled.remove(player);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
31
src/main/java/com/loki/lochat/utils/Constants.java
Normal file
31
src/main/java/com/loki/lochat/utils/Constants.java
Normal file
|
|
@ -0,0 +1,31 @@
|
||||||
|
package com.loki.lochat.utils;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Константы плагина
|
||||||
|
*/
|
||||||
|
public final class Constants {
|
||||||
|
|
||||||
|
private Constants() {}
|
||||||
|
|
||||||
|
// Чат
|
||||||
|
public static final int DEFAULT_LOCAL_RADIUS = 100;
|
||||||
|
public static final int CLEAR_CHAT_LINES = 100;
|
||||||
|
|
||||||
|
// Время
|
||||||
|
public static final long MILLIS_IN_SECOND = 1000L;
|
||||||
|
public static final int SECONDS_IN_MINUTE = 60;
|
||||||
|
public static final int MINUTES_IN_HOUR = 60;
|
||||||
|
public static final int HOURS_IN_DAY = 24;
|
||||||
|
|
||||||
|
// Градиенты
|
||||||
|
public static final int DEFAULT_PRICE_PER_COLOR = 50;
|
||||||
|
public static final int DEFAULT_PREFIX_PRICE = 500;
|
||||||
|
public static final int LUCKPERMS_PREFIX_PRIORITY = 100;
|
||||||
|
|
||||||
|
// Folia/Paper совместимость
|
||||||
|
public static final int TICKS_PER_SECOND = 20;
|
||||||
|
public static final int MILLIS_PER_TICK = 50;
|
||||||
|
|
||||||
|
// Анти-спам
|
||||||
|
public static final int PERCENTAGE_MULTIPLIER = 100;
|
||||||
|
}
|
||||||
70
src/main/java/com/loki/lochat/utils/PlayerUtil.java
Normal file
70
src/main/java/com/loki/lochat/utils/PlayerUtil.java
Normal file
|
|
@ -0,0 +1,70 @@
|
||||||
|
package com.loki.lochat.utils;
|
||||||
|
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.OfflinePlayer;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Утилиты для работы с игроками
|
||||||
|
*/
|
||||||
|
public final class PlayerUtil {
|
||||||
|
|
||||||
|
private PlayerUtil() {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Находит игрока по имени (онлайн или оффлайн)
|
||||||
|
* @param name имя игрока
|
||||||
|
* @return UUID игрока или null если не найден
|
||||||
|
*/
|
||||||
|
public static UUID findPlayerUUID(String name) {
|
||||||
|
// Сначала ищем онлайн игрока
|
||||||
|
Player onlinePlayer = Bukkit.getPlayer(name);
|
||||||
|
if (onlinePlayer != null) {
|
||||||
|
return onlinePlayer.getUniqueId();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Затем ищем оффлайн игрока
|
||||||
|
OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(name);
|
||||||
|
if (offlinePlayer.hasPlayedBefore() || offlinePlayer.isOnline()) {
|
||||||
|
return offlinePlayer.getUniqueId();
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Проверяет, существует ли игрок (играл на сервере)
|
||||||
|
* @param name имя игрока
|
||||||
|
* @return true если игрок существует
|
||||||
|
*/
|
||||||
|
public static boolean playerExists(String name) {
|
||||||
|
return findPlayerUUID(name) != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Получает имя игрока по UUID
|
||||||
|
* @param uuid UUID игрока
|
||||||
|
* @return имя игрока или null
|
||||||
|
*/
|
||||||
|
public static String getPlayerName(UUID uuid) {
|
||||||
|
Player onlinePlayer = Bukkit.getPlayer(uuid);
|
||||||
|
if (onlinePlayer != null) {
|
||||||
|
return onlinePlayer.getName();
|
||||||
|
}
|
||||||
|
|
||||||
|
OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(uuid);
|
||||||
|
return offlinePlayer.getName();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Проверяет, онлайн ли игрок
|
||||||
|
* @param uuid UUID игрока
|
||||||
|
* @return true если игрок онлайн
|
||||||
|
*/
|
||||||
|
public static boolean isPlayerOnline(UUID uuid) {
|
||||||
|
Player player = Bukkit.getPlayer(uuid);
|
||||||
|
return player != null && player.isOnline();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -39,10 +39,11 @@ spy:
|
||||||
enabled: "CADFШпион режим включен"
|
enabled: "CADFШпион режим включен"
|
||||||
disabled: "CADFШпион режим выключен"
|
disabled: "CADFШпион режим выключен"
|
||||||
format: "󅒐[SPY] {sender} → {receiver}: {message}"
|
format: "󅒐[SPY] {sender} → {receiver}: {message}"
|
||||||
|
chat-format: "󅒐[SPY] {type} {sender}: {message}"
|
||||||
|
|
||||||
filter:
|
filter:
|
||||||
blocked: "CADFСообщение заблокировано (мат)"
|
blocked: "CADFСообщение заблокировано (мат)"
|
||||||
warned: "CADFПредупреждение: не используйте мат!"
|
warning: "CADFПредупреждение: не используйте мат!"
|
||||||
|
|
||||||
cooldown:
|
cooldown:
|
||||||
wait: "CADFПодождите {time} сек перед следующим сообщением"
|
wait: "CADFПодождите {time} сек перед следующим сообщением"
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue