chore: cleanup configs, docs, checkstyle, remove dead deps

This commit is contained in:
loki5512344 2026-07-05 11:38:04 +02:00
parent 984b364295
commit d3d87c34e0
23 changed files with 1703 additions and 2231 deletions

View file

@ -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 | Дополнительный контекст

View file

@ -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 | Дополнительный контекст

View file

@ -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 | Дополнительная информация

View file

@ -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 #

6
.gitignore vendored
View file

@ -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

View file

@ -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

141
CONTRIBUTING.md Normal file
View file

@ -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)

676
README.md
View file

@ -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)
---
<div align="center">
**[EN](#english) · [RU](#russian)**
</div>
---
<a name="english"></a>
## 🇬🇧 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 <message>` | Global chat |
| `/l <message>` | Local chat |
| `/msg <player> <message>` | Private message |
| `/reply <message>` | Reply to PM |
| `/ignore <player>` | Ignore player |
| `/unignore <player>` | Unignore player |
| `/ignorelist` | List ignored players |
#### Gradients
| Command | Description |
|---------|-------------|
| `/color <hex1> [hex2] ...` | Set gradient |
| `/prefix <text>` | Set prefix |
| `/aprefix <command>` | Admin gradient commands |
#### Moderation
| Command | Description |
|---------|-------------|
| `/lmute <player> [time] [-s] [reason]` | Mute player |
| `/lunmute <player> [-s]` | Unmute player |
| `/lban <player> [time] [reason]` | Ban player |
| `/lunban <player>` | Unban player |
| `/lwarn <player> [reason]` | Warn player |
| `/lmutelist` | List mutes |
| `/lmutehistory <player>` | Mute history |
#### RP
| Command | Description |
|---------|-------------|
| `/me <action>` | Third-person action |
| `/do <description>` | Action description |
| `/try <attempt>` | Chance attempt |
| `/roll [number]` | Dice roll |
#### Admin
| Command | Description |
|---------|-------------|
| `/lochat reload` | Reload config |
| `/clearchat` | Clear chat |
| `/chatspy` | Spy mode |
| `/announce <message>` | 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)
---
<a name="russian"></a>
## 🇷🇺 Русский
### Обзор
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 <hex1> [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 <hex1> [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)

View file

@ -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
## Благодарности
Мы благодарим всех, кто ответственно сообщает об уязвимостях и помогает сделать проект безопаснее.

527
TODO.md
View file

@ -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<Filter>` 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:
- "&#7858E9▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬"
- "&#B798A8✦ &f{player}"
- ""
- "&#9878C9⏱ &fПинг: &#7858E9{ping}ms"
- "&#9878C9♥ &fЗдоровье: &#7858E9{health}/20"
- "&#9878C9🍖 &fГолод: &#7858E9{food}/20"
- ""
- "&#7858E9▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬"
- "&#B798A8✦ &fНажми чтобы написать"
emojis:
":heart:": "❤"
":star:": "★"
":diamond:": "◆"
# Сообщения
messages:
mute:
player-muted: "&#9878C9Игрок &#7858E9{player} &#9878C9замучен на &#7858E9{time}"
muted-message: "&#CF6679Вы замучены на &#7858E9{time}\n&#B798A8Причина: &f{reason}"
local-chat:
nobody-heard: "&#9878C9Вас никто не услышал"
cooldown:
message: "&#B798A8Подождите &#7858E9{remaining} &#B798A8сек"
# RP команды
rp:
radius: 100
cooldowns:
me: 3
try: 5
do: 3
roll: 2
# Градиенты
gradient:
enabled: true
presets:
fire: ["#FF4500", "#FF6347", "#FFD700"]
ocean: ["#00CED1", "#1E90FF", "#4169E1"]
```
**Файлы для изменения:**
1. `src/main/resources/config.yml` - объединить все настройки
2. `src/main/java/com/loki/lochat/config/ConfigManager.java` - убрать AppearanceConfig и HardcodedMessages
3. `src/main/java/com/loki/lochat/renderer/EnhancedChatRenderer.java` - читать из ConfigManager напрямую
4. Удалить `src/main/java/com/loki/lochat/config/AppearanceConfig.java`
5. Удалить `src/main/java/com/loki/lochat/config/HardcodedMessages.java`
6. Удалить все файлы из `src/main/resources/config/`
---
### Вариант 2: Отдельные файлы в корне resources
Переместить конфиги в корень `resources/` и создавать их вручную.
**Структура:**
```
src/main/resources/
├── config.yml # Основной конфиг
├── chat-appearance.yml # Внешний вид
├── messages.yml # Сообщения
├── gradient-config.yml # Градиенты
└── custom-commands.yml # Кастомные команды
```
**Файлы для изменения:**
1. Переместить все из `config/` в корень `resources/`
2. `AppearanceConfig.java` - изменить путь с `config/chat-appearance.yml` на `chat-appearance.yml`
3. `HardcodedMessages.java` - изменить путь с `config/hardcoded-messages.yml` на `messages.yml`
4. Убрать создание папки `config/` в коде
---
## 🎯 РЕКОМЕНДАЦИЯ
**Использовать Вариант 1** - один большой `config.yml`:
- ✅ Всё в одном месте
- ✅ Гарантированно работает
- ✅ Проще для пользователей
- ✅ Меньше файлов
- ✅ Только hex-цвета (&#FFD700)
---
## 📝 ЧЕКЛИСТ ВЫПОЛНЕНИЯ
### Шаг 1: Подготовка
- [ ] Сохранить текущие настройки из всех конфигов
- [ ] Создать бэкап проекта
### Шаг 2: Объединение конфигов
- [ ] Скопировать все секции из `config/chat-appearance.yml` в `config.yml`
- [ ] Скопировать все секции из `config/hardcoded-messages.yml` в `config.yml`
- [ ] Заменить все `<red>`, `<bold>` на hex-цвета `&#FF0000`
- [ ] Проверить отступы YAML
### Шаг 3: Изменение кода
- [ ] `ConfigManager.java` - убрать `AppearanceConfig` и `HardcodedMessages`
- [ ] `ConfigManager.java` - добавить методы для чтения всех настроек из `config.yml`
- [ ] `EnhancedChatRenderer.java` - заменить `cfg.getAppearanceConfig()` на прямые вызовы
- [ ] Удалить `AppearanceConfig.java`
- [ ] Удалить `HardcodedMessages.java`
### Шаг 4: Очистка
- [ ] Удалить папку `src/main/resources/config/`
- [ ] Удалить неиспользуемые импорты
### Шаг 5: Тестирование
- [ ] `./gradlew clean build -x test`
- [ ] Проверить что jar собирается
- [ ] Запустить на тестовом сервере
- [ ] Проверить что `config.yml` создаётся
- [ ] Проверить что все настройки работают
---
## 🔧 ТЕКУЩЕЕ СОСТОЯНИЕ
**Проблемные файлы:**
- `src/main/java/com/loki/lochat/renderer/EnhancedChatRenderer.java` - ошибки компиляции
- `src/main/java/com/loki/lochat/config/ConfigManager.java` - неполный рефакторинг
**Что работает:**
- Базовые настройки чата
- Градиенты
- RP команды с кулдаунами
**Что НЕ работает:**
- Файлы из `config/` не копируются на сервер
- Префиксы чата (читаются из несуществующих файлов)
- Hover подсказки
- Эмодзи замены
---
## 📌 ВАЖНО
- Использовать ТОЛЬКО hex-цвета: `&#FFD700`
- НЕ использовать MiniMessage: `<red>`, `<bold>`
- Все настройки в `config.yml`
- Простая и понятная структура
- Gradients may not display correctly on clients < 1.16
- Some filters may block legitimate messages (configurable in `config/filters.yml`)

View file

@ -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
}

View file

@ -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

View file

@ -3,71 +3,185 @@
"-//Checkstyle//DTD Checkstyle Configuration 1.3//EN"
"https://checkstyle.org/dtds/configuration_1_3.dtd">
<!--
Google Java Style configuration for LoChat.
Based on Google Java Style Guide:
https://google.github.io/styleguide/javaguide.html
-->
<module name="Checker">
<property name="charset" value="UTF-8"/>
<property name="severity" value="warning"/>
<property name="fileExtensions" value="java"/>
<!-- File length: max 600 lines -->
<module name="FileLength">
<property name="max" value="600"/>
</module>
<!-- Line length: max 100 characters (Google style) -->
<module name="LineLength">
<property name="max" value="140"/>
<property name="ignorePattern" value="^package.*|^import.*|a href|href|http://|https://|ftp://"/>
<property name="max" value="100"/>
<property name="ignorePattern"
value="^package.*|^import.*|a href|href|http://|https://|ftp://"/>
</module>
<!-- No tabs allowed (Google style: spaces only) -->
<module name="FileTabCharacter"/>
<module name="TreeWalker">
<module name="MethodLength">
<property name="max" value="60"/>
<property name="countEmpty" value="false"/>
<!-- ========== Google Style: Indentation ========== -->
<!-- Basic offset: 2, continuation indent: 4 (Google style) -->
<module name="Indentation">
<property name="basicOffset" value="2"/>
<property name="braceAdjustment" value="0"/>
<property name="caseIndent" value="2"/>
<property name="throwsIndent" value="4"/>
<property name="arrayInitIndent" value="2"/>
<property name="lineWrappingIndentation" value="4"/>
<property name="forceStrictCondition" value="false"/>
</module>
<module name="CyclomaticComplexity">
<property name="max" value="15"/>
<!-- ========== Google Style: Braces ========== -->
<!-- Braces required for if/for/while/do (Google style) -->
<module name="NeedBraces"/>
<!-- Left brace at end of line (Google style) -->
<module name="LeftCurly">
<property name="option" value="eol"/>
</module>
<!-- Right brace alone on line (Google style) -->
<module name="RightCurly">
<property name="option" value="alone"/>
</module>
<module name="ParameterNumber">
<property name="max" value="7"/>
<!-- ========== Google Style: Whitespace ========== -->
<module name="WhitespaceAround">
<property name="allowEmptyConstructors" value="true"/>
<property name="allowEmptyMethods" value="true"/>
<property name="allowEmptyTypes" value="true"/>
<property name="allowEmptyLoops" value="true"/>
<property name="allowEmptyLambdas" value="true"/>
<property name="allowEmptyCatches" value="true"/>
</module>
<module name="NestedIfDepth">
<property name="max" value="3"/>
<module name="WhitespaceAfter"/>
<module name="NoWhitespaceBefore">
<property name="tokens" value="COMMA, SEMI, POST_INC, POST_DEC, DOT, METHOD_REF"/>
</module>
<module name="NestedTryDepth">
<property name="max" value="2"/>
<module name="NoWhitespaceAfter">
<property name="tokens"
value="BNOT, DEC, DOT, INC, LNOT, UNARY_MINUS, UNARY_PLUS, ARRAY_DECLARATOR"/>
</module>
<module name="GenericWhitespace"/>
<module name="MethodParamPad"/>
<module name="ParenPad"/>
<module name="TypecastParenPad"/>
<module name="NoLineWrap"/>
<module name="AvoidStarImport"/> <module name="UnusedImports"/>
<module name="RedundantImport"/>
<!-- ========== Google Style: Naming ========== -->
<module name="PackageName">
<property name="format" value="^[a-z]+(\.[a-z][a-z0-9]*)*$"/>
</module>
<module name="TypeName"/>
<module name="MethodName"/>
<module name="MemberName"/> <module name="ParameterName"/>
<module name="MemberName"/>
<module name="ParameterName"/>
<module name="LocalVariableName"/>
<module name="ConstantName"/>
<module name="NeedBraces"/>
<module name="LeftCurly"/>
<module name="RightCurly"/>
<module name="WhitespaceAround">
<property name="allowEmptyConstructors" value="true"/>
<property name="allowEmptyMethods" value="true"/>
<module name="CatchParameterName"/>
<module name="ClassTypeParameterName"/>
<module name="MethodTypeParameterName"/>
<module name="InterfaceTypeParameterName"/>
<module name="LambdaParameterName"/>
<module name="PatternVariableName"/>
<module name="RecordComponentName"/>
<module name="LocalFinalVariableName"/>
<module name="StaticVariableName"/>
<module name="AbbreviationAsWordInName">
<property name="allowedAbbreviationLength" value="0"/>
<property name="ignoreFinal" value="false"/>
<property name="allowedAbbreviations" value="IO, URL, HTML, XML, JSON, SQL, API, PM, RP, GUI, ID"/>
</module>
<module name="ModifierOrder"/> <module name="EmptyStatement"/>
<module name="EqualsHashCode"/> <module name="SimplifyBooleanExpression"/>
<!-- ========== Google Style: Imports ========== -->
<module name="AvoidStarImport"/>
<module name="UnusedImports"/>
<module name="RedundantImport"/>
<module name="ImportOrder">
<property name="groups" value="com,net,org,java,javax"/>
<property name="ordered" value="true"/>
<property name="separated" value="true"/>
<property name="option" value="top"/>
<property name="sortStaticImportsAlphabetically" value="true"/>
</module>
<!-- ========== Google Style: Modifiers ========== -->
<module name="ModifierOrder"/>
<module name="RedundantModifier"/>
<!-- ========== Code Quality ========== -->
<module name="EmptyStatement"/>
<module name="EqualsHashCode"/>
<module name="SimplifyBooleanExpression"/>
<module name="SimplifyBooleanReturn"/>
<module name="StringLiteralEquality"/> <module name="DefaultComesLast"/> <module name="MultipleVariableDeclarations"/> <module name="FallThrough"/> <module name="HideUtilityClassConstructor"/>
<module name="StringLiteralEquality"/>
<module name="DefaultComesLast"/>
<module name="MultipleVariableDeclarations"/>
<module name="FallThrough"/>
<module name="HideUtilityClassConstructor"/>
<module name="OneTopLevelClass"/>
<module name="OneStatementPerLine"/>
<module name="EmptyBlock">
<property name="option" value="text"/>
</module>
<module name="EmptyCatchBlock">
<property name="exceptionVariableName" value="expected|ignore"/>
</module>
<module name="MissingSwitchDefault"/>
<module name="UpperEll"/>
<module name="ArrayTypeStyle"/>
<module name="CommentsIndentation"/>
<module name="UnnecessaryParentheses"/>
<!-- ========== Metrics ========== -->
<module name="MethodLength">
<property name="max" value="60"/>
<property name="countEmpty" value="false"/>
</module>
<module name="CyclomaticComplexity">
<property name="max" value="15"/>
</module>
<module name="ParameterNumber">
<property name="max" value="7"/>
</module>
<module name="NestedIfDepth">
<property name="max" value="3"/>
</module>
<module name="NestedTryDepth">
<property name="max" value="2"/>
</module>
<!-- ========== Google Style: Javadoc ========== -->
<module name="JavadocMethod">
<property name="accessModifiers" value="public, protected"/>
<property name="allowMissingParamTags" value="false"/>
<property name="allowMissingReturnTag" value="false"/>
<property name="allowedAnnotations" value="Override, Test"/>
<property name="tokens" value="METHOD_DEF, CTOR_DEF, ANNOTATION_FIELD_DEF"/>
</module>
<module name="MissingJavadocMethod">
<property name="scope" value="public"/>
<property name="minLineCount" value="2"/>
<property name="allowedAnnotations" value="Override, Test"/>
<property name="tokens" value="METHOD_DEF, CTOR_DEF"/>
</module>
<module name="MissingJavadocType">
<property name="scope" value="public"/>
</module>
<module name="JavadocType">
<property name="scope" value="public"/>
</module>
<module name="JavadocStyle"/>
<module name="NonEmptyAtclause"/>
</module>
</module>

Binary file not shown.

View file

@ -1,143 +1,114 @@
# ╔══════════════════════════════════════════════════════════════════════════════╗
# ║ LoChat Configuration ║
# ║ Единый конфиг плагина ║
# ╚══════════════════════════════════════════════════════════════════════════════╝
# LoChat main configuration
# All settings for chat, gradients, moderation, RP commands, sounds, and filters.
config-version: 5
prefix: "&#00D4FF[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"
separator: " &8\u25B6 "
message-color: "&7"
# Формат сообщений
# {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 при наведении на ник
hover:
enabled: true
format:
- "&#7858E9▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬"
- "&#B798A8✦ &f{player}"
- "&8\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550"
- " &b\u2726 &f{player}"
- ""
- "&#9878C9⏱ &fПинг: &#7858E9{ping}ms"
- "&#9878C9❤ &fЗдоровье: &#7858E9{health}/20"
- "&#9878C9🍖 &fГолод: &#7858E9{food}/20"
- " &7Ping: &b{ping}ms"
- " &7Health: &a{health}&7/20"
- " &7Food: &6{food}&7/20"
- ""
- "&#7858E9▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬"
- "&#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
# Лимиты
limits:
min-colors: 1
max-colors: 7
max-prefix-length: 16
# Цены (PlayerPoints)
pricing:
price-per-color: 50
prefix-price: 500
prefix-one-time-purchase: true
use-permission-instead-of-cost: false
# Кулдауны (секунды)
color-cooldown: 60
prefix-cooldown: 120
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
use-legacy-rgb-format: true
# Хранилище (file / sqlite)
storage-type: "file"
storage:
type: file
sqlite-file: "gradient-data.db"
# ┌─────────────────────────────────────────────────────────────────────────────┐
# │ RP команды (/me, /do, /try, /roll) │
# └─────────────────────────────────────────────────────────────────────────────┘
# ── 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: "[ссылка скрыта]"
replacement: "&7[URL hidden]"
# IP фильтр
ip:
enabled: true
replacement: "[IP скрыт]"
replacement: "&7[IP hidden]"
# Скрытые URL (discord.gg и т.д.)
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 ─────────────────────────────────────────────────────────────────
moderation:
# Дефолтные значения
default-mute-duration: "7d"
default-mute-reason: "Без причины"
default-ban-reason: "Без причины"
# Команда после мута (для голосового чата)
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}"
# Сообщение при кике забаненного
ban-kick-message: "&#CF6679Вы забанены! &#B798A8Причина: &#7858E9{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: "&#9878C9✦ &#B798A8{player} &#7858E9зашел на сервер"
format: "&7\u2726 &b{player} &7joined the server"
# Сообщение при выходе
quit:
enabled: true
format: "&#9878C9✦ &#B798A8{player} &#7858E9вышел с сервера"
format: "&7\u2726 &b{player} &7left the server"
# Сообщение при смерти
# {player} - ник игрока
# {killer} - ник убийцы (если есть)
# {weapon} - название оружия (если есть)
# {death_message} - стандартное сообщение смерти
death:
enabled: true
# Убийство игроком
player_kill: "&#CF6679☠ &#B798A8{player} &#7858E9был убит игроком &#B798A8{killer} &#9878C9({weapon})"
# Смерть от моба
mob_kill: "&#CF6679☠ &#B798A8{player} &#7858E9был убит мобом &#B798A8{killer}"
# Обычная смерть
default: "&#CF6679☠ &#B798A8{player} &#7858E9{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"

