Войти или зарегистрироваться

Копирование текста в буфер обмена

Korvinius

Активный участник
Пользователь
Баллы
88
Приветствую! В общем, мне нужно сделать так, чтобы игрок мог получить определённый секретный текст, при этом, данный текст не должен попасть ни в логи сервера ни в логи клиента, и даже в личный чат игрока.
Я предполагаю, что это можна сделать с помощью специальной ссылки в чате, при наведении на которую, появляется всплывающее окно с эти скрытым текстом, а при клике, этот скрытый текст копируется в буфер обмена.

Подскажите возможно ли подобное реализовать в плагине и если да, то каким образом?
 
Компонентами можно сделать копирование при клике. В Paper для подобного есть adventure-api, оформляется через clickEvent. Если нужно, чтоб это ещё было и читабельно при создании, стоит взглянуть на MineDown (а-ля Markdown) или MiniMessage (встроен в Paper последних версий).
 
Компонентами можно сделать копирование при клике. В Paper для подобного есть adventure-api, оформляется через clickEvent. Если нужно, чтоб это ещё было и читабельно при создании, стоит взглянуть на MineDown (а-ля Markdown) или MiniMessage (встроен в Paper последних версий).
а как-то универсальнее, чтобы для разных ядер подходило нельзя?
 
а как-то универсальнее, чтобы для разных ядер подходило нельзя?
Рекомендую все же воспользоваться adventure, т.к. поддерживается все бОльшим количеством разработчиков и платформ (Paper, Velocity, Sponge, Fabric). К тому же есть возможность зашедить библиотеку и организовать платформу для adventure при использовании на Spigot. Ну, и формально MD и MM не имеют конкретной привязки к Paper, лишь к adventure как таковому.
Но если нужна какая-то универсальность для Spigot+ и не хочется увеличивать итоговый джарник, альтернативно можно воспользоваться схожим API от md_5 - оно вшито и в Spigot+, и в BungeeCord имеется. У MineDown есть версия с поддержкой этих компонентов.
 
а как-то универсальнее, чтобы для разных ядер подходило нельзя?
Разных - это каких?
Если нужна поддержка спигот, то можно использовать компоненты md_5.
Но лучше реально зашейдить Adventure
 
Рекомендую все же воспользоваться adventure, т.к. поддерживается все бОльшим количеством разработчиков и платформ (Paper, Velocity, Sponge, Fabric). К тому же есть возможность зашедить библиотеку и организовать платформу для adventure при использовании на Spigot. Ну, и формально MD и MM не имеют конкретной привязки к Paper, лишь к adventure как таковому.
Но если нужна какая-то универсальность для Spigot+ и не хочется увеличивать итоговый джарник, альтернативно можно воспользоваться схожим API от md_5 - оно вшито и в Spigot+, и в BungeeCord имеется. У MineDown есть версия с поддержкой этих компонентов.
Короче ковырял я сначала "kyori adventure", но потом плюнул и в итоге обнаружил что используя API от md_5, то что мне нужно реализуется 4-мя строчками кода, а всё остальное лишнее, спасибо за подсказку.

Код:
TextComponent message = new TextComponent(ChatColor.UNDERLINE + "Click to copy";
message.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new Text("Private text")));
message.setClickEvent(new ClickEvent(ClickEvent.Action.COPY_TO_CLIPBOARD, "Private text"));
sender.spigot().sendMessage(message);
 
Последнее редактирование:
Короче ковырял я сначала "kyori adventure", но потом плюнул и в итоге обнаружил что используя API от md_5, то что мне нужно реализуется 4-мя строчками кода, а всё остальное лишнее, спасибо за подсказку.

Код:
TextComponent message = new TextComponent(ChatColor.UNDERLINE + "Click to copy";
message.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new Text("Private text")));
message.setClickEvent(new ClickEvent(ClickEvent.Action.COPY_TO_CLIPBOARD, "Private text"));
sender.spigot().sendMessage(message);
В adventure ещё проще, не разобрался видимо
 
да, не осилил), но тут не нужно зависеть от внешней библиотеки, всё и так уже есть
Ну, ты хотел универсальности, тебе универсальное решение и предложили. А так да, компоненты md_5 в коробке и в банже, и в спиготе. Правда на paper оно уже помечено устаревшим. Ну и на другие платформы не факт, что можно будет подключить компоненты md_5. Тогда уж реально лучше Adventure.
А раз не осилил - придётся делать свою реализацию отправки сообщения под каждую платформу.

