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 серверов** -## Сборка и локальный тестовый сервер +[![Build](https://github.com/loki5512344/LoChat/actions/workflows/build.yml/badge.svg)](https://github.com/loki5512344/LoChat/actions/workflows/build.yml) +[![License: GPLv3](https://img.shields.io/badge/License-GPLv3-blue.svg)](LICENSE) +[![](https://img.shields.io/badge/Paper-1.21.4-blue)](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}\n&#B798A8Причина: &f{reason}" - local-chat: - nobody-heard: "⚖C9Вас никто не услышал" - cooldown: - message: "&#B798A8Подождите ẲE9{remaining} &#B798A8сек" - -# RP команды -rp: - radius: 100 - cooldowns: - me: 3 - try: 5 - do: 3 - roll: 2 - -# Градиенты -gradient: - enabled: true - presets: - fire: ["#FF4500", "#FF6347", "#FFD700"] - ocean: ["#00CED1", "#1E90FF", "#4169E1"] -``` - -**Файлы для изменения:** -1. `src/main/resources/config.yml` - объединить все настройки -2. `src/main/java/com/loki/lochat/config/ConfigManager.java` - убрать AppearanceConfig и HardcodedMessages -3. `src/main/java/com/loki/lochat/renderer/EnhancedChatRenderer.java` - читать из ConfigManager напрямую -4. Удалить `src/main/java/com/loki/lochat/config/AppearanceConfig.java` -5. Удалить `src/main/java/com/loki/lochat/config/HardcodedMessages.java` -6. Удалить все файлы из `src/main/resources/config/` - ---- - -### Вариант 2: Отдельные файлы в корне resources -Переместить конфиги в корень `resources/` и создавать их вручную. - -**Структура:** -``` -src/main/resources/ -├── config.yml # Основной конфиг -├── chat-appearance.yml # Внешний вид -├── messages.yml # Сообщения -├── gradient-config.yml # Градиенты -└── custom-commands.yml # Кастомные команды -``` - -**Файлы для изменения:** -1. Переместить все из `config/` в корень `resources/` -2. `AppearanceConfig.java` - изменить путь с `config/chat-appearance.yml` на `chat-appearance.yml` -3. `HardcodedMessages.java` - изменить путь с `config/hardcoded-messages.yml` на `messages.yml` -4. Убрать создание папки `config/` в коде - ---- - -## 🎯 РЕКОМЕНДАЦИЯ - -**Использовать Вариант 1** - один большой `config.yml`: -- ✅ Всё в одном месте -- ✅ Гарантированно работает -- ✅ Проще для пользователей -- ✅ Меньше файлов -- ✅ Только hex-цвета (&#FFD700) - ---- - -## 📝 ЧЕКЛИСТ ВЫПОЛНЕНИЯ - -### Шаг 1: Подготовка -- [ ] Сохранить текущие настройки из всех конфигов -- [ ] Создать бэкап проекта - -### Шаг 2: Объединение конфигов -- [ ] Скопировать все секции из `config/chat-appearance.yml` в `config.yml` -- [ ] Скопировать все секции из `config/hardcoded-messages.yml` в `config.yml` -- [ ] Заменить все ``, `` на 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}\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Цвета: ẲE9&#RRGGBBẲ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]"