Стартап InkyMessage | Форматирование текста под adventure

imDaniX

Активный участник
Пользователь
Баллы
96
Ник в Minecraft
imDaniX
Исходный код: https://github.com/GlowingInk/InkyMessage
Документация: пока что README

Описание​
Разработка в ранней стадии.

(Де)сериализатор текста для Adventure, вдохновленный MineDown и MiniMessage. Поддерживает как легаси формат цветов(&a, &1, &n), так и современные функции.
Меня не устраивали оба решения, из-за чего я и решил взяться за проект. MineDown в принципе неплохой, но стакать опции сообщений - крайне неудобно. MiniMessage требует большое количество писанины для минимальных функций, на что просто становится больно смотреть.

Производительность итоговой библиотеки не так важна, ведь всё в любом случае измеряется буквально в наносекундах. Но если вам вдруг понадобится отправлять тысячи сообщений в секунду - грубо говоря, на данном этапе примерно в три раза быстрее MineDown, примерно в пять раз быстрее MiniMessage. Может отличаться от ситуации к ситуации; в частности - обработка градиентов пока идет примерно наравне с MiniMessage.

Формат​
Полностью поддерживается легаси формат цветов. Для более богатого форматирования используйте формат: &[моё сообщение](тег1:подтег)(тег2:подтег значение)(тегN:подтег...)
Для всех текущих тегов смотрите документацию.

