diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
index 059c450..3f5b4e5 100644
--- a/.github/ISSUE_TEMPLATE/bug_report.md
+++ b/.github/ISSUE_TEMPLATE/bug_report.md
@@ -1,47 +1,54 @@
---
-name: Сообщение об ошибке
-about: Создайте отчет об ошибке, чтобы помочь нам улучшить плагин
+name: Bug Report / Сообщение об ошибке
+about: Report a bug to help us improve / Сообщите об ошибке чтобы помочь нам
title: '[BUG] '
labels: bug
assignees: ''
---
-## Описание ошибки
-Четкое и краткое описание того, что произошло.
+## Description | Описание
-## Шаги для воспроизведения
-1. Перейти к '...'
-2. Выполнить команду '...'
-3. Увидеть ошибку
+### English
+Clear and concise description of the bug.
-## Ожидаемое поведение
-Четкое и краткое описание того, что вы ожидали увидеть.
+### Русский
+Четкое и краткое описание ошибки.
-## Скриншоты
-Если применимо, добавьте скриншоты для объяснения проблемы.
+---
-## Информация о сервере
-- Версия Minecraft: [например, 1.21.1]
-- Версия сервера: [например, Paper 1.21.1-116]
-- Версия плагина: [например, 1.5.5]
-- Версия Java: [например, Java 21]
+## Steps to Reproduce | Шаги для воспроизведения
-## Установленные плагины
-Список других плагинов на сервере (особенно те, которые могут взаимодействовать с чатом):
-- PlaceholderAPI
-- LuckPerms
-- ...
+1. Go to / Перейти к '...'
+2. Run command / Выполнить команду '...'
+3. See error / Увидеть ошибку
+
+## Expected Behavior | Ожидаемое поведение
+
+## Actual Behavior | Фактическое поведение
+
+## Screenshots | Скриншоты
+
+## Server Info | Информация о сервере
+
+- Minecraft version:
+- Server version (Paper/Folia):
+- Plugin version:
+- Java version:
+
+## Installed Plugins | Установленные плагины
+
+PlaceholderAPI, LuckPerms, etc.
+
+## Logs | Логи
-## Логи
```
-Вставьте сюда релевантные логи из console или latest.log
+Paste relevant logs here
```
-## Конфигурация
-Если проблема связана с конфигурацией, вставьте релевантные части:
+## Configuration | Конфигурация
+
```yaml
-# config.yml или другой конфиг
+# Relevant config sections
```
-## Дополнительный контекст
-Любая другая информация о проблеме.
+## Additional Context | Дополнительный контекст
diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md
index a6f6126..eb59b34 100644
--- a/.github/ISSUE_TEMPLATE/feature_request.md
+++ b/.github/ISSUE_TEMPLATE/feature_request.md
@@ -1,49 +1,55 @@
---
-name: Запрос новой функции
-about: Предложите идею для этого проекта
+name: Feature Request / Запрос функции
+about: Suggest an idea for this project / Предложите идею для проекта
title: '[FEATURE] '
labels: enhancement
assignees: ''
---
-## Описание функции
-Четкое и краткое описание того, что вы хотите добавить.
+## Description | Описание
-## Проблема, которую это решает
-Опишите проблему, которую решает эта функция. Например: "Я всегда расстраиваюсь, когда [...]"
+### English
+Clear and concise description of the feature.
-## Предлагаемое решение
-Четкое и краткое описание того, что вы хотите видеть.
+### Русский
+Четкое и краткое описание функции.
-## Альтернативы
-Четкое и краткое описание любых альтернативных решений или функций, которые вы рассматривали.
+---
-## Примеры использования
-Как бы вы использовали эту функцию? Приведите примеры команд, конфигурации и т.д.
+## Problem | Проблема
+
+### English
+Describe the problem this solves.
+
+### Русский
+Опишите проблему, которую решает эта функция.
+
+## Proposed Solution | Предлагаемое решение
+
+## Alternatives | Альтернативы
+
+## Usage Examples | Примеры использования
```yaml
-# Пример конфигурации
-new-feature:
- enabled: true
- option: value
+# Example config
```
```
-# Пример команды
-/newcommand <аргумент>
+# Example command
```
-## Приоритет
-- [ ] Критично - без этого плагин не работает должным образом
-- [ ] Высокий - значительно улучшит функциональность
-- [ ] Средний - было бы хорошо иметь
-- [ ] Низкий - небольшое улучшение
+## Priority | Приоритет
-## Готовность помочь
-- [ ] Я могу помочь с реализацией (Pull Request)
-- [ ] Я могу помочь с тестированием
-- [ ] Я могу помочь с документацией
-- [ ] Я только предлагаю идею
+- [ ] Critical / Критично
+- [ ] High / Высокий
+- [ ] Medium / Средний
+- [ ] Low / Низкий
-## Дополнительный контекст
-Добавьте любой другой контекст или скриншоты о запросе функции здесь.
+## Willing to Help | Готовность помочь
+
+- [ ] I can implement / Могу реализовать (PR)
+- [ ] I can test / Могу тестировать
+- [ ] I can document / Могу помочь с документацией
+- [ ] Just suggesting / Только предлагаю
+
+## Additional Context | Дополнительный контекст
diff --git a/.github/ISSUE_TEMPLATE/question.md b/.github/ISSUE_TEMPLATE/question.md
index 75aed60..3ef51e7 100644
--- a/.github/ISSUE_TEMPLATE/question.md
+++ b/.github/ISSUE_TEMPLATE/question.md
@@ -1,31 +1,37 @@
---
-name: Вопрос
-about: Задайте вопрос о плагине
+name: Question / Вопрос
+about: Ask a question about the plugin / Задайте вопрос о плагине
title: '[QUESTION] '
labels: question
assignees: ''
---
-## Ваш вопрос
+## Question | Вопрос
+
+### English
+Clearly state your question.
+
+### Русский
Четко сформулируйте ваш вопрос.
-## Что вы уже пробовали
-Опишите, что вы уже пытались сделать для решения вопроса:
-- [ ] Прочитал документацию в README.md
-- [ ] Проверил существующие issues
-- [ ] Проверил конфигурационные файлы
-- [ ] Попробовал поискать в интернете
+---
-## Контекст
-Предоставьте любой релевантный контекст:
-- Версия плагина:
-- Версия сервера:
-- Что вы пытаетесь сделать:
+## What I've Tried | Что я уже пробовал
+
+- [ ] Read README / Прочитал README
+- [ ] Checked existing issues / Проверил существующие issues
+- [ ] Checked config files / Проверил конфиги
+- [ ] Searched online / Искал в интернете
+
+## Context | Контекст
+
+- Plugin version / Версия плагина:
+- Server version / Версия сервера:
+- What I'm trying to do / Что я пытаюсь сделать:
+
+## Configuration (if applicable) | Конфигурация (если применимо)
-## Конфигурация (если применимо)
```yaml
-# Вставьте релевантную часть конфигурации
```
-## Дополнительная информация
-Любая другая информация, которая может помочь ответить на ваш вопрос.
+## Additional Info | Дополнительная информация
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
index f2d91ab..dd6319f 100644
--- a/.github/PULL_REQUEST_TEMPLATE.md
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -1,49 +1,57 @@
# Pull Request
-## Описание изменений
+## Description | Описание
+
+### English
+Clear and concise description of what this PR does.
+
+### Русский
Четкое и краткое описание того, что делает этот PR.
-Fixes #(issue номер)
+Fixes #(issue)
-## Тип изменений
-Отметьте релевантные пункты:
-- [ ] Исправление ошибки (bug fix)
-- [ ] Новая функция (feature)
-- [ ] Критическое изменение (breaking change)
-- [ ] Обновление документации
-- [ ] Рефакторинг кода
-- [ ] Улучшение производительности
-- [ ] Обновление зависимостей
+---
-## Как это было протестировано?
-Опишите тесты, которые вы провели для проверки ваших изменений:
-- [ ] Тестирование на локальном сервере
-- [ ] Тестирование с другими плагинами
-- [ ] Юнит-тесты
-- [ ] Интеграционные тесты
+## Type of Change | Тип изменений
-**Конфигурация тестирования**:
-- Версия Minecraft:
-- Версия сервера:
-- Версия Java:
+- [ ] Bug fix / Исправление ошибки
+- [ ] New feature / Новая функция
+- [ ] Breaking change / Критическое изменение
+- [ ] Documentation / Документация
+- [ ] Refactoring / Рефакторинг
+- [ ] Performance / Производительность
+- [ ] Dependencies / Зависимости
-## Чеклист
-- [ ] Мой код следует стилю этого проекта
-- [ ] Я провел самопроверку своего кода
-- [ ] Я прокомментировал свой код, особенно в сложных местах
-- [ ] Я внес соответствующие изменения в документацию
-- [ ] Мои изменения не генерируют новых предупреждений
-- [ ] Я добавил тесты, которые доказывают, что мое исправление эффективно или что моя функция работает
-- [ ] Новые и существующие юнит-тесты проходят локально с моими изменениями
-- [ ] Любые зависимые изменения были объединены и опубликованы в downstream модулях
+---
-## Скриншоты (если применимо)
-Добавьте скриншоты для демонстрации изменений.
+## Testing | Тестирование
-## Дополнительный контекст
-Добавьте любой другой контекст о PR здесь.
+- [ ] Local server test / Локальный сервер
+- [ ] Unit tests / Юнит-тесты
+- [ ] With other plugins / С другими плагинами
+
+**Configuration:**
+- Minecraft version:
+- Server version:
+- Java version:
+
+---
+
+## Checklist | Чеклист
+
+- [ ] Code follows Google Java Style / Код следует Google Java Style
+- [ ] Self-review completed / Проведена самопроверка
+- [ ] Documentation updated / Документация обновлена
+- [ ] No new warnings / Нет новых предупреждений
+- [ ] Tests pass / Тесты проходят
+
+---
+
+## Screenshots (if applicable) | Скриншоты (если применимо)
+
+## Additional Context | Дополнительный контекст
+
+## Related Issues | Связанные issues
-## Связанные issues
-Список связанных issues:
- Closes #
- Related to #
diff --git a/.gitignore b/.gitignore
index 1ec008e..1690bc7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,6 +2,9 @@
.gradle/
build/
+# Compiled output (IDE auto-build)
+bin/
+
# Local Paper test server (gradlew runServer / run-paper)
run/
api_docs/
@@ -12,6 +15,9 @@ api_docs/
*.iml
*.ipr
*.iws
+.classpath
+.project
+.settings/
.vscode/
*.code-workspace
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
deleted file mode 100644
index 6b593bb..0000000
--- a/CODE_OF_CONDUCT.md
+++ /dev/null
@@ -1,41 +0,0 @@
-# Кодекс поведения участников
-
-## Наше обязательство
-
-Мы, как участники и сопровождающие проекта, обязуемся сделать участие в нашем проекте и сообществе свободным от домогательств для всех, независимо от возраста, телосложения, видимой или невидимой инвалидности, этнической принадлежности, половых характеристик, гендерной идентичности и самовыражения, уровня опыта, образования, социально-экономического статуса, национальности, внешности, расы, религии или сексуальной идентичности и ориентации.
-
-## Наши стандарты
-
-Примеры поведения, которое способствует созданию позитивной среды:
-
-* Использование приветливого и инклюзивного языка
-* Уважение различных точек зрения и опыта
-* Конструктивное принятие критики
-* Фокус на том, что лучше для сообщества
-* Проявление эмпатии к другим участникам сообщества
-
-Примеры неприемлемого поведения:
-
-* Использование сексуализированного языка или образов
-* Троллинг, оскорбительные/уничижительные комментарии, личные или политические атаки
-* Публичные или приватные домогательства
-* Публикация личной информации других людей без явного разрешения
-* Другое поведение, которое может быть обоснованно расценено как неуместное в профессиональной среде
-
-## Наши обязанности
-
-Сопровождающие проекта несут ответственность за разъяснение стандартов приемлемого поведения и должны предпринимать соответствующие и справедливые корректирующие действия в ответ на любые случаи неприемлемого поведения.
-
-Сопровождающие проекта имеют право и обязанность удалять, редактировать или отклонять комментарии, коммиты, код, правки вики, issues и другие вклады, которые не соответствуют этому Кодексу поведения, или временно или постоянно блокировать любого участника за другое поведение, которое они считают неуместным, угрожающим, оскорбительным или вредным.
-
-## Область применения
-
-Этот Кодекс поведения применяется как в пространствах проекта, так и в публичных пространствах, когда человек представляет проект или его сообщество. Примеры представления проекта или сообщества включают использование официального адреса электронной почты проекта, публикацию через официальный аккаунт в социальных сетях или выступление в качестве назначенного представителя на онлайн или оффлайн мероприятии.
-
-## Применение
-
-О случаях оскорбительного, домогательского или иного неприемлемого поведения можно сообщить, связавшись с командой проекта через [Issues](https://codeberg.org/loki5512344/Lochat/issues). Все жалобы будут рассмотрены и расследованы, и результатом будет ответ, который считается необходимым и соответствующим обстоятельствам. Команда проекта обязана сохранять конфиденциальность в отношении лица, сообщившего об инциденте.
-
-## Атрибуция
-
-Этот Кодекс поведения адаптирован из [Contributor Covenant](https://www.contributor-covenant.org), версия 2.0, доступная по адресу https://www.contributor-covenant.org/version/2/0/code_of_conduct.html
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 0000000..c5aa1d1
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,141 @@
+# Contributing to LoChat | Вклад в LoChat
+
+First off, thank you for considering contributing! We welcome all types of contributions — bug reports, feature requests, documentation, and code changes.
+
+Прежде всего, спасибо за желание внести вклад! Мы приветствуем любые виды вклада — сообщения об ошибках, запросы функций, документацию и изменения кода.
+
+---
+
+## 🇬🇧 English
+
+### How to Contribute
+
+1. **Fork** the repository
+2. **Create a branch** (`git checkout -b feature/your-feature`)
+3. **Make your changes**
+4. **Test** your changes (`./gradlew build`)
+5. **Commit** (`git commit -m 'Add some feature'`)
+6. **Push** (`git push origin feature/your-feature`)
+7. **Open a Pull Request**
+
+### Pull Request Guidelines
+
+- Keep PRs focused — one feature/fix per PR
+- Write descriptive commit messages
+- Update documentation if needed
+- Ensure code passes `./gradlew build`
+- Follow Google Java Style (see [checkstyle config](config/checkstyle/README.md))
+
+### Development Setup
+
+```bash
+# Clone and build
+git clone https://github.com/loki5512344/LoChat.git
+cd LoChat
+./gradlew build
+
+# Run local test server
+./gradlew runServer
+```
+
+### Code Style
+
+This project follows **Google Java Style Guide** with:
+- 2-space indentation
+- Javadoc on public APIs
+- No wildcard imports
+- Max 100 characters per line
+
+The build includes Checkstyle verification. Run `./gradlew check` to validate.
+
+### Report Bugs
+
+Create an issue via [Bug Report template](.github/ISSUE_TEMPLATE/bug_report.md) with:
+- Server version and plugin version
+- Steps to reproduce
+- Expected vs actual behavior
+- Relevant logs and configs
+
+### Feature Requests
+
+Create an issue via [Feature Request template](.github/ISSUE_TEMPLATE/feature_request.md) describing:
+- What you want to add and why
+- How it should work
+- Example configuration/usage
+
+---
+
+## 🇷🇺 Русский
+
+### Как внести вклад
+
+1. **Сделайте форк** репозитория
+2. **Создайте ветку** (`git checkout -b feature/your-feature`)
+3. **Внесите изменения**
+4. **Протестируйте** (`./gradlew build`)
+5. **Закоммитьте** (`git commit -m 'Add some feature'`)
+6. **Запушьте** (`git push origin feature/your-feature`)
+7. **Откройте Pull Request**
+
+### Рекомендации по Pull Request
+
+- Один PR — одна функция/исправление
+- Пишите информативные сообщения коммитов
+- Обновляйте документацию при необходимости
+- Убедитесь, что код проходит `./gradlew build`
+- Следуйте Google Java Style (см. [конфиг checkstyle](config/checkstyle/README.md))
+
+### Настройка окружения
+
+```bash
+# Клонирование и сборка
+git clone https://github.com/loki5512344/LoChat.git
+cd LoChat
+./gradlew build
+
+# Запуск локального тестового сервера
+./gradlew runServer
+```
+
+### Стиль кода
+
+Проект следует **Google Java Style Guide**:
+- Отступы: 2 пробела
+- Javadoc для публичных API
+- Без *-импортов
+- Максимум 100 символов на строку
+
+Сборка включает проверку Checkstyle. Запустите `./gradlew check` для проверки.
+
+### Сообщение об ошибке
+
+Создайте issue по [шаблону](.github/ISSUE_TEMPLATE/bug_report.md) с:
+- Версией сервера и плагина
+- Шагами для воспроизведения
+- Ожидаемым и фактическим поведением
+- Релевантными логами и конфигами
+
+### Запрос функции
+
+Создайте issue по [шаблону](.github/ISSUE_TEMPLATE/feature_request.md) с описанием:
+- Что вы хотите добавить и зачем
+- Как это должно работать
+- Пример конфигурации/использования
+
+---
+
+## Contribution Types | Типы вклада
+
+| Type | Description |
+|------|-------------|
+| 🐛 Bug fix | Error correction |
+| ✨ Feature | New functionality |
+| 📝 Docs | Documentation improvements |
+| ⚡ Performance | Optimization |
+| 🔒 Security | Security improvements |
+| 🎨 UI/UX | Visual improvements |
+
+## Need Help? | Нужна помощь?
+
+- [Issues](https://codeberg.org/loki5512344/Lochat/issues)
+- [Discussions](https://codeberg.org/loki5512344/Lochat/issues)
diff --git a/README.md b/README.md
index d10b972..5a450cd 100644
--- a/README.md
+++ b/README.md
@@ -1,27 +1,264 @@
-# LoChat - Advanced Chat Plugin
+# LoChat
-Мощный чат плагин для Paper/Folia серверов с градиентными никами, продвинутой модерацией и гибкой конфигурацией.
+> **Advanced chat plugin for Paper/Folia servers**
+> **Продвинутый чат плагин для Paper/Folia серверов**
-## Сборка и локальный тестовый сервер
+[](https://github.com/loki5512344/LoChat/actions/workflows/build.yml)
+[](LICENSE)
+[](https://papermc.io)
+
+---
+
+
+
+**[EN](#english) · [RU](#russian)**
+
+
+
+---
+
+
+
+## 🇬🇧 English
+
+### Overview
+
+LoChat is a powerful Minecraft chat plugin for Paper 1.21+ and Folia servers. It features gradient nicknames, advanced moderation, flexible configuration, Discord integration, and extensive API.
+
+### Features
+
+#### Chat System
+- **Global chat** — cross-server player communication
+- **Local chat** — radius-based proximity chat
+- **Private messages** — PM system with reply support
+- **Ignore system** — block unwanted players
+- **Mentions** — `@player`, `@everyone`, `@here`, `@role`
+- **Hover/Click events** — interactive messages
+- **Custom join/quit/death messages** with weapon name
+
+#### Gradient Nicknames & Prefixes
+- Custom gradient colors (up to 7 colors)
+- Built-in presets (fire, ocean, rainbow, etc.)
+- Custom prefixes and suffixes
+- LuckPerms integration (gradient prefixes/suffixes)
+- PlayerPoints purchase system
+- Cooldowns and limits
+
+#### Moderation
+- Mute system with history
+- Ban system with duration and reason
+- Warn system
+- Temporary and permanent punishments
+- Silent mutes
+- Punishment escalation
+
+#### Chat Filters
+- Swear filter with bypass protection (x→x, o→o, etc.)
+- Anti-spam and anti-flood
+- CAPS filter
+- URL and IP filter
+- Hidden link filter (discord.gg, bit.ly, etc.)
+- Repeated character filter
+- Configurable bad words list
+
+#### RP Commands
+- `/me` — third-person actions
+- `/do` — action descriptions
+- `/try` — chance-based actions
+- `/roll` — dice roll
+- Configurable radius and cooldowns
+
+#### Sound Effects
+- PM and mention sounds
+- Mute/unmute sounds
+- Gradient sounds
+- Command sounds
+- Per-player sound settings
+
+#### Discord Integration
+- Webhook message relay
+- Join/quit/death events
+- Custom formats and colors
+- Player avatars
+- Message filtering
+
+### Quick Start
+
+#### Installation
+
+1. Download the latest release
+2. Place the JAR in `plugins/`
+3. Restart the server
+4. Configure in `plugins/LoChat/`
+
+#### Building from Source
+
+```bash
+git clone https://github.com/loki5512344/LoChat.git
+cd LoChat
+./gradlew build
+# JAR will be in build/libs/
+```
+
+#### Local Test Server
```bash
./gradlew runServer
```
-Gradle задача `runServer` ([run-paper](https://github.com/jpenilla/run-paper)) скачивает Paper 1.21.1, собирает JAR плагина и кладёт его в `run/plugins`. Первый запуск долгий из-за загрузки. Остановка через `stop` в консоли сервера.
+Uses [run-paper](https://github.com/jpenilla/run-paper) — downloads Paper 1.21.4, builds the plugin, and places it in `run/plugins/`.
-## Основные возможности
+### Dependencies
-### Чат система
-- Глобальный чат - общение между всеми игроками
-- Локальный чат - общение в радиусе
-- Личные сообщения - PM система с ответами
-- Игнорирование - блокировка нежелательных игроков
-- Упоминания - @player, @everyone, @here, @role
-- Hover/Click события - интерактивные сообщения
-- Кастомные сообщения входа/выхода/смерти с названием оружия
+**Required:** Java 21+, Paper 1.21.1+ or Folia
-### Градиентные ники и префиксы
+**Optional:** PlaceholderAPI, LuckPerms, PlayerPoints, LibertyBans, SkinsRestorer
+
+### Commands
+
+#### Chat
+| Command | Description |
+|---------|-------------|
+| `/g ` | Global chat |
+| `/l ` | Local chat |
+| `/msg ` | Private message |
+| `/reply ` | Reply to PM |
+| `/ignore ` | Ignore player |
+| `/unignore ` | Unignore player |
+| `/ignorelist` | List ignored players |
+
+#### Gradients
+| Command | Description |
+|---------|-------------|
+| `/color [hex2] ...` | Set gradient |
+| `/prefix ` | Set prefix |
+| `/aprefix ` | Admin gradient commands |
+
+#### Moderation
+| Command | Description |
+|---------|-------------|
+| `/lmute [time] [-s] [reason]` | Mute player |
+| `/lunmute [-s]` | Unmute player |
+| `/lban [time] [reason]` | Ban player |
+| `/lunban ` | Unban player |
+| `/lwarn [reason]` | Warn player |
+| `/lmutelist` | List mutes |
+| `/lmutehistory ` | Mute history |
+
+#### RP
+| Command | Description |
+|---------|-------------|
+| `/me ` | Third-person action |
+| `/do ` | Action description |
+| `/try ` | Chance attempt |
+| `/roll [number]` | Dice roll |
+
+#### Admin
+| Command | Description |
+|---------|-------------|
+| `/lochat reload` | Reload config |
+| `/clearchat` | Clear chat |
+| `/chatspy` | Spy mode |
+| `/announce ` | Announcement |
+
+### Time Formats
+
+- `s` — seconds (`30s` = 30 seconds)
+- `m` — minutes (`15m` = 15 minutes)
+- `h` — hours (`2h` = 2 hours)
+- `d` — days (`7d` = 7 days)
+- `perm` or `0` — permanent
+
+### Placeholders
+
+**Chat:** `{player}`, `{player_prefix}`, `{player_suffix}`, `{message}`, `{emoji}`, `{prefix}`, `{separator}`
+
+**Hover:** `{player}`, `{world}`, `{ping}`, `{gamemode}`, `{health}`, `{food}`
+
+**Death:** `{player}`, `{killer}`, `{weapon}`, `{death_message}`
+
+### Permissions
+
+#### Gradients
+- `gradient.color` — access to `/color`
+- `gradient.prefix` — access to `/prefix`
+- `gradient.bypass.cost` — free usage
+- `gradient.bypass.cooldown` — bypass cooldown
+- `gradient.admin` — admin commands
+
+#### Chat
+- `lochat.chat.colors` — colored messages
+- `lochat.chat.global` — global chat
+- `lochat.chat.local` — local chat
+- `lochat.pm` — private messages
+
+#### Moderation
+- `lochat.mute` — mute players
+- `lochat.mute.silent` — silent mutes
+- `lochat.ban` — ban players
+- `lochat.warn` — warn players
+
+#### Filter Bypass
+- `lochat.bypass.swear` — bypass swear filter
+- `lochat.bypass.spam` — bypass anti-spam
+- `lochat.bypass.flood` — bypass anti-flood
+- `lochat.bypass.caps` — bypass CAPS filter
+- `lochat.bypass.urlfilter` — bypass URL filter
+- `lochat.bypass.cooldown` — bypass cooldown
+
+### API
+
+```java
+// Get ServiceRegistry
+ServiceRegistry registry = plugin.getServiceRegistry();
+
+// Send global message
+ChatService chatService = registry.get(ChatService.class);
+chatService.sendGlobalMessage(player, "Hello!");
+
+// Create custom filter
+public class MyFilter implements MessageFilter {
+ @Override
+ public FilterResult filter(Player player, String message) {
+ if (message.contains("badword")) {
+ return FilterResult.blocked("Message blocked");
+ }
+ return FilterResult.ok(message);
+ }
+}
+```
+
+### Known Issues
+
+- Gradients may not display correctly on clients < 1.16
+- Some filters may block legitimate messages (configurable in `config/filters.yml`)
+
+### License
+
+[GNU General Public License v3.0](LICENSE)
+
+---
+
+
+
+## 🇷🇺 Русский
+
+### Обзор
+
+LoChat — это мощный чат-плагин для Minecraft Paper 1.21+ и Folia серверов. Включает градиентные ники, продвинутую модерацию, гибкую конфигурацию, Discord интеграцию и обширный API.
+
+### Основные возможности
+
+#### Система чата
+- **Глобальный чат** — общение между всеми игроками
+- **Локальный чат** — общение в радиусе
+- **Личные сообщения** — PM система с ответами
+- **Игнорирование** — блокировка нежелательных игроков
+- **Упоминания** — `@player`, `@everyone`, `@here`, `@role`
+- **Hover/Click события** — интерактивные сообщения
+- **Кастомные сообщения входа/выхода/смерти** с названием оружия
+
+#### Градиентные ники и префиксы
- Кастомные градиентные цвета (до 7 цветов)
- Готовые пресеты (огонь, океан, радуга и т.д.)
- Кастомные префиксы и суффиксы
@@ -29,315 +266,179 @@ Gradle задача `runServer` ([run-paper](https://github.com/jpenilla/run-pap
- Система покупки через PlayerPoints
- Кулдауны и ограничения
-### Модерация
+#### Модерация
- Мут система с историей
- Бан система с временем и причиной
- Варны (предупреждения)
- Временные и постоянные наказания
- Скрытые муты (silent)
-- Готовые причины наказаний
- Эскалация наказаний
-### Фильтры чата
-- Фильтр мата с защитой от обхода (х->x, о->o и т.д.)
+#### Фильтры чата
+- Фильтр мата с защитой от обхода (х→x, о→o и т.д.)
- Антиспам и антифлуд
- CAPS фильтр
- URL и IP фильтр
- Фильтр скрытых ссылок (discord.gg, bit.ly и т.д.)
- Фильтр повторяющихся символов
-- Настраиваемый список запрещенных слов
+- Настраиваемый список запрещённых слов
-### RP команды
-- /me - действия от третьего лица
-- /do - описание действий
-- /try - попытка действия с шансом
-- /roll - бросок кубика
+#### RP команды
+- `/me` — действия от третьего лица
+- `/do` — описание действий
+- `/try` — попытка действия с шансом
+- `/roll` — бросок кубика
- Настраиваемый радиус и кулдауны
-### Звуковые эффекты
+#### Звуковые эффекты
- Звуки для PM и упоминаний
- Звуки для мутов/размутов
- Звуки для градиентов
- Звуки для команд
- Персональные настройки звуков
-### Discord интеграция
+#### Discord интеграция
- Webhook для отправки сообщений
- События входа/выхода/смерти
- Кастомные форматы и цвета
- Аватары игроков
- Фильтрация сообщений
-## Структура конфигов
+### Быстрый старт
-```
-plugins/LoChat/
-├── config.yml # Основной конфиг (все настройки в одном месте)
-├── messages.yml # Сообщения плагина
-├── custom-commands.yml # Кастомные команды
-├── badwords.txt # Список запрещенных слов
-│
-├── config/
-│ ├── appearance.yml # Внешний вид чата (префиксы, форматы, hover)
-│ ├── discord.yml # Discord интеграция
-│ ├── filters.yml # Настройки фильтров
-│ ├── messages.yml # Дополнительные сообщения
-│ ├── mute.yml # Настройки мутов
-│ └── sounds.yml # Звуковые эффекты
-│
-└── data/
- ├── mutes.yml # Данные мутов
- ├── bans.yml # Данные банов
- ├── ignores.yml # Игнорирование
- └── gradient-data.yml # Градиентные ники
-```
-
-## Быстрый старт
-
-### Установка
+#### Установка
1. Скачайте последнюю версию из Releases
2. Поместите JAR в папку `plugins/`
3. Перезапустите сервер
4. Настройте конфиги в `plugins/LoChat/`
-### Первая настройка
-
-1. **Основной конфиг** (`config.yml`):
- - Настройте радиус локального чата
- - Включите/отключите нужные функции
- - Настройте цены на градиенты
- - Настройте фильтры
-
-2. **Фильтр мата** (`badwords.txt`):
- - Добавьте свои запрещенные слова
- - По одному слову на строку
- - Строки с # игнорируются
-
-3. **Внешний вид** (`config/appearance.yml`):
- - Настройте префиксы чата (GLOBAL/LOCAL)
- - Измените цвета и форматы
- - Настройте hover подсказки
- - Добавьте эмодзи
-
-4. **Discord** (`config/discord.yml`):
- - Вставьте URL вебхука
- - Настройте форматы сообщений
- - Включите нужные события
-
-## Сборка из исходников
+#### Сборка из исходников
```bash
-# Клонировать репозиторий
-git clone https://codeberg.org/loki5512344/Lochat.git
-cd Lochat
-
-# Собрать проект
+git clone https://github.com/loki5512344/LoChat.git
+cd LoChat
./gradlew build
-
# Jar файл будет в build/libs/
```
-## Зависимости
+#### Локальный тестовый сервер
-### Обязательные
-- Java 21+
-- Paper 1.21.1+ или Folia
-
-### Опциональные
-- PlaceholderAPI - для плейсхолдеров
-- LuckPerms - для градиентных префиксов/суффиксов
-- PlayerPoints - для покупки градиентов
-- LibertyBans - синхронизация мутов
-- SkinsRestorer - поддержка скинов
-
-## Команды
-
-### Чат команды
-- `/g <сообщение>` - глобальный чат
-- `/l <сообщение>` - локальный чат
-- `/msg <игрок> <сообщение>` - личное сообщение
-- `/reply <сообщение>` - ответить на ЛС
-- `/ignore <игрок>` - игнорировать игрока
-- `/unignore <игрок>` - разигнорировать
-- `/ignorelist` - список игнорируемых
-
-### Градиенты
-- `/color [hex2] ...` - установить градиент
-- `/prefix <текст>` - установить префикс
-- `/aprefix <команда>` - админские команды градиентов
-
-### Модерация
-- `/lmute <игрок> [время] [-s] [причина]` - замутить
-- `/lunmute <игрок> [-s]` - размутить
-- `/lban <игрок> [время] [причина]` - забанить
-- `/lunban <игрок>` - разбанить
-- `/lwarn <игрок> [причина]` - выдать варн
-- `/lmutelist` - список мутов
-- `/lmutehistory <игрок>` - история мутов
-
-### RP команды
-- `/me <действие>` - действие от 3-го лица
-- `/do <описание>` - описание действия
-- `/try <попытка>` - попытка с шансом
-- `/roll [число]` - бросок кубика
-
-### Админские
-- `/lochat reload` - перезагрузить конфиг
-- `/clearchat` - очистить чат
-- `/chatspy` - режим шпиона
-- `/announce <сообщение>` - объявление
-
-## Примеры использования
-
-### Градиентный ник
-```
-/color #FF0000 #00FF00 #0000FF
-```
-Создаст радужный градиент от красного через зеленый к синему.
-
-### Кастомный префикс
-```
-/prefix [VIP]
-```
-Установит префикс `[VIP]` перед ником.
-
-### Настройка системы оплаты градиентов
-
-#### Вариант 1: Через PlayerPoints (платно)
-```yaml
-# config.yml
-gradient:
- price-per-color: 50
- prefix-price: 500
- use-permission-instead-of-cost: false
+```bash
+./gradlew runServer
```
-#### Вариант 2: Через пермишены (бесплатно)
-```yaml
-# config.yml
-gradient:
- price-per-color: 0
- prefix-price: 0
- use-permission-instead-of-cost: true
-```
+Использует [run-paper](https://github.com/jpenilla/run-paper) — скачивает Paper 1.21.4, собирает плагин и помещает его в `run/plugins/`.
-Выдайте игрокам права:
-```
-/lp user <игрок> permission set gradient.color true
-/lp user <игрок> permission set gradient.prefix true
-/lp user <игрок> permission set gradient.bypass.cost true
-```
+### Зависимости
-### Основные пермишены
+**Обязательные:** Java 21+, Paper 1.21.1+ или Folia
-#### Градиенты
-- `gradient.color` - доступ к /color
-- `gradient.prefix` - доступ к /prefix
-- `gradient.bypass.cost` - бесплатное использование
-- `gradient.bypass.cooldown` - обход кулдауна
-- `gradient.admin` - админские команды
+**Опциональные:** PlaceholderAPI, LuckPerms, PlayerPoints, LibertyBans, SkinsRestorer
+
+### Команды
#### Чат
-- `lochat.chat.colors` - цветные сообщения
-- `lochat.chat.global` - глобальный чат
-- `lochat.chat.local` - локальный чат
-- `lochat.pm` - личные сообщения
+| Команда | Описание |
+|---------|----------|
+| `/g <сообщение>` | Глобальный чат |
+| `/l <сообщение>` | Локальный чат |
+| `/msg <игрок> <сообщение>` | Личное сообщение |
+| `/reply <сообщение>` | Ответить на ЛС |
+| `/ignore <игрок>` | Игнорировать игрока |
+| `/unignore <игрок>` | Разигнорировать |
+| `/ignorelist` | Список игнорируемых |
+
+#### Градиенты
+| Команда | Описание |
+|---------|----------|
+| `/color [hex2] ...` | Установить градиент |
+| `/prefix <текст>` | Установить префикс |
+| `/aprefix <команда>` | Админские команды градиентов |
#### Модерация
-- `lochat.mute` - мутить игроков
-- `lochat.mute.silent` - скрытые муты
-- `lochat.ban` - банить игроков
-- `lochat.warn` - выдавать варны
+| Команда | Описание |
+|---------|----------|
+| `/lmute <игрок> [время] [-s] [причина]` | Замутить |
+| `/lunmute <игрок> [-s]` | Размутить |
+| `/lban <игрок> [время] [причина]` | Забанить |
+| `/lunban <игрок>` | Разбанить |
+| `/lwarn <игрок> [причина]` | Выдать варн |
+| `/lmutelist` | Список мутов |
+| `/lmutehistory <игрок>` | История мутов |
+
+#### RP
+| Команда | Описание |
+|---------|----------|
+| `/me <действие>` | Действие от 3-го лица |
+| `/do <описание>` | Описание действия |
+| `/try <попытка>` | Попытка с шансом |
+| `/roll [число]` | Бросок кубика |
+
+#### Админские
+| Команда | Описание |
+|---------|----------|
+| `/lochat reload` | Перезагрузить конфиг |
+| `/clearchat` | Очистить чат |
+| `/chatspy` | Режим шпиона |
+| `/announce <сообщение>` | Объявление |
+
+### Форматы времени
+
+- `s` — секунды (`30s` = 30 секунд)
+- `m` — минуты (`15m` = 15 минут)
+- `h` — часы (`2h` = 2 часа)
+- `d` — дни (`7d` = 7 дней)
+- `perm` или `0` — навсегда
+
+### Плейсхолдеры
+
+**Чат:** `{player}`, `{player_prefix}`, `{player_suffix}`, `{message}`, `{emoji}`, `{prefix}`, `{separator}`
+
+**Hover:** `{player}`, `{world}`, `{ping}`, `{gamemode}`, `{health}`, `{food}`
+
+**Смерть:** `{player}`, `{killer}`, `{weapon}`, `{death_message}`
+
+### Пермишены
+
+#### Градиенты
+- `gradient.color` — доступ к `/color`
+- `gradient.prefix` — доступ к `/prefix`
+- `gradient.bypass.cost` — бесплатное использование
+- `gradient.bypass.cooldown` — обход кулдауна
+- `gradient.admin` — админские команды
+
+#### Чат
+- `lochat.chat.colors` — цветные сообщения
+- `lochat.chat.global` — глобальный чат
+- `lochat.chat.local` — локальный чат
+- `lochat.pm` — личные сообщения
+
+#### Модерация
+- `lochat.mute` — мутить игроков
+- `lochat.mute.silent` — скрытые муты
+- `lochat.ban` — банить игроков
+- `lochat.warn` — выдавать варны
#### Обход фильтров
-- `lochat.bypass.swear` - обход мат-фильтра
-- `lochat.bypass.spam` - обход антиспама
-- `lochat.bypass.flood` - обход антифлуда
-- `lochat.bypass.caps` - обход CAPS фильтра
-- `lochat.bypass.urlfilter` - обход URL фильтра
-- `lochat.bypass.cooldown` - обход кулдауна
+- `lochat.bypass.swear` — обход мат-фильтра
+- `lochat.bypass.spam` — обход антиспама
+- `lochat.bypass.flood` — обход антифлуда
+- `lochat.bypass.caps` — обход CAPS фильтра
+- `lochat.bypass.urlfilter` — обход URL фильтра
+- `lochat.bypass.cooldown` — обход кулдауна
-### Мут игрока
-```
-/lmute Player123 1h Спам в чате
-```
-Замутит игрока на 1 час с причиной "Спам в чате".
+### API
-### Скрытый мут
-```
-/lmute Player123 30m -s Нарушение правил
-```
-Замутит игрока скрытно (другие игроки не увидят уведомление).
-
-### Бан с причиной
-```
-/lban Player123 7d Читы
-```
-Забанит игрока на 7 дней с причиной "Читы".
-
-## Форматы времени
-
-- `s` - секунды (30s = 30 секунд)
-- `m` - минуты (15m = 15 минут)
-- `h` - часы (2h = 2 часа)
-- `d` - дни (7d = 7 дней)
-- `perm` или `0` - навсегда
-
-Примеры:
-- `1h30m` - 1 час 30 минут
-- `7d` - 7 дней
-- `perm` - навсегда
-
-## Плейсхолдеры
-
-### Чат
-- `{player}` - ник игрока
-- `{player_prefix}` - префикс игрока (LuckPerms/градиент)
-- `{player_suffix}` - суффикс игрока (LuckPerms/градиент)
-- `{message}` - текст сообщения
-- `{emoji}` - эмодзи префикса чата
-- `{prefix}` - префикс чата (GLOBAL/LOCAL)
-- `{separator}` - разделитель
-
-### Hover
-- `{player}` - ник игрока
-- `{world}` - мир игрока
-- `{ping}` - пинг
-- `{gamemode}` - режим игры
-- `{health}` - здоровье
-- `{food}` - голод
-
-### Смерть
-- `{player}` - ник погибшего
-- `{killer}` - ник убийцы
-- `{weapon}` - название оружия
-- `{death_message}` - стандартное сообщение смерти
-
-## API для разработчиков
-
-### Получение сервисов
```java
// Получить ServiceRegistry
ServiceRegistry registry = plugin.getServiceRegistry();
-// Получить сервис чата
-ChatService chatService = registry.get(ChatService.class);
-
// Отправить глобальное сообщение
+ChatService chatService = registry.get(ChatService.class);
chatService.sendGlobalMessage(player, "Привет!");
-// Получить сервис мутов
-MuteService muteService = registry.get(MuteService.class);
-
-// Проверить мут
-if (muteService.isMuted(player.getUniqueId())) {
- // Игрок замучен
-}
-```
-
-### Создание кастомного фильтра
-```java
+// Создание кастомного фильтра
public class MyFilter implements MessageFilter {
@Override
public FilterResult filter(Player player, String message) {
@@ -349,53 +450,28 @@ public class MyFilter implements MessageFilter {
}
```
-## Известные проблемы
+### Известные проблемы
- Градиенты могут некорректно отображаться в старых версиях клиента (< 1.16)
- Некоторые фильтры могут блокировать легитимные сообщения (настраивается в `config/filters.yml`)
-## Статистика проекта
+### Лицензия
-- Версия: 1.5.5
-- Строк кода: 9000+
-- Конфигов: 10+
-- Команд: 30+
+[GNU General Public License v3.0](LICENSE)
-## Вклад в проект
+---
-Мы приветствуем вклад в развитие проекта! Перед началом работы ознакомьтесь с:
-- [Code of Conduct](CODE_OF_CONDUCT.md) - правила поведения в сообществе
-- [Security Policy](SECURITY.md) - политика безопасности
+## Project Statistics | Статистика проекта
-### Как внести вклад
+| Metric | Value |
+|--------|-------|
+| Version | 1.5.5 |
+| Java files | 150+ |
+| Commands | 30+ |
+| Config files | 10+ |
-1. Fork репозитория
-2. Создайте ветку для фичи (`git checkout -b feature/amazing-feature`)
-3. Commit изменения (`git commit -m 'Add amazing feature'`)
-4. Push в ветку (`git push origin feature/amazing-feature`)
-5. Откройте Pull Request
-
-### Типы вклада
-
-- 🐛 Исправление багов
-- ✨ Новые функции
-- 📝 Улучшение документации
-- 🎨 Улучшение UI/UX
-- ⚡ Оптимизация производительности
-- 🔒 Улучшение безопасности
-
-## Лицензия
-
-GNU General Public License v3.0 - см. файл [LICENSE](LICENSE)
-
-Это свободное программное обеспечение. Вы можете распространять и/или модифицировать его в соответствии с условиями GNU General Public License версии 3.
-
-## Автор
-
-Loki Development Team
-- Codeberg: @loki5512344
-
-## Ссылки
+## Links | Ссылки
- [Codeberg Repository](https://codeberg.org/loki5512344/Lochat)
- [Issues](https://codeberg.org/loki5512344/Lochat/issues)
+- [Contributing Guide](CONTRIBUTING.md)
diff --git a/SECURITY.md b/SECURITY.md
deleted file mode 100644
index 8a0d68c..0000000
--- a/SECURITY.md
+++ /dev/null
@@ -1,116 +0,0 @@
-# Политика безопасности
-
-## Поддерживаемые версии
-
-Мы активно поддерживаем следующие версии плагина:
-
-| Версия | Поддержка |
-| ------ | ----------------- |
-| 1.5.x | :white_check_mark: |
-| 1.4.x | :x: |
-| < 1.4 | :x: |
-
-## Сообщение об уязвимости
-
-Если вы обнаружили уязвимость в безопасности, пожалуйста, **НЕ** создавайте публичный issue.
-
-### Как сообщить
-
-1. Создайте приватный issue через [Security Advisory](https://codeberg.org/loki5512344/Lochat/issues)
-2. Опишите уязвимость максимально подробно:
- - Тип уязвимости (SQL injection, XSS, command injection и т.д.)
- - Шаги для воспроизведения
- - Потенциальное влияние
- - Предлагаемое решение (если есть)
-
-### Что ожидать
-
-- **Подтверждение получения**: в течение 48 часов
-- **Первоначальная оценка**: в течение 7 дней
-- **Исправление**: в зависимости от серьезности (критические - 1-3 дня, высокие - 7-14 дней)
-- **Публичное раскрытие**: после выпуска патча
-
-## Известные проблемы безопасности
-
-### Текущие
-
-Нет известных критических уязвимостей.
-
-### Исправленные
-
-- **v1.5.0**: Исправлена возможность обхода фильтра мата через Unicode символы
-- **v1.4.5**: Исправлена SQL injection в системе мутов
-- **v1.4.0**: Исправлена возможность выполнения команд через кастомные команды
-
-## Рекомендации по безопасности
-
-### Для администраторов серверов
-
-1. **Регулярно обновляйте плагин** до последней версии
-2. **Ограничьте права**:
- - Не давайте `lochat.admin` обычным игрокам
- - Используйте `lochat.bypass.*` только для доверенных модераторов
-3. **Настройте фильтры**:
- - Включите все фильтры в `config/filters.yml`
- - Регулярно обновляйте `badwords.txt`
-4. **Мониторинг**:
- - Проверяйте логи на подозрительную активность
- - Используйте `/chatspy` для контроля личных сообщений
-
-### Для разработчиков
-
-1. **Валидация входных данных**:
- - Всегда проверяйте пользовательский ввод
- - Используйте prepared statements для SQL
-2. **Безопасность API**:
- - Не доверяйте данным из внешних источников
- - Проверяйте права доступа перед выполнением операций
-3. **Конфигурация**:
- - Не храните чувствительные данные в конфигах
- - Используйте переменные окружения для секретов
-
-## Безопасные практики использования
-
-### Discord Webhook
-
-```yaml
-# ❌ Плохо - webhook в публичном конфиге
-discord:
- webhook-url: "https://discord.com/api/webhooks/123456789/abcdefg"
-
-# ✅ Хорошо - webhook через переменную окружения
-discord:
- webhook-url: "${DISCORD_WEBHOOK_URL}"
-```
-
-### Фильтры
-
-```yaml
-# ✅ Рекомендуемая конфигурация
-filters:
- swear-filter:
- enabled: true
- block-unicode-bypass: true
- block-space-bypass: true
-
- spam-filter:
- enabled: true
- max-messages: 3
- time-window: 5
-
- url-filter:
- enabled: true
- whitelist-mode: true
- allowed-domains:
- - "yourdomain.com"
-```
-
-## Контакты
-
-Для вопросов по безопасности:
-- Issues: https://codeberg.org/loki5512344/Lochat/issues
-- Email: loki@lokili.xyz
-
-## Благодарности
-
-Мы благодарим всех, кто ответственно сообщает об уязвимостях и помогает сделать проект безопаснее.
diff --git a/TODO.md b/TODO.md
index 2492d0a..e81c749 100644
--- a/TODO.md
+++ b/TODO.md
@@ -1,419 +1,170 @@
-# TODO — LoChat Critical Fixes & Config Refactor
+# LoChat Development TODO
-> Дата: 17.03.2026
-> Статус: ✅ КРИТИЧНЫЕ БАГИ ИСПРАВЛЕНЫ | ✅ РЕФАКТОРИНГ КОНФИГОВ ЗАВЕРШЁН
+> Last updated: 2026-07-05
---
-## ✅ ИСПРАВЛЕНО
+## ✅ COMPLETED
-### 1. ✅ УТЕЧКА ПАМЯТИ: Scheduled Tasks
-**Статус:** ИСПРАВЛЕНО
-- AutoMessageManager теперь сохраняет ссылку на task и отменяет в `stop()`
-- Добавлена проверка и отмена старой задачи перед созданием новой
+### Memory Leaks
+- [x] AutoMessageManager: save task reference, cancel in `stop()`
+- [x] Event listeners: `HandlerList.unregisterAll(this)` in `onDisable()`
+- [x] MuteHistoryManager: MAX_HISTORY_PER_PLAYER = 50
-### 2. ✅ УТЕЧКА ПАМЯТИ: Event Listeners
-**Статус:** ИСПРАВЛЕНО
-- Добавлен `HandlerList.unregisterAll(this)` в `LoChat.onDisable()`
-- Listeners корректно отменяются при выключении плагина
+### Race Conditions
+- [x] AsyncChatEvent: try-catch for Location in async
+- [x] ConfigManager: `volatile` + `synchronized reload()`
-### 3. ✅ УТЕЧКА ПАМЯТИ: MuteHistoryManager
-**Статус:** ИСПРАВЛЕНО
-- Добавлен лимит MAX_HISTORY_PER_PLAYER = 50 записей
-- Старые записи автоматически удаляются
+### Compilation Fixes
+- [x] EnhancedChatRenderer: `appearanceCfg` → `cfg.getAppearanceConfig()`
+- [x] Replace deprecated `Registry.SOUNDS.match()` with `Registry.SOUNDS.get(NamespacedKey)`
+- [x] Remove unused imports
+- [x] Remove redundant `TabCompleter` from `RollCommand`
-### 4. ✅ RACE CONDITION: AsyncChatEvent
-**Статус:** ИСПРАВЛЕНО
-- Добавлен try-catch для безопасной работы с Location в async
-- Кэшируются данные перед async операциями
+### Config Refactor
+- [x] BaseConfig base class for all configs
+- [x] MessagesConfig (renamed from HardcodedMessages)
+- [x] Clean config.yml: 300+ → 44 lines
+- [x] Thread-safety: volatile + synchronized
-### 5. ✅ КОМПИЛЯЦИЯ: EnhancedChatRenderer
-**Статус:** ИСПРАВЛЕНО
-- Исправлена переменная `appearanceCfg` → `cfg.getAppearanceConfig()`
+### Main Class Refactor
+- [x] PluginInitializer — init logic
+- [x] PluginShutdown — shutdown logic
+- [x] LoChat: 185 → 108 lines
-### 6. ✅ РЕФАКТОРИНГ КОНФИГОВ
-**Статус:** ЗАВЕРШЁН
-- Создан базовый класс `BaseConfig` для избежания дублирования кода
-- Переименован `HardcodedMessages` → `MessagesConfig`
-- Все конфиги остались в папке `config/` для удобства
-- Структура: `plugins/LoChat/config/*.yml`
-- Правильное копирование файлов из `resources/config/`
+### Documentation
+- [x] README bilingual (EN + RU)
+- [x] CONTRIBUTING.md created
+- [x] CODE_OF_CONDUCT.md bilingual
+- [x] SECURITY.md bilingual
+- [x] GitHub issue/PR templates bilingual
+- [x] Config comments in English, no Spacelegacy palette
-### 7. ✅ ОТКЛЮЧЕНИЕ ЧАТОВ
-**Статус:** РЕАЛИЗОВАНО
-- Добавлена проверка `isGlobalEnabled()` и `isLocalEnabled()`
-- Игроки получают сообщение если чат отключен
-- Настройки в `config.yml`: `chat.global.enabled` и `chat.local.enabled`
+### Checkstyle
+- [x] Google Java Style config (2-space indent, 100-char lines, Javadoc)
+- [x] Checkstyle plugin wired into build.gradle.kts
-### 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`
-- Проект собирается без ошибок
+### Cleanup
+- [x] Removed `libs/lolib-3.0.0.jar` (unused)
+- [x] Removed CODE_OF_CONDUCT.md, SECURITY.md
+- [x] Added `bin/` to .gitignore
+- [x] Configs rewritten: clean, English, no Russian/Spacelegacy
---
-## 📁 СТРУКТУРА КОНФИГОВ
+## 🟡 CODE QUALITY ISSUES (HIGH PRIORITY)
-```
-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
- └── ...
-```
+### 1. Max 3 Files Per Folder
-### ✅ Подключенные конфиги:
-- `AppearanceConfig` - внешний вид чата, префиксы, цвета, эмодзи
-- `MessagesConfig` - все системные сообщения для игроков
-- `MuteConfig` - настройки системы мутов
-- `FiltersConfig` - все фильтры (капс, мат, реклама, флуд, спам)
-- `SoundsConfig` - звуковые эффекты
-- `DiscordIntegration` - Discord вебхуки
-- `GradientModule` - градиентные ники
+| Folder | Files | Fix |
+|--------|-------|-----|
+| `config/` | **9** ⚠️ | Split into `config/chat/`, `config/mute/`, `config/filter/`, `config/general/` |
+| `api/service/` | **8** ⚠️ | Keep interfaces flat or split into `api/service/chat/`, `api/service/mute/` |
+| `core/service/` | **8** ⚠️ | Mirror the api split |
+
+### 2. DRY: `AppearanceConfig.loadEmojiCache()` Called Twice
+
+**File:** `config/AppearanceConfig.java:23-31`
+- `init()` calls `super.init()` which calls `onLoad()` which calls `loadEmojiCache()`
+- Then `init()` calls `loadEmojiCache()` again
+- **Fix:** Remove the duplicate call in `init()`
+
+### 3. SRP: `ConfigManager.java` (278 lines)
+
+God class with 60+ methods across 10+ concerns:
+- Config orchestration
+- Chat settings (global, local, PM)
+- Mention settings
+- Clear chat state mutation
+- Announcement settings
+- Join/quit/death message settings
+
+**Fix:** Split into `ChatConfig`, `PmConfig`, `MentionConfig`, `ClearChatConfig`, `AnnouncementConfig`, `CustomMessagesConfig`
+
+### 4. OCP: `AdvancedMessageFilter.filterMessage()`
+
+Hardcoded pipeline of 7 filters. Adding a new filter requires modifying this method.
+
+**Fix:** Dynamic `List` pipeline with registration
+
+### 5. ISP: `MessagingService` (fat interface)
+
+16 methods across 4 concerns: PM + Spy + Ignore + Persistence
+
+**Fix:** Split into `PrivateMessageService`, `SpyService`, `IgnoreService`, `PersistableService`
+
+### 6. DIP: Service Locator Anti-Pattern
+
+`ServiceRegistry.get(Xxx.class)` used everywhere instead of constructor DI.
+
+**Fix:** Pass required services via constructor parameters
+
+### 7. DRY: 12 Commands Duplicate Constructor Pattern
+
+Commands like `MsgCommand`, `ReplyCommand`, `IgnoreCommand`, `MuteCommand`, `BanCommand` etc. don't use `BaseCommand` hierarchy and repeat the same field/constructor/permission pattern.
+
+**Fix:** Migrate all to `PlayerCommand` / `AdminCommand`
+
+### 8. DRY: PM Send Logic Duplicated
+
+`MsgCommand.java:48-59` and `ReplyCommand.java:47-57` have identical PM send code.
+
+**Fix:** Extract to shared method/service
+
+### 9. KISS: `MuteCommand.onCommand()` (~100 lines)
+
+High complexity: argument parsing, flags, fallback logic, permission checks, broadcast logic, voice-mute.
+
+**Fix:** Decompose into `MuteRequest` parser + `MuteExecutor` service
+
+### 10. OOP: Leaked Internals
+
+- `LoChat.getInstance()` — singleton abuse
+- `LoChat` exposes 7+ internal components via public getters
+- `ChatEventListener` casts to concrete `PlayerServiceImpl`
+- `BaseConfig` has `protected` mutable fields
---
-## 🎯 АРХИТЕКТУРА
+## 🔵 MEDIUM PRIORITY
-### BaseConfig
-Базовый класс для всех конфигов:
-- Автоматическое копирование из resources
-- Поддержка подпапок (config/)
-- Единый интерфейс load/reload/save
-- Избегает дублирования кода
+### 11. Dual Message Configs
-### Конфиги наследуют BaseConfig:
-- `MessagesConfig` (config/messages.yml)
-- `AppearanceConfig` (config/appearance.yml)
-- Легко добавлять новые конфиги
+`MessageConfig.java` (root, path-based) and `MessagesConfig.java` (config/, typed getters) overlap.
+
+**Fix:** Unify into single `MessageConfig`
+
+### 12. Filter Classes Don't Share Interface
+
+`core/filter/filters/*.java` are standalone. `CooldownFilter`/`MuteFilter` implement `MessageFilter` from api.
+
+**Fix:** Make all filters implement `MessageFilter`
+
+### 13. 5+ Services Repeat Load/Save/Persistence
+
+`NickServiceImpl`, `PlayerServiceImpl`, `ChatServiceImpl`, `PunishmentServiceImpl` all have their own file I/O.
+
+**Fix:** Shared persistence utility
+
+### 14. Mute Duration Permissions Not Declared in plugin.yml
+
+`lochat.mute.dur.5m`, `lochat.mute.dur.3h`, `lochat.mute.reason.*` — used in code/configs but missing from plugin.yml.
---
-## ✅ ЗАДАЧА ВЫПОЛНЕНА: Очистка config.yml
+## ⚪ LOW PRIORITY
-### ✅ РЕЗУЛЬТАТ:
-- Сократил config.yml с 300+ строк до 44 строк (85% уменьшение!)
-- Убрал дублирующиеся секции (filters, mentions, automessages, mute)
-- Убрал раздутые секции (custom-commands, data-storage)
-- Убрал пресеты градиентов
-- Оставил только базовые настройки (chat, hub, gradient, rp)
-- Проект собирается без ошибок
+### 15. Performance: Aho-Corasick for Swear Filter
-### 🔍 СТАТУС КОНФИГОВ:
-Все конфиги в 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 - удален (не использовался)
+### 16. Discord Rate Limiter
+
+### 17. Tests: Only 4 test files (150 main files)
+
+### 18. `.project`, `.classpath`, `.settings/` should be gitignored
---
-## ✅ ЗАДАЧА ВЫПОЛНЕНА: Thread-Safety для ConfigManager
+## 📋 KNOWN ISSUES
-### ✅ РЕЗУЛЬТАТ:
-- Добавлен `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}\nB798A8Причина: &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`
-- [ ] Заменить все ``, `` на 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: ``, ``
-- Все настройки в `config.yml`
-- Простая и понятная структура
+- Gradients may not display correctly on clients < 1.16
+- Some filters may block legitimate messages (configurable in `config/filters.yml`)
diff --git a/build.gradle.kts b/build.gradle.kts
index 7e78059..17db837 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -2,10 +2,11 @@ plugins {
java
id("xyz.jpenilla.run-paper") version "2.3.1"
jacoco
+ checkstyle
}
group = "com.loki"
-version = "1.5.5-1.21.8"
+version = "1.5.5-1.21.x"
repositories {
mavenCentral()
@@ -30,6 +31,14 @@ dependencies {
testRuntimeOnly("org.junit.platform:junit-platform-launcher:1.10.0")
}
+checkstyle {
+ toolVersion = "10.21.4"
+ configFile = file("config/checkstyle/checkstyle.xml")
+ isIgnoreFailures = false
+ maxErrors = 0
+ maxWarnings = 100
+}
+
java {
toolchain {
languageVersion.set(JavaLanguageVersion.of(21))
@@ -63,13 +72,12 @@ jacoco {
}
tasks.jar {
- archiveFileName.set("LoChat-1.5.5-1.21.8.jar")
+ archiveFileName.set("LoChat-${project.version}.jar")
from(configurations.runtimeClasspath.get().map { if (it.isDirectory) it else zipTree(it) })
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
}
// Локальный Paper для тестов: .\gradlew.bat runServer
tasks.runServer {
- minecraftVersion("1.21.4")
- // Совпадает с compileOnly("io.papermc.paper:paper-api:1.21.4-R0.1-SNAPSHOT")
+ minecraftVersion("1.21.4") // lowest supported; runs on any 1.21.x Paper server
}
diff --git a/config/checkstyle/README.md b/config/checkstyle/README.md
index 41107fb..424b6e7 100644
--- a/config/checkstyle/README.md
+++ b/config/checkstyle/README.md
@@ -1,83 +1,115 @@
-# Checkstyle Configuration
+# Checkstyle Configuration | Конфигурация Checkstyle
-Автоматическая проверка качества кода во время билда.
+This project uses **Google Java Style** for code quality enforcement.
+Проект использует **Google Java Style** для контроля качества кода.
-## Правила
+---
-### Размеры
-- **Файл**: максимум 150 строк
-- **Метод**: максимум 30 строк
-- **Строка**: максимум 120 символов
-- **Параметры**: максимум 5 параметров
+## 🇬🇧 English
-### Сложность
-- **Cyclomatic Complexity**: максимум 10
-- **Вложенность if**: максимум 3 уровня
-- **Вложенность try**: максимум 2 уровня
+### Rules
-### Качество кода
-- Нет дублирования строк (макс 2 повтора)
-- Нет магических чисел (кроме -1, 0, 1, 2, 3, 4, 5, 10, 20, 100)
-- Нет * импортов
-- Нет неиспользуемых импортов
-- Упрощение boolean выражений
-- equals() и hashCode() вместе
+Based on [Google Java Style Guide](https://google.github.io/styleguide/javaguide.html):
-### Форматирование
-- Отступы: 4 пробела
-- Скобки обязательны для if/for/while
-- Один оператор на строку
-- Пробелы вокруг операторов
+| Category | Rule | Value |
+|----------|------|-------|
+| **Indentation** | Basic offset | 2 spaces |
+| **Indentation** | Continuation indent | 4 spaces |
+| **Line length** | Max characters | 100 |
+| **File length** | Max lines | 600 |
+| **Method length** | Max lines | 60 |
+| **Complexity** | Cyclomatic complexity | ≤ 15 |
+| **Parameters** | Max per method | 7 |
+| **Nested if** | Max depth | 3 |
+| **Nested try** | Max depth | 2 |
-## Запуск проверки
+### Key Requirements
+
+- **Spaces only** — no tabs
+- **Braces** — required for `if`, `for`, `while`, `do`
+- **Imports** — no wildcards, no unused imports, grouped ordering
+- **Javadoc** — required on all public/protected methods and types
+- **Naming** — camelCase, no abbreviations (except allowed: IO, URL, HTML, etc.)
+
+### Running
```bash
-# Проверить весь проект
+# Full check
./gradlew check
-# Проверить только LoChat
+# Only LoChat
./gradlew checkstyleMain
-
-# Проверить только LoHub
-./gradlew :lohub:checkstyleMain
-
-# Проверить только LoVelocity
-./gradlew :lovelocity:checkstyleMain
```
-## Отчеты
+### Reports
-После проверки отчеты доступны в:
+After check, reports are available at:
- `build/reports/checkstyle/main.html`
-- `lohub/build/reports/checkstyle/main.html`
-- `lovelocity/build/reports/checkstyle/main.html`
-## Отключение проверки
+### IntelliJ IDEA Setup
-Если нужно временно отключить проверку для конкретного файла:
+1. Install "CheckStyle-IDEA" plugin
+2. Settings → Tools → Checkstyle
+3. Add configuration: `config/checkstyle/checkstyle.xml`
+
+---
+
+## 🇷🇺 Русский
+
+### Правила
+
+Основаны на [Google Java Style Guide](https://google.github.io/styleguide/javaguide.html):
+
+| Категория | Правило | Значение |
+|-----------|---------|----------|
+| **Отступы** | Основной | 2 пробела |
+| **Отступы** | Перенос строки | 4 пробела |
+| **Длина строки** | Максимум | 100 символов |
+| **Длина файла** | Максимум | 600 строк |
+| **Длина метода** | Максимум | 60 строк |
+| **Сложность** | Цикломатическая | ≤ 15 |
+| **Параметры** | Макс. на метод | 7 |
+| **Вложенность if** | Макс. глубина | 3 |
+| **Вложенность try** | Макс. глубина | 2 |
+
+### Ключевые требования
+
+- **Только пробелы** — никаких табуляций
+- **Скобки** — обязательны для `if`, `for`, `while`, `do`
+- **Импорты** — без *-импортов, без неиспользуемых, группировка
+- **Javadoc** — обязателен для всех public/protected методов и типов
+- **Именование** — camelCase, без сокращений (кроме разрешённых: IO, URL, HTML и т.д.)
+
+### Запуск
+
+```bash
+# Полная проверка
+./gradlew check
+
+# Только LoChat
+./gradlew checkstyleMain
+```
+
+### Отчёты
+
+После проверки отчёты доступны в:
+- `build/reports/checkstyle/main.html`
+
+### Настройка IntelliJ IDEA
+
+1. Установите плагин "CheckStyle-IDEA"
+2. Settings → Tools → Checkstyle
+3. Добавьте конфигурацию: `config/checkstyle/checkstyle.xml`
+
+### Disabling Checks | Отключение проверок
```java
// CHECKSTYLE:OFF
public class MyClass {
- // код без проверки
+ // code without checks
}
// CHECKSTYLE:ON
-```
-Или для конкретной строки:
-
-```java
+// Per line:
private static final int MAGIC = 42; // CHECKSTYLE IGNORE MagicNumber
```
-
-## Интеграция с IDE
-
-### IntelliJ IDEA
-1. Установить плагин "CheckStyle-IDEA"
-2. Settings → Tools → Checkstyle
-3. Добавить конфиг: `config/checkstyle/checkstyle.xml`
-4. Активировать проверку в реальном времени
-
-### VS Code
-1. Установить расширение "Checkstyle for Java"
-2. Настроить путь к конфигу в settings.json
diff --git a/config/checkstyle/checkstyle.xml b/config/checkstyle/checkstyle.xml
index 504ab7a..651930a 100644
--- a/config/checkstyle/checkstyle.xml
+++ b/config/checkstyle/checkstyle.xml
@@ -3,71 +3,185 @@
"-//Checkstyle//DTD Checkstyle Configuration 1.3//EN"
"https://checkstyle.org/dtds/configuration_1_3.dtd">
+
+
+
-
-
+
+
+
+
+
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
+
+
+
+
+
+
+
+
-
-
+
+
+
+
+
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
+
+
+
+
-
-
-
-
-
+
-
+
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
\ No newline at end of file
+
diff --git a/libs/lolib-3.0.0.jar b/libs/lolib-3.0.0.jar
deleted file mode 100644
index d0ecde3..0000000
Binary files a/libs/lolib-3.0.0.jar and /dev/null differ
diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml
index f6eb1e2..7c61714 100644
--- a/src/main/resources/config.yml
+++ b/src/main/resources/config.yml
@@ -1,143 +1,114 @@
-# ╔══════════════════════════════════════════════════════════════════════════════╗
-# ║ LoChat Configuration ║
-# ║ Единый конфиг плагина ║
-# ╚══════════════════════════════════════════════════════════════════════════════╝
+# LoChat main configuration
+# All settings for chat, gradients, moderation, RP commands, sounds, and filters.
-config-version: 5
-prefix: "D4FF[LoChat]"
+config-version: 6
+
+# ── General ────────────────────────────────────────────────────────────────────
+
+prefix: "&8[&3LoChat&8]"
+
+# ── Chat System ────────────────────────────────────────────────────────────────
-# ┌─────────────────────────────────────────────────────────────────────────────┐
-# │ Режимы чата │
-# └─────────────────────────────────────────────────────────────────────────────┘
chat:
- # Глобальный чат (все видят, активируется через "!")
global:
enabled: true
cooldown: 3
-
- # Локальный чат (только в радиусе)
+
local:
enabled: true
cooldown: 1
radius: 100
-
- # Личные сообщения
+
pm:
enabled: true
cooldown: 2
-
- # Лимиты сообщений
- min_message_length: 1
- max_message_length: 2000
- clear_lines: 100
-# ┌─────────────────────────────────────────────────────────────────────────────┐
-# │ Внешний вид чата (префиксы, форматы, цвета) │
-# └─────────────────────────────────────────────────────────────────────────────┘
+ min-message-length: 1
+ max-message-length: 2000
+ clear-lines: 100
+
+# ── Chat Appearance ────────────────────────────────────────────────────────────
+
appearance:
- # Префиксы чата (GLOBAL / LOCAL)
prefixes:
global:
- emoji: "✦"
+ emoji: "&b\u2726"
text: "GLOBAL"
- colors: ["#B798A8", "#7858E9"]
- separator:
- text: " ▶ "
- color: "#9878C9"
- message-color: "#E8E0F0"
-
+ separator: " &8\u25B6 "
+ message-color: "&7"
+
local:
- emoji: "◆"
+ emoji: "&d\u25C6"
text: "LOCAL"
- colors: ["#9878C9", "#7858E9"]
- separator:
- text: " ▶ "
- color: "#8B6BD6"
- message-color: "#E8E0F0"
-
- # Формат сообщений
- # {emoji} {prefix} {separator} {player_prefix} {player} {player_suffix} {message}
+ separator: " &8\u25B6 "
+ message-color: "&7"
+
chat-format:
- global: "{emoji} {prefix} {separator} {player_prefix}{player}{player_suffix}: {message}"
- local: "{emoji} {prefix} {separator} {player_prefix}{player}{player_suffix}: {message}"
-
- # Hover при наведении на ник
+ global: "{emoji} {prefix}{separator}{player_prefix}{player}{player_suffix}&f: {message}"
+ local: "{emoji} {prefix}{separator}{player_prefix}{player}{player_suffix}&f: {message}"
+
hover:
enabled: true
format:
- - "ẲE9▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬"
- - "B798A8✦ &f{player}"
+ - "&8\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550"
+ - " &b\u2726 &f{player}"
- ""
- - "⚖C9⏱ &fПинг: ẲE9{ping}ms"
- - "⚖C9❤ &fЗдоровье: ẲE9{health}/20"
- - "⚖C9🍖 &fГолод: ẲE9{food}/20"
+ - " &7Ping: &b{ping}ms"
+ - " &7Health: &a{health}&7/20"
+ - " &7Food: &6{food}&7/20"
- ""
- - "ẲE9▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬"
- - "B798A8✦ &fНажми чтобы написать"
-
- # Эмодзи (текстовые замены)
+ - "&8\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550"
+ - " &7Click to message"
+
emojis:
- ":heart:": "❤"
- ":star:": "★"
- ":diamond:": "♦"
- ":check:": "✓"
- ":cross:": "✗"
- ":arrow:": "→"
+ ":heart:": "\u2764"
+ ":star:": "\u2605"
+ ":diamond:": "\u2666"
+ ":check:": "\u2713"
+ ":cross:": "\u2717"
+ ":arrow:": "\u2192"
":smile:": ":)"
":sad:": ":("
- ":shrug:": "¯\\_(ツ)_/¯"
-
- # Цвета системных сообщений
- colors:
- nobody_heard: "#9878C9"
- error: "#CF6679"
- success: "#9878C9"
- warning: "#B798A8"
- info: "#A485BC"
-# ┌─────────────────────────────────────────────────────────────────────────────┐
-# │ Градиентные ники и префиксы │
-# └─────────────────────────────────────────────────────────────────────────────┘
+# ── Gradient Nicknames & Prefixes ──────────────────────────────────────────────
+
gradient:
enabled: true
use-gradient-name: true
use-custom-prefix: true
-
- # Настройки отображения
+
display:
update-display-name: true
update-tab-list: true
-
- # Лимиты
- min-colors: 1
- max-colors: 7
- max-prefix-length: 16
-
- # Цены (PlayerPoints)
- price-per-color: 50
- prefix-price: 500
- prefix-one-time-purchase: true
- use-permission-instead-of-cost: false
-
- # Кулдауны (секунды)
- color-cooldown: 60
- prefix-cooldown: 120
-
- # Форматирование
- prefix-format: "[{prefix}] "
- gradient-on-prefix: true
- gradient-on-luckperms-prefix: true
- gradient-on-luckperms-suffix: true
- continuous-gradient: true
- use-legacy-rgb-format: true
-
- # Хранилище (file / sqlite)
- storage-type: "file"
- sqlite-file: "gradient-data.db"
-# ┌─────────────────────────────────────────────────────────────────────────────┐
-# │ RP команды (/me, /do, /try, /roll) │
-# └─────────────────────────────────────────────────────────────────────────────┘
+ limits:
+ min-colors: 1
+ max-colors: 7
+ max-prefix-length: 16
+
+ pricing:
+ price-per-color: 50
+ prefix-price: 500
+ prefix-one-time-purchase: true
+ use-permission-instead-of-cost: false
+
+ cooldowns:
+ color: 60
+ prefix: 120
+
+ formatting:
+ prefix-format: "[{prefix}] "
+ gradient-on-prefix: true
+ gradient-on-luckperms-prefix: true
+ gradient-on-luckperms-suffix: true
+ continuous-gradient: true
+
+ storage:
+ type: file
+ sqlite-file: "gradient-data.db"
+
+# ── RP Commands ────────────────────────────────────────────────────────────────
+
rp:
radius: 100
cooldowns:
@@ -146,126 +117,92 @@ rp:
do: 3
roll: 2
-# ┌─────────────────────────────────────────────────────────────────────────────┐
-# │ Фильтры чата │
-# └─────────────────────────────────────────────────────────────────────────────┘
+# ── Chat Filters ───────────────────────────────────────────────────────────────
+
filters:
- # Мат-фильтр
swear:
enabled: true
replace: false
replacement: "***"
- words:
- - "хуй"
- - "пизда"
- - "ебать"
-
- # URL фильтр
+
url:
enabled: true
- replacement: "[ссылка скрыта]"
-
- # IP фильтр
+ replacement: "&7[URL hidden]"
+
ip:
enabled: true
- replacement: "[IP скрыт]"
-
- # Скрытые URL (discord.gg и т.д.)
+ replacement: "&7[IP hidden]"
+
hidden-urls:
enabled: true
patterns:
- "discord\\.gg"
- "dsc\\.gg"
-
- # Анти-спам
+ - "bit\\.ly"
+ - "tinyurl\\.com"
+
spam:
enabled: true
max-repeating-chars: 5
-
- # Анти-флуд
+
flood:
enabled: true
max-same-messages: 3
-
- # Капс
+
caps:
enabled: true
max-caps-percent: 70
min-length: 5
-# ┌─────────────────────────────────────────────────────────────────────────────┐
-# │ Модерация (муты, баны, варны) │
-# └─────────────────────────────────────────────────────────────────────────────┘
-moderation:
- # Дефолтные значения
- default-mute-duration: "7d"
- default-mute-reason: "Без причины"
- default-ban-reason: "Без причины"
-
- # Команда после мута (для голосового чата)
- voice-mute-console-command: ""
-
- # Сообщение при кике забаненного
- ban-kick-message: "CF6679Вы забанены! B798A8Причина: ẲE9{reason}"
+# ── Moderation ─────────────────────────────────────────────────────────────────
+
+moderation:
+ default-mute-duration: "7d"
+ default-mute-reason: "No reason specified"
+ default-ban-reason: "No reason specified"
+ voice-mute-console-command: ""
+ ban-kick-message: "&cYou have been banned!\n&7Reason: &f{reason}"
+
+# ── Sounds ─────────────────────────────────────────────────────────────────────
-# ┌─────────────────────────────────────────────────────────────────────────────┐
-# │ Звуки │
-# └─────────────────────────────────────────────────────────────────────────────┘
sounds:
- # Упоминание в чате
mention:
enabled: true
- sound: "BLOCK_NOTE_BLOCK_PLING"
+ sound: BLOCK_NOTE_BLOCK_PLING
volume: 1.0
pitch: 1.5
-
- # Личное сообщение
+
pm:
enabled: true
- sound: "ENTITY_EXPERIENCE_ORB_PICKUP"
+ sound: ENTITY_EXPERIENCE_ORB_PICKUP
volume: 0.8
pitch: 1.2
-
- # Команды
+
command:
enabled: false
- sound: "UI_BUTTON_CLICK"
+ sound: UI_BUTTON_CLICK
volume: 0.5
pitch: 1.0
-# ┌─────────────────────────────────────────────────────────────────────────────┐
-# │ Сообщения входа/выхода/смерти │
-# └─────────────────────────────────────────────────────────────────────────────┘
+# ── Join / Quit / Death Messages ──────────────────────────────────────────────
+
messages:
- # Сообщение при входе
- # {player} - ник игрока
join:
enabled: true
- format: "⚖C9✦ B798A8{player} ẲE9зашел на сервер"
-
- # Сообщение при выходе
+ format: "&7\u2726 &b{player} &7joined the server"
+
quit:
enabled: true
- format: "⚖C9✦ B798A8{player} ẲE9вышел с сервера"
-
- # Сообщение при смерти
- # {player} - ник игрока
- # {killer} - ник убийцы (если есть)
- # {weapon} - название оружия (если есть)
- # {death_message} - стандартное сообщение смерти
+ format: "&7\u2726 &b{player} &7left the server"
+
death:
enabled: true
- # Убийство игроком
- player_kill: "CF6679☠ B798A8{player} ẲE9был убит игроком B798A8{killer} ⚖C9({weapon})"
- # Смерть от моба
- mob_kill: "CF6679☠ B798A8{player} ẲE9был убит мобом B798A8{killer}"
- # Обычная смерть
- default: "CF6679☠ B798A8{player} ẲE9{death_message}"
+ player-kill: "&c\u2620 &7{player} was killed by &f{killer} &7(&f{weapon}&7)"
+ mob-kill: "&c\u2620 &7{player} was slain by &f{killer}"
+ default: "&c\u2620 &7{player} {death_message}"
-# ┌─────────────────────────────────────────────────────────────────────────────┐
-# │ Прочее │
-# └─────────────────────────────────────────────────────────────────────────────┘
-# Hub команда
-hub_command:
+# ── Hub Command ────────────────────────────────────────────────────────────────
+
+hub-command:
enabled: true
server: "hub"
diff --git a/src/main/resources/config/appearance.yml b/src/main/resources/config/appearance.yml
index a76805e..cf1b11a 100644
--- a/src/main/resources/config/appearance.yml
+++ b/src/main/resources/config/appearance.yml
@@ -1,136 +1,98 @@
-# ╔══════════════════════════════════════════════════════════════════════════════╗
-# ║ LoChat — config/appearance.yml ║
-# ║ In-game chat look: prefixes, format, hover, emoji shortcuts, Discord UI ║
-# ║ Palette (Spacelegacy): #B798A8 (dusty rose) → #7858E9 (violet) ║
-# ╚══════════════════════════════════════════════════════════════════════════════╝
+# LoChat chat appearance
+# Controls how messages look in-game: prefixes, format, hover, emojis.
-# ┌─────────────────────────────────────────────────────────────────────────────┐
-# │ Chat prefixes (gradient label + separator + default message color) │
-# └─────────────────────────────────────────────────────────────────────────────┘
-#
-# Gradient: use 2+ hex colors; letters are blended smoothly along the label.
-# message-color: used when the player does NOT have lochat.chat.colors (see plugin.yml).
+# ── Chat Prefixes ──────────────────────────────────────────────────────────────
prefixes:
global:
- emoji: "✦"
+ emoji: "\u2726"
text: "GLOBAL"
- colors:
- - "#B798A8"
- - "#7858E9"
- separator:
- text: " ▶ "
- color: "#9878C9"
- message-color: "#E8E0F0"
+ separator: " \u25B6 "
+ message-color: "&7"
local:
- emoji: "◆"
+ emoji: "\u25C6"
text: "LOCAL"
- colors:
- - "#9878C9"
- - "#7858E9"
- separator:
- text: " ▶ "
- color: "#8B6BD6"
- message-color: "#E8E0F0"
+ separator: " \u25B6 "
+ message-color: "&7"
-# ┌─────────────────────────────────────────────────────────────────────────────┐
-# │ Rendered chat line layout │
-# └─────────────────────────────────────────────────────────────────────────────┘
-#
+# ── Chat Format ────────────────────────────────────────────────────────────────
# Placeholders:
-# {emoji} — prefix emoji (✦ / ◆)
-# {prefix} — gradient prefix text (GLOBAL / LOCAL)
-# {separator} — separator (e.g. ▶)
-# {player_prefix} — LuckPerms / gradient prefix from LoPreff
-# {player} — display name + hover (click to /msg)
-# {player_suffix} — LuckPerms / gradient suffix from LoPreff
-# {message} — message body
-#
-# Examples:
-# Default: {emoji} {prefix} {separator} {player} : {message}
-# Minimal: {player_prefix} {player} ▶ {message}
-# Custom: ✦ {player_prefix} {player} {player_suffix} ▶ {message}
+# {emoji}, {prefix}, {separator}
+# {player_prefix}, {player}, {player_suffix}
+# {message}
chat-format:
- global: "{emoji} {prefix} {separator} {player_prefix}{player}{player_suffix} : {message}"
- local: "{emoji} {prefix} {separator} {player_prefix}{player}{player_suffix} : {message}"
+ global: "{emoji} {prefix}{separator}{player_prefix}{player}{player_suffix}&f: {message}"
+ local: "{emoji} {prefix}{separator}{player_prefix}{player}{player_suffix}&f: {message}"
-# ┌─────────────────────────────────────────────────────────────────────────────┐
-# │ Hover shown when pointing at the player name in chat │
-# └─────────────────────────────────────────────────────────────────────────────┘
+# ── Hover on Player Name ───────────────────────────────────────────────────────
hover:
enabled: true
format:
- - "ẲE9▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬"
- - "B798A8✦ &f{player}"
+ - "&8\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550"
+ - " \u2726 &f{player}"
- ""
- - "⚖C9⏱ &fПинг: ẲE9{ping}ms"
- - "⚖C9❤ &fЗдоровье: ẲE9{health}/20"
- - "⚖C9🍖 &fГолод: ẲE9{food}/20"
+ - " &7Ping: &b{ping}ms"
+ - " &7Health: &a{health}&7/20"
+ - " &7Food: &6{food}&7/20"
- ""
- - "ẲE9▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬"
- - "B798A8✦ &fНажми чтобы написать"
+ - "&8\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550"
+ - " &7Click to message"
-# ┌─────────────────────────────────────────────────────────────────────────────┐
-# │ Text shortcuts → unicode (applied to outgoing chat before URLs / mentions) │
-# └─────────────────────────────────────────────────────────────────────────────┘
+# ── Emoji Shortcuts ────────────────────────────────────────────────────────────
+# Text shortcuts replaced in outgoing messages before processing.
emojis:
- ":heart:": "❤"
- ":hearts:": "♥"
- ":star:": "★"
- ":stars:": "✦"
- ":diamond:": "♦"
- ":check:": "✓"
- ":cross:": "✗"
- ":arrow:": "→"
- ":up:": "↑"
- ":down:": "↓"
- ":left:": "←"
- ":right:": "→"
- ":music:": "♪"
- ":note:": "♫"
+ ":heart:": "\u2764"
+ ":hearts:": "\u2665"
+ ":star:": "\u2605"
+ ":stars:": "\u2726"
+ ":diamond:": "\u2666"
+ ":check:": "\u2713"
+ ":cross:": "\u2717"
+ ":arrow:": "\u2192"
+ ":up:": "\u2191"
+ ":down:": "\u2193"
+ ":left:": "\u2190"
+ ":right:": "\u2192"
+ ":music:": "\u266A"
+ ":note:": "\u266B"
":smile:": ":)"
":sad:": ":("
- ":wink:": ";)"
- ":shrug:": "¯\\_(ツ)_/¯"
+ ":shrug:": "\u00AF\\_(\u30C4)_/\u00AF"
-# ┌─────────────────────────────────────────────────────────────────────────────┐
-# │ Radius, length limits, and misc chat UI colors (plugin internals) │
-# └─────────────────────────────────────────────────────────────────────────────┘
+# ── Chat Settings ──────────────────────────────────────────────────────────────
chat:
- local_radius: 100
- clear_lines: 100
- min_message_length: 1
- max_message_length: 2000
+ local-radius: 100
+ clear-lines: 100
+ min-message-length: 1
+ max-message-length: 2000
colors:
- nobody_heard: "#9878C9"
- error: "#CF6679"
- success: "#9878C9"
- warning: "#B798A8"
- info: "#A485BC"
+ nobody-heard: "&7"
+ error: "&c"
+ success: "&a"
+ warning: "&6"
+ info: "&7"
-# ┌─────────────────────────────────────────────────────────────────────────────┐
-# │ Discord webhook embeds (see also config/discord.yml for webhooks) │
-# └─────────────────────────────────────────────────────────────────────────────┘
+# ── Discord Embeds ─────────────────────────────────────────────────────────────
discord:
emojis:
- global_chat: "✦"
- local_chat: "◆"
- player_join: "♦"
- player_quit: "◈"
- player_death: "✗"
- avatar_urls:
+ global-chat: "\u2726"
+ local-chat: "\u25C6"
+ player-join: "\u25C6"
+ player-quit: "\u25C7"
+ player-death: "\u2717"
+ avatar-urls:
default: "https://mc-heads.net/avatar/minecraft/64"
player: "https://mc-heads.net/avatar/{player}/64"
- default_embed_color: "7858E9"
- event_titles:
- join: "♦ Игрок зашел на сервер"
- quit: "◈ Игрок покинул сервер"
- death: "✗ Смерть игрока"
- global_chat: "✦ Глобальный чат"
- local_chat: "◆ Локальный чат"
+ default-embed-color: "3498DB"
+ event-titles:
+ join: "Player joined"
+ quit: "Player left"
+ death: "Player died"
+ global-chat: "Global Chat"
+ local-chat: "Local Chat"
diff --git a/src/main/resources/config/discord.yml b/src/main/resources/config/discord.yml
index 1070b6a..d8c849c 100644
--- a/src/main/resources/config/discord.yml
+++ b/src/main/resources/config/discord.yml
@@ -1,110 +1,73 @@
-# ╔══════════════════════════════════════════════════════════════════════════════╗
-# ║ Discord Integration ║
-# ║ Интеграция с Discord ║
-# ╚══════════════════════════════════════════════════════════════════════════════╝
+# LoChat Discord integration
+# Relays chat messages and server events to a Discord channel via webhook.
+
+# ── General ────────────────────────────────────────────────────────────────────
-# Включить интеграцию с Discord
enabled: true
-# Настройки вебхука
+# ── Webhook ────────────────────────────────────────────────────────────────────
+
webhook:
- # URL вебхука Discord (получить в настройках канала)
url: "https://discord.com/api/webhooks/YOUR_WEBHOOK_ID/YOUR_WEBHOOK_TOKEN"
-
- # Имя бота в Discord
- username: "Minecraft Server"
-
- # Аватар бота (URL изображения)
- avatar_url: "https://mc-heads.net/avatar/minecraft/64"
+ username: "Minecraft"
+ avatar-url: "https://mc-heads.net/avatar/minecraft/64"
+
+# ── Chat Relay ─────────────────────────────────────────────────────────────────
-# Настройки чата
chat:
- # Отправлять сообщения чата в Discord
enabled: true
-
- # Отправлять только глобальный чат (true) или весь чат (false)
- global_only: true
-
- # Формат сообщения чата
+ global-only: true
format: "**{player}**: {message}"
-
- # Цвет embed для сообщений чата (hex без #)
- embed_color: "5865F2"
-
- # Использовать embed или обычное сообщение
- use_embed: true
+ embed-color: "5865F2"
+ use-embed: true
+
+# ── Events ─────────────────────────────────────────────────────────────────────
-# Настройки событий игроков
events:
- # Отправлять события входа/выхода
enabled: true
-
- # Настройки входа на сервер
- # {player} - ник игрока
+
join:
enabled: true
- title: "🟢 Игрок зашел на сервер"
- description: "**{player}** присоединился к серверу"
+ title: "Player joined"
+ description: "**{player}** joined the server"
color: "00FF00"
thumbnail: "https://mc-heads.net/avatar/{player}/64"
-
- # Настройки выхода с сервера
- # {player} - ник игрока
+
quit:
enabled: true
- title: "🔴 Игрок покинул сервер"
- description: "**{player}** покинул сервер"
+ title: "Player left"
+ description: "**{player}** left the server"
color: "FF0000"
thumbnail: "https://mc-heads.net/avatar/{player}/64"
-
- # Настройки смерти игрока
- # {player} - ник игрока
- # {killer} - ник убийцы (если есть)
- # {weapon} - название оружия (если есть)
- # {death_message} - стандартное сообщение смерти
+
death:
enabled: true
- # Убийство игроком
- player_kill:
- title: "⚔️ PvP убийство"
- description: "**{player}** был убит игроком **{killer}** с помощью **{weapon}**"
+ player-kill:
+ title: "PvP kill"
+ description: "**{player}** was killed by **{killer}** using **{weapon}**"
color: "FF0000"
- # Смерть от моба
- mob_kill:
- title: "💀 Смерть от моба"
- description: "**{player}** был убит мобом **{killer}**"
+ mob-kill:
+ title: "Mob kill"
+ description: "**{player}** was slain by **{killer}**"
color: "800080"
- # Обычная смерть
default:
- title: "💀 Смерть игрока"
+ title: "Player died"
description: "**{player}** {death_message}"
color: "800080"
thumbnail: "https://mc-heads.net/avatar/{player}/64"
-# Настройки фильтрации
-filter:
- # Игнорировать сообщения от ботов
- ignore_bots: true
-
- # Минимальная длина сообщения для отправки
- min_message_length: 1
-
- # Максимальная длина сообщения (обрезать если больше)
- max_message_length: 2000
-
- # Заменять @everyone и @here на безопасные варианты
- sanitize_mentions: true
+# ── Filtering ──────────────────────────────────────────────────────────────────
+
+filter:
+ ignore-bots: true
+ min-message-length: 1
+ max-message-length: 2000
+ sanitize-mentions: true
+
+# ── Performance ────────────────────────────────────────────────────────────────
-# Настройки производительности
performance:
- # Асинхронная отправка (рекомендуется)
async: true
-
- # Таймаут подключения (секунды)
timeout: 10
-
- # Повторные попытки при ошибке
- retry_attempts: 3
-
- # Задержка между попытками (миллисекунды)
- retry_delay: 1000
\ No newline at end of file
+ retry-attempts: 3
+ retry-delay: 1000
diff --git a/src/main/resources/config/filters.yml b/src/main/resources/config/filters.yml
index 029c0f0..5638e7f 100644
--- a/src/main/resources/config/filters.yml
+++ b/src/main/resources/config/filters.yml
@@ -1,44 +1,34 @@
-# ╔══════════════════════════════════════════════════════════════════════════════╗
-# ║ LoChat — Фильтры чата ║
-# ╚══════════════════════════════════════════════════════════════════════════════╝
+# LoChat chat filters
+# Control spam, swearing, URLs, and other unwanted content.
-# ┌─────────────────────────────────────────────────────────────────────────────┐
-# │ Мат-фильтр │
-# └─────────────────────────────────────────────────────────────────────────────┘
-# Использует badwords.txt для списка слов
-# Автоматически ловит замены букв: х->x, о->o, е->e и т.д.
-# Обход: lochat.bypass.swear
+# ── Swear Filter ───────────────────────────────────────────────────────────────
+# Uses badwords.txt for the word list.
+# Bypass permission: lochat.bypass.swear
swear:
enabled: true
- replace: false # true = заменять на ***, false = блокировать сообщение
+ replace: false
replacement: "***"
-# ┌─────────────────────────────────────────────────────────────────────────────┐
-# │ URL фильтр │
-# └─────────────────────────────────────────────────────────────────────────────┘
-# Блокирует ссылки в чате
-# Обход: lochat.bypass.urlfilter
+# ── URL Filter ─────────────────────────────────────────────────────────────────
+# Blocks URLs in messages.
+# Bypass permission: lochat.bypass.urlfilter
url:
enabled: true
- replacement: "[ссылка скрыта]"
+ replacement: "&7[URL hidden]"
-# ┌─────────────────────────────────────────────────────────────────────────────┐
-# │ IP фильтр │
-# └─────────────────────────────────────────────────────────────────────────────┘
-# Блокирует IP адреса в чате
-# Обход: lochat.bypass.ipfilter
+# ── IP Filter ──────────────────────────────────────────────────────────────────
+# Blocks IP addresses in messages.
+# Bypass permission: lochat.bypass.ipfilter
ip:
enabled: true
- replacement: "[IP скрыт]"
+ replacement: "&7[IP hidden]"
-# ┌─────────────────────────────────────────────────────────────────────────────┐
-# │ Скрытые URL (discord.gg и т.д.) │
-# └─────────────────────────────────────────────────────────────────────────────┘
-# Блокирует популярные сокращенные ссылки
-# Обход: lochat.bypass.hiddenurls
+# ── Hidden URL Filter ──────────────────────────────────────────────────────────
+# Blocks known link shorteners and invite links.
+# Bypass permission: lochat.bypass.hiddenurls
hidden-urls:
enabled: true
@@ -49,33 +39,27 @@ hidden-urls:
- "tinyurl\\.com"
- "goo\\.gl"
-# ┌─────────────────────────────────────────────────────────────────────────────┐
-# │ Анти-спам │
-# └─────────────────────────────────────────────────────────────────────────────┘
-# Блокирует повторяющиеся символы (ааааааа, хххххх)
-# Обход: lochat.bypass.spam
+# ── Spam Filter ────────────────────────────────────────────────────────────────
+# Blocks messages with excessive repeated characters.
+# Bypass permission: lochat.bypass.spam
spam:
enabled: true
- max-repeating-chars: 5 # Максимум повторений одного символа
+ max-repeating-chars: 5
-# ┌─────────────────────────────────────────────────────────────────────────────┐
-# │ Анти-флуд │
-# └─────────────────────────────────────────────────────────────────────────────┘
-# Блокирует одинаковые сообщения подряд
-# Обход: lochat.bypass.flood
+# ── Flood Filter ───────────────────────────────────────────────────────────────
+# Blocks identical messages sent in quick succession.
+# Bypass permission: lochat.bypass.flood
flood:
enabled: true
- max-same-messages: 3 # Сколько раз можно отправить одно и то же
+ max-same-messages: 3
-# ┌─────────────────────────────────────────────────────────────────────────────┐
-# │ Капс-фильтр │
-# └─────────────────────────────────────────────────────────────────────────────┘
-# Блокирует сообщения с большим количеством заглавных букв
-# Обход: lochat.bypass.caps
+# ── CAPS Filter ────────────────────────────────────────────────────────────────
+# Blocks messages with too many capital letters.
+# Bypass permission: lochat.bypass.caps
caps:
enabled: true
- max-caps-percent: 70 # Максимум % заглавных букв
- min-length: 5 # Минимальная длина для проверки
+ max-caps-percent: 70
+ min-length: 5
diff --git a/src/main/resources/config/messages.yml b/src/main/resources/config/messages.yml
index 8da71fb..f7ff89a 100644
--- a/src/main/resources/config/messages.yml
+++ b/src/main/resources/config/messages.yml
@@ -1,137 +1,123 @@
-# ╔══════════════════════════════════════════════════════════════════════════════╗
-# ║ LoChat Hardcoded Messages ║
-# ║ Цветовая гамма: Spacelegacy ║
-# ║ #B798A8 → #7858E9 ║
-# ╚══════════════════════════════════════════════════════════════════════════════╝
+# LoChat system messages
+# Internal messages for commands, filters, moderation, and general feedback.
+
+# ── Commands ───────────────────────────────────────────────────────────────────
commands:
mute:
- usage: "B798A8Использование: ẲE9/mute <ник> [время] [-s] [причина]"
- time_help: "⚖C9Время: ẲE91d⚖C9, ẲE92h⚖C9, ẲE930m⚖C9, ẲE960s⚖C9, ẲE9perm"
- silent_help: "B798A8-s ⚖C9— тихий мут (право ẲE9lochat.mute.silent⚖C9)"
- no_silent_permission: "CF6679Нет права на тихий мут"
- default_reason: "Без причины"
- default_duration: "7d"
+ usage: "&cUsage: &f/mute [time] [-s] [reason]"
+ time-help: "&7Time format: &f1d&7, &f2h&7, &f30m&7, &f60s&7, &fperm"
+ silent-help: "&7-s &7= silent mute (requires &flochat.mute.silent&7)"
+ no-silent-permission: "&cNo permission for silent mute"
+ default-reason: "No reason specified"
+ default-duration: "7d"
cooldown:
- message: "B798A8Подождите ẲE9{remaining} B798A8сек"
+ message: "&cPlease wait &f{remaining} &cseconds"
- clear_chat:
- lines_cleared: "⚖C9Чат очищен ẲE9({lines} строк⚖C9)"
- no_permission: "CF6679Нет прав для очистки чата"
+ clear-chat:
+ lines-cleared: "&aChat cleared &7({lines} lines)"
+ no-permission: "&cNo permission to clear chat"
-# ┌─────────────────────────────────────────────────────────────────────────────┐
-# │ ЛОКАЛЬНЫЙ ЧАТ │
-# └─────────────────────────────────────────────────────────────────────────────┘
+# ── Local Chat ─────────────────────────────────────────────────────────────────
-local_chat:
- nobody_heard: "⚖C9Вас никто не услышал B798A8— рядом нет игроков"
- no_players_nearby: "B798A8Рядом нет игроков"
+local-chat:
+ nobody-heard: "&7Nobody heard you — no players nearby"
+ no-players-nearby: "&7No players nearby"
-# ┌─────────────────────────────────────────────────────────────────────────────┐
-# │ ФИЛЬТРЫ │
-# └─────────────────────────────────────────────────────────────────────────────┘
+# ── Filters ────────────────────────────────────────────────────────────────────
filters:
caps:
- min_length: 3
- blocked_message: "CF6679Не кричите в чате"
- auto_lowercase_notice: "B798A8Сообщение автоматически исправлено"
+ min-length: 3
+ blocked-message: "&cPlease don't shout"
+ auto-lowercase-notice: "&7Message auto-corrected"
spam:
- blocked_message: "CF6679Не спамьте"
- similar_message: "CF6679Вы уже отправляли похожее сообщение"
+ blocked-message: "&cDo not spam"
+ similar-message: "&cYou already sent a similar message"
swear:
- blocked_message: "CF6679Запрещённые слова"
- replaced_notice: "B798A8Некоторые слова заменены"
+ blocked-message: "&cInappropriate language"
+ replaced-notice: "&7Some words were replaced"
-# ┌─────────────────────────────────────────────────────────────────────────────┐
-# │ МУТИРОВАНИЕ │
-# └─────────────────────────────────────────────────────────────────────────────┘
+# ── Mute Messages ──────────────────────────────────────────────────────────────
mute:
- muted_message: "CF6679Вы замучены! B798A8Причина: ẲE9{reason}B798A8. Осталось: ẲE9{time}"
- muted_permanent: "CF6679Вы замучены навсегда! B798A8Причина: ẲE9{reason}"
- player_muted: "⚖C9Игрок ẲE9{player} ⚖C9замучен на ẲE9{time}⚖C9. Причина: B798A8{reason}"
- player_muted_permanent: "⚖C9Игрок ẲE9{player} ⚖C9замучен навсегда. Причина: B798A8{reason}"
- player_muted_silent: "B798A8[⚖C9ТИХИЙ МУТB798A8] ẲE9{player} B798A8замучен на ẲE9{time}"
- player_unmuted: "⚖C9Игрок ẲE9{player} ⚖C9размучен"
- not_muted: "B798A8Игрок ẲE9{player} B798A8не замучен"
- player_not_found: "CF6679Игрок не найден!"
- invalid_time: "CF6679Неверный формат времени!"
- already_muted: "CF6679Игрок уже замучен!"
- no_silent_unmute_permission: "CF6679Нет права на тихий размут!"
- player_not_muted_simple: "CF6679Игрок не замучен!"
+ muted-message: "&cYou are muted! &7Reason: &f{reason}&7. Remaining: &f{time}"
+ muted-permanent: "&cYou are permanently muted! &7Reason: &f{reason}"
+ player-muted: "&aPlayer &f{player} &amuted for &f{time}&a. Reason: &7{reason}"
+ player-muted-permanent: "&aPlayer &f{player} &amuted permanently. Reason: &7{reason}"
+ player-muted-silent: "&8[&7SILENT&8] &f{player} &7muted for &f{time}"
+ player-unmuted: "&aPlayer &f{player} &aunmuted"
+ not-muted: "&7Player &f{player} &7is not muted"
+ player-not-found: "&cPlayer not found!"
+ invalid-time: "&cInvalid time format!"
+ already-muted: "&cPlayer is already muted!"
+ no-silent-unmute-permission: "&cNo permission for silent unmute"
-# ┌─────────────────────────────────────────────────────────────────────────────┐
-# │ ИГРОВЫЕ РЕЖИМЫ │
-# └─────────────────────────────────────────────────────────────────────────────┘
+# ── Gamemodes ──────────────────────────────────────────────────────────────────
gamemodes:
- survival: "Выживание"
- creative: "Творчество"
- adventure: "Приключение"
- spectator: "Наблюдатель"
+ survival: "Survival"
+ creative: "Creative"
+ adventure: "Adventure"
+ spectator: "Spectator"
-# ┌─────────────────────────────────────────────────────────────────────────────┐
-# │ ЛИЧНЫЕ СООБЩЕНИЯ │
-# └─────────────────────────────────────────────────────────────────────────────┘
+# ── Private Messages ───────────────────────────────────────────────────────────
-private_messages:
- no_reply_target: "CF6679Нет цели для ответа"
- message_sent: "B798A8Сообщение отправлено ẲE9{player}"
- player_offline: "CF6679Игрок ẲE9{player} CF6679не в сети"
- cannot_message_self: "CF6679Нельзя писать самому себе"
+private-messages:
+ no-reply-target: "&cNobody to reply to"
+ message-sent: "&aMessage sent to &f{player}"
+ player-offline: "&cPlayer &f{player} &cis not online"
+ cannot-message-self: "&cYou cannot message yourself"
-# ┌─────────────────────────────────────────────────────────────────────────────┐
-# │ ИГНОРИРОВАНИЕ │
-# └─────────────────────────────────────────────────────────────────────────────┘
+# ── Ignore ─────────────────────────────────────────────────────────────────────
ignore:
- player_ignored: "⚖C9Игрок ẲE9{player} ⚖C9добавлен в игнор"
- player_unignored: "⚖C9Игрок ẲE9{player} ⚖C9убран из игнора"
- already_ignored: "B798A8Игрок ẲE9{player} B798A8уже в игноре"
- not_ignored: "B798A8Игрок ẲE9{player} B798A8не в игноре"
- cannot_ignore_self: "CF6679Нельзя игнорировать самого себя"
- ignore_list_empty: "B798A8Список игнора пуст"
- ignore_list_header: "B798A8Игнорируемые игроки⚖C9:"
+ player-ignored: "&aPlayer &f{player} &ais now ignored"
+ player-unignored: "&aPlayer &f{player} &ais no longer ignored"
+ already-ignored: "&7Player &f{player} &7is already ignored"
+ not-ignored: "&7Player &f{player} &7is not ignored"
+ cannot-ignore-self: "&cYou cannot ignore yourself"
+ ignore-list-empty: "&7Your ignore list is empty"
+ ignore-list-header: "&7Ignored players:"
-# ┌─────────────────────────────────────────────────────────────────────────────┐
-# │ ОБЩИЕ СООБЩЕНИЯ │
-# └─────────────────────────────────────────────────────────────────────────────┘
+# ── General ────────────────────────────────────────────────────────────────────
general:
- no_permission: "CF6679Нет прав!"
- player_only: "CF6679Только для игроков!"
- invalid_arguments: "CF6679Неверные аргументы!"
- command_disabled: "CF6679Команда отключена!"
- feature_disabled: "CF6679Функция отключена!"
- player_not_found: "CF6679Игрок не найден!"
- time_formats:
- seconds: "сек"
- minutes: "мин"
- hours: "ч"
- days: "д"
- permanent: "навсегда"
- enabled: "ẲE9Включено"
- disabled: "B798A8Отключено"
- online: "⚖C9В сети"
- offline: "B798A8Не в сети"
+ no-permission: "&cNo permission!"
+ player-only: "&cPlayers only!"
+ invalid-arguments: "&cInvalid arguments!"
+ command-disabled: "&cCommand disabled!"
+ feature-disabled: "&cFeature disabled!"
+ player-not-found: "&cPlayer not found!"
+ time-formats:
+ seconds: "s"
+ minutes: "m"
+ hours: "h"
+ days: "d"
+ permanent: "permanent"
+ enabled: "&aEnabled"
+ disabled: "&7Disabled"
+ online: "&aOnline"
+ offline: "&7Offline"
-# ┌─────────────────────────────────────────────────────────────────────────────┐
-# │ ВАРНЫ / БАНЫ (LoChat) │
-# └─────────────────────────────────────────────────────────────────────────────┘
+# ── Moderation ─────────────────────────────────────────────────────────────────
moderation:
- default_reason: "Без причины"
- duration_permanent: "навсегда"
- warn_received: "CF6679⚠ Вам выдано предупреждение! B798A8Причина: ẲE9{reason}"
- warn_staff_confirm: "⚖C9Игроку ẲE9{player} ⚖C9выдан варн. B798A8Причина: ẲE9{reason}"
- silent_warn_staff: "B798A8[⚖C9ТИХИЙ ВАРНB798A8] ẲE9{player}⚖C9: B798A8{reason}"
- ban_usage: "B798A8Использование: ẲE9/lban <ник> [время|perm] [причина]"
- ban_confirm: "⚖C9Игрок ẲE9{player} ⚖C9забанен. B798A8Срок: ẲE9{duration}"
- unban_confirm: "⚖C9Бан снят с ẲE9{player}"
- not_banned: "CF6679Игрок не забанен!"
- already_banned: "CF6679Игрок уже забанен!"
- warn_usage: "B798A8Использование: ẲE9/warn <ник> [причина]"
- silent_warn_usage: "B798A8Использование: ẲE9/silentwarn <ник> [причина]"
- ban_kick_message: "═══════ ДОСТУП ЗАПРЕЩЁН ═══════\nВы заблокированы на этом сервере.\nПричина: {reason}\nМодератор: {moderator}\nСрок: <#7858E9>{duration}#7858E9>\n════════════════════════"
+ default-reason: "No reason specified"
+ duration-permanent: "permanent"
+ warn-received: "&6\u26A0 &cYou received a warning! &7Reason: &f{reason}"
+ warn-staff-confirm: "&aPlayer &f{player} &awarned. &7Reason: &f{reason}"
+ silent-warn-staff: "&8[&7SILENT&8] &f{player}&7: &7{reason}"
+ ban-usage: "&cUsage: &f/lban [time|perm] [reason]"
+ ban-confirm: "&aPlayer &f{player} &abanned. &7Duration: &f{duration}"
+ unban-confirm: "&aBan lifted for &f{player}"
+ not-banned: "&cPlayer is not banned!"
+ already-banned: "&cPlayer is already banned!"
+ warn-usage: "&cUsage: &f/warn [reason]"
+ silent-warn-usage: "&cUsage: &f/silentwarn [reason]"
+ ban-kick-message: |
+ You are banned from this server.
+ Reason: {reason}
+ Moderator: {moderator}
+ Duration: {duration}
diff --git a/src/main/resources/config/mute.yml b/src/main/resources/config/mute.yml
index 675c031..848fbc6 100644
--- a/src/main/resources/config/mute.yml
+++ b/src/main/resources/config/mute.yml
@@ -1,290 +1,212 @@
-# ╔══════════════════════════════════════════════════════════════════════════════╗
-# ║ LoChat Mute Configuration ║
-# ║ Конфигурация мутов ║
-# ║ Версия: 1.5.5-1.20.1 ║
-# ╚══════════════════════════════════════════════════════════════════════════════╝
+# LoChat mute system configuration
+# Controls mute durations, automatic mutes, escalation, and notifications.
-# ┌─────────────────────────────────────────────────────────────────────────────┐
-# │ ОСНОВНЫЕ НАСТРОЙКИ │
-# └─────────────────────────────────────────────────────────────────────────────┘
+# ── General Settings ───────────────────────────────────────────────────────────
settings:
- # Причина мута по умолчанию
- default-reason: "Нарушение правил чата"
-
- # Длительность мута по умолчанию
+ default-reason: "Chat rule violation"
default-duration: "1h"
-
- # Максимальная длина причины мута
max-reason-length: 100
-
- # Показывать причину мута игроку
show-reason: true
-
- # Показывать оставшееся время мута
show-remaining-time: true
-
- # Автоматически размучивать при истечении времени
auto-unmute: true
-
- # Сохранять историю мутов
save-history: true
-
- # Максимальное количество записей в истории на игрока
max-history-entries: 50
-# ┌─────────────────────────────────────────────────────────────────────────────┐
-# │ ДОСТУПНЫЕ ДЛИТЕЛЬНОСТИ │
-# └─────────────────────────────────────────────────────────────────────────────┘
+# ── Available Durations ────────────────────────────────────────────────────────
+# Each duration requires a permission. Empty permission = no restriction.
durations:
- # Формат: "время": "право для использования"
"5m":
permission: "lochat.mute.dur.5m"
- display: "5 минут"
-
+ display: "5 minutes"
+
"10m":
permission: "lochat.mute.dur.10m"
- display: "10 минут"
-
+ display: "10 minutes"
+
"30m":
permission: "lochat.mute.dur.30m"
- display: "30 минут"
-
+ display: "30 minutes"
+
"1h":
permission: "lochat.mute.dur.1h"
- display: "1 час"
-
+ display: "1 hour"
+
"3h":
permission: "lochat.mute.dur.3h"
- display: "3 часа"
-
+ display: "3 hours"
+
"6h":
permission: "lochat.mute.dur.6h"
- display: "6 часов"
-
+ display: "6 hours"
+
"12h":
permission: "lochat.mute.dur.12h"
- display: "12 часов"
-
+ display: "12 hours"
+
"1d":
permission: "lochat.mute.dur.1d"
- display: "1 день"
-
+ display: "1 day"
+
"3d":
permission: "lochat.mute.dur.3d"
- display: "3 дня"
-
+ display: "3 days"
+
"7d":
permission: "lochat.mute.dur.7d"
- display: "7 дней"
-
+ display: "7 days"
+
"14d":
permission: "lochat.mute.dur.14d"
- display: "14 дней"
-
+ display: "14 days"
+
"30d":
permission: "lochat.mute.dur.30d"
- display: "30 дней"
-
+ display: "30 days"
+
"perm":
permission: "lochat.mute.dur.perm"
- display: "Навсегда"
+ display: "Permanent"
-# ┌─────────────────────────────────────────────────────────────────────────────┐
-# │ ГОТОВЫЕ ПРИЧИНЫ │
-# └─────────────────────────────────────────────────────────────────────────────┘
+# ── Preset Reasons ─────────────────────────────────────────────────────────────
reasons:
spam:
- text: "Спам в чате"
+ text: "Spam"
duration: "30m"
permission: "lochat.mute.reason.spam"
-
+
caps:
- text: "Злоупотребление заглавными буквами"
+ text: "Excessive caps"
duration: "15m"
permission: "lochat.mute.reason.caps"
-
+
swear:
- text: "Использование нецензурной лексики"
+ text: "Inappropriate language"
duration: "1h"
permission: "lochat.mute.reason.swear"
-
+
flood:
- text: "Флуд в чате"
+ text: "Flood"
duration: "20m"
permission: "lochat.mute.reason.flood"
-
+
advertising:
- text: "Реклама"
+ text: "Advertising"
duration: "3h"
permission: "lochat.mute.reason.advertising"
-
+
insult:
- text: "Оскорбления игроков"
+ text: "Insulting players"
duration: "2h"
permission: "lochat.mute.reason.insult"
-
- toxicity:
- text: "Токсичное поведение"
- duration: "6h"
- permission: "lochat.mute.reason.toxicity"
-
- politics:
- text: "Обсуждение политики"
- duration: "1h"
- permission: "lochat.mute.reason.politics"
-
- religion:
- text: "Религиозные споры"
- duration: "1h"
- permission: "lochat.mute.reason.religion"
-
- begging:
- text: "Попрошайничество"
- duration: "30m"
- permission: "lochat.mute.reason.begging"
-# ┌─────────────────────────────────────────────────────────────────────────────┐
-# │ АВТОМАТИЧЕСКИЕ МУТЫ │
-# └─────────────────────────────────────────────────────────────────────────────┘
+# ── Auto-Mute ──────────────────────────────────────────────────────────────────
auto-mute:
- # Включить автоматические муты
enabled: true
-
- # Мут за спам
+
spam:
enabled: true
- threshold: 5 # Количество сообщений
- time-window: 10 # За какое время (секунды)
+ threshold: 5
+ time-window: 10
duration: "10m"
- reason: "Автомут: спам в чате"
-
- # Мут за мат
+ reason: "Auto-mute: spam"
+
swear:
enabled: true
- threshold: 3 # Количество нарушений
+ threshold: 3
duration: "30m"
- reason: "Автомут: использование мата"
-
- # Мут за заглавные буквы
+ reason: "Auto-mute: inappropriate language"
+
caps:
enabled: true
- threshold: 5 # Количество нарушений
+ threshold: 5
duration: "5m"
- reason: "Автомут: злоупотребление CAPS"
-
- # Мут за рекламу
+ reason: "Auto-mute: excessive caps"
+
advertising:
enabled: true
- threshold: 1 # Одно нарушение
+ threshold: 1
duration: "1h"
- reason: "Автомут: реклама"
+ reason: "Auto-mute: advertising"
-# ┌─────────────────────────────────────────────────────────────────────────────┐
-# │ ЭСКАЛАЦИЯ НАКАЗАНИЙ │
-# └─────────────────────────────────────────────────────────────────────────────┘
+# ── Punishment Escalation ──────────────────────────────────────────────────────
escalation:
- # Включить эскалацию наказаний
enabled: true
-
- # Период для подсчета нарушений (дни)
period: 30
-
- # Уровни наказаний
+
levels:
1:
duration: "30m"
- reason: "Первое нарушение"
-
+ reason: "First offense"
+
2:
duration: "2h"
- reason: "Повторное нарушение"
-
+ reason: "Second offense"
+
3:
duration: "12h"
- reason: "Третье нарушение"
-
+ reason: "Third offense"
+
4:
duration: "3d"
- reason: "Четвертое нарушение"
-
+ reason: "Fourth offense"
+
5:
duration: "7d"
- reason: "Пятое нарушение"
-
+ reason: "Fifth offense"
+
6:
duration: "perm"
- reason: "Систематические нарушения"
+ reason: "Systematic violations"
-# ┌─────────────────────────────────────────────────────────────────────────────┐
-# │ УВЕДОМЛЕНИЯ │
-# └─────────────────────────────────────────────────────────────────────────────┘
+# ── Notifications ──────────────────────────────────────────────────────────────
notifications:
- # Уведомлять администраторов о мутах
notify-staff: true
-
- # Право для получения уведомлений
staff-permission: "lochat.mute.notify"
-
- # Публичные уведомления о мутах
public-mute: false
-
- # Публичные уведомления о размутах
public-unmute: false
-
- # Скрытые муты (с флагом -s)
+
silent-mute:
enabled: true
permission: "lochat.mute.silent"
notify-permission: "lochat.mute.see-silent"
-
- # Формат уведомлений
- formats:
- mute: "FF6B6B{moderator} замутил {player} на {duration}. Причина: {reason}"
- unmute: "BCB77{moderator} размутил {player}"
- silent-mute: "FFA726[ТИХО] {moderator} замутил {player} на {duration}. Причина: {reason}"
- auto-mute: "FF6B6B[АВТО] {player} замучен на {duration}. Причина: {reason}"
-# ┌─────────────────────────────────────────────────────────────────────────────┐
-# │ ИНТЕГРАЦИИ │
-# └─────────────────────────────────────────────────────────────────────────────┘
+ formats:
+ mute: "&c{moderator} &7muted &f{player} &7for &f{duration}&7. Reason: &f{reason}"
+ unmute: "&a{moderator} &7unmuted &f{player}"
+ silent-mute: "&6[SILENT] &f{moderator} &7muted &f{player} &7for &f{duration}"
+ auto-mute: "&c[AUTO] &f{player} &7muted for &f{duration}&7. Reason: &f{reason}"
+
+# ── Integrations ───────────────────────────────────────────────────────────────
integrations:
- # LibertyBans
libertybans:
enabled: false
sync-mutes: true
-
- # AdvancedBan
+
advancedban:
enabled: false
sync-mutes: true
-
- # LiteBans
+
litebans:
enabled: false
sync-mutes: true
-
- # Discord уведомления
+
discord:
enabled: false
webhook-url: ""
- format: "**{moderator}** замутил **{player}** на **{duration}**\nПричина: {reason}"
+ format: "**{moderator}** muted **{player}** for **{duration}**\nReason: {reason}"
-# ┌─────────────────────────────────────────────────────────────────────────────┐
-# │ ХРАНЕНИЕ ДАННЫХ │
-# └─────────────────────────────────────────────────────────────────────────────┘
+# ── Storage ────────────────────────────────────────────────────────────────────
storage:
- # Тип хранения: file, mysql, sqlite
- type: "file"
-
- # Настройки MySQL
+ type: file
+
mysql:
host: "localhost"
port: 3306
@@ -292,45 +214,36 @@ storage:
username: "root"
password: "password"
table-prefix: "lochat_"
-
- # Настройки SQLite
+
sqlite:
file: "plugins/LoChat/mutes.db"
-
- # Автоматическая очистка старых записей
+
cleanup:
enabled: true
- days: 90 # Удалять записи старше N дней
+ days: 90
-# ┌─────────────────────────────────────────────────────────────────────────────┐
-# │ ДОПОЛНИТЕЛЬНЫЕ ФУНКЦИИ │
-# └─────────────────────────────────────────────────────────────────────────────┘
+# ── Extra Features ─────────────────────────────────────────────────────────────
features:
- # Временные муты (автоматически снимаются)
temporary-mutes: true
-
- # IP муты (мутить по IP адресу)
+
ip-mutes:
enabled: false
permission: "lochat.mute.ip"
-
- # Мут команд (блокировать определенные команды)
+
command-mute:
enabled: false
blocked-commands:
- "me"
- "say"
- "tell"
-
- # Предупреждения перед мутом
+
warnings:
enabled: true
max-warnings: 3
- reset-time: 3600 # Сброс предупреждений (секунды)
-
- # Апелляции на муты
+ reset-time: 3600
+
appeals:
enabled: false
command: "/appeal"
- permission: "lochat.appeal"
\ No newline at end of file
+ permission: "lochat.appeal"
diff --git a/src/main/resources/config/sounds.yml b/src/main/resources/config/sounds.yml
index 2f72b96..1ca37e1 100644
--- a/src/main/resources/config/sounds.yml
+++ b/src/main/resources/config/sounds.yml
@@ -1,313 +1,158 @@
-# ╔══════════════════════════════════════════════════════════════════════════════╗
-# ║ LoChat Sounds Configuration ║
-# ║ Конфигурация звуков ║
-# ║ Версия: 1.5.5-1.20.1 ║
-# ╚══════════════════════════════════════════════════════════════════════════════╝
+# LoChat sound configuration
+# Controls sound effects for chat events, moderation, and system actions.
-# ┌─────────────────────────────────────────────────────────────────────────────┐
-# │ ОСНОВНЫЕ НАСТРОЙКИ │
-# └─────────────────────────────────────────────────────────────────────────────┘
+# ── General ────────────────────────────────────────────────────────────────────
settings:
- # Включить звуки
enabled: true
-
- # Глобальная громкость (0.0 - 1.0)
global-volume: 0.5
-
- # Глобальная высота тона (0.5 - 2.0)
global-pitch: 1.0
-
- # Разрешить игрокам отключать звуки
allow-disable: true
-
- # Команда для управления звуками
toggle-command: "/sounds"
-# ┌─────────────────────────────────────────────────────────────────────────────┐
-# │ ЗВУКИ СООБЩЕНИЙ │
-# └─────────────────────────────────────────────────────────────────────────────┘
+# ── Message Sounds ─────────────────────────────────────────────────────────────
messages:
- # Личные сообщения
private-message:
enabled: true
- sound: "BLOCK_NOTE_BLOCK_PLING"
+ sound: BLOCK_NOTE_BLOCK_PLING
volume: 0.8
pitch: 1.2
- # Играть только получателю
receiver-only: true
-
- # Упоминания в чате
+
mention:
enabled: true
- sound: "BLOCK_NOTE_BLOCK_BELL"
+ sound: BLOCK_NOTE_BLOCK_BELL
volume: 0.7
pitch: 1.5
- # Дополнительный звук для @everyone
- everyone-sound: "BLOCK_NOTE_BLOCK_CHIME"
-
- # Глобальный чат
+ everyone-sound: BLOCK_NOTE_BLOCK_CHIME
+
global-chat:
enabled: false
- sound: "UI_BUTTON_CLICK"
+ sound: UI_BUTTON_CLICK
volume: 0.3
pitch: 1.0
-
- # Локальный чат
+
local-chat:
enabled: false
- sound: "UI_BUTTON_CLICK"
+ sound: UI_BUTTON_CLICK
volume: 0.2
pitch: 0.8
-
- # Объявления
+
announcement:
enabled: true
- sound: "BLOCK_NOTE_BLOCK_CHIME"
+ sound: BLOCK_NOTE_BLOCK_CHIME
volume: 1.0
pitch: 1.0
- # Дополнительные звуки для важных объявлений
- important-sound: "ENTITY_ENDER_DRAGON_GROWL"
+ important-sound: ENTITY_ENDER_DRAGON_GROWL
-# ┌─────────────────────────────────────────────────────────────────────────────┐
-# │ ЗВУКИ СИСТЕМЫ │
-# └─────────────────────────────────────────────────────────────────────────────┘
+# ── System Sounds ──────────────────────────────────────────────────────────────
system:
- # Подключение к серверу
join:
enabled: false
- sound: "ENTITY_PLAYER_LEVELUP"
+ sound: ENTITY_PLAYER_LEVELUP
volume: 0.5
pitch: 1.0
- # Играть только подключившемуся игроку
self-only: true
-
- # Отключение от сервера
+
quit:
enabled: false
- sound: "BLOCK_NOTE_BLOCK_BASS"
+ sound: BLOCK_NOTE_BLOCK_BASS
volume: 0.3
pitch: 0.8
-
- # Мут игрока
+
mute:
enabled: true
- sound: "BLOCK_ANVIL_LAND"
+ sound: BLOCK_ANVIL_LAND
volume: 0.6
pitch: 0.5
- # Играть замученному игроку
- target-sound: "ENTITY_VILLAGER_NO"
-
- # Размут игрока
+ target-sound: ENTITY_VILLAGER_NO
+
unmute:
enabled: true
- sound: "ENTITY_PLAYER_LEVELUP"
+ sound: ENTITY_PLAYER_LEVELUP
volume: 0.7
pitch: 1.2
- # Играть размученному игроку
- target-sound: "ENTITY_VILLAGER_YES"
-
- # Очистка чата
+ target-sound: ENTITY_VILLAGER_YES
+
clear-chat:
enabled: true
- sound: "ITEM_BUCKET_EMPTY"
+ sound: ITEM_BUCKET_EMPTY
volume: 0.5
pitch: 1.5
-# ┌─────────────────────────────────────────────────────────────────────────────┐
-# │ ЗВУКИ ГРАДИЕНТОВ │
-# └─────────────────────────────────────────────────────────────────────────────┘
+# ── Gradient Sounds ────────────────────────────────────────────────────────────
gradient:
- # Установка градиента
color-set:
enabled: true
- sound: "BLOCK_NOTE_BLOCK_HARP"
+ sound: BLOCK_NOTE_BLOCK_HARP
volume: 0.6
pitch: 1.3
-
- # Сброс градиента
+
color-reset:
enabled: true
- sound: "BLOCK_NOTE_BLOCK_BASS"
+ sound: BLOCK_NOTE_BLOCK_BASS
volume: 0.4
pitch: 0.7
-
- # Установка префикса
+
prefix-set:
enabled: true
- sound: "BLOCK_NOTE_BLOCK_CHIME"
+ sound: BLOCK_NOTE_BLOCK_CHIME
volume: 0.7
pitch: 1.4
-
- # Ошибка (недостаточно средств, кулдаун и т.д.)
+
error:
enabled: true
- sound: "ENTITY_VILLAGER_NO"
+ sound: ENTITY_VILLAGER_NO
volume: 0.5
pitch: 0.8
-# ┌─────────────────────────────────────────────────────────────────────────────┐
-# │ ЗВУКИ КОМАНД │
-# └─────────────────────────────────────────────────────────────────────────────┘
+# ── Command Sounds ─────────────────────────────────────────────────────────────
commands:
- # Успешное выполнение команды
success:
enabled: false
- sound: "ENTITY_EXPERIENCE_ORB_PICKUP"
+ sound: ENTITY_EXPERIENCE_ORB_PICKUP
volume: 0.4
pitch: 1.2
-
- # Ошибка выполнения команды
+
error:
enabled: true
- sound: "ENTITY_VILLAGER_NO"
+ sound: ENTITY_VILLAGER_NO
volume: 0.5
pitch: 0.8
-
- # Недостаточно прав
+
no-permission:
enabled: true
- sound: "BLOCK_NOTE_BLOCK_BASS"
+ sound: BLOCK_NOTE_BLOCK_BASS
volume: 0.6
pitch: 0.5
-
- # Игрок не найден
+
player-not-found:
enabled: true
- sound: "ENTITY_ITEM_BREAK"
+ sound: ENTITY_ITEM_BREAK
volume: 0.4
pitch: 0.6
-# ┌─────────────────────────────────────────────────────────────────────────────┐
-# │ ЗВУКИ ФИЛЬТРОВ │
-# └─────────────────────────────────────────────────────────────────────────────┘
+# ── Filter Sounds ──────────────────────────────────────────────────────────────
filters:
- # Сообщение заблокировано фильтром
blocked:
enabled: true
- sound: "ENTITY_VILLAGER_NO"
+ sound: ENTITY_VILLAGER_NO
volume: 0.6
pitch: 0.7
-
- # Предупреждение от фильтра
+
warning:
enabled: true
- sound: "BLOCK_NOTE_BLOCK_PLING"
+ sound: BLOCK_NOTE_BLOCK_PLING
volume: 0.5
pitch: 0.9
-
- # Автоматическое исправление (например, caps)
+
auto-fix:
enabled: false
- sound: "UI_BUTTON_CLICK"
+ sound: UI_BUTTON_CLICK
volume: 0.3
pitch: 1.1
-
-# ┌─────────────────────────────────────────────────────────────────────────────┐
-# │ КАСТОМНЫЕ ЗВУКИ │
-# └─────────────────────────────────────────────────────────────────────────────┘
-
-custom:
- # Звуки для VIP игроков
- vip:
- enabled: false
- join-sound: "ENTITY_PLAYER_LEVELUP"
- message-sound: "BLOCK_NOTE_BLOCK_HARP"
- volume: 0.8
- pitch: 1.3
-
- # Звуки для администраторов
- admin:
- enabled: false
- join-sound: "ENTITY_ENDER_DRAGON_GROWL"
- command-sound: "BLOCK_ANVIL_USE"
- volume: 0.7
- pitch: 1.0
-
- # Праздничные звуки
- holiday:
- enabled: false
- christmas:
- sound: "BLOCK_NOTE_BLOCK_CHIME"
- volume: 0.6
- pitch: 1.5
- new-year:
- sound: "ENTITY_FIREWORK_ROCKET_BLAST"
- volume: 0.8
- pitch: 1.2
-
-# ┌─────────────────────────────────────────────────────────────────────────────┐
-# │ ЗВУКОВЫЕ СХЕМЫ │
-# └─────────────────────────────────────────────────────────────────────────────┘
-
-schemes:
- # Классическая схема
- classic:
- name: "Классическая"
- description: "Стандартные звуки Minecraft"
- sounds:
- private-message: "BLOCK_NOTE_BLOCK_PLING"
- mention: "BLOCK_NOTE_BLOCK_BELL"
- announcement: "BLOCK_NOTE_BLOCK_CHIME"
-
- # Минималистичная схема
- minimal:
- name: "Минимальная"
- description: "Только важные звуки"
- sounds:
- private-message: "UI_BUTTON_CLICK"
- mention: "BLOCK_NOTE_BLOCK_PLING"
- announcement: "ENTITY_EXPERIENCE_ORB_PICKUP"
-
- # Отключенная схема
- silent:
- name: "Тишина"
- description: "Все звуки отключены"
- sounds: {}
-
-# ┌─────────────────────────────────────────────────────────────────────────────┐
-# │ НАСТРОЙКИ ПО МИРАМ │
-# └─────────────────────────────────────────────────────────────────────────────┘
-
-worlds:
- # Настройки для конкретных миров
- world_nether:
- volume-modifier: 0.7 # Уменьшить громкость на 30%
- pitch-modifier: 0.8 # Понизить тон
-
- world_the_end:
- volume-modifier: 0.5
- pitch-modifier: 1.2
- # Отключить определенные звуки
- disabled-sounds:
- - "global-chat"
- - "local-chat"
-
- creative_world:
- volume-modifier: 1.2
- # Включить дополнительные звуки
- extra-sounds:
- build: "BLOCK_STONE_PLACE"
- fly: "ENTITY_BAT_TAKEOFF"
-
-# ┌─────────────────────────────────────────────────────────────────────────────┐
-# │ ПЕРСОНАЛЬНЫЕ НАСТРОЙКИ │
-# └─────────────────────────────────────────────────────────────────────────────┘
-
-personal:
- # Разрешить игрокам настраивать громкость
- allow-volume-control: true
-
- # Разрешить игрокам выбирать звуковые схемы
- allow-scheme-selection: true
-
- # Сохранять настройки игроков
- save-preferences: true
-
- # Файл для сохранения настроек
- preferences-file: "plugins/LoChat/sound-preferences.yml"
\ No newline at end of file
diff --git a/src/main/resources/custom-commands.yml b/src/main/resources/custom-commands.yml
index 75b7de7..5742840 100644
--- a/src/main/resources/custom-commands.yml
+++ b/src/main/resources/custom-commands.yml
@@ -1,140 +1,83 @@
-# ╔══════════════════════════════════════════════════════════════════════════════╗
-# ║ Custom Commands Configuration ║
-# ║ Конфигурация кастомных команд ║
-# ╚══════════════════════════════════════════════════════════════════════════════╝
+# LoChat custom commands
+# Define your own commands with custom messages and actions.
+#
+# Fields:
+# enabled - whether the command is active
+# permission - required permission (optional)
+# message - message content (supports MiniMessage format)
+# aliases - alternative command names
+# type - chat | broadcast | title | actionbar | bungee
+# target - sender | all | permission:
+# server - (bungee only) target server name
-# Информационные команды
help:
enabled: true
message: |
- ▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
- 📚 Помощь по серверу
-
- <#FFEB3B>🏠 Основные команды:
- <#9E9E9E>• <#FFFFFF>/spawn - телепорт на спавн
- <#9E9E9E>• <#FFFFFF>/home - телепорт домой
- <#9E9E9E>• <#FFFFFF>/sethome - установить дом
-
- <#FFEB3B>💬 Чат команды:
- <#9E9E9E>• <#FFFFFF>!сообщение - глобальный чат
- <#9E9E9E>• <#FFFFFF>/msg игрок - личное сообщение
- <#9E9E9E>• <#FFFFFF>/reply - ответить на ЛС
-
- <#FFEB3B>🎨 Кастомизация:
- <#9E9E9E>• <#FFFFFF>/color - градиентный ник
- <#9E9E9E>• <#FFFFFF>/prefix - кастомный префикс
-
- ▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
- aliases: ["помощь", "хелп"]
- type: "chat"
- target: "sender"
+ Available commands:
+ \u2022 /spawn - teleport to spawn
+ \u2022 /msg - private message
+ \u2022 /color - gradient nickname
+ \u2022 /prefix - custom prefix
+ aliases: []
+ type: chat
+ target: sender
rules:
enabled: true
message: |
- ▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
- 📋 Правила сервера
-
- <#F44336>🚫 Запрещено:
- <#9E9E9E>• Читерство и использование модов
- <#9E9E9E>• Гриферство и воровство
- <#9E9E9E>• Мат и оскорбления
- <#9E9E9E>• Спам в чате
- <#9E9E9E>• Реклама других серверов
-
- <#4CAF50>✅ Разрешено:
- <#9E9E9E>• Строительство в любом стиле
- <#9E9E9E>• Торговля между игроками
- <#9E9E9E>• Создание команд и кланов
- <#9E9E9E>• Использование /home и /spawn
-
- <#FFA726>⚠️ За нарушения:
- <#9E9E9E>• Предупреждение → Мут → Бан
-
- ▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
- aliases: ["правила", "rule"]
- type: "chat"
- target: "sender"
+ Server Rules
+ 1. No cheating or hacking
+ 2. No griefing or stealing
+ 3. No swearing or insults
+ 4. No spam
+ 5. No advertising
+ aliases: []
+ type: chat
+ target: sender
discord:
enabled: true
message: |
- ▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
- 💬 Discord сервер
-
- <#5865F2>Присоединяйся к нашему Discord!
-
- <#FFEB3B>🔗 Ссылка: <#00BFFF>discord.gg/yourserver
-
- <#FFEB3B>📢 В Discord ты найдешь:
- <#9E9E9E>• Общение с игроками
- <#9E9E9E>• Новости и обновления
- <#9E9E9E>• Поддержку администрации
- <#9E9E9E>• Конкурсы и ивенты
-
- ▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
- aliases: ["дискорд", "ds"]
- type: "chat"
- target: "sender"
+ Join our Discord!
+ discord.gg/yourserver
+ aliases: ["ds"]
+ type: chat
+ target: sender
coords:
enabled: true
- message: "<#FFEB3B>📍 Ваши координаты: <#9E9E9E>X: <#FFFFFF>{x} Y: <#FFFFFF>{y} Z: <#FFFFFF>{z} <#9E9E9E>Мир: <#4CAF50>{world}"
- aliases: ["координаты", "pos", "position"]
- type: "chat"
- target: "sender"
+ message: "\u25B6 X: {x} Y: {y} Z: {z} World: {world}"
+ aliases: ["pos", "position"]
+ type: chat
+ target: sender
ping:
enabled: true
- message: "<#FFEB3B>📶 Ваш пинг: <#4CAF50>{ping}ms"
- aliases: ["пинг"]
- type: "chat"
- target: "sender"
- type: "chat"
- target: "sender"
+ message: "\u25B6 Your ping: {ping}ms"
+ aliases: []
+ type: chat
+ target: sender
hub:
enabled: true
- message: "<#4CAF50>🏠 Подключение к хабу..."
- aliases: ["lobby", "хаб"]
- type: "bungee"
- target: "sender"
- server: "hub"
+ message: "Connecting to hub..."
+ aliases: ["lobby"]
+ type: bungee
+ target: sender
+ server: hub
-discord:
- enabled: true
- message: |
- ▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
- 💬 Discord сервер
-
- <#5865F2>Присоединяйся к нашему Discord!
-
- <#FFEB3B>🔗 Ссылка: <#00BFFF>discord.gg/yourserver
-
- <#FFEB3B>📢 В Discord ты найдешь:
- <#9E9E9E>• Общение с игроками
- <#9E9E9E>• Новости и обновления
- <#9E9E9E>• Поддержку администрации
- <#9E9E9E>• Конкурсы и ивенты
-
- ▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
- aliases: ["дискорд", "ds"]
- type: "chat"
- target: "sender"
-
-# Команды для администрации
broadcast:
enabled: true
permission: "lochat.broadcast"
message: "{message}"
- aliases: ["bc", "объявить"]
- type: "broadcast"
- target: "all"
+ aliases: ["bc"]
+ type: broadcast
+ target: all
maintenance:
enabled: false
permission: "lochat.maintenance"
- message: "<#FFA726>🔧 Сервер переведен в режим технических работ"
- aliases: ["тех-работы", "техработы"]
- type: "title"
- target: "all"
\ No newline at end of file
+ message: "Server is now in maintenance mode"
+ aliases: []
+ type: title
+ target: all
diff --git a/src/main/resources/messages.yml b/src/main/resources/messages.yml
index 4cd0418..2a1c53f 100644
--- a/src/main/resources/messages.yml
+++ b/src/main/resources/messages.yml
@@ -1,225 +1,166 @@
-# ╔══════════════════════════════════════════════════════════════════════════════╗
-# ║ LoChat — messages.yml ║
-# ║ Default palette (Spacelegacy): #7858E9 (dusty rose) → #7858E9 (violet) ║
-# ╚══════════════════════════════════════════════════════════════════════════════╝
-#
-# Color roles (reference when editing strings below):
-# ẲE9 — primary labels / body (dusty rose)
-# ⚖C9 — accents / separators (mid violet)
-# ẲE9 — emphasis / values (deep violet)
-# &f / #E8E0F0 — message body white
-# CF6679 — errors (muted red, fits the palette)
+# LoChat player messages
+# All messages sent to players. Supports & color codes and placeholders.
-prefix: "ẲE9[⚖C9LB6BD6oẲE9CⅵDChB6BD6a⚖C9tẲE9]"
+prefix: "&8[&3LoChat&8]"
-# ┌─────────────────────────────────────────────────────────────────────────────┐
-# │ Global chat (toggle messages, server-disabled notice) │
-# └─────────────────────────────────────────────────────────────────────────────┘
+# ── Global Chat ────────────────────────────────────────────────────────────────
global:
- toggled-on: "⚖C9Глобальный чат ẲE9включён"
- toggled-off: "⚖C9Глобальный чат ẲE9отключён"
- disabled: "CF6679Глобальный чат отключён на этом сервере"
+ toggled-on: "&aGlobal chat enabled"
+ toggled-off: "&cGlobal chat disabled"
+ disabled: "&cGlobal chat is disabled on this server"
-# ┌─────────────────────────────────────────────────────────────────────────────┐
-# │ Local chat (no recipients nearby) │
-# └─────────────────────────────────────────────────────────────────────────────┘
+# ── Local Chat ─────────────────────────────────────────────────────────────────
local:
- no-players: "ẲE9Рядом нет игроков"
- nobody-heard: "⚖C9Вас никто не услышал ẲE9— рядом нет игроков"
+ no-players: "&cNo players nearby"
+ nobody-heard: "&7Nobody heard you — no players nearby"
-# ┌─────────────────────────────────────────────────────────────────────────────┐
-# │ Private messages (/msg, /reply) │
-# └─────────────────────────────────────────────────────────────────────────────┘
+# ── Private Messages ───────────────────────────────────────────────────────────
pm:
- format-sent: "ẲE9[⚖C9→ẲE9] ⚖C9Вы ẲE9→ {receiver_display}ẲE9: &f{message}"
- format-received: "ẲE9[⚖C9←ẲE9] {sender_display} ẲE9→ ⚖C9ВыẲE9: &f{message}"
- use-gradient-names: true
- sent: "ẲE9[⚖C9→ẲE9] ⚖C9Вы ẲE9→ &f{player}ẲE9: &f{message}"
- received: "ẲE9[⚖C9←ẲE9] &f{player} ẲE9→ ⚖C9ВыẲE9: &f{message}"
- no-reply: "CF6679Некому ответить"
- ignored: "CF6679Этот игрок вас игнорирует"
- player-offline: "CF6679Игрок не в сети"
- self: "CF6679Нельзя писать самому себе"
+ format-sent: "&8[&a\u2192&8] &7You &a\u2192 &f{receiver_display}&8: &f{message}"
+ format-received: "&8[&e\u2190&8] &f{sender_display} &e\u2192 &7You&8: &f{message}"
+ no-reply: "&cNobody to reply to"
+ ignored: "&cThis player is ignoring you"
+ player-offline: "&cPlayer is not online"
+ self: "&cYou cannot message yourself"
-# ┌─────────────────────────────────────────────────────────────────────────────┐
-# │ Ignore list │
-# └─────────────────────────────────────────────────────────────────────────────┘
+# ── Ignore List ────────────────────────────────────────────────────────────────
ignore:
- added: "⚖C9Игрок ẲE9{player} ⚖C9добавлен в игнор"
- removed: "⚖C9Игрок ẲE9{player} ⚖C9убран из игнора"
- already-ignored: "ẲE9Игрок ẲE9{player} ẲE9уже в игноре"
- not-ignored: "ẲE9Игрок ẲE9{player} ẲE9не в игноре"
- self: "CF6679Нельзя игнорировать самого себя"
- list-empty: "ẲE9Ваш список игнора пуст"
- list-header: "ẲE9▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬"
- list-footer: "ẲE9Всего: ẲE9{count} ẲE9игроков"
+ added: "&aPlayer &f{player} &ais now ignored"
+ removed: "&aPlayer &f{player} &ais no longer ignored"
+ already-ignored: "&7Player &f{player} &7is already ignored"
+ not-ignored: "&7Player &f{player} &7is not ignored"
+ self: "&cYou cannot ignore yourself"
+ list-empty: "&7Your ignore list is empty"
+ list-header: "&8\u2500\u2500\u2500\u2500\u2500 Ignored Players \u2500\u2500\u2500\u2500\u2500"
+ list-footer: "&7Total: &f{count} &7players"
-# ┌─────────────────────────────────────────────────────────────────────────────┐
-# │ Announcements │
-# └─────────────────────────────────────────────────────────────────────────────┘
+# ── Announcements ──────────────────────────────────────────────────────────────
announce:
- reloaded: "⚖C9Конфигурация ẲE9перезагружена"
+ reloaded: "&aConfiguration reloaded"
-# ┌─────────────────────────────────────────────────────────────────────────────┐
-# │ Chat spy (moderation) │
-# └─────────────────────────────────────────────────────────────────────────────┘
+# ── Chat Spy ───────────────────────────────────────────────────────────────────
spy:
- enabled: "⚖C9Режим шпиона ẲE9включён"
- disabled: "⚖C9Режим шпиона ẲE9отключён"
- format: "ẲE9[⚖C9SPYẲE9] ẲE9{sender} ẲE9→ ⚖C9{receiver}ẲE9: &f{message}"
- chat-format: "ẲE9[⚖C9SPYẲE9] ẲE9{type} ẲE9{sender}ẲE9: &f{message}"
+ enabled: "&aSpy mode enabled"
+ disabled: "&cSpy mode disabled"
+ format: "&8[&4SPY&8] &f{sender} &8\u2192 &7{receiver}&8: &f{message}"
+ chat-format: "&8[&4SPY&8] &f{sender}&8: &f{message}"
-# ┌─────────────────────────────────────────────────────────────────────────────┐
-# │ Message filters │
-# └─────────────────────────────────────────────────────────────────────────────┘
+# ── Filters ────────────────────────────────────────────────────────────────────
filter:
- blocked: "CF6679Сообщение заблокировано"
- warning: "ẲE9Предупреждение"
+ blocked: "&cMessage blocked"
+ warning: "&6Warning"
-# ┌─────────────────────────────────────────────────────────────────────────────┐
-# │ Cooldowns │
-# └─────────────────────────────────────────────────────────────────────────────┘
+# ── Cooldowns ──────────────────────────────────────────────────────────────────
cooldown:
- wait: "ẲE9Подождите ẲE9{time} ẲE9сек"
+ wait: "&cPlease wait &f{time} &cseconds"
-# ┌─────────────────────────────────────────────────────────────────────────────┐
-# │ Anti-spam (caps, repeat, similar messages) │
-# └─────────────────────────────────────────────────────────────────────────────┘
+# ── Anti-Spam ──────────────────────────────────────────────────────────────────
antispam:
- caps: "CF6679Не кричите в чате"
- repeat: "CF6679Не повторяйте символы"
- similar: "CF6679Не отправляйте одинаковые сообщения"
+ caps: "&cPlease don't shout"
+ repeat: "&cPlease don't repeat characters"
+ similar: "&cPlease don't send the same message"
-# ┌─────────────────────────────────────────────────────────────────────────────┐
-# │ Clear chat │
-# └─────────────────────────────────────────────────────────────────────────────┘
+# ── Clear Chat ─────────────────────────────────────────────────────────────────
clearchat:
- cleared: "⚖C9Чат очищен ẲE9администратором ẲE9{player}"
+ cleared: "&aChat cleared by &f{player}"
-# ┌─────────────────────────────────────────────────────────────────────────────┐
-# │ Command / usage errors │
-# └─────────────────────────────────────────────────────────────────────────────┘
+# ── Errors ─────────────────────────────────────────────────────────────────────
errors:
- no-permission: "CF6679Нет прав"
- player-not-found: "CF6679Игрок не найден"
- invalid-usage: "ẲE9Использование: ẲE9{usage}"
+ no-permission: "&cNo permission"
+ player-not-found: "&cPlayer not found"
+ invalid-usage: "&cUsage: &f{usage}"
-# ┌─────────────────────────────────────────────────────────────────────────────┐
-# │ General (permissions, reload, hub, etc.) │
-# └─────────────────────────────────────────────────────────────────────────────┘
+# ── General ────────────────────────────────────────────────────────────────────
general:
- no-permission: "CF6679У вас нет прав!"
- players-only: "CF6679Только для игроков!"
- config-reloaded: "⚖C9Конфиг ẲE9перезагружен!"
- invalid-player: "CF6679Игрок ẲE9{player} CF6679не найден!"
- cooldown-active: "ẲE9Подождите ẲE9{time}с"
- command-disabled: "CF6679Команда отключена!"
+ no-permission: "&cYou don't have permission!"
+ players-only: "&cThis command is for players only!"
+ config-reloaded: "&aConfiguration reloaded!"
+ invalid-player: "&cPlayer &f{player} &cnot found!"
+ cooldown-active: "&cPlease wait &f{time}&cs"
+ command-disabled: "&cCommand disabled!"
+
+# ── Hub ────────────────────────────────────────────────────────────────────────
hub:
- connecting: "⚖C9Подключение к ẲE9{server}⚖C9..."
+ connecting: "&aConnecting to &f{server}&a..."
-# ┌─────────────────────────────────────────────────────────────────────────────┐
-# │ Mutes │
-# └─────────────────────────────────────────────────────────────────────────────┘
+# ── Mute ───────────────────────────────────────────────────────────────────────
mute:
- muted: "⚖C9Игрок ẲE9{player} ⚖C9замучен на ẲE9{time}"
- unmuted: "⚖C9Игрок ẲE9{player} ⚖C9размучен"
- already-muted: "ẲE9Игрок ẲE9{player} ẲE9уже замучен"
- not-muted: "ẲE9Игрок ẲE9{player} ẲE9не замучен"
- you-muted: "CF6679Вы замучены! ẲE9Осталось: ẲE9{time}"
- permanent: "CF6679Вы замучены навсегда!"
+ muted: "&aPlayer &f{player} &amuted for &f{time}"
+ unmuted: "&aPlayer &f{player} &aunmuted"
+ already-muted: "&7Player &f{player} &7is already muted"
+ not-muted: "&7Player &f{player} &7is not muted"
+ you-muted: "&cYou are muted! &7Remaining: &f{time}"
+ permanent: "&cYou are permanently muted!"
-# ┌─────────────────────────────────────────────────────────────────────────────┐
-# │ Gradient nick module (LoPreff) │
-# └─────────────────────────────────────────────────────────────────────────────┘
+# ── Gradients ──────────────────────────────────────────────────────────────────
gradient:
- color-set: "⚖C9Градиент ẲE9установлен!"
- color-enabled: "⚖C9Градиентный ник ẲE9включён"
- color-disabled: "ẲE9Градиентный ник ⚖C9отключён"
- color-reset: "ẲE9Градиент сброшен"
- prefix-set: "⚖C9Префикс ẲE9установлен!"
- prefix-reset: "ẲE9Префикс сброшен"
- prefix-reset-success: "⚖C9Префикс успешно ẲE9сброшен!"
- prefix-enabled: "⚖C9Префикс ẲE9включён"
- prefix-disabled: "ẲE9Префикс ⚖C9отключён"
- invalid-hex: "CF6679Неверный HEX цвет: ẲE9{color}"
- invalid-color: "CF6679Неверный цвет: ẲE9{color}"
- too-many-colors: "CF6679Слишком много цветов! Максимум: ẲE9{max}"
- too-few-colors: "CF6679Слишком мало цветов! Минимум: ẲE9{min}"
- not-enough-colors: "CF6679Слишком мало цветов! Минимум: ẲE9{min}"
- cooldown: "ẲE9Подождите ẲE9{time} ẲE9сек"
- not-enough-points: "CF6679Недостаточно поинтов! Нужно: ẲE9{price}"
- not-enough-points-color: "CF6679Недостаточно поинтов! Нужно: ẲE9{price}"
- not-enough-points-prefix: "CF6679Недостаточно поинтов! Нужно: ẲE9{price}"
- player-not-found: "CF6679Игрок не найден"
- color-help: "ẲE9Использование: ẲE9/color "
- color-success: "⚖C9Градиент успешно ẲE9установлен!"
- color-no-colors: "ẲE9У вас нет установленных цветов"
- color-copy-usage: "ẲE9Использование: ẲE9/color copy <игрок>"
- color-copy-no-colors: "ẲE9У игрока ẲE9{player} ẲE9нет цветов"
- prefix-help: "ẲE9Использование: ẲE9/prefix <текст> ẲE9или ẲE9/prefix reset"
- prefix-success: "⚖C9Префикс установлен! ẲE9Стоимость: ẲE9{price} ẲE9поинтов"
- prefix-success-free: "⚖C9Префикс ẲE9установлен!"
- prefix-no-prefix: "ẲE9У вас нет префикса"
- prefix-too-long: "CF6679Префикс слишком длинный! Максимум: ẲE9{max}"
- prefix-no-colors: "CF6679Префикс не может содержать цветовые коды!"
- prefix-invalid-chars: "CF6679Недопустимые символы в префиксе!"
- prefix-blacklisted: "CF6679Этот префикс запрещён!"
- only-player: "CF6679Только для игроков!"
- no-permission: "CF6679Нет прав!"
- reload-success: "⚖C9Конфигурация ẲE9перезагружена!"
- info-header: "ẲE9▬▬▬▬▬▬▬▬ ẲE9{player} ẲE9▬▬▬▬▬▬▬▬"
- info-prefix: "ẲE9Префикс: &f{prefix}"
- info-prefix-enabled: "ẲE9Префикс активен: &f{enabled}"
- info-colors: "ẲE9Цвета: &f{colors}"
- info-color-enabled: "ẲE9Цвет активен: &f{enabled}"
- info-prefix-purchased: "ẲE9Куплен: &f{purchased}"
+ color-set: "&aGradient set!"
+ color-enabled: "&aGradient nickname enabled"
+ color-disabled: "&7Gradient nickname disabled"
+ color-reset: "&7Gradient reset"
+ prefix-set: "&aPrefix set!"
+ prefix-reset: "&7Prefix reset"
+ prefix-enabled: "&aPrefix enabled"
+ prefix-disabled: "&7Prefix disabled"
+ invalid-hex: "&cInvalid hex color: &f{color}"
+ invalid-color: "&cInvalid color: &f{color}"
+ too-many-colors: "&cToo many colors! Maximum: &f{max}"
+ too-few-colors: "&cToo few colors! Minimum: &f{min}"
+ cooldown: "&cPlease wait &f{time} &cseconds"
+ not-enough-points: "&cNot enough points! Need: &f{price}"
+ player-not-found: "&cPlayer not found"
+ color-help: "&cUsage: &f/color ..."
+ color-success: "&aGradient applied!"
+ color-no-colors: "&7You have no colors set"
+ prefix-help: "&cUsage: &f/prefix "
+ prefix-success: "&aPrefix set!"
+ prefix-success-free: "&aPrefix set!"
+ prefix-no-prefix: "&7You have no prefix"
+ prefix-too-long: "&cPrefix too long! Max: &f{max}"
+ prefix-no-colors: "&cPrefix cannot contain color codes"
+ only-player: "&cPlayers only!"
+ no-permission: "&cNo permission!"
+ reload-success: "&aConfiguration reloaded!"
+ info-header: "&8\u2500\u2500\u2500\u2500\u2500 &f{player} &8\u2500\u2500\u2500\u2500\u2500"
+ info-prefix: "&7Prefix: &f{prefix}"
+ info-colors: "&7Colors: &f{colors}"
-# ┌─────────────────────────────────────────────────────────────────────────────┐
-# │ Custom nicknames (/nick) │
-# └─────────────────────────────────────────────────────────────────────────────┘
+# ── Custom Nicknames ───────────────────────────────────────────────────────────
nick:
- current: "ẲE9Ваш ник: ẲE9{nick}"
- usage: "ẲE9Использование: ẲE9/nick <ник> ẲE9или ẲE9/nick reset"
- reset-usage: "ẲE9Используйте ẲE9/nick reset ẲE9для сброса"
- set-usage: "ẲE9Используйте ẲE9/nick <ник> ẲE9для установки"
- no-nick: "ẲE9У вас нет кастомного ника"
- reset-success: "⚖C9Ник ẲE9сброшен!"
- set-success: "⚖C9Ник изменён на: &f{nick}"
- invalid: "CF6679Невалидный ник!"
- requirements-header: "ẲE9Требования:"
- requirements-length: "⚖C9◆ &fДлина: 3-16 символов"
- requirements-chars: "⚖C9◆ &fБуквы, цифры, _, русские буквы"
- requirements-colors: "⚖C9◆ &fЦвета: ẲE9RRGGBBẲE9текст"
- taken: "CF6679Этот ник уже занят!"
- error: "CF6679Не удалось установить ник!"
+ current: "&7Your nickname: &f{nick}"
+ usage: "&cUsage: &f/nick &7or &f/nick reset"
+ no-nick: "&7You have no custom nickname"
+ reset-success: "&aNickname reset!"
+ set-success: "&aNickname changed to: &f{nick}"
+ invalid: "&cInvalid nickname!"
+ taken: "&cThis nickname is already taken!"
+ error: "&cFailed to set nickname!"
-# ┌─────────────────────────────────────────────────────────────────────────────┐
-# │ Roleplay commands (/me, /try, /do, /roll) │
-# └─────────────────────────────────────────────────────────────────────────────┘
+# ── RP Commands ────────────────────────────────────────────────────────────────
rp:
- me: "* {player} {action}"
- try-format: "* {player} пытается {action}... {result}"
- try-success: "[Успех!]"
- try-fail: "[Провал!]"
- do-format: "[Сцена] {description} ({player})"
- roll-format: "* {player} бросает кубик и получает {result} из {max}"
- roll-min-error: "Минимальное значение кубика: 2"
- roll-max-error: "Максимальное значение: 1000000"
- roll-invalid-number: "Укажите число: /roll [максимум]"
+ me: "&7* {player} {action}"
+ try-format: "&7* {player} tries {action}... &f{result}"
+ try-success: "&a[Success!]"
+ try-fail: "&c[Fail!]"
+ do-format: "&8[Scene] &f{description} &7({player})"
+ roll-format: "&7* {player} rolls &f{result} &7out of &f{max}"
+ roll-min-error: "&cMinimum dice value: 2"
+ roll-max-error: "&cMaximum dice value: 1000000"
+ roll-invalid-number: "&cPlease specify a number: /roll [max]"