View file

@ -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:
- "&#7858E9▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬"
- "&#B798A8✦ &f{player}"
- "&8\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550"
- " \u2726 &f{player}"
- ""
- "&#9878C9⏱ &fПинг: &#7858E9{ping}ms"
- "&#9878C9❤ &fЗдоровье: &#7858E9{health}/20"
- "&#9878C9🍖 &fГолод: &#7858E9{food}/20"
- " &7Ping: &b{ping}ms"
- " &7Health: &a{health}&7/20"
- " &7Food: &6{food}&7/20"
- ""
- "&#7858E9▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬"
- "&#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"

View file

@ -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"
username: "Minecraft"
avatar-url: "https://mc-heads.net/avatar/minecraft/64"
# Имя бота в Discord
username: "Minecraft Server"
# ── Chat Relay ─────────────────────────────────────────────────────────────────
# Аватар бота (URL изображения)
avatar_url: "https://mc-heads.net/avatar/minecraft/64"
# Настройки чата
chat:
# Отправлять сообщения чата в Discord
enabled: true
# Отправлять только глобальный чат (true) или весь чат (false)
global_only: true
# Формат сообщения чата
global-only: true
format: "**{player}**: {message}"
embed-color: "5865F2"
use-embed: true
# Цвет embed для сообщений чата (hex без #)
embed_color: "5865F2"
# ── Events ─────────────────────────────────────────────────────────────────────
# Использовать embed или обычное сообщение
use_embed: true
# Настройки событий игроков
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"
# Настройки фильтрации
# ── Filtering ──────────────────────────────────────────────────────────────────
filter:
# Игнорировать сообщения от ботов
ignore_bots: true
ignore-bots: true
min-message-length: 1
max-message-length: 2000
sanitize-mentions: true
# Минимальная длина сообщения для отправки
min_message_length: 1
# ── Performance ────────────────────────────────────────────────────────────────
# Максимальная длина сообщения (обрезать если больше)
max_message_length: 2000
# Заменять @everyone и @here на безопасные варианты
sanitize_mentions: true
# Настройки производительности
performance:
# Асинхронная отправка (рекомендуется)
async: true
# Таймаут подключения (секунды)
timeout: 10
# Повторные попытки при ошибке
retry_attempts: 3
# Задержка между попытками (миллисекунды)
retry_delay: 1000
retry-attempts: 3
retry-delay: 1000