Green, clickable red, red again.
Код:
Inky: &aGreen, &[clickable&c red](click:url https://rubukkit.org/), red again.
Mini: <green>Green, <click:open_url:'https://rubukkit.org/'><green>clickable<red> red</click><red>, red again.
Down: &aGreen, [&aclickable&c red](https://rubukkit.org/)&c, red again
Как можно заметить, в отличии от MiniMessage и MineDown, цвета сохраняют линейность даже после дополнительного форматирования. Единственная неудобность в этом плане: форматирование с тегом color будет требовать поставить &r заранее - цвета накладываются "поверх", и если у текста уже есть какой-то цвет, то по сути тег будет проигнорирован.
Код:
Inky: &aЗелёный, &r&[радужный](gradient:spectrum)(click:url https://rubukkit.org/)
Mini: <green>Зелёный, <click:open_url:'https://rubukkit.org/'><rainbow>радужный</rainbow></click>
Down: &aЗелёный, [&rainbow&радужный](https://rubukkit.org/)

Использование​
Основа - класс InkyMessage. Для генерации сообщений воспользуйтесь InkyMessage.inkyMessage() - либо импортируйте статично, либо просто сохраните в переменную. Далее достаточно вызвать deserialize("&aСообщение"). Экранировать текст можно через InkyMessage.escape("&aСообщение") - подобное сообщение при попадании в deserialize будет работать как обычный текст.
Кастомизация InkyMessageResolver пока в разработке, и я настоятельно не рекомендую её использовать в данный момент - иначе вам ещё раз 10 придется её переписывать, я уверен.

Для добавления к себе в проект можно воспользоваться Maven.
Репозиторий
HTML:
<repository>
    <id>glowing-ink</id>
    <url>https://repo.glowing.ink/releases</url>
</repository>
Зависимость
HTML:
<dependency>
    <groupId>ink.glowing</groupId>
    <artifactId>inkymessage</artifactId>
    <version>0.11.0</version> <!-- Сравните с версией на GitHub -->
</dependency>
По нужде - зашейдить
HTML:
<build>
    <plugins>
        <plugin>
            <artifactId>maven-shade-plugin</artifactId>
            <version>3.4.1</version>
            <configuration>
                <relocations>
                    <relocation>
                        <pattern>ink.glowing.text</pattern>
                        <shadedPattern>ваш.пакет.для.библиотеки</shadedPattern>
                    </relocation>
                </relocations>
            </configuration>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

TODO​
До релиза сделать в планах следующее:
  • Плейсхолдеры для компонентов клавиш и прочего.
  • Дописать документацию, примеры, скриншоты.
  • Закончить первую стадию API.
 
Последнее редактирование:
Не думал кинуть пулл реквест в Adventure с таким сериалайзером?
 
Не думал кинуть пулл реквест в Adventure с таким сериалайзером?
Та не. Насколько я помню, они в принципе были очень против старого формата, мол, все эти &3 - магические значения, не имеющие за собой ничего. Разве что на замену LegacyComponentSerializer предлагать, но такое изменение станется серьезной сменой ожидаемого поведения.
 
Релиз 0.7.0
  • Под капотом было переделано много чего для чуть более солидного API. Но всё ещё не рекомендую использовать что-либо, кроме InkyMessage.inkyMessage() - слишком сыро. Впрочем, фиксация релизов для того и нужна, чтобы была возможность стоять на одном API - просто предупреждаю, что оно точно изменится.
  • Подготовка к сериализации (компоненты -> строка).
  • "Зарубежная" радуга изменена на "русскую" (roygbiv -> кожзгсф), просто потому что мне слишком странно видеть два фиолетовых цвета...
  • В стандартный резольвер добавлена обработка ссылок http(s).
В README.md добавил репозиторий снапшотов - туда автоматически подтягиваются последние изменения в проекте. Версию снапшота можно подсмотреть в pom'нике проекта.

upd: Итоговый радужный градиент вышел не очень, поэтому откатится в ближайшем релизе.
 
Последнее редактирование:
Релиз 0.7.1/0.7.2
  • Градиенты отделены в отдельный тег gradient. Использование через тег color всё ещё возможно.
  • Градиент rainbow теперь называется spectrum (старое название доступно) и использует другой алгоритм формирования, а-ля MiniMessage.
 
Релиз 0.7.0
  • Под капотом было переделано много чего для чуть более солидного API. Но всё ещё не рекомендую использовать что-либо, кроме InkyMessage.inkyMessage() - слишком сыро. Впрочем, фиксация релизов для того и нужна, чтобы была возможность стоять на одном API - просто предупреждаю, что оно точно изменится.
  • Подготовка к сериализации (компоненты -> строка).
  • "Зарубежная" радуга изменена на "русскую" (roygbiv -> кожзгсф), просто потому что мне слишком странно видеть два фиолетовых цвета...
  • В стандартный резольвер добавлена обработка ссылок http(s).
В README.md добавил репозиторий снапшотов - туда автоматически подтягиваются последние изменения в проекте. Версию снапшота можно подсмотреть в pom'нике проекта.

upd: Итоговый радужный градиент вышел не очень, поэтому откатится в ближайшем релизе.

А вопросик, такой а где два фиолетовых?
 
А вопросик, такой а где два фиолетовых?
Меня эти два конфузят больно.
Да и яндекс подсказывает, что это около-фиолетовые.
upload_2023-4-26_15-27-13.png
upload_2023-4-26_15-27-30.png
На английском они indigo и violet, но больно они "фиолетовые" для меня.
 
Релиз 0.8.0
  • Реализован базовый сериалайзер (компонент -> строка).
Пока что есть огрехи в виде отсутствия "оптимизации" легаси кодов между компонентами.
Вот выдержка из текущих тестов (сначала компоненты, потом результат):
Код:
text()
        .append(text("First green").color(GREEN).decorate(BOLD))
        .append(text(" then second green").color(GREEN).decorate(BOLD)).build()
"&a&lFirst green&a&l then second green"

text("First green").append(text(" then second green")).color(GREEN).decorate(BOLD)
"&a&lFirst green&a&l then second green"
Сериализация меня интересует несколько меньше, чем десериализация, но постараюсь исправить этот момент в скором будущем.
 
Релиз 0.9.2
  • Переписана десериализация - теперь будет проще добавлять некоторые обещанные фичи.
  • Как обычно, большие изменения API. Всё ещё не рекомендую трогать. InkyMessage.inkyMessage() как всегда доступен.
 
Релиз 0.10.0
  • Добавлена первоначальная реализация плейсхолдеров-компонентов. Формат &{ключ:значение}(спецтег:подтег значение)(спецтег...). Пока что лишь для переводов - &{lang:chat.type.advancement.task}(lang:arg &aНеизвестный игрок)(lang:arg &b[Нюх-нюх])(lang:fallback Сообщение, если у клиента не будет нужного языка). Реализация не очень нравится - как всегда предупреждаю, что будет переделываться.
  • Тег gradient был перенесён в color - теперь они имеют единый синтаксис. &[Чёрный](color:black), &[Чёрно-белый](color:white-black), &[Радужный](color:spectrum)
  • Градиенты несколько оптимизированы. В небольших тестах производительность примерно равна MiniMessage.
 
Релиз 0.11.0
  • Улучшена реализация плейсхолдеров.
  • Исправлен парсинг форматирования при использовании того впритык &[друг](...)&[ за другом](...)
Также поставил доступ к репо через Cloudflare, так что теперь можно подключаться по https, чтобы последние версии Maven'а не ругались.
 
Чет не могу понять, а какая минимальная версия ядра? Допустим MiniMessage работает только от paper 1 18 насколько я знаю.
Ищу себе какое-то подобное решение которое будет работать на 1 17 1 paper)
 
Чет не могу понять, а какая минимальная версия ядра? Допустим MiniMessage работает только от paper 1 18 насколько я знаю.
Ищу себе какое-то подобное решение которое будет работать на 1 17 1 paper)
Я не тестировал версии ниже 1.19.3. Но судя по версии adventure на разных версиях, боюсь, тоже с 1.18, и то, font не будет работать на нем.

Могу лишь посоветовать попробовать использовать платформу Bukkit, сам adventure последней версии, и зашейдить полностью пакет net.kyori.adventure - чтобы и adventure внутри InkyMessage, и платформа, и твой adventure были под одним пакетом. Тогда не будет таких проблем с устаревшей версией adventure на старых версиях. Но получившийся джарник конечно будет довольно большим...
 
Насколько я помню, они в принципе были очень против старого формата, мол, все эти &3 - магические значения, не имеющие за собой ничего.
Ну, собственно, и по теме как раз ;D Упоминал MineDown на сервере Adventure - касательно легаси они довольно солёные.
upload_2023-5-24_8-5-12.png
 
Как начет использования [] внутри &[]()? В MineDown это реализовано с помощью \\[\\]
 
Как начет использования [] внутри &[]()? В MineDown это реализовано с помощью \\[\\]
Символы &]()}\ точно также экранируются слэшем. [ и { не требуют экранирования - они работают только после &.
"&[[Текст\]](decor:bold)" выведет "[Текст]".
 
Символы &]()}\ точно также экранируются слэшем. [ и { не требуют экранирования - они работают только после &.
"&[[Текст\]](decor:bold)" выведет "[Текст]".
Замечательно, имело место быть упомянутым где-то.
Еще хотелось бы пример работы с placeholder'ами увидеть.

Все же, результат для:
"&7&[/command asd [dsa\\]](click:suggest /command asd)(hover:text &7%display%)"
Где %display% это "asdasdasd \\(asdasdasd\\)"
Это /command asd [dsa]) < ???
 
Последнее редактирование:
Замечательно, имело место быть упомянутым где-то.
Еще хотелось бы пример работы с placeholder'ами увидеть.

Все же, результат для:
"&7&[/command asd [dsa\\]](click:suggest /command asd)(hover:text &7%display%)"
Где %display% это "asdasdasd \\(asdasdasd\\)"
Это /command asd [dsa]) < ???
Проверил это:
Код:
inkyMessage().deserialize("&7&[/command asd [dsa\\]](click:suggest /command asd)(hover:text &7%display%)".replace("%display%", "asdasdasd \\(asdasdasd\\)"));
Результат:
upload_2023-7-4_2-37-56.png

Возможно, дело в 0.11.0 - попробуй снапшот 0.12.0-SNAPSHOT (нужно подменить репо на снапшотный)
 
Проверил это:
Код:
inkyMessage().deserialize("&7&[/command asd [dsa\\]](click:suggest /command asd)(hover:text &7%display%)".replace("%display%", "asdasdasd \\(asdasdasd\\)"));
Результат:
Посмотреть вложение 65330

Возможно, дело в 0.11.0 - попробуй снапшот 0.12.0-SNAPSHOT (нужно подменить репо на снапшотный)
Поставил снапшот, проблема осталась.
 
Ранее я немного схитрил - это сериализованный компонент MiniMessage, чтоб отрендерить на https://webui.advntr.dev/
Но проверил на сервере все же - тоже самое, проходит нормально. Причем, 0.11.0.
upload_2023-7-4_2-53-4.png
Может значение в %display% дважды экранируешь? В таком случае как раз остаётся ), и значение при наведении отличается.
upload_2023-7-4_2-56-48.png
 
Назад
Верх Низ