А на Adventure то, что тебе нужно, делается так:
PHP:
Component message = Component.text("Click to copy", NamedTextColor.WHITE, TextDecoration.UNDERLINED)
        .hoverEvent(HoverEvent.showText(Component.text("Private text")))
        .clickEvent(ClickEvent.copyToClipboard("Private text"));
sender.sendMessage(message);
 
Последнее редактирование:
А на Adventure то, что тебе нужно, делается так:
Это то я понял, у меня не хватило терпения и понимания, чтобы импортировать нужные классы из Adventure в свой плагин, так как вся библиотека ради 3-х с половиной строчек кода мне не нужна
 
Это то я понял, у меня не хватило терпения и понимания, чтобы импортировать нужные классы из Adventure в свой плагин, так как вся библиотека ради 3-х с половиной строчек кода мне не нужна
Как знаешь
 
О, я тут подумал, а как сделать такую провеку?
PHP:
if (есть подключена Adventure) {
Component message = Component.text("Click to copy", NamedTextColor.WHITE, TextDecoration.UNDERLINED)
        .hoverEvent(HoverEvent.showText(Component.text("Private text")))
        .clickEvent(ClickEvent.copyToClipboard("Private text"));
sender.sendMessage(message);
} else if (есть md_5){
TextComponent message = new TextComponent(ChatColor.UNDERLINE + "Click to copy";
message.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new Text("Private text")));
message.setClickEvent(new ClickEvent(ClickEvent.Action.COPY_TO_CLIPBOARD, "Private text"));
sender.spigot().sendMessage(message);
}else {
sender.sendMessage("Private text");
}
Есть ли в этом смысл для поддержания универсальности?
 
Последнее редактирование:
О, я тут подумал, а как сделать такую провеку?
PHP:
if (есть подключена Adventure) {
Component message = Component.text("Click to copy", NamedTextColor.WHITE, TextDecoration.UNDERLINED)
        .hoverEvent(HoverEvent.showText(Component.text("Private text")))
        .clickEvent(ClickEvent.copyToClipboard("Private text"));
sender.sendMessage(message);
} else if (есть md_5){
TextComponent message = new TextComponent(ChatColor.UNDERLINE + "Click to copy";
message.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new Text("Private text")));
message.setClickEvent(new ClickEvent(ClickEvent.Action.COPY_TO_CLIPBOARD, "Private text"));
sender.spigot().sendMessage(message);
}else {
sender.sendMessage("Private text");
}
Есть ли в этом смысл для поддержания универсальности?
Не сказал бы, что это прям универсальность. Скорее просто стабильность. Когда удалят компоненты md_5 из paper, то твой плагин не сломается. Нормально, да. И даже на допотопном CraftBukkit будет работать (хотя не уверен, что это плюс)
 
Не сказал бы, что это прям универсальность. Скорее просто стабильность. Когда удалят компоненты md_5 из paper, то твой плагин не сломается. Нормально, да. И даже на допотопном CraftBukkit будет работать (хотя не уверен, что это плюс)
тогда подскажите как реализовать такую проверку?
 
тогда подскажите как реализовать такую проверку?
PHP:
private static boolean isClassPresent(String className) {
    try {
        Class.forName(className);
        return true;
    } catch (ClassNotFoundException e) {
        return false;
    }
}
Использование:
PHP:
boolean adventureSupport = isClassPresent("net.kyori.adventure.text.Component");
boolean md5Support = isClassPresent("net.md_5.bungee.api.chat.BaseComponent");
 
А на Adventure то, что тебе нужно, делается так:
PHP:
Component message = Component.text("Click to copy", NamedTextColor.WHITE, TextDecoration.UNDERLINED)
        .hoverEvent(HoverEvent.showText(Component.text("Private text")))
        .clickEvent(ClickEvent.copyToClipboard("Private text"));
sender.sendMessage(message);
Что-то мне подсказывает, что такая отправка сообщения возможно не будет работать "sender.sendMessage(message)" здесь "message" должно быть String, а преобразование в строку просто выведет всё как строку без добавленных ивентов
 
Назад
Верх