View file

@ -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

View file

@ -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Использование: &#7858E9/mute <ник> [время] [-s] [причина]"
time_help: "&#9878C9Время: &#7858E91d&#9878C9, &#7858E92h&#9878C9, &#7858E930m&#9878C9, &#7858E960s&#9878C9, &#7858E9perm"
silent_help: "&#B798A8-s &#9878C9— тихий мут (право &#7858E9lochat.mute.silent&#9878C9)"
no_silent_permission: "&#CF6679Нет права на тихий мут"
default_reason: "Без причины"
default_duration: "7d"
usage: "&cUsage: &f/mute <player> [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Подождите &#7858E9{remaining} &#B798A8сек"
message: "&cPlease wait &f{remaining} &cseconds"
clear_chat:
lines_cleared: "&#9878C9Чат очищен &#7858E9({lines} строк&#9878C9)"
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: "&#9878C9Вас никто не услышал &#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Причина: &#7858E9{reason}&#B798A8. Осталось: &#7858E9{time}"
muted_permanent: "&#CF6679Вы замучены навсегда! &#B798A8Причина: &#7858E9{reason}"
player_muted: "&#9878C9Игрок &#7858E9{player} &#9878C9замучен на &#7858E9{time}&#9878C9. Причина: &#B798A8{reason}"
player_muted_permanent: "&#9878C9Игрок &#7858E9{player} &#9878C9замучен навсегда. Причина: &#B798A8{reason}"
player_muted_silent: "&#B798A8[&#9878C9ТИХИЙ МУТ&#B798A8] &#7858E9{player} &#B798A8замучен на &#7858E9{time}"
player_unmuted: "&#9878C9Игрок &#7858E9{player} &#9878C9размучен"
not_muted: "&#B798A8Игрок &#7858E9{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Сообщение отправлено &#7858E9{player}"
player_offline: "&#CF6679Игрок &#7858E9{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: "&#9878C9Игрок &#7858E9{player} &#9878C9добавлен в игнор"
player_unignored: "&#9878C9Игрок &#7858E9{player} &#9878C9убран из игнора"
already_ignored: "&#B798A8Игрок &#7858E9{player} &#B798A8уже в игноре"
not_ignored: "&#B798A8Игрок &#7858E9{player} &#B798A8не в игноре"
cannot_ignore_self: "&#CF6679Нельзя игнорировать самого себя"
ignore_list_empty: "&#B798A8Список игнора пуст"
ignore_list_header: "&#B798A8Игнорируемые игроки&#9878C9:"
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: "&#7858E9Включено"
disabled: "&#B798A8Отключено"
online: "&#9878C9В сети"
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Причина: &#7858E9{reason}"
warn_staff_confirm: "&#9878C9Игроку &#7858E9{player} &#9878C9выдан варн. &#B798A8Причина: &#7858E9{reason}"
silent_warn_staff: "&#B798A8[&#9878C9ТИХИЙ ВАРН&#B798A8] &#7858E9{player}&#9878C9: &#B798A8{reason}"
ban_usage: "&#B798A8Использование: &#7858E9/lban <ник> [время|perm] [причина]"
ban_confirm: "&#9878C9Игрок &#7858E9{player} &#9878C9забанен. &#B798A8Срок: &#7858E9{duration}"
unban_confirm: "&#9878C9Бан снят с &#7858E9{player}"
not_banned: "&#CF6679Игрок не забанен!"
already_banned: "&#CF6679Игрок уже забанен!"
warn_usage: "&#B798A8Использование: &#7858E9/warn <ник> [причина]"
silent_warn_usage: "&#B798A8Использование: &#7858E9/silentwarn <ник> [причина]"
ban_kick_message: "<gradient:#FF5555:#8B0000><bold>═══════ ДОСТУП ЗАПРЕЩЁН ═══════</bold></gradient>\n<gray>Вы заблокированы на этом сервере.</gray>\n<white>Причина: <gradient:#7858E9:#B798A8>{reason}</gradient></white>\n<gray>Модератор: <white>{moderator}</white></gray>\n<gray>Срок: <#7858E9>{duration}</#7858E9></gray>\n<gradient:#FF5555:#8B0000><bold>════════════════════════</bold></gradient>"
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 <player> [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 <player> [reason]"
silent-warn-usage: "&cUsage: &f/silentwarn <player> [reason]"
ban-kick-message: |
<red><bold>You are banned from this server.</bold></red>
<gray>Reason: <white>{reason}</white></gray>
<gray>Moderator: <white>{moderator}</white></gray>
<gray>Duration: <white>{duration}</white></gray>

View file

@ -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: "&#6BCB77{moderator} размутил {player}"
silent-mute: "&#FFA726[ТИХО] {moderator} замутил {player} на {duration}. Причина: {reason}"
auto-mute: "&#FF6B6B[АВТО] {player} замучен на {duration}. Причина: {reason}"
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"
type: file
# Настройки MySQL
mysql:
host: "localhost"
port: 3306
@ -293,29 +215,22 @@ storage:
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:
@ -323,13 +238,11 @@ features:
- "say"
- "tell"
# Предупреждения перед мутом
warnings:
enabled: true
max-warnings: 3
reset-time: 3600 # Сброс предупреждений (секунды)
reset-time: 3600
# Апелляции на муты
appeals:
enabled: false
command: "/appeal"

View file

@ -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"

View file

@ -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:<perm>
# server - (bungee only) target server name
# Информационные команды
help:
enabled: true
message: |
<gradient:#FFD700:#FFA500><bold>▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬</bold></gradient>
<gradient:#87CEEB:#4169E1><bold>📚 Помощь по серверу</bold></gradient>
<#FFEB3B>🏠 Основные команды:</color>
<#9E9E9E>• <#FFFFFF>/spawn</color> - телепорт на спавн
<#9E9E9E>• <#FFFFFF>/home</color> - телепорт домой
<#9E9E9E>• <#FFFFFF>/sethome</color> - установить дом
<#FFEB3B>💬 Чат команды:</color>
<#9E9E9E>• <#FFFFFF>!сообщение</color> - глобальный чат
<#9E9E9E>• <#FFFFFF>/msg игрок</color> - личное сообщение
<#9E9E9E>• <#FFFFFF>/reply</color> - ответить на ЛС
<#FFEB3B>🎨 Кастомизация:</color>
<#9E9E9E>• <#FFFFFF>/color</color> - градиентный ник
<#9E9E9E>• <#FFFFFF>/prefix</color> - кастомный префикс
<gradient:#FFD700:#FFA500><bold>▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬</bold></gradient>
aliases: ["помощь", "хелп"]
type: "chat"
target: "sender"
<gray>Available commands:</gray>
<gray>\u2022 <white>/spawn</white> - teleport to spawn
<gray>\u2022 <white>/msg <player></white> - private message
<gray>\u2022 <white>/color</white> - gradient nickname
<gray>\u2022 <white>/prefix</white> - custom prefix
aliases: []
type: chat
target: sender
rules:
enabled: true
message: |
<gradient:#FF6B6B:#FF4500><bold>▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬</bold></gradient>
<gradient:#87CEEB:#4169E1><bold>📋 Правила сервера</bold></gradient>
<#F44336><bold>🚫 Запрещено:</bold></color>
<#9E9E9E>• Читерство и использование модов
<#9E9E9E>• Гриферство и воровство
<#9E9E9E>• Мат и оскорбления
<#9E9E9E>• Спам в чате
<#9E9E9E>• Реклама других серверов
<#4CAF50><bold>✅ Разрешено:</bold></color>
<#9E9E9E>• Строительство в любом стиле
<#9E9E9E>• Торговля между игроками
<#9E9E9E>• Создание команд и кланов
<#9E9E9E>• Использование /home и /spawn
<#FFA726><bold>⚠️ За нарушения:</bold></color>
<#9E9E9E>• Предупреждение → Мут → Бан
<gradient:#FF6B6B:#FF4500><bold>▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬</bold></gradient>
aliases: ["правила", "rule"]
type: "chat"
target: "sender"
<red><bold>Server Rules</bold></red>
<gray>1. No cheating or hacking</gray>
<gray>2. No griefing or stealing</gray>
<gray>3. No swearing or insults</gray>
<gray>4. No spam</gray>
<gray>5. No advertising</gray>
aliases: []
type: chat
target: sender
discord:
enabled: true
message: |
<gradient:#5865F2:#7289DA><bold>▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬</bold></gradient>
<gradient:#87CEEB:#4169E1><bold>💬 Discord сервер</bold></gradient>
<#5865F2><bold>Присоединяйся к нашему Discord!</bold></color>
<#FFEB3B>🔗 Ссылка:</color> <click:open_url:'https://discord.gg/yourserver'><u><#00BFFF>discord.gg/yourserver</u></click>
<#FFEB3B>📢 В Discord ты найдешь:</color>
<#9E9E9E>• Общение с игроками
<#9E9E9E>• Новости и обновления
<#9E9E9E>• Поддержку администрации
<#9E9E9E>• Конкурсы и ивенты
<gradient:#5865F2:#7289DA><bold>▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬</bold></gradient>
aliases: ["дискорд", "ds"]
type: "chat"
target: "sender"
<color:#5865F2><bold>Join our Discord!</bold></color>
<click:open_url:'https://discord.gg/yourserver'><u><color:#00BFFF>discord.gg/yourserver</color></u></click>
aliases: ["ds"]
type: chat
target: sender
coords:
enabled: true
message: "<#FFEB3B>📍 <bold>Ваши координаты:</bold></color> <#9E9E9E>X: <#FFFFFF>{x}</color> Y: <#FFFFFF>{y}</color> Z: <#FFFFFF>{z}</color> <#9E9E9E>Мир: <#4CAF50>{world}</color>"
aliases: ["координаты", "pos", "position"]
type: "chat"
target: "sender"
message: "<gold>\u25B6 <white>X: {x} Y: {y} Z: {z} <dark_gray>World: <green>{world}</green>"
aliases: ["pos", "position"]
type: chat
target: sender
ping:
enabled: true
message: "<#FFEB3B>📶 <bold>Ваш пинг:</bold></color> <#4CAF50>{ping}ms</color>"
aliases: ["пинг"]
type: "chat"
target: "sender"
type: "chat"
target: "sender"
message: "<gold>\u25B6 <white>Your ping: <green>{ping}ms</green>"
aliases: []
type: chat
target: sender
hub:
enabled: true
message: "<#4CAF50>🏠 Подключение к хабу...</color>"
aliases: ["lobby", "хаб"]
type: "bungee"
target: "sender"
server: "hub"
message: "<green>Connecting to hub...</green>"
aliases: ["lobby"]
type: bungee
target: sender
server: hub
discord:
enabled: true
message: |
<gradient:#5865F2:#7289DA><bold>▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬</bold></gradient>
<gradient:#87CEEB:#4169E1><bold>💬 Discord сервер</bold></gradient>
<#5865F2><bold>Присоединяйся к нашему Discord!</bold></color>
<#FFEB3B>🔗 Ссылка:</color> <click:open_url:'https://discord.gg/yourserver'><u><#00BFFF>discord.gg/yourserver</u></click>
<#FFEB3B>📢 В Discord ты найдешь:</color>
<#9E9E9E>• Общение с игроками
<#9E9E9E>• Новости и обновления
<#9E9E9E>• Поддержку администрации
<#9E9E9E>• Конкурсы и ивенты
<gradient:#5865F2:#7289DA><bold>▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬</bold></gradient>
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><bold>🔧 Сервер переведен в режим технических работ</bold></color>"
aliases: ["тех-работы", "техработы"]
type: "title"
target: "all"
message: "<gold><bold>Server is now in maintenance mode</bold></gold>"
aliases: []
type: title
target: all

View file

@ -1,225 +1,166 @@
# ╔══════════════════════════════════════════════════════════════════════════════╗
# ║ LoChat — messages.yml ║
# ║ Default palette (Spacelegacy): #7858E9 (dusty rose) → #7858E9 (violet) ║
# ╚══════════════════════════════════════════════════════════════════════════════╝
#
# Color roles (reference when editing strings below):
# &#7858E9 — primary labels / body (dusty rose)
# &#9878C9 — accents / separators (mid violet)
# &#7858E9 — 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: "&#7858E9[&#9878C9L&#8B6BD6o&#7858E9C&#8565DCh&#8B6BD6a&#9878C9t&#7858E9]"
prefix: "&8[&3LoChat&8]"
# ┌─────────────────────────────────────────────────────────────────────────────┐
# │ Global chat (toggle messages, server-disabled notice) │
# └─────────────────────────────────────────────────────────────────────────────┘
# ── Global Chat ────────────────────────────────────────────────────────────────
global:
toggled-on: "&#9878C9Глобальный чат &#7858E9включён"
toggled-off: "&#9878C9Глобальный чат &#7858E9отключён"
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: "&#7858E9Рядом нет игроков"
nobody-heard: "&#9878C9Вас никто не услышал &#7858E9— рядом нет игроков"
no-players: "&cNo players nearby"
nobody-heard: "&7Nobody heard you — no players nearby"
# ┌─────────────────────────────────────────────────────────────────────────────┐
# │ Private messages (/msg, /reply) │
# └─────────────────────────────────────────────────────────────────────────────┘
# ── Private Messages ───────────────────────────────────────────────────────────
pm:
format-sent: "&#7858E9[&#9878C9→&#7858E9] &#9878C9Вы &#7858E9→ {receiver_display}&#7858E9: &f{message}"
format-received: "&#7858E9[&#9878C9←&#7858E9] {sender_display} &#7858E9→ &#9878C9Вы&#7858E9: &f{message}"
use-gradient-names: true
sent: "&#7858E9[&#9878C9→&#7858E9] &#9878C9Вы &#7858E9→ &f{player}&#7858E9: &f{message}"
received: "&#7858E9[&#9878C9←&#7858E9] &f{player} &#7858E9→ &#9878C9Вы&#7858E9: &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: "&#9878C9Игрок &#7858E9{player} &#9878C9добавлен в игнор"
removed: "&#9878C9Игрок &#7858E9{player} &#9878C9убран из игнора"
already-ignored: "&#7858E9Игрок &#7858E9{player} &#7858E9уже в игноре"
not-ignored: "&#7858E9Игрок &#7858E9{player} &#7858E9не в игноре"
self: "&#CF6679Нельзя игнорировать самого себя"
list-empty: "&#7858E9Ваш список игнора пуст"
list-header: "&#7858E9▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬"
list-footer: "&#7858E9Всего: &#7858E9{count} &#7858E9игроков"
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: "&#9878C9Конфигурация &#7858E9перезагружена"
reloaded: "&aConfiguration reloaded"
# ┌─────────────────────────────────────────────────────────────────────────────┐
# │ Chat spy (moderation) │
# └─────────────────────────────────────────────────────────────────────────────┘
# ── Chat Spy ───────────────────────────────────────────────────────────────────
spy:
enabled: "&#9878C9Режим шпиона &#7858E9включён"
disabled: "&#9878C9Режим шпиона &#7858E9отключён"
format: "&#7858E9[&#9878C9SPY&#7858E9] &#7858E9{sender} &#7858E9→ &#9878C9{receiver}&#7858E9: &f{message}"
chat-format: "&#7858E9[&#9878C9SPY&#7858E9] &#7858E9{type} &#7858E9{sender}&#7858E9: &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: "&#7858E9Предупреждение"
blocked: "&cMessage blocked"
warning: "&6Warning"
# ┌─────────────────────────────────────────────────────────────────────────────┐
# │ Cooldowns │
# └─────────────────────────────────────────────────────────────────────────────┘
# ── Cooldowns ──────────────────────────────────────────────────────────────────
cooldown:
wait: "&#7858E9Подождите &#7858E9{time} &#7858E9сек"
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: "&#9878C9Чат очищен &#7858E9администратором &#7858E9{player}"
cleared: "&aChat cleared by &f{player}"
# ┌─────────────────────────────────────────────────────────────────────────────┐
# │ Command / usage errors │
# └─────────────────────────────────────────────────────────────────────────────┘
# ── Errors ─────────────────────────────────────────────────────────────────────
errors:
no-permission: "&#CF6679Нет прав"
player-not-found: "&#CF6679Игрок не найден"
invalid-usage: "&#7858E9Использование: &#7858E9{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: "&#9878C9Конфиг &#7858E9перезагружен!"
invalid-player: "&#CF6679Игрок &#7858E9{player} &#CF6679не найден!"
cooldown-active: "&#7858E9Подождите &#7858E9{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: "&#9878C9Подключение к &#7858E9{server}&#9878C9..."
connecting: "&aConnecting to &f{server}&a..."
# ┌─────────────────────────────────────────────────────────────────────────────┐
# │ Mutes │
# └─────────────────────────────────────────────────────────────────────────────┘
# ── Mute ───────────────────────────────────────────────────────────────────────
mute:
muted: "&#9878C9Игрок &#7858E9{player} &#9878C9замучен на &#7858E9{time}"
unmuted: "&#9878C9Игрок &#7858E9{player} &#9878C9размучен"
already-muted: "&#7858E9Игрок &#7858E9{player} &#7858E9уже замучен"
not-muted: "&#7858E9Игрок &#7858E9{player} &#7858E9не замучен"
you-muted: "&#CF6679Вы замучены! &#7858E9Осталось: &#7858E9{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: "&#9878C9Градиент &#7858E9установлен!"
color-enabled: "&#9878C9Градиентный ник &#7858E9включён"
color-disabled: "&#7858E9Градиентный ник &#9878C9отключён"
color-reset: "&#7858E9Градиент сброшен"
prefix-set: "&#9878C9Префикс &#7858E9установлен!"
prefix-reset: "&#7858E9Префикс сброшен"
prefix-reset-success: "&#9878C9Префикс успешно &#7858E9сброшен!"
prefix-enabled: "&#9878C9Префикс &#7858E9включён"
prefix-disabled: "&#7858E9Префикс &#9878C9отключён"
invalid-hex: "&#CF6679Неверный HEX цвет: &#7858E9{color}"
invalid-color: "&#CF6679Неверный цвет: &#7858E9{color}"
too-many-colors: "&#CF6679Слишком много цветов! Максимум: &#7858E9{max}"
too-few-colors: "&#CF6679Слишком мало цветов! Минимум: &#7858E9{min}"
not-enough-colors: "&#CF6679Слишком мало цветов! Минимум: &#7858E9{min}"
cooldown: "&#7858E9Подождите &#7858E9{time} &#7858E9сек"
not-enough-points: "&#CF6679Недостаточно поинтов! Нужно: &#7858E9{price}"
not-enough-points-color: "&#CF6679Недостаточно поинтов! Нужно: &#7858E9{price}"
not-enough-points-prefix: "&#CF6679Недостаточно поинтов! Нужно: &#7858E9{price}"
player-not-found: "&#CF6679Игрок не найден"
color-help: "&#7858E9Использование: &#7858E9/color <HEX1> <HEX2>"
color-success: "&#9878C9Градиент успешно &#7858E9установлен!"
color-no-colors: "&#7858E9У вас нет установленных цветов"
color-copy-usage: "&#7858E9Использование: &#7858E9/color copy <игрок>"
color-copy-no-colors: "&#7858E9У игрока &#7858E9{player} &#7858E9нет цветов"
prefix-help: "&#7858E9Использование: &#7858E9/prefix <текст> &#7858E9или &#7858E9/prefix reset"
prefix-success: "&#9878C9Префикс установлен! &#7858E9Стоимость: &#7858E9{price} &#7858E9поинтов"
prefix-success-free: "&#9878C9Префикс &#7858E9установлен!"
prefix-no-prefix: "&#7858E9У вас нет префикса"
prefix-too-long: "&#CF6679Префикс слишком длинный! Максимум: &#7858E9{max}"
prefix-no-colors: "&#CF6679Префикс не может содержать цветовые коды!"
prefix-invalid-chars: "&#CF6679Недопустимые символы в префиксе!"
prefix-blacklisted: "&#CF6679Этот префикс запрещён!"
only-player: "&#CF6679Только для игроков!"
no-permission: "&#CF6679Нет прав!"
reload-success: "&#9878C9Конфигурация &#7858E9перезагружена!"
info-header: "&#7858E9▬▬▬▬▬▬▬▬ &#7858E9{player} &#7858E9▬▬▬▬▬▬▬▬"
info-prefix: "&#7858E9Префикс: &f{prefix}"
info-prefix-enabled: "&#7858E9Префикс активен: &f{enabled}"
info-colors: "&#7858E9Цвета: &f{colors}"
info-color-enabled: "&#7858E9Цвет активен: &f{enabled}"
info-prefix-purchased: "&#7858E9Куплен: &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 <hex1> <hex2> ..."
color-success: "&aGradient applied!"
color-no-colors: "&7You have no colors set"
prefix-help: "&cUsage: &f/prefix <text>"
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: "&#7858E9Ваш ник: &#7858E9{nick}"
usage: "&#7858E9Использование: &#7858E9/nick <ник> &#7858E9или &#7858E9/nick reset"
reset-usage: "&#7858E9Используйте &#7858E9/nick reset &#7858E9для сброса"
set-usage: "&#7858E9Используйте &#7858E9/nick <ник> &#7858E9для установки"
no-nick: "&#7858E9У вас нет кастомного ника"
reset-success: "&#9878C9Ник &#7858E9сброшен!"
set-success: "&#9878C9Ник изменён на: &f{nick}"
invalid: "&#CF6679Невалидный ник!"
requirements-header: "&#7858E9Требования:"
requirements-length: "&#9878C9◆ &fДлина: 3-16 символов"
requirements-chars: "&#9878C9◆ &fБуквы, цифры, _, русские буквы"
requirements-colors: "&#9878C9◆ &fЦвета: &#7858E9&#RRGGBB&#7858E9текст"
taken: "&#CF6679Этот ник уже занят!"
error: "&#CF6679Не удалось установить ник!"
current: "&7Your nickname: &f{nick}"
usage: "&cUsage: &f/nick <name> &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: "<color:#7858E9>* {player} {action}</color>"
try-format: "<color:#7858E9>* {player} пытается {action}...</color> {result}"
try-success: "<color:#9878C9><bold>[Успех!]</bold></color>"
try-fail: "<color:#CF6679><bold>[Провал!]</bold></color>"
do-format: "<color:#7858E9>[<color:#7858E9>Сцена</color>]</color> <white>{description}</white> <color:#9878C9>({player})</color>"
roll-format: "<color:#7858E9>* {player} бросает кубик и получает </color><color:#7858E9><bold>{result}</bold></color><color:#7858E9> из </color><color:#9878C9>{max}</color>"
roll-min-error: "<color:#CF6679>Минимальное значение кубика: 2</color>"
roll-max-error: "<color:#CF6679>Максимальное значение: 1000000</color>"
roll-invalid-number: "<color:#CF6679>Укажите число: /roll [максимум]</color>"
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]"