- Remove deprecated service interfaces (CooldownService, IgnoreService, PMService, PlayerDataService, SpyService) - Add new unified service interfaces (MessagingService, PlayerService, PunishmentService) - Extract FilterResult as standalone class from AdvancedMessageFilter - Implement individual filter classes (CharacterFilter, FloodFilter, SpamFilter, SwearFilter, UrlFilter) - Add moderation commands (BanCommand, WarnCommand, SilentWarnCommand, UnbanCommand) - Introduce data models for punishment tracking (BanRecord, WarnEntry) - Refactor messaging service with new MessagingServiceImpl implementation - Add mute service utilities (MuteDataStorage, MutePermissionChecker) - Implement PunishmentServiceImpl with snapshot tracking - Add Discord integration components (DiscordConfig, DiscordMessageService) - Introduce command handlers for gradient module (ColorCommandHandler, PrefixCommandHandler) - Add renderer components (EmojiComponent, GradientBuilder, UrlProcessor) - Add utility classes (ColorConverter, MessageSender, PlaceholderProcessor) - Update configuration files and plugin metadata - Add documentation files (CODE_REVIEW_RU.md, REFACTORING_SERVICES.md) - Consolidate service architecture for improved maintainability and separation of concerns
225 lines
19 KiB
YAML
225 lines
19 KiB
YAML
# ╔══════════════════════════════════════════════════════════════════════════════╗
|
||
# ║ LoChat — messages.yml ║
|
||
# ║ Default palette (Spacelegacy): #B798A8 (dusty rose) → #7858E9 (violet) ║
|
||
# ╚══════════════════════════════════════════════════════════════════════════════╝
|
||
#
|
||
# Color roles (reference when editing strings below):
|
||
# &#B798A8 — primary labels / body (dusty rose)
|
||
# ⚖C9 — accents / separators (mid violet)
|
||
# ẲE9 — emphasis / values (deep violet)
|
||
# &f / #E8E0F0 — message body white
|
||
# &#CF6679 — errors (muted red, fits the palette)
|
||
|
||
prefix: "&#B798A8[⚖C9LB6BD6oẲE9CⅵDChB6BD6a⚖C9t&#B798A8]"
|
||
|
||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
||
# │ Global chat (toggle messages, server-disabled notice) │
|
||
# └─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
global:
|
||
toggled-on: "⚖C9Глобальный чат ẲE9включён"
|
||
toggled-off: "⚖C9Глобальный чат &#B798A8отключён"
|
||
disabled: "&#CF6679Глобальный чат отключён на этом сервере"
|
||
|
||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
||
# │ Local chat (no recipients nearby) │
|
||
# └─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
local:
|
||
no-players: "&#B798A8Рядом нет игроков"
|
||
nobody-heard: "⚖C9Вас никто не услышал &#B798A8— рядом нет игроков"
|
||
|
||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
||
# │ Private messages (/msg, /reply) │
|
||
# └─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
pm:
|
||
format-sent: "&#B798A8[⚖C9→&#B798A8] ⚖C9Вы &#B798A8→ {receiver_display}&#B798A8: &f{message}"
|
||
format-received: "&#B798A8[⚖C9←&#B798A8] {sender_display} &#B798A8→ ⚖C9Вы&#B798A8: &f{message}"
|
||
use-gradient-names: true
|
||
sent: "&#B798A8[⚖C9→&#B798A8] ⚖C9Вы &#B798A8→ &f{player}&#B798A8: &f{message}"
|
||
received: "&#B798A8[⚖C9←&#B798A8] &f{player} &#B798A8→ ⚖C9Вы&#B798A8: &f{message}"
|
||
no-reply: "&#CF6679Некому ответить"
|
||
ignored: "&#CF6679Этот игрок вас игнорирует"
|
||
player-offline: "&#CF6679Игрок не в сети"
|
||
self: "&#CF6679Нельзя писать самому себе"
|
||
|
||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
||
# │ Ignore list │
|
||
# └─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
ignore:
|
||
added: "⚖C9Игрок ẲE9{player} ⚖C9добавлен в игнор"
|
||
removed: "⚖C9Игрок ẲE9{player} ⚖C9убран из игнора"
|
||
already-ignored: "&#B798A8Игрок ẲE9{player} &#B798A8уже в игноре"
|
||
not-ignored: "&#B798A8Игрок ẲE9{player} &#B798A8не в игноре"
|
||
self: "&#CF6679Нельзя игнорировать самого себя"
|
||
list-empty: "&#B798A8Ваш список игнора пуст"
|
||
list-header: "ẲE9▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬"
|
||
list-footer: "&#B798A8Всего: ẲE9{count} &#B798A8игроков"
|
||
|
||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
||
# │ Announcements │
|
||
# └─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
announce:
|
||
reloaded: "⚖C9Конфигурация ẲE9перезагружена"
|
||
|
||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
||
# │ Chat spy (moderation) │
|
||
# └─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
spy:
|
||
enabled: "⚖C9Режим шпиона ẲE9включён"
|
||
disabled: "⚖C9Режим шпиона &#B798A8отключён"
|
||
format: "&#B798A8[⚖C9SPY&#B798A8] ẲE9{sender} &#B798A8→ ⚖C9{receiver}&#B798A8: &f{message}"
|
||
chat-format: "&#B798A8[⚖C9SPY&#B798A8] &#B798A8{type} ẲE9{sender}&#B798A8: &f{message}"
|
||
|
||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
||
# │ Message filters │
|
||
# └─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
filter:
|
||
blocked: "&#CF6679Сообщение заблокировано"
|
||
warning: "&#B798A8Предупреждение"
|
||
|
||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
||
# │ Cooldowns │
|
||
# └─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
cooldown:
|
||
wait: "&#B798A8Подождите ẲE9{time} &#B798A8сек"
|
||
|
||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
||
# │ Anti-spam (caps, repeat, similar messages) │
|
||
# └─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
antispam:
|
||
caps: "&#CF6679Не кричите в чате"
|
||
repeat: "&#CF6679Не повторяйте символы"
|
||
similar: "&#CF6679Не отправляйте одинаковые сообщения"
|
||
|
||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
||
# │ Clear chat │
|
||
# └─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
clearchat:
|
||
cleared: "⚖C9Чат очищен &#B798A8администратором ẲE9{player}"
|
||
|
||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
||
# │ Command / usage errors │
|
||
# └─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
errors:
|
||
no-permission: "&#CF6679Нет прав"
|
||
player-not-found: "&#CF6679Игрок не найден"
|
||
invalid-usage: "&#B798A8Использование: ẲE9{usage}"
|
||
|
||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
||
# │ General (permissions, reload, hub, etc.) │
|
||
# └─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
general:
|
||
no-permission: "&#CF6679У вас нет прав!"
|
||
players-only: "&#CF6679Только для игроков!"
|
||
config-reloaded: "⚖C9Конфиг ẲE9перезагружен!"
|
||
invalid-player: "&#CF6679Игрок ẲE9{player} &#CF6679не найден!"
|
||
cooldown-active: "&#B798A8Подождите ẲE9{time}с"
|
||
command-disabled: "&#CF6679Команда отключена!"
|
||
|
||
hub:
|
||
connecting: "⚖C9Подключение к ẲE9{server}⚖C9..."
|
||
|
||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
||
# │ Mutes │
|
||
# └─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
mute:
|
||
muted: "⚖C9Игрок ẲE9{player} ⚖C9замучен на ẲE9{time}"
|
||
unmuted: "⚖C9Игрок ẲE9{player} ⚖C9размучен"
|
||
already-muted: "&#B798A8Игрок ẲE9{player} &#B798A8уже замучен"
|
||
not-muted: "&#B798A8Игрок ẲE9{player} &#B798A8не замучен"
|
||
you-muted: "&#CF6679Вы замучены! &#B798A8Осталось: ẲE9{time}"
|
||
permanent: "&#CF6679Вы замучены навсегда!"
|
||
|
||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
||
# │ Gradient nick module (LoPreff) │
|
||
# └─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
gradient:
|
||
color-set: "⚖C9Градиент ẲE9установлен!"
|
||
color-enabled: "⚖C9Градиентный ник ẲE9включён"
|
||
color-disabled: "&#B798A8Градиентный ник ⚖C9отключён"
|
||
color-reset: "&#B798A8Градиент сброшен"
|
||
prefix-set: "⚖C9Префикс ẲE9установлен!"
|
||
prefix-reset: "&#B798A8Префикс сброшен"
|
||
prefix-reset-success: "⚖C9Префикс успешно ẲE9сброшен!"
|
||
prefix-enabled: "⚖C9Префикс ẲE9включён"
|
||
prefix-disabled: "&#B798A8Префикс ⚖C9отключён"
|
||
invalid-hex: "&#CF6679Неверный HEX цвет: ẲE9{color}"
|
||
invalid-color: "&#CF6679Неверный цвет: ẲE9{color}"
|
||
too-many-colors: "&#CF6679Слишком много цветов! Максимум: ẲE9{max}"
|
||
too-few-colors: "&#CF6679Слишком мало цветов! Минимум: ẲE9{min}"
|
||
not-enough-colors: "&#CF6679Слишком мало цветов! Минимум: ẲE9{min}"
|
||
cooldown: "&#B798A8Подождите ẲE9{time} &#B798A8сек"
|
||
not-enough-points: "&#CF6679Недостаточно поинтов! Нужно: ẲE9{price}"
|
||
not-enough-points-color: "&#CF6679Недостаточно поинтов! Нужно: ẲE9{price}"
|
||
not-enough-points-prefix: "&#CF6679Недостаточно поинтов! Нужно: ẲE9{price}"
|
||
player-not-found: "&#CF6679Игрок не найден"
|
||
color-help: "&#B798A8Использование: ẲE9/color <HEX1> <HEX2>"
|
||
color-success: "⚖C9Градиент успешно ẲE9установлен!"
|
||
color-no-colors: "&#B798A8У вас нет установленных цветов"
|
||
color-copy-usage: "&#B798A8Использование: ẲE9/color copy <игрок>"
|
||
color-copy-no-colors: "&#B798A8У игрока ẲE9{player} &#B798A8нет цветов"
|
||
prefix-help: "&#B798A8Использование: ẲE9/prefix <текст> &#B798A8или ẲE9/prefix reset"
|
||
prefix-success: "⚖C9Префикс установлен! &#B798A8Стоимость: ẲE9{price} &#B798A8поинтов"
|
||
prefix-success-free: "⚖C9Префикс ẲE9установлен!"
|
||
prefix-no-prefix: "&#B798A8У вас нет префикса"
|
||
prefix-too-long: "&#CF6679Префикс слишком длинный! Максимум: ẲE9{max}"
|
||
prefix-no-colors: "&#CF6679Префикс не может содержать цветовые коды!"
|
||
prefix-invalid-chars: "&#CF6679Недопустимые символы в префиксе!"
|
||
prefix-blacklisted: "&#CF6679Этот префикс запрещён!"
|
||
only-player: "&#CF6679Только для игроков!"
|
||
no-permission: "&#CF6679Нет прав!"
|
||
reload-success: "⚖C9Конфигурация ẲE9перезагружена!"
|
||
info-header: "ẲE9▬▬▬▬▬▬▬▬ &#B798A8{player} ẲE9▬▬▬▬▬▬▬▬"
|
||
info-prefix: "&#B798A8Префикс: &f{prefix}"
|
||
info-prefix-enabled: "&#B798A8Префикс активен: &f{enabled}"
|
||
info-colors: "&#B798A8Цвета: &f{colors}"
|
||
info-color-enabled: "&#B798A8Цвет активен: &f{enabled}"
|
||
info-prefix-purchased: "&#B798A8Куплен: &f{purchased}"
|
||
|
||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
||
# │ Custom nicknames (/nick) │
|
||
# └─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
nick:
|
||
current: "&#B798A8Ваш ник: ẲE9{nick}"
|
||
usage: "&#B798A8Использование: ẲE9/nick <ник> &#B798A8или ẲE9/nick reset"
|
||
reset-usage: "&#B798A8Используйте ẲE9/nick reset &#B798A8для сброса"
|
||
set-usage: "&#B798A8Используйте ẲE9/nick <ник> &#B798A8для установки"
|
||
no-nick: "&#B798A8У вас нет кастомного ника"
|
||
reset-success: "⚖C9Ник ẲE9сброшен!"
|
||
set-success: "⚖C9Ник изменён на: &f{nick}"
|
||
invalid: "&#CF6679Невалидный ник!"
|
||
requirements-header: "&#B798A8Требования:"
|
||
requirements-length: "⚖C9◆ &fДлина: 3-16 символов"
|
||
requirements-chars: "⚖C9◆ &fБуквы, цифры, _, русские буквы"
|
||
requirements-colors: "⚖C9◆ &fЦвета: ẲE9&#RRGGBB&#B798A8текст"
|
||
taken: "&#CF6679Этот ник уже занят!"
|
||
error: "&#CF6679Не удалось установить ник!"
|
||
|
||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
||
# │ Roleplay commands (/me, /try, /do, /roll) │
|
||
# └─────────────────────────────────────────────────────────────────────────────┘
|
||
|
||
rp:
|
||
me: "<color:#B798A8>* {player} {action}</color>"
|
||
try-format: "<color:#B798A8>* {player} пытается {action}...</color> {result}"
|
||
try-success: "<color:#9878C9><bold>[Успех!]</bold></color>"
|
||
try-fail: "<color:#CF6679><bold>[Провал!]</bold></color>"
|
||
do-format: "<color:#7858E9>[<color:#B798A8>Сцена</color>]</color> <white>{description}</white> <color:#9878C9>({player})</color>"
|
||
roll-format: "<color:#B798A8>* {player} бросает кубик и получает </color><color:#7858E9><bold>{result}</bold></color><color:#B798A8> из </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>"
|