refactor: Remove emoji system and chat filters, implement SOLID architecture
This commit is contained in:
parent
16a5e09118
commit
74482851aa
72 changed files with 2654 additions and 1287 deletions
365
REFACTORING_PLAN.md
Normal file
365
REFACTORING_PLAN.md
Normal file
|
|
@ -0,0 +1,365 @@
|
|||
# План рефакторинга LoChat
|
||||
|
||||
## Цель
|
||||
Убрать legacy код, перевести всё на новую архитектуру (SOLID + DI через ServiceRegistry)
|
||||
|
||||
---
|
||||
|
||||
## Текущая структура
|
||||
|
||||
### ✅ Новая архитектура (уже готово)
|
||||
```
|
||||
src/main/java/com/loki/lochat/
|
||||
├── api/ # Интерфейсы сервисов
|
||||
│ ├── service/
|
||||
│ │ ├── ChatService.java
|
||||
│ │ ├── MuteService.java
|
||||
│ │ ├── AntiSpamService.java
|
||||
│ │ ├── CooldownService.java
|
||||
│ │ ├── MessageService.java
|
||||
│ │ └── PlayerDataService.java
|
||||
│ └── filter/
|
||||
│ └── MessageFilter.java
|
||||
├── core/ # Реализации
|
||||
│ ├── service/
|
||||
│ │ ├── ChatServiceImpl.java
|
||||
│ │ ├── MuteServiceImpl.java
|
||||
│ │ ├── AntiSpamServiceImpl.java
|
||||
│ │ ├── CooldownServiceImpl.java
|
||||
│ │ ├── MessageServiceImpl.java
|
||||
│ │ └── PlayerDataServiceImpl.java
|
||||
│ ├── filter/
|
||||
│ │ ├── MuteFilter.java
|
||||
│ │ ├── CooldownFilter.java
|
||||
│ │ ├── SpamFilter.java
|
||||
│ │ └── WordFilter.java
|
||||
│ └── registry/
|
||||
│ └── ServiceRegistry.java
|
||||
└── listener/ # Новые слушатели
|
||||
├── ChatEventListener.java (35 строк)
|
||||
└── PlayerEventListener.java (23 строки)
|
||||
```
|
||||
|
||||
### ❌ Legacy код (нужно удалить/переписать)
|
||||
```
|
||||
src/main/java/com/loki/lochat/
|
||||
├── managers/ # Старые менеджеры
|
||||
│ ├── MuteManager.java (409 строк) ❌
|
||||
│ ├── ChatManager.java (131 строк) ❌
|
||||
│ ├── AntiSpamManager.java ❌
|
||||
│ ├── CooldownManager.java ❌
|
||||
│ ├── PMManager.java ❌
|
||||
│ ├── IgnoreManager.java ❌
|
||||
│ ├── SpyManager.java ❌
|
||||
│ ├── MentionManager.java (123 строки) ❌
|
||||
│ ├── AutoMessageManager.java (159 строк) ⚠️
|
||||
│ └── CustomCommandManager.java (269 строк) ⚠️
|
||||
└── listeners/
|
||||
└── ChatListener.java (185 строк) ❌
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Этап 1: Анализ зависимостей
|
||||
|
||||
### 1.1 Проверить что использует legacy менеджеры
|
||||
```bash
|
||||
# Найти все вызовы getMuteManager(), getChatManager() и т.д.
|
||||
grep -r "getMuteManager\|getChatManager\|getAntiSpamManager" src/main/java/com/loki/lochat/commands/
|
||||
```
|
||||
|
||||
### 1.2 Составить список команд для миграции
|
||||
- [x] ChatEventListener - уже использует ServiceRegistry
|
||||
- [ ] MuteCommand - использует MuteManager
|
||||
- [ ] UnmuteCommand - использует MuteManager
|
||||
- [ ] MuteListCommand - использует MuteManager
|
||||
- [ ] MuteHistoryCommand - использует MuteManager
|
||||
- [ ] MuteBlameCommand - использует MuteManager
|
||||
- [ ] GlobalChatCommand - использует ChatManager
|
||||
- [ ] LocalChatCommand - использует ChatManager
|
||||
- [ ] MsgCommand - использует PMManager, IgnoreManager
|
||||
- [ ] ReplyCommand - использует PMManager, IgnoreManager
|
||||
- [ ] IgnoreCommand - использует IgnoreManager
|
||||
- [ ] UnignoreCommand - использует IgnoreManager
|
||||
- [ ] ChatSpyCommand - использует SpyManager
|
||||
|
||||
---
|
||||
|
||||
## Этап 2: Создание новых сервисов
|
||||
|
||||
### 2.1 PMService (личные сообщения)
|
||||
```java
|
||||
// api/service/PMService.java
|
||||
public interface PMService {
|
||||
void sendPrivateMessage(Player sender, Player receiver, String message);
|
||||
Optional<UUID> getLastConversation(UUID player);
|
||||
void setLastConversation(UUID player, UUID target);
|
||||
}
|
||||
|
||||
// core/service/PMServiceImpl.java
|
||||
public class PMServiceImpl implements PMService {
|
||||
private final Map<UUID, UUID> conversations = new ConcurrentHashMap<>();
|
||||
// ...
|
||||
}
|
||||
```
|
||||
|
||||
### 2.2 IgnoreService (игнорирование)
|
||||
```java
|
||||
// api/service/IgnoreService.java
|
||||
public interface IgnoreService {
|
||||
boolean isIgnoring(UUID player, UUID target);
|
||||
void addIgnore(UUID player, UUID target);
|
||||
void removeIgnore(UUID player, UUID target);
|
||||
int getIgnoredCount(UUID player);
|
||||
}
|
||||
|
||||
// core/service/IgnoreServiceImpl.java
|
||||
public class IgnoreServiceImpl implements IgnoreService {
|
||||
private final Map<UUID, Set<UUID>> ignoreMap = new ConcurrentHashMap<>();
|
||||
// ...
|
||||
}
|
||||
```
|
||||
|
||||
### 2.3 SpyService (шпионаж за чатом)
|
||||
```java
|
||||
// api/service/SpyService.java
|
||||
public interface SpyService {
|
||||
boolean toggleSpy(UUID player);
|
||||
boolean isSpying(UUID player);
|
||||
void sendToSpies(Player sender, Object message, boolean isGlobal);
|
||||
}
|
||||
|
||||
// core/service/SpyServiceImpl.java
|
||||
public class SpyServiceImpl implements SpyService {
|
||||
private final Set<UUID> spies = ConcurrentHashMap.newKeySet();
|
||||
// ...
|
||||
}
|
||||
```
|
||||
|
||||
### 2.4 MentionService (упоминания)
|
||||
```java
|
||||
// api/service/MentionService.java
|
||||
public interface MentionService {
|
||||
String processMentions(String message, Set<Player> mentioned);
|
||||
void notifyMentioned(Set<Player> players);
|
||||
}
|
||||
|
||||
// core/service/MentionServiceImpl.java
|
||||
public class MentionServiceImpl implements MentionService {
|
||||
// ...
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Этап 3: Миграция команд
|
||||
|
||||
### 3.1 Mute команды
|
||||
**Приоритет: ВЫСОКИЙ** (используют MuteManager 409 строк)
|
||||
|
||||
```java
|
||||
// Было:
|
||||
public class MuteCommand {
|
||||
private final LoChat plugin;
|
||||
// plugin.getMuteManager().mute(...)
|
||||
}
|
||||
|
||||
// Станет:
|
||||
public class MuteCommand {
|
||||
private final MuteService muteService;
|
||||
|
||||
public MuteCommand(LoChat plugin) {
|
||||
this.muteService = plugin.getServiceRegistry().get(MuteService.class);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**Файлы для миграции:**
|
||||
- [ ] MuteCommand.java
|
||||
- [ ] UnmuteCommand.java
|
||||
- [ ] MuteListCommand.java
|
||||
- [ ] MuteHistoryCommand.java
|
||||
- [ ] MuteBlameCommand.java
|
||||
|
||||
### 3.2 Chat команды
|
||||
**Приоритет: ВЫСОКИЙ**
|
||||
|
||||
```java
|
||||
// Было:
|
||||
plugin.getChatManager().sendGlobalMessage(...)
|
||||
|
||||
// Станет:
|
||||
ChatService chatService = plugin.getServiceRegistry().get(ChatService.class);
|
||||
chatService.sendGlobalMessage(...)
|
||||
```
|
||||
|
||||
**Файлы для миграции:**
|
||||
- [ ] GlobalChatCommand.java
|
||||
- [ ] LocalChatCommand.java
|
||||
|
||||
### 3.3 PM команды
|
||||
**Приоритет: СРЕДНИЙ**
|
||||
|
||||
**Файлы для миграции:**
|
||||
- [ ] MsgCommand.java
|
||||
- [ ] ReplyCommand.java
|
||||
|
||||
### 3.4 Ignore команды
|
||||
**Приоритет: СРЕДНИЙ**
|
||||
|
||||
**Файлы для миграции:**
|
||||
- [ ] IgnoreCommand.java
|
||||
- [ ] UnignoreCommand.java
|
||||
|
||||
### 3.5 Spy команды
|
||||
**Приоритет: НИЗКИЙ**
|
||||
|
||||
**Файлы для миграции:**
|
||||
- [ ] ChatSpyCommand.java
|
||||
|
||||
---
|
||||
|
||||
## Этап 4: Удаление legacy кода
|
||||
|
||||
### 4.1 Удалить старые менеджеры
|
||||
После миграции всех команд:
|
||||
```bash
|
||||
rm src/main/java/com/loki/lochat/managers/MuteManager.java
|
||||
rm src/main/java/com/loki/lochat/managers/ChatManager.java
|
||||
rm src/main/java/com/loki/lochat/managers/AntiSpamManager.java
|
||||
rm src/main/java/com/loki/lochat/managers/CooldownManager.java
|
||||
rm src/main/java/com/loki/lochat/managers/PMManager.java
|
||||
rm src/main/java/com/loki/lochat/managers/IgnoreManager.java
|
||||
rm src/main/java/com/loki/lochat/managers/SpyManager.java
|
||||
rm src/main/java/com/loki/lochat/managers/MentionManager.java
|
||||
```
|
||||
|
||||
### 4.2 Удалить старый ChatListener
|
||||
```bash
|
||||
rm src/main/java/com/loki/lochat/listeners/ChatListener.java
|
||||
```
|
||||
|
||||
### 4.3 Очистить LoChat.java
|
||||
Удалить все legacy геттеры:
|
||||
```java
|
||||
// Удалить:
|
||||
public PMManager getPmManager() { return pmManager; }
|
||||
public IgnoreManager getIgnoreManager() { return ignoreManager; }
|
||||
public SpyManager getSpyManager() { return spyManager; }
|
||||
public MuteManager getMuteManager() { return muteManager; }
|
||||
public ChatManager getChatManager() { return chatManager; }
|
||||
public AntiSpamManager getAntiSpamManager() { return antiSpamManager; }
|
||||
public CooldownManager getCooldownManager() { return cooldownManager; }
|
||||
public MentionManager getMentionManager() { return mentionManager; }
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Этап 5: Оптимизация больших классов
|
||||
|
||||
### 5.1 ConfigManager (270 строк)
|
||||
**Проблема:** Слишком много методов
|
||||
|
||||
**Решение:** Разбить на категории
|
||||
```java
|
||||
// config/ChatConfig.java - настройки чата
|
||||
// config/MuteConfig.java - настройки мутов
|
||||
// config/SpamConfig.java - настройки антиспама
|
||||
```
|
||||
|
||||
### 5.2 CustomCommandManager (269 строк)
|
||||
**Проблема:** Много логики в одном классе
|
||||
|
||||
**Решение:** Вынести парсинг команд
|
||||
```java
|
||||
// commands/custom/CustomCommandParser.java
|
||||
// commands/custom/CustomCommandExecutor.java
|
||||
```
|
||||
|
||||
### 5.3 GradientModule (249 строк)
|
||||
**Статус:** Оставить как есть (это отдельный модуль)
|
||||
|
||||
### 5.4 AutoMessageManager (159 строк)
|
||||
**Статус:** Оставить как есть (нормальный размер)
|
||||
|
||||
---
|
||||
|
||||
## Этап 6: Тестирование
|
||||
|
||||
### 6.1 Написать тесты для новых сервисов
|
||||
```java
|
||||
// test/java/com/loki/lochat/core/service/
|
||||
├── PMServiceImplTest.java
|
||||
├── IgnoreServiceImplTest.java
|
||||
├── SpyServiceImplTest.java
|
||||
└── MentionServiceImplTest.java
|
||||
```
|
||||
|
||||
### 6.2 Интеграционные тесты
|
||||
```java
|
||||
// test/java/com/loki/lochat/integration/
|
||||
└── ChatFlowTest.java - тест полного флоу отправки сообщения
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Этап 7: Финальная проверка
|
||||
|
||||
### 7.1 Проверить размеры классов
|
||||
```bash
|
||||
# Все классы должны быть < 150 строк (кроме модулей)
|
||||
find src/main/java -name "*.java" -exec wc -l {} \; | sort -rn | head -20
|
||||
```
|
||||
|
||||
### 7.2 Проверить архитектуру
|
||||
- [ ] Все сервисы через интерфейсы
|
||||
- [ ] Все зависимости через ServiceRegistry
|
||||
- [ ] Нет прямых вызовов new Service()
|
||||
- [ ] Все команды используют DI
|
||||
|
||||
### 7.3 Проверить производительность
|
||||
- [ ] Нет утечек памяти
|
||||
- [ ] Нет блокирующих операций в главном потоке
|
||||
- [ ] Folia совместимость
|
||||
|
||||
---
|
||||
|
||||
## Метрики успеха
|
||||
|
||||
### До рефакторинга
|
||||
- Главный класс: 166 строк
|
||||
- Legacy менеджеры: 8 классов, ~1500 строк
|
||||
- Старый ChatListener: 185 строк
|
||||
- Дублирование кода: высокое
|
||||
- Тестовое покрытие: 52 теста
|
||||
|
||||
### После рефакторинга (цель)
|
||||
- Главный класс: <100 строк
|
||||
- Новые сервисы: 8 интерфейсов + 8 реализаций, ~800 строк
|
||||
- Новые слушатели: 2 класса, ~60 строк
|
||||
- Дублирование кода: минимальное
|
||||
- Тестовое покрытие: >80 тестов
|
||||
- Все классы: <150 строк
|
||||
|
||||
---
|
||||
|
||||
## Порядок выполнения
|
||||
|
||||
1. ✅ Создать новую архитектуру (api + core + registry)
|
||||
2. ✅ Мигрировать ChatEventListener
|
||||
3. ✅ Удалить эмодзи
|
||||
4. **→ Создать PMService, IgnoreService, SpyService, MentionService**
|
||||
5. **→ Мигрировать все команды на новые сервисы**
|
||||
6. **→ Удалить legacy менеджеры**
|
||||
7. **→ Оптимизировать большие классы**
|
||||
8. **→ Написать тесты**
|
||||
9. **→ Финальная проверка**
|
||||
|
||||
---
|
||||
|
||||
## Примечания
|
||||
|
||||
- Миграция должна быть постепенной (по одной команде)
|
||||
- После каждого шага - компиляция и тесты
|
||||
- Сохранять обратную совместимость до полной миграции
|
||||
- Документировать изменения в CHANGELOG.md
|
||||
Loading…
Add table
Add a link
Reference in a new issue