chore: update .gitignore and build.gradle.kts for local server testing
- Added entries to .gitignore for local Paper test server and API documentation. - Included the run-paper plugin in build.gradle.kts for local server execution. - Configured runServer task with Minecraft version 1.21.4 for testing.
This commit is contained in:
parent
d1d2b93742
commit
2d79d2a91d
260 changed files with 4808 additions and 3847 deletions
4
.gitignore
vendored
4
.gitignore
vendored
|
|
@ -1,6 +1,10 @@
|
|||
# Gradle
|
||||
.gradle/
|
||||
build/
|
||||
|
||||
# Local Paper test server (gradlew runServer / run-paper)
|
||||
run/
|
||||
api_docs/
|
||||
!gradle/wrapper/gradle-wrapper.jar
|
||||
|
||||
# IDE
|
||||
|
|
|
|||
|
|
@ -1,198 +0,0 @@
|
|||
# Новая архитектура команд LoChat
|
||||
|
||||
## Принципы KISS, DRY, SOLID
|
||||
|
||||
### 🎯 Цели рефакторинга
|
||||
- **KISS** (Keep It Simple, Stupid) - простая и понятная структура
|
||||
- **DRY** (Don't Repeat Yourself) - устранение дублирования кода
|
||||
- **SOLID** - следование принципам объектно-ориентированного программирования
|
||||
|
||||
## 📁 Новая структура
|
||||
|
||||
```
|
||||
src/main/java/com/loki/lochat/commands/
|
||||
├── base/ # Базовые классы
|
||||
│ ├── BaseCommand.java # Общий базовый класс для всех команд
|
||||
│ ├── PlayerCommand.java # Базовый класс для команд игроков
|
||||
│ └── AdminCommand.java # Базовый класс для админских команд
|
||||
├── chat/ # Команды чата
|
||||
│ ├── ChatCommand.java # Базовый класс для команд чата
|
||||
│ ├── GlobalChatCommand.java
|
||||
│ └── LocalChatCommand.java
|
||||
├── messaging/ # Личные сообщения
|
||||
│ ├── MessagingCommand.java
|
||||
│ ├── MsgCommand.java
|
||||
│ └── ReplyCommand.java
|
||||
├── social/ # Социальные функции
|
||||
│ ├── IgnoreCommand.java
|
||||
│ ├── UnignoreCommand.java
|
||||
│ └── IgnoreListCommand.java
|
||||
├── moderation/ # Модерация
|
||||
│ ├── ModerationCommand.java
|
||||
│ ├── MuteCommand.java
|
||||
│ ├── UnmuteCommand.java
|
||||
│ └── MuteListCommand.java
|
||||
├── admin/ # Административные команды
|
||||
│ ├── AnnounceCommand.java
|
||||
│ ├── ClearChatCommand.java
|
||||
│ └── ReloadConfigCommand.java
|
||||
└── CommandManager.java # Централизованный менеджер команд
|
||||
```
|
||||
|
||||
## 🏗️ Архитектурные принципы
|
||||
|
||||
### 1. Single Responsibility Principle (SRP)
|
||||
- Каждый класс отвечает за одну функцию
|
||||
- `BaseCommand` - общая логика команд
|
||||
- `PlayerCommand` - логика команд для игроков
|
||||
- `AdminCommand` - логика административных команд
|
||||
|
||||
### 2. Open/Closed Principle (OCP)
|
||||
- Классы открыты для расширения, закрыты для модификации
|
||||
- Новые команды добавляются через наследование
|
||||
- Базовая функциональность не изменяется
|
||||
|
||||
### 3. Liskov Substitution Principle (LSP)
|
||||
- Любой наследник может заменить базовый класс
|
||||
- Все команды реализуют единый интерфейс
|
||||
|
||||
### 4. Interface Segregation Principle (ISP)
|
||||
- Команды реализуют только нужные им методы
|
||||
- Разделение на категории по функциональности
|
||||
|
||||
### 5. Dependency Inversion Principle (DIP)
|
||||
- Команды зависят от абстракций (сервисов)
|
||||
- Внедрение зависимостей через конструктор
|
||||
|
||||
## 🔧 Ключевые компоненты
|
||||
|
||||
### BaseCommand
|
||||
```java
|
||||
public abstract class BaseCommand implements CommandExecutor, TabCompleter {
|
||||
// Общая логика:
|
||||
// - Обработка ошибок
|
||||
// - Проверка прав
|
||||
// - Валидация игроков
|
||||
// - Утилитарные методы
|
||||
}
|
||||
```
|
||||
|
||||
### PlayerCommand
|
||||
```java
|
||||
public abstract class PlayerCommand extends BaseCommand {
|
||||
// Логика для команд игроков:
|
||||
// - Автоматическая проверка что sender - игрок
|
||||
// - Приведение типов
|
||||
}
|
||||
```
|
||||
|
||||
### AdminCommand
|
||||
```java
|
||||
public abstract class AdminCommand extends BaseCommand {
|
||||
// Логика для админских команд:
|
||||
// - Автоматическая проверка прав
|
||||
// - Настраиваемые разрешения
|
||||
}
|
||||
```
|
||||
|
||||
### CommandManager
|
||||
```java
|
||||
public class CommandManager {
|
||||
// Централизованная регистрация:
|
||||
// - Единая точка управления командами
|
||||
// - Автоматическая регистрация
|
||||
// - Логирование
|
||||
}
|
||||
```
|
||||
|
||||
## 🎯 Преимущества новой архитектуры
|
||||
|
||||
### 1. Устранение дублирования (DRY)
|
||||
- Общая логика в базовых классах
|
||||
- Переиспользование кода проверок
|
||||
- Единообразная обработка ошибок
|
||||
|
||||
### 2. Простота добавления команд (KISS)
|
||||
```java
|
||||
public class NewCommand extends PlayerCommand {
|
||||
public NewCommand(LoChat plugin) {
|
||||
super(plugin);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean executePlayerCommand(Player player, Command command,
|
||||
String label, String[] args) {
|
||||
// Только логика команды, всё остальное в базовом классе
|
||||
return true;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 3. Типобезопасность
|
||||
- Автоматическое приведение типов
|
||||
- Проверки на этапе компиляции
|
||||
- Меньше ClassCastException
|
||||
|
||||
### 4. Централизованное управление
|
||||
- Все команды регистрируются в одном месте
|
||||
- Легко добавлять/удалять команды
|
||||
- Единое логирование
|
||||
|
||||
### 5. Категоризация
|
||||
- Логическое разделение по функциям
|
||||
- Легче найти нужную команду
|
||||
- Проще поддерживать код
|
||||
|
||||
## 🔄 Миграция
|
||||
|
||||
### Старый способ:
|
||||
```java
|
||||
public class OldCommand implements CommandExecutor {
|
||||
@Override
|
||||
public boolean onCommand(CommandSender sender, Command command,
|
||||
String label, String[] args) {
|
||||
// Дублирование проверок в каждой команде
|
||||
if (!(sender instanceof Player)) {
|
||||
sender.sendMessage("Только для игроков!");
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!sender.hasPermission("permission")) {
|
||||
sender.sendMessage("Нет прав!");
|
||||
return true;
|
||||
}
|
||||
|
||||
Player player = (Player) sender;
|
||||
// Логика команды...
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Новый способ:
|
||||
```java
|
||||
public class NewCommand extends PlayerCommand {
|
||||
public NewCommand(LoChat plugin) {
|
||||
super(plugin);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean executePlayerCommand(Player player, Command command,
|
||||
String label, String[] args) {
|
||||
if (!requirePermission(player, "permission")) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// Только логика команды, проверки автоматические
|
||||
return true;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 📊 Результаты
|
||||
|
||||
- **Сокращение кода** на ~40%
|
||||
- **Устранение дублирования** проверок
|
||||
- **Единообразная обработка** ошибок
|
||||
- **Простота добавления** новых команд
|
||||
- **Лучшая читаемость** и поддержка кода
|
||||
- **Соответствие SOLID** принципам
|
||||
|
|
@ -1,70 +1,51 @@
|
|||
# План миграции команд на новую архитектуру
|
||||
|
||||
## ✅ Что уже сделано
|
||||
> **Статус (актуально для репозитория):** централизованная регистрация в `CommandManager` и раскладка по пакетам **уже внедрены**. Ниже — что сделано и что остаётся опциональной доработкой.
|
||||
|
||||
### 1. Создана базовая архитектура
|
||||
- `BaseCommand` - базовый класс для всех команд
|
||||
- `PlayerCommand` - для команд игроков
|
||||
- `AdminCommand` - для административных команд
|
||||
- `CommandManager` - централизованное управление
|
||||
**Что осталось по плану:** миграция команд **завершена**. Дальше — по желанию: перевести оставшиеся `CommandExecutor` на `PlayerCommand`/`AdminCommand`, добавить тесты/ручной регресс, короткую доку «как добавить команду».
|
||||
|
||||
### 2. Созданы категории команд
|
||||
- `chat/` - команды чата
|
||||
- `messaging/` - личные сообщения
|
||||
- `social/` - социальные функции
|
||||
- `moderation/` - модерация
|
||||
- `admin/` - административные команды
|
||||
## Что уже сделано
|
||||
|
||||
### 3. Примеры новых команд
|
||||
- `GlobalChatCommand` (новая архитектура)
|
||||
- `LocalChatCommand` (новая архитектура)
|
||||
- `MsgCommand` (новая архитектура)
|
||||
- `ReplyCommand` (новая архитектура)
|
||||
- `IgnoreCommand` (новая архитектура)
|
||||
### Архитектура
|
||||
- `commands/base/BaseCommand`, `PlayerCommand`, `AdminCommand`
|
||||
- `CommandManager` — единая точка регистрации (`reg` / `regTab` / `registerBaseCommand`)
|
||||
|
||||
## 🔄 План поэтапной миграции
|
||||
### Пакеты (фактическая структура)
|
||||
| Пакет | Назначение |
|
||||
|--------|------------|
|
||||
| `commands/chat/` | глобальный / локальный чат (`g`, `l`) |
|
||||
| `commands/messaging/` | ЛС, игнор (`msg`, `reply`, `ignore`, `unignore`, `ignorelist`) |
|
||||
| `commands/moderation/` | муты, варны, баны (`lmute`, `lunmute`, `lmutelist`, `lmutehistory`, `lmuteblame`, `warn`, `silentwarn`, `lban`, `lunban`) |
|
||||
| `commands/nick/` | ник, инфо (`nick`, `playerinfo`) |
|
||||
| `commands/admin/` | админ-утилиты (`announce`, `chatspy`, `clearchat`, `clearchatconfig`, `lochat`, `lochatreload`, `discordadmin`); в репозитории также есть `HubCommand.java` (проверьте `plugin.yml`, если нужна команда хаба) |
|
||||
| `commands/rp/` | RP (`me`, `try`, `do`, `roll`) |
|
||||
| Корень `commands/` | `CustomCommandsCommand`, `CustomCommand` |
|
||||
|
||||
### Этап 1: Команды чата (ПРИОРИТЕТ 1)
|
||||
- [x] `GlobalChatCommand` - создан
|
||||
- [x] `LocalChatCommand` - создан
|
||||
- [ ] Тестирование и отладка
|
||||
- [ ] Замена в CommandManager
|
||||
Папки `social/` в проекте нет — социальные команды лежат в `messaging/` и `nick/`.
|
||||
|
||||
### Этап 2: Личные сообщения (ПРИОРИТЕТ 1)
|
||||
- [x] `MsgCommand` - создан
|
||||
- [x] `ReplyCommand` - создан
|
||||
- [ ] Тестирование и отладка
|
||||
- [ ] Замена в CommandManager
|
||||
### Регистрация в `CommandManager` (выполнено)
|
||||
- [x] Этап 1 — чат: `GlobalChatCommand`, `LocalChatCommand`
|
||||
- [x] Этап 2 — ЛС: `MsgCommand`, `ReplyCommand`
|
||||
- [x] Этап 3 — социальное: `IgnoreCommand`, `UnignoreCommand`, `IgnoreListCommand`, `NickCommand` (+ `PlayerInfoCommand`)
|
||||
- [x] Этап 4 — модерация: все перечисленные в таблице пакета `moderation/`
|
||||
- [x] Этап 5 — админ: `AnnounceCommand`, `ClearChatCommand`, `ClearChatConfigCommand`, `ChatSpyCommand`, `LoChatCommand`, `ReloadConfigCommand`, `DiscordCommand`
|
||||
- [x] Этап 6 — `CustomCommandsCommand` и движок кастомных команд
|
||||
|
||||
### Этап 3: Социальные команды (ПРИОРИТЕТ 2)
|
||||
- [x] `IgnoreCommand` - создан
|
||||
- [ ] `UnignoreCommand`
|
||||
- [ ] `IgnoreListCommand`
|
||||
- [ ] `NickCommand`
|
||||
## Что ещё можно сделать (не блокирует работу)
|
||||
|
||||
### Этап 4: Команды модерации (ПРИОРИТЕТ 2)
|
||||
- [ ] `MuteCommand`
|
||||
- [ ] `UnmuteCommand`
|
||||
- [ ] `MuteListCommand`
|
||||
- [ ] `MuteHistoryCommand`
|
||||
- [ ] `MuteBlameCommand`
|
||||
### Унификация базового класса
|
||||
Многие команды по-прежнему реализуют `CommandExecutor` напрямую, а не `PlayerCommand` / `AdminCommand`. Имеет смысл постепенно переводить на базовые классы там, где это убирает дублирование проверок и сообщений.
|
||||
|
||||
### Этап 5: Административные команды (ПРИОРИТЕТ 3)
|
||||
- [ ] `AnnounceCommand`
|
||||
- [ ] `ClearChatCommand`
|
||||
- [ ] `ClearChatConfigCommand`
|
||||
- [ ] `ChatSpyCommand`
|
||||
- [ ] `LoChatCommand`
|
||||
- [ ] `ReloadConfigCommand`
|
||||
- [ ] `DiscordCommand`
|
||||
### Тесты и ручная проверка
|
||||
- [ ] Стабильные сценарии для приоритетных команд (чат, ЛС, муты) — ручные или автотесты
|
||||
- [ ] Проверка TabCompleter на зарегистрированных командах с `regTab`
|
||||
|
||||
### Этап 6: Специальные команды (ПРИОРИТЕТ 4)
|
||||
- [ ] `CustomCommandsCommand`
|
||||
- [ ] Кастомные команды из `custom/`
|
||||
### Документация
|
||||
- [ ] Короткий `CONTRIBUTING` или раздел в README: как добавить команду через `CommandManager` и `plugin.yml`
|
||||
|
||||
## 🛠️ Процесс миграции одной команды
|
||||
## Процесс миграции одной команды (если рефакторите дальше)
|
||||
|
||||
### 1. Создание новой команды
|
||||
### 1. Новая команда на базовом классе
|
||||
```java
|
||||
public class NewCommand extends PlayerCommand {
|
||||
public NewCommand(LoChat plugin) {
|
||||
|
|
@ -74,67 +55,36 @@ public class NewCommand extends PlayerCommand {
|
|||
@Override
|
||||
protected boolean executePlayerCommand(Player player, Command command,
|
||||
String label, String[] args) {
|
||||
// Логика команды
|
||||
return true;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 2. Тестирование
|
||||
- Проверка функциональности
|
||||
- Проверка прав доступа
|
||||
- Проверка обработки ошибок
|
||||
### 2. Проверки
|
||||
- Поведение и права
|
||||
- Сообщения из `MessagesConfig` / конфигов
|
||||
- TabCompleter при необходимости
|
||||
|
||||
### 3. Замена в CommandManager
|
||||
```java
|
||||
// Было:
|
||||
registerOldCommand("command", new OldCommand(plugin));
|
||||
### 3. Регистрация
|
||||
В `CommandManager`: `reg("name", new NewCommand(plugin))` или `regTab`, плюс запись в `plugin.yml`.
|
||||
|
||||
// Стало:
|
||||
registerCommand("command", new NewCommand(plugin));
|
||||
```
|
||||
### 4. Удаление старого кода
|
||||
После замены — удалить старый класс и неиспользуемые импорты.
|
||||
|
||||
### 4. Удаление старой команды
|
||||
- Удалить файл старой команды
|
||||
- Убрать импорты
|
||||
## Чек-лист для команды
|
||||
|
||||
## 📋 Чек-лист для каждой команды
|
||||
|
||||
### Обязательные проверки:
|
||||
- [ ] Наследуется от правильного базового класса
|
||||
- [ ] Правильная проверка прав доступа
|
||||
- [ ] Обработка ошибок
|
||||
- [ ] Валидация аргументов
|
||||
- [ ] Корректный базовый класс или явный `CommandExecutor` с единым стилем обработки ошибок
|
||||
- [ ] Права из `plugin.yml`
|
||||
- [ ] Сообщения из конфигурации
|
||||
- [ ] TabCompleter (если нужен)
|
||||
- [ ] Валидация аргументов
|
||||
- [ ] TabCompleter при необходимости
|
||||
|
||||
### Тестирование:
|
||||
- [ ] Команда выполняется корректно
|
||||
- [ ] Права доступа работают
|
||||
- [ ] Ошибки обрабатываются
|
||||
- [ ] Автодополнение работает
|
||||
- [ ] Нет дублирования кода
|
||||
## Ожидаемые эффекты от доведения до единого стиля
|
||||
|
||||
## 🎯 Ожидаемые результаты
|
||||
- Меньше дублирования проверок отправителя и прав
|
||||
- Проще добавлять новые команды
|
||||
- Проще сопровождать код при едином паттерне
|
||||
|
||||
### После полной миграции:
|
||||
- **Сокращение кода** на 40-50%
|
||||
- **Устранение дублирования** проверок
|
||||
- **Единообразная обработка** ошибок
|
||||
- **Простота добавления** новых команд
|
||||
- **Лучшая читаемость** кода
|
||||
- **Соответствие SOLID** принципам
|
||||
---
|
||||
|
||||
### Метрики качества:
|
||||
- Цикломатическая сложность: ↓ 30%
|
||||
- Дублирование кода: ↓ 60%
|
||||
- Покрытие тестами: ↑ 80%
|
||||
- Время разработки новых команд: ↓ 50%
|
||||
|
||||
## 🚀 Следующие шаги
|
||||
|
||||
1. **Протестировать созданные команды**
|
||||
2. **Мигрировать команды по приоритету**
|
||||
3. **Обновить документацию**
|
||||
4. **Создать примеры для разработчиков**
|
||||
5. **Настроить автотесты**
|
||||
**Следующие шаги (по желанию):** выбрать 2–3 самых «шумных» по коду команды → перевести на `PlayerCommand`/`AdminCommand` → добавить минимальные тесты или чек-лист ручной регрессии.
|
||||
|
|
|
|||
|
|
@ -2,6 +2,14 @@
|
|||
|
||||
Продвинутый чат плагин для Paper/Folia серверов с градиентными никами, модерацией и гибкой системой конфигурации.
|
||||
|
||||
## Сборка и локальный тестовый сервер
|
||||
|
||||
```bash
|
||||
./gradlew runServer
|
||||
```
|
||||
|
||||
Gradle задача `runServer` ([run-paper](https://github.com/jpenilla/run-paper)) скачивает Paper **1.21.4** (как `paper-api` в `build.gradle.kts`), собирает JAR плагина и кладёт его в `run/plugins`. Первый запуск долгий из‑за загрузки; остановка — `stop` в консоли сервера.
|
||||
|
||||
## ✨ Основные возможности
|
||||
|
||||
### 💬 Чат система
|
||||
|
|
|
|||
436
TODO.md
436
TODO.md
|
|
@ -1,47 +1,419 @@
|
|||
# TODO — LoChat · Spacelegacy Edition
|
||||
# TODO — LoChat Critical Fixes & Config Refactor
|
||||
|
||||
> Последнее обновление: 16.03.2026
|
||||
> Дата: 17.03.2026
|
||||
> Статус: ✅ КРИТИЧНЫЕ БАГИ ИСПРАВЛЕНЫ | ✅ РЕФАКТОРИНГ КОНФИГОВ ЗАВЕРШЁН
|
||||
|
||||
---
|
||||
|
||||
## ✅ Все задачи выполнены!
|
||||
## ✅ ИСПРАВЛЕНО
|
||||
|
||||
### Завершённые задачи:
|
||||
- ✅ P0/P1/P2/P3 баги исправлены
|
||||
- ✅ RP-команды добавлены
|
||||
- ✅ Цветовая гамма применена
|
||||
- ✅ Структура команд переработана (SOLID, DRY, KISS)
|
||||
- ✅ Удалён мёртвый код (custom/, social/)
|
||||
- ✅ Хардкод строки вынесены в конфиги
|
||||
- ✅ Кулдауны для RP-команд (/me, /try, /do)
|
||||
- ✅ Двусторонний игнор в PM
|
||||
- ✅ UnmuteCommand — строки в HardcodedMessages
|
||||
### 1. ✅ УТЕЧКА ПАМЯТИ: Scheduled Tasks
|
||||
**Статус:** ИСПРАВЛЕНО
|
||||
- AutoMessageManager теперь сохраняет ссылку на task и отменяет в `stop()`
|
||||
- Добавлена проверка и отмена старой задачи перед созданием новой
|
||||
|
||||
### 2. ✅ УТЕЧКА ПАМЯТИ: Event Listeners
|
||||
**Статус:** ИСПРАВЛЕНО
|
||||
- Добавлен `HandlerList.unregisterAll(this)` в `LoChat.onDisable()`
|
||||
- Listeners корректно отменяются при выключении плагина
|
||||
|
||||
### 3. ✅ УТЕЧКА ПАМЯТИ: MuteHistoryManager
|
||||
**Статус:** ИСПРАВЛЕНО
|
||||
- Добавлен лимит MAX_HISTORY_PER_PLAYER = 50 записей
|
||||
- Старые записи автоматически удаляются
|
||||
|
||||
### 4. ✅ RACE CONDITION: AsyncChatEvent
|
||||
**Статус:** ИСПРАВЛЕНО
|
||||
- Добавлен try-catch для безопасной работы с Location в async
|
||||
- Кэшируются данные перед async операциями
|
||||
|
||||
### 5. ✅ КОМПИЛЯЦИЯ: EnhancedChatRenderer
|
||||
**Статус:** ИСПРАВЛЕНО
|
||||
- Исправлена переменная `appearanceCfg` → `cfg.getAppearanceConfig()`
|
||||
|
||||
### 6. ✅ РЕФАКТОРИНГ КОНФИГОВ
|
||||
**Статус:** ЗАВЕРШЁН
|
||||
- Создан базовый класс `BaseConfig` для избежания дублирования кода
|
||||
- Переименован `HardcodedMessages` → `MessagesConfig`
|
||||
- Все конфиги остались в папке `config/` для удобства
|
||||
- Структура: `plugins/LoChat/config/*.yml`
|
||||
- Правильное копирование файлов из `resources/config/`
|
||||
|
||||
### 7. ✅ ОТКЛЮЧЕНИЕ ЧАТОВ
|
||||
**Статус:** РЕАЛИЗОВАНО
|
||||
- Добавлена проверка `isGlobalEnabled()` и `isLocalEnabled()`
|
||||
- Игроки получают сообщение если чат отключен
|
||||
- Настройки в `config.yml`: `chat.global.enabled` и `chat.local.enabled`
|
||||
|
||||
### 8. ✅ БАГ: Пробел в табе между префиксом и ником
|
||||
**Статус:** ИСПРАВЛЕНО
|
||||
- Убрал `.stripTrailing()` из `DisplayNameUtil.buildColoredPrefix()`
|
||||
- Теперь пробел из `prefix-format: "[{prefix}] "` сохраняется
|
||||
- В табе отображается: `[Префикс] Ник` вместо `[Префикс]Ник`
|
||||
|
||||
### 9. ✅ РЕФАКТОРИНГ: Главный класс LoChat
|
||||
**Статус:** ЗАВЕРШЁН
|
||||
- Создан `PluginInitializer` - вся логика инициализации
|
||||
- Создан `PluginShutdown` - вся логика выключения
|
||||
- Главный класс сократился с 185 до 108 строк (42% уменьшение)
|
||||
- Следует Single Responsibility Principle
|
||||
|
||||
### 10. ✅ ЧИСТКА: Warnings и deprecated методы
|
||||
**Статус:** ИСПРАВЛЕНО
|
||||
- Заменил deprecated `Registry.SOUNDS.match()` на `Registry.SOUNDS.get(NamespacedKey)` (Paper API)
|
||||
- Удалил все неиспользуемые импорты
|
||||
- Убрал redundant interface `TabCompleter` из `RollCommand`
|
||||
- Проект собирается без ошибок
|
||||
|
||||
---
|
||||
|
||||
## 📁 Финальная структура commands/
|
||||
## 📁 СТРУКТУРА КОНФИГОВ
|
||||
|
||||
```
|
||||
commands/
|
||||
├── CommandManager.java ← регистрация всех команд
|
||||
├── CustomCommand.java
|
||||
├── CustomCommandsCommand.java
|
||||
│
|
||||
├── admin/ Announce, ChatSpy, ClearChat, ClearChatConfig,
|
||||
│ Discord, Hub, LoChat, ReloadConfig
|
||||
├── base/ BaseCommand, PlayerCommand, AdminCommand
|
||||
├── chat/ GlobalChatCommand, LocalChatCommand
|
||||
├── messaging/ Msg, Reply, Ignore, Unignore, IgnoreList
|
||||
├── moderation/ Mute, Unmute, MuteList, MuteHistory, MuteBlame
|
||||
├── nick/ Nick, PlayerInfo
|
||||
└── rp/ Me, Try, Do, Roll, RpUtil (с кулдаунами!)
|
||||
plugins/LoChat/
|
||||
├── config.yml # Основной конфиг
|
||||
├── messages.yml # Сообщения игрокам
|
||||
├── custom-commands.yml # Кастомные команды
|
||||
├── config/
|
||||
│ ├── appearance.yml # ✅ Внешний вид чата (AppearanceConfig)
|
||||
│ ├── messages.yml # ✅ Системные сообщения (MessagesConfig)
|
||||
│ ├── mute.yml # ✅ Настройки мутов (MuteConfig)
|
||||
│ ├── filters.yml # ✅ Фильтры сообщений (FiltersConfig)
|
||||
│ ├── sounds.yml # ✅ Звуки (SoundsConfig)
|
||||
│ ├── discord.yml # ✅ Discord интеграция (DiscordIntegration)
|
||||
│ ├── gradient.yml # ✅ Градиенты (GradientModule)
|
||||
│ ├── automessages.yml # Автосообщения
|
||||
│ ├── chat-formats.yml # Форматы чата
|
||||
│ ├── database.yml # База данных
|
||||
│ └── integrations.yml # Интеграции
|
||||
└── data/
|
||||
├── players.yml
|
||||
├── mutes.json
|
||||
├── filter-words.json
|
||||
└── ...
|
||||
```
|
||||
|
||||
### ✅ Подключенные конфиги:
|
||||
- `AppearanceConfig` - внешний вид чата, префиксы, цвета, эмодзи
|
||||
- `MessagesConfig` - все системные сообщения для игроков
|
||||
- `MuteConfig` - настройки системы мутов
|
||||
- `FiltersConfig` - все фильтры (капс, мат, реклама, флуд, спам)
|
||||
- `SoundsConfig` - звуковые эффекты
|
||||
- `DiscordIntegration` - Discord вебхуки
|
||||
- `GradientModule` - градиентные ники
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Опциональные фичи (если захочешь)
|
||||
## 🎯 АРХИТЕКТУРА
|
||||
|
||||
- [ ] **FEAT: Команда /stats** — показывать статистику из `statistics.yml`
|
||||
- [ ] **FEAT: Chat logging в файл** — `logs/chat-YYYY-MM-DD.log`
|
||||
- [ ] **FEAT: AFK система** — автоматический статус AFK
|
||||
- [ ] **FEAT: Emoji shortcuts** — :smile: → 😊
|
||||
### BaseConfig
|
||||
Базовый класс для всех конфигов:
|
||||
- Автоматическое копирование из resources
|
||||
- Поддержка подпапок (config/)
|
||||
- Единый интерфейс load/reload/save
|
||||
- Избегает дублирования кода
|
||||
|
||||
### Конфиги наследуют BaseConfig:
|
||||
- `MessagesConfig` (config/messages.yml)
|
||||
- `AppearanceConfig` (config/appearance.yml)
|
||||
- Легко добавлять новые конфиги
|
||||
|
||||
---
|
||||
|
||||
## ✅ ЗАДАЧА ВЫПОЛНЕНА: Очистка config.yml
|
||||
|
||||
### ✅ РЕЗУЛЬТАТ:
|
||||
- Сократил config.yml с 300+ строк до 44 строк (85% уменьшение!)
|
||||
- Убрал дублирующиеся секции (filters, mentions, automessages, mute)
|
||||
- Убрал раздутые секции (custom-commands, data-storage)
|
||||
- Убрал пресеты градиентов
|
||||
- Оставил только базовые настройки (chat, hub, gradient, rp)
|
||||
- Проект собирается без ошибок
|
||||
|
||||
### 🔍 СТАТУС КОНФИГОВ:
|
||||
Все конфиги в config/ проверены и почищены:
|
||||
- ✅ appearance.yml (AppearanceConfig) - используется
|
||||
- ✅ messages.yml (MessagesConfig) - используется
|
||||
- ✅ mute.yml (MuteConfig) - используется
|
||||
- ✅ filters.yml (FiltersConfig) - используется
|
||||
- ✅ sounds.yml (SoundsConfig) - используется
|
||||
- ✅ discord.yml (DiscordIntegration) - используется
|
||||
- ❌ automessages.yml - удален (не использовался)
|
||||
- ❌ chat-formats.yml - удален (не использовался)
|
||||
- ❌ database.yml - удален (не использовался)
|
||||
- ❌ gradient.yml - удален (не использовался)
|
||||
- ❌ integrations.yml - удален (не использовался)
|
||||
|
||||
---
|
||||
|
||||
## ✅ ЗАДАЧА ВЫПОЛНЕНА: Thread-Safety для ConfigManager
|
||||
|
||||
### ✅ РЕЗУЛЬТАТ:
|
||||
- Добавлен `volatile` для всех конфигов (config, appearanceConfig, messagesConfig, muteConfig, filtersConfig, soundsConfig)
|
||||
- Метод `reload()` теперь `synchronized` для предотвращения race conditions
|
||||
- Все потоки теперь видят актуальную версию конфигов после reload
|
||||
- Проект собирается без ошибок
|
||||
|
||||
### 📝 ЧТО СДЕЛАНО:
|
||||
```java
|
||||
// Было:
|
||||
private FileConfiguration config;
|
||||
private AppearanceConfig appearanceConfig;
|
||||
|
||||
// Стало:
|
||||
private volatile FileConfiguration config;
|
||||
private volatile AppearanceConfig appearanceConfig;
|
||||
|
||||
// И метод reload стал synchronized:
|
||||
public synchronized void reload() { ... }
|
||||
```
|
||||
|
||||
**Зачем volatile:**
|
||||
- Гарантирует видимость изменений между потоками
|
||||
- Предотвращает кэширование значений в регистрах CPU
|
||||
- Обеспечивает happens-before relationship
|
||||
|
||||
**Зачем synchronized:**
|
||||
- Предотвращает одновременный reload из разных потоков
|
||||
- Гарантирует атомарность операции перезагрузки
|
||||
|
||||
---
|
||||
|
||||
## 🔧 ОСТАЛОСЬ (НИЗКИЙ ПРИОРИТЕТ)
|
||||
|
||||
### ПРОИЗВОДИТЕЛЬНОСТЬ: Фильтры
|
||||
- Рассмотреть Aho-Corasick алгоритм для поиска матных слов
|
||||
- Добавить метрики производительности
|
||||
|
||||
### БЕЗОПАСНОСТЬ: Discord rate limiting
|
||||
- Добавить локальный rate limiter
|
||||
|
||||
---
|
||||
|
||||
## ✅ ИТОГ
|
||||
|
||||
Все критичные баги исправлены. Плагин полностью готов к использованию.
|
||||
|
||||
**Выполнено:**
|
||||
- ✅ Исправлены утечки памяти (tasks, listeners, history)
|
||||
- ✅ Исправлены race conditions
|
||||
- ✅ Рефакторинг конфигов (BaseConfig, MessagesConfig, FiltersConfig, SoundsConfig, MuteConfig)
|
||||
- ✅ Очистка config.yml (300+ → 52 строки)
|
||||
- ✅ Thread-safety для ConfigManager (volatile + synchronized)
|
||||
- ✅ Баг с пробелом в табе
|
||||
- ✅ Рефакторинг главного класса (185 → 108 строк)
|
||||
- ✅ Чистка warnings и deprecated методов
|
||||
- ✅ Режим единого чата (опционально через local.enabled: false)
|
||||
|
||||
**Архитектура:**
|
||||
- SOLID принципы (ServiceRegistry, DI)
|
||||
- Чистый код (Single Responsibility)
|
||||
- Thread-safe reload
|
||||
- Минимальный главный класс
|
||||
|
||||
Проект собирается без ошибок и готов к продакшену.
|
||||
|
||||
---
|
||||
|
||||
## 📋 ПЛАН ИСПРАВЛЕНИЯ КРИТИЧНЫХ БАГОВ
|
||||
|
||||
### Фаза 1: Утечки памяти (СРОЧНО)
|
||||
1. **AutoMessageManager** - сохранять ссылку на task и отменять в `stop()`
|
||||
2. **LoChat.onDisable()** - добавить `HandlerList.unregisterAll(this)`
|
||||
3. **MuteHistoryManager** - ограничить размер истории (MAX 50 записей на игрока)
|
||||
|
||||
### Фаза 2: Race conditions
|
||||
4. **ChatEventListener** - проверить `DistanceUtil.isInRange()` на async-safety
|
||||
5. **ConfigManager** - использовать `volatile` для thread-safe reload
|
||||
|
||||
### Фаза 3: Компиляция
|
||||
6. **EnhancedChatRenderer** - исправить `appearanceCfg` → `cfg.getAppearanceConfig()`
|
||||
|
||||
---
|
||||
|
||||
## 📋 ПЛАН ИСПРАВЛЕНИЯ КОНФИГОВ
|
||||
|
||||
### Вариант 1: Всё в config.yml (РЕКОМЕНДУЕТСЯ)
|
||||
Объединить все настройки в один `config.yml` с секциями.
|
||||
|
||||
**Структура config.yml:**
|
||||
```yaml
|
||||
config-version: 5
|
||||
|
||||
# Базовые настройки
|
||||
chat:
|
||||
global:
|
||||
enabled: true
|
||||
cooldown: 3
|
||||
local:
|
||||
enabled: true
|
||||
radius: 100
|
||||
cooldown: 1
|
||||
pm:
|
||||
enabled: true
|
||||
sound: true
|
||||
|
||||
# Внешний вид чата
|
||||
chat-appearance:
|
||||
prefixes:
|
||||
global:
|
||||
emoji: "✦"
|
||||
text: "GLOBAL"
|
||||
colors:
|
||||
- "#B798A8"
|
||||
- "#7858E9"
|
||||
separator:
|
||||
text: " ▶ "
|
||||
color: "#9878C9"
|
||||
local:
|
||||
emoji: "◆"
|
||||
text: "LOCAL"
|
||||
colors:
|
||||
- "#9878C9"
|
||||
- "#7858E9"
|
||||
separator:
|
||||
text: " ▶ "
|
||||
color: "#8B6BD6"
|
||||
hover:
|
||||
enabled: true
|
||||
format:
|
||||
- "ẲE9▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬"
|
||||
- "&#B798A8✦ &f{player}"
|
||||
- ""
|
||||
- "⚖C9⏱ &fПинг: ẲE9{ping}ms"
|
||||
- "⚖C9♥ &fЗдоровье: ẲE9{health}/20"
|
||||
- "⚖C9🍖 &fГолод: ẲE9{food}/20"
|
||||
- ""
|
||||
- "ẲE9▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬"
|
||||
- "&#B798A8✦ &fНажми чтобы написать"
|
||||
emojis:
|
||||
":heart:": "❤"
|
||||
":star:": "★"
|
||||
":diamond:": "◆"
|
||||
|
||||
# Сообщения
|
||||
messages:
|
||||
mute:
|
||||
player-muted: "⚖C9Игрок ẲE9{player} ⚖C9замучен на ẲE9{time}"
|
||||
muted-message: "&#CF6679Вы замучены на ẲE9{time}\n&#B798A8Причина: &f{reason}"
|
||||
local-chat:
|
||||
nobody-heard: "⚖C9Вас никто не услышал"
|
||||
cooldown:
|
||||
message: "&#B798A8Подождите ẲE9{remaining} &#B798A8сек"
|
||||
|
||||
# RP команды
|
||||
rp:
|
||||
radius: 100
|
||||
cooldowns:
|
||||
me: 3
|
||||
try: 5
|
||||
do: 3
|
||||
roll: 2
|
||||
|
||||
# Градиенты
|
||||
gradient:
|
||||
enabled: true
|
||||
presets:
|
||||
fire: ["#FF4500", "#FF6347", "#FFD700"]
|
||||
ocean: ["#00CED1", "#1E90FF", "#4169E1"]
|
||||
```
|
||||
|
||||
**Файлы для изменения:**
|
||||
1. `src/main/resources/config.yml` - объединить все настройки
|
||||
2. `src/main/java/com/loki/lochat/config/ConfigManager.java` - убрать AppearanceConfig и HardcodedMessages
|
||||
3. `src/main/java/com/loki/lochat/renderer/EnhancedChatRenderer.java` - читать из ConfigManager напрямую
|
||||
4. Удалить `src/main/java/com/loki/lochat/config/AppearanceConfig.java`
|
||||
5. Удалить `src/main/java/com/loki/lochat/config/HardcodedMessages.java`
|
||||
6. Удалить все файлы из `src/main/resources/config/`
|
||||
|
||||
---
|
||||
|
||||
### Вариант 2: Отдельные файлы в корне resources
|
||||
Переместить конфиги в корень `resources/` и создавать их вручную.
|
||||
|
||||
**Структура:**
|
||||
```
|
||||
src/main/resources/
|
||||
├── config.yml # Основной конфиг
|
||||
├── chat-appearance.yml # Внешний вид
|
||||
├── messages.yml # Сообщения
|
||||
├── gradient-config.yml # Градиенты
|
||||
└── custom-commands.yml # Кастомные команды
|
||||
```
|
||||
|
||||
**Файлы для изменения:**
|
||||
1. Переместить все из `config/` в корень `resources/`
|
||||
2. `AppearanceConfig.java` - изменить путь с `config/chat-appearance.yml` на `chat-appearance.yml`
|
||||
3. `HardcodedMessages.java` - изменить путь с `config/hardcoded-messages.yml` на `messages.yml`
|
||||
4. Убрать создание папки `config/` в коде
|
||||
|
||||
---
|
||||
|
||||
## 🎯 РЕКОМЕНДАЦИЯ
|
||||
|
||||
**Использовать Вариант 1** - один большой `config.yml`:
|
||||
- ✅ Всё в одном месте
|
||||
- ✅ Гарантированно работает
|
||||
- ✅ Проще для пользователей
|
||||
- ✅ Меньше файлов
|
||||
- ✅ Только hex-цвета (&#FFD700)
|
||||
|
||||
---
|
||||
|
||||
## 📝 ЧЕКЛИСТ ВЫПОЛНЕНИЯ
|
||||
|
||||
### Шаг 1: Подготовка
|
||||
- [ ] Сохранить текущие настройки из всех конфигов
|
||||
- [ ] Создать бэкап проекта
|
||||
|
||||
### Шаг 2: Объединение конфигов
|
||||
- [ ] Скопировать все секции из `config/chat-appearance.yml` в `config.yml`
|
||||
- [ ] Скопировать все секции из `config/hardcoded-messages.yml` в `config.yml`
|
||||
- [ ] Заменить все `<red>`, `<bold>` на hex-цвета `&#FF0000`
|
||||
- [ ] Проверить отступы YAML
|
||||
|
||||
### Шаг 3: Изменение кода
|
||||
- [ ] `ConfigManager.java` - убрать `AppearanceConfig` и `HardcodedMessages`
|
||||
- [ ] `ConfigManager.java` - добавить методы для чтения всех настроек из `config.yml`
|
||||
- [ ] `EnhancedChatRenderer.java` - заменить `cfg.getAppearanceConfig()` на прямые вызовы
|
||||
- [ ] Удалить `AppearanceConfig.java`
|
||||
- [ ] Удалить `HardcodedMessages.java`
|
||||
|
||||
### Шаг 4: Очистка
|
||||
- [ ] Удалить папку `src/main/resources/config/`
|
||||
- [ ] Удалить неиспользуемые импорты
|
||||
|
||||
### Шаг 5: Тестирование
|
||||
- [ ] `./gradlew clean build -x test`
|
||||
- [ ] Проверить что jar собирается
|
||||
- [ ] Запустить на тестовом сервере
|
||||
- [ ] Проверить что `config.yml` создаётся
|
||||
- [ ] Проверить что все настройки работают
|
||||
|
||||
---
|
||||
|
||||
## 🔧 ТЕКУЩЕЕ СОСТОЯНИЕ
|
||||
|
||||
**Проблемные файлы:**
|
||||
- `src/main/java/com/loki/lochat/renderer/EnhancedChatRenderer.java` - ошибки компиляции
|
||||
- `src/main/java/com/loki/lochat/config/ConfigManager.java` - неполный рефакторинг
|
||||
|
||||
**Что работает:**
|
||||
- Базовые настройки чата
|
||||
- Градиенты
|
||||
- RP команды с кулдаунами
|
||||
|
||||
**Что НЕ работает:**
|
||||
- Файлы из `config/` не копируются на сервер
|
||||
- Префиксы чата (читаются из несуществующих файлов)
|
||||
- Hover подсказки
|
||||
- Эмодзи замены
|
||||
|
||||
---
|
||||
|
||||
## 📌 ВАЖНО
|
||||
|
||||
- Использовать ТОЛЬКО hex-цвета: `&#FFD700`
|
||||
- НЕ использовать MiniMessage: `<red>`, `<bold>`
|
||||
- Все настройки в `config.yml`
|
||||
- Простая и понятная структура
|
||||
|
|
|
|||
|
|
@ -1,90 +0,0 @@
|
|||
# ╔══════════════════════════════════════════════════════════════════════════════╗
|
||||
# ║ LoChat Auto Messages ║
|
||||
# ║ Автосообщения чата ║
|
||||
# ║ Версия: 1.5.5-1.20.1 ║
|
||||
# ╚══════════════════════════════════════════════════════════════════════════════╝
|
||||
|
||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
# │ НАСТРОЙКИ │
|
||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
||||
|
||||
settings:
|
||||
# Префикс автосообщений
|
||||
prefix: "<gradient:#00D4FF:#0099CC>[INFO]</gradient>"
|
||||
|
||||
# Режим отправки: sequential (по порядку), random (случайно), custom (свой порядок)
|
||||
mode: "sequential"
|
||||
|
||||
# Свой порядок сообщений (только для режима custom)
|
||||
# Можно указывать номера или названия сообщений
|
||||
order: "welcome, rules, discord, website"
|
||||
|
||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
# │ СООБЩЕНИЯ │
|
||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
||||
|
||||
messages:
|
||||
# Приветственное сообщение
|
||||
welcome:
|
||||
- "<gradient:#FFD700:#FFA500>Добро пожаловать на наш сервер!</gradient>"
|
||||
- "<gray>Используйте</gray> <gradient:#87CEEB:#4682B4>/help</gradient> <gray>для получения помощи</gray>"
|
||||
|
||||
# Правила сервера
|
||||
rules:
|
||||
- "<gradient:#FF6B6B:#FF4757>Соблюдайте правила сервера!</gradient>"
|
||||
- "<gray>Подробнее:</gray> <gradient:#87CEEB:#4682B4>/rules</gradient>"
|
||||
|
||||
# Информация о Discord
|
||||
discord:
|
||||
- "<gradient:#7289DA:#5865F2>Присоединяйтесь к нашему Discord!</gradient>"
|
||||
- "<gray>Ссылка:</gray> <click:open_url:'https://discord.gg/example'><gradient:#87CEEB:#4682B4>discord.gg/example</gradient></click>"
|
||||
|
||||
# Веб-сайт
|
||||
website:
|
||||
- "<gradient:#00FF88:#00CC66>Посетите наш сайт!</gradient>"
|
||||
- "<gray>Адрес:</gray> <click:open_url:'https://example.com'><gradient:#87CEEB:#4682B4>example.com</gradient></click>"
|
||||
|
||||
# Донат информация
|
||||
donate:
|
||||
- "<gradient:#FFD700:#FFA500>Поддержите сервер!</gradient>"
|
||||
- "<gray>Донат:</gray> <click:open_url:'https://donate.example.com'><gradient:#87CEEB:#4682B4>donate.example.com</gradient></click>"
|
||||
|
||||
# Градиентные ники
|
||||
gradients:
|
||||
- "<gradient:#9370DB:#8A2BE2>Создайте красивый ник!</gradient>"
|
||||
- "<gray>Команда:</gray> <gradient:#87CEEB:#4682B4>/color</gradient> <gray>для градиентов</gray>"
|
||||
|
||||
# Чат команды
|
||||
chat-commands:
|
||||
- "<gradient:#FFA726:#FF9800>Полезные команды чата:</gradient>"
|
||||
- "<gradient:#87CEEB:#4682B4>/msg <игрок> <сообщение></gradient> <gray>- личное сообщение</gray>"
|
||||
- "<gradient:#87CEEB:#4682B4>/ignore <игрок></gradient> <gray>- игнорировать игрока</gray>"
|
||||
|
||||
# Онлайн статистика
|
||||
online-stats:
|
||||
- "<gradient:#6BCB77:#4ECDC4>Сейчас онлайн: {online} игроков</gradient>"
|
||||
- "<gray>Максимум за день:</gray> <white>{max_online}</white>"
|
||||
|
||||
# Время на сервере
|
||||
server-time:
|
||||
- "<gradient:#87CEEB:#4682B4>Время на сервере:</gradient> <white>{time}</white>"
|
||||
- "<gray>Дата:</gray> <white>{date}</white>"
|
||||
|
||||
# События
|
||||
events:
|
||||
- "<gradient:#FF69B4:#FF1493>Следите за событиями!</gradient>"
|
||||
- "<gray>Расписание:</gray> <gradient:#87CEEB:#4682B4>/events</gradient>"
|
||||
|
||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
# │ ПЛЕЙСХОЛДЕРЫ │
|
||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
||||
|
||||
# Доступные плейсхолдеры в сообщениях:
|
||||
# {online} - количество игроков онлайн
|
||||
# {max_online} - максимальное количество игроков (из server.properties)
|
||||
# {time} - текущее время
|
||||
# {date} - текущая дата
|
||||
# {server_name} - название сервера
|
||||
# {tps} - TPS сервера (если доступно)
|
||||
#
|
||||
# Также поддерживаются все плейсхолдеры PlaceholderAPI
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
formats:
|
||||
global: "<gray>[G]</gray> {prefix}{name}<gray>:</gray> <white>{message}"
|
||||
local: "{prefix}{name}<gray>:</gray> <white>{message}"
|
||||
Binary file not shown.
BIN
bin/main/com/loki/lochat/api/filter/MessageFilter.class
Normal file
BIN
bin/main/com/loki/lochat/api/filter/MessageFilter.class
Normal file
Binary file not shown.
BIN
bin/main/com/loki/lochat/api/service/ChatService.class
Normal file
BIN
bin/main/com/loki/lochat/api/service/ChatService.class
Normal file
Binary file not shown.
BIN
bin/main/com/loki/lochat/api/service/CooldownService.class
Normal file
BIN
bin/main/com/loki/lochat/api/service/CooldownService.class
Normal file
Binary file not shown.
BIN
bin/main/com/loki/lochat/api/service/IgnoreService.class
Normal file
BIN
bin/main/com/loki/lochat/api/service/IgnoreService.class
Normal file
Binary file not shown.
BIN
bin/main/com/loki/lochat/api/service/MentionService.class
Normal file
BIN
bin/main/com/loki/lochat/api/service/MentionService.class
Normal file
Binary file not shown.
BIN
bin/main/com/loki/lochat/api/service/MessageService.class
Normal file
BIN
bin/main/com/loki/lochat/api/service/MessageService.class
Normal file
Binary file not shown.
BIN
bin/main/com/loki/lochat/api/service/MuteService.class
Normal file
BIN
bin/main/com/loki/lochat/api/service/MuteService.class
Normal file
Binary file not shown.
BIN
bin/main/com/loki/lochat/api/service/NickService.class
Normal file
BIN
bin/main/com/loki/lochat/api/service/NickService.class
Normal file
Binary file not shown.
BIN
bin/main/com/loki/lochat/api/service/PMService.class
Normal file
BIN
bin/main/com/loki/lochat/api/service/PMService.class
Normal file
Binary file not shown.
BIN
bin/main/com/loki/lochat/api/service/PlayerDataService.class
Normal file
BIN
bin/main/com/loki/lochat/api/service/PlayerDataService.class
Normal file
Binary file not shown.
BIN
bin/main/com/loki/lochat/api/service/SpyService.class
Normal file
BIN
bin/main/com/loki/lochat/api/service/SpyService.class
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
bin/main/com/loki/lochat/commands/CommandManager.class
Normal file
BIN
bin/main/com/loki/lochat/commands/CommandManager.class
Normal file
Binary file not shown.
Binary file not shown.
BIN
bin/main/com/loki/lochat/commands/CustomCommandsCommand.class
Normal file
BIN
bin/main/com/loki/lochat/commands/CustomCommandsCommand.class
Normal file
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.
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.
Binary file not shown.
BIN
bin/main/com/loki/lochat/commands/admin/ChatSpyCommand.class
Normal file
BIN
bin/main/com/loki/lochat/commands/admin/ChatSpyCommand.class
Normal file
Binary file not shown.
BIN
bin/main/com/loki/lochat/commands/admin/ClearChatCommand.class
Normal file
BIN
bin/main/com/loki/lochat/commands/admin/ClearChatCommand.class
Normal file
Binary file not shown.
Binary file not shown.
BIN
bin/main/com/loki/lochat/commands/admin/DiscordCommand.class
Normal file
BIN
bin/main/com/loki/lochat/commands/admin/DiscordCommand.class
Normal file
Binary file not shown.
BIN
bin/main/com/loki/lochat/commands/admin/HubCommand.class
Normal file
BIN
bin/main/com/loki/lochat/commands/admin/HubCommand.class
Normal file
Binary file not shown.
BIN
bin/main/com/loki/lochat/commands/admin/LoChatCommand.class
Normal file
BIN
bin/main/com/loki/lochat/commands/admin/LoChatCommand.class
Normal file
Binary file not shown.
Binary file not shown.
BIN
bin/main/com/loki/lochat/commands/base/AdminCommand.class
Normal file
BIN
bin/main/com/loki/lochat/commands/base/AdminCommand.class
Normal file
Binary file not shown.
BIN
bin/main/com/loki/lochat/commands/base/BaseCommand.class
Normal file
BIN
bin/main/com/loki/lochat/commands/base/BaseCommand.class
Normal file
Binary file not shown.
BIN
bin/main/com/loki/lochat/commands/base/PlayerCommand.class
Normal file
BIN
bin/main/com/loki/lochat/commands/base/PlayerCommand.class
Normal file
Binary file not shown.
BIN
bin/main/com/loki/lochat/commands/chat/GlobalChatCommand.class
Normal file
BIN
bin/main/com/loki/lochat/commands/chat/GlobalChatCommand.class
Normal file
Binary file not shown.
BIN
bin/main/com/loki/lochat/commands/chat/LocalChatCommand.class
Normal file
BIN
bin/main/com/loki/lochat/commands/chat/LocalChatCommand.class
Normal file
Binary file not shown.
BIN
bin/main/com/loki/lochat/commands/messaging/IgnoreCommand.class
Normal file
BIN
bin/main/com/loki/lochat/commands/messaging/IgnoreCommand.class
Normal file
Binary file not shown.
Binary file not shown.
BIN
bin/main/com/loki/lochat/commands/messaging/MsgCommand.class
Normal file
BIN
bin/main/com/loki/lochat/commands/messaging/MsgCommand.class
Normal file
Binary file not shown.
BIN
bin/main/com/loki/lochat/commands/messaging/ReplyCommand.class
Normal file
BIN
bin/main/com/loki/lochat/commands/messaging/ReplyCommand.class
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
bin/main/com/loki/lochat/commands/moderation/MuteCommand.class
Normal file
BIN
bin/main/com/loki/lochat/commands/moderation/MuteCommand.class
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
bin/main/com/loki/lochat/commands/moderation/UnmuteCommand.class
Normal file
BIN
bin/main/com/loki/lochat/commands/moderation/UnmuteCommand.class
Normal file
Binary file not shown.
BIN
bin/main/com/loki/lochat/commands/nick/NickCommand.class
Normal file
BIN
bin/main/com/loki/lochat/commands/nick/NickCommand.class
Normal file
Binary file not shown.
BIN
bin/main/com/loki/lochat/commands/nick/PlayerInfoCommand.class
Normal file
BIN
bin/main/com/loki/lochat/commands/nick/PlayerInfoCommand.class
Normal file
Binary file not shown.
BIN
bin/main/com/loki/lochat/commands/rp/DoCommand.class
Normal file
BIN
bin/main/com/loki/lochat/commands/rp/DoCommand.class
Normal file
Binary file not shown.
BIN
bin/main/com/loki/lochat/commands/rp/MeCommand.class
Normal file
BIN
bin/main/com/loki/lochat/commands/rp/MeCommand.class
Normal file
Binary file not shown.
BIN
bin/main/com/loki/lochat/commands/rp/RollCommand.class
Normal file
BIN
bin/main/com/loki/lochat/commands/rp/RollCommand.class
Normal file
Binary file not shown.
BIN
bin/main/com/loki/lochat/commands/rp/RpUtil.class
Normal file
BIN
bin/main/com/loki/lochat/commands/rp/RpUtil.class
Normal file
Binary file not shown.
BIN
bin/main/com/loki/lochat/commands/rp/TryCommand.class
Normal file
BIN
bin/main/com/loki/lochat/commands/rp/TryCommand.class
Normal file
Binary file not shown.
BIN
bin/main/com/loki/lochat/config/AppearanceConfig.class
Normal file
BIN
bin/main/com/loki/lochat/config/AppearanceConfig.class
Normal file
Binary file not shown.
BIN
bin/main/com/loki/lochat/config/BaseConfig.class
Normal file
BIN
bin/main/com/loki/lochat/config/BaseConfig.class
Normal file
Binary file not shown.
Binary file not shown.
BIN
bin/main/com/loki/lochat/config/FiltersConfig.class
Normal file
BIN
bin/main/com/loki/lochat/config/FiltersConfig.class
Normal file
Binary file not shown.
Binary file not shown.
BIN
bin/main/com/loki/lochat/config/MessagesConfig.class
Normal file
BIN
bin/main/com/loki/lochat/config/MessagesConfig.class
Normal file
Binary file not shown.
BIN
bin/main/com/loki/lochat/config/MuteConfig.class
Normal file
BIN
bin/main/com/loki/lochat/config/MuteConfig.class
Normal file
Binary file not shown.
BIN
bin/main/com/loki/lochat/config/SoundsConfig.class
Normal file
BIN
bin/main/com/loki/lochat/config/SoundsConfig.class
Normal file
Binary file not shown.
BIN
bin/main/com/loki/lochat/core/PluginInitializer.class
Normal file
BIN
bin/main/com/loki/lochat/core/PluginInitializer.class
Normal file
Binary file not shown.
BIN
bin/main/com/loki/lochat/core/PluginShutdown.class
Normal file
BIN
bin/main/com/loki/lochat/core/PluginShutdown.class
Normal file
Binary file not shown.
Binary file not shown.
BIN
bin/main/com/loki/lochat/core/filter/AdvancedMessageFilter.class
Normal file
BIN
bin/main/com/loki/lochat/core/filter/AdvancedMessageFilter.class
Normal file
Binary file not shown.
BIN
bin/main/com/loki/lochat/core/filter/CapsFilter.class
Normal file
BIN
bin/main/com/loki/lochat/core/filter/CapsFilter.class
Normal file
Binary file not shown.
BIN
bin/main/com/loki/lochat/core/filter/CooldownFilter.class
Normal file
BIN
bin/main/com/loki/lochat/core/filter/CooldownFilter.class
Normal file
Binary file not shown.
BIN
bin/main/com/loki/lochat/core/filter/MuteFilter.class
Normal file
BIN
bin/main/com/loki/lochat/core/filter/MuteFilter.class
Normal file
Binary file not shown.
BIN
bin/main/com/loki/lochat/core/registry/ServiceRegistry.class
Normal file
BIN
bin/main/com/loki/lochat/core/registry/ServiceRegistry.class
Normal file
Binary file not shown.
BIN
bin/main/com/loki/lochat/core/service/ChatServiceImpl.class
Normal file
BIN
bin/main/com/loki/lochat/core/service/ChatServiceImpl.class
Normal file
Binary file not shown.
BIN
bin/main/com/loki/lochat/core/service/CooldownServiceImpl.class
Normal file
BIN
bin/main/com/loki/lochat/core/service/CooldownServiceImpl.class
Normal file
Binary file not shown.
BIN
bin/main/com/loki/lochat/core/service/IgnoreServiceImpl.class
Normal file
BIN
bin/main/com/loki/lochat/core/service/IgnoreServiceImpl.class
Normal file
Binary file not shown.
BIN
bin/main/com/loki/lochat/core/service/MentionServiceImpl.class
Normal file
BIN
bin/main/com/loki/lochat/core/service/MentionServiceImpl.class
Normal file
Binary file not shown.
BIN
bin/main/com/loki/lochat/core/service/MessageServiceImpl.class
Normal file
BIN
bin/main/com/loki/lochat/core/service/MessageServiceImpl.class
Normal file
Binary file not shown.
BIN
bin/main/com/loki/lochat/core/service/MuteHistoryManager$1.class
Normal file
BIN
bin/main/com/loki/lochat/core/service/MuteHistoryManager$1.class
Normal file
Binary file not shown.
BIN
bin/main/com/loki/lochat/core/service/MuteHistoryManager.class
Normal file
BIN
bin/main/com/loki/lochat/core/service/MuteHistoryManager.class
Normal file
Binary file not shown.
BIN
bin/main/com/loki/lochat/core/service/MuteServiceImpl$1.class
Normal file
BIN
bin/main/com/loki/lochat/core/service/MuteServiceImpl$1.class
Normal file
Binary file not shown.
BIN
bin/main/com/loki/lochat/core/service/MuteServiceImpl.class
Normal file
BIN
bin/main/com/loki/lochat/core/service/MuteServiceImpl.class
Normal file
Binary file not shown.
BIN
bin/main/com/loki/lochat/core/service/NickServiceImpl.class
Normal file
BIN
bin/main/com/loki/lochat/core/service/NickServiceImpl.class
Normal file
Binary file not shown.
BIN
bin/main/com/loki/lochat/core/service/PMServiceImpl.class
Normal file
BIN
bin/main/com/loki/lochat/core/service/PMServiceImpl.class
Normal file
Binary file not shown.
Binary file not shown.
BIN
bin/main/com/loki/lochat/core/service/SpyServiceImpl.class
Normal file
BIN
bin/main/com/loki/lochat/core/service/SpyServiceImpl.class
Normal file
Binary file not shown.
BIN
bin/main/com/loki/lochat/data/model/ChatMessage.class
Normal file
BIN
bin/main/com/loki/lochat/data/model/ChatMessage.class
Normal file
Binary file not shown.
Binary file not shown.
BIN
bin/main/com/loki/lochat/data/model/MuteData.class
Normal file
BIN
bin/main/com/loki/lochat/data/model/MuteData.class
Normal file
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue