USER
User: Напиши плагин для майнкрафт ChatPriority. А что если, когда DiscordSRV получает сообщение из майнкрафта, мы проверяем это сообщение, если оно не из чата Global, то мы не отправляем его в дискорд.
import org.bukkit.entity.Player;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
import org.jetbrains.annotations.NotNull;
import ru.brikster.chatty.api.chat.Chat;
import java.util.List;
public final class ChattyMessageEvent extends Event {
private static final HandlerList HANDLER_LIST = new HandlerList();
private final Player player;
private final Chat chat;
private final String plainMessage;
private final List<Player> recipients;
public ChattyMessageEvent(@NotNull Player player,
@NotNull Chat chat,
@NotNull String plainMessage,
@NotNull List<Player> recipients) {
super(true);
this.player = player;
this.chat = chat;
this.plainMessage = plainMessage;
this.recipients = recipients;
}
public static HandlerList getHandlerList() {
return HANDLER_LIST;
}
/**
* Returns the player that sends a message
*
* @return player that sends a message
*/
@NotNull
public Player getSender() {
return player;
}
/**
* Returns the chat to which message sends
*
* @return chat to which message sends
*/
@NotNull
public Chat getChat() {
return chat;
}
/**
* Returns the plain message text, typed by player
*
* @return plain message text
*/
@NotNull
public String getPlainMessage() {
return plainMessage;
}
@NotNull
public List<Player> getRecipients() {
return recipients;
}
@Override
@NotNull
public HandlerList getHandlers() {
return HANDLER_LIST;
}
}
Assistant: Создать плагин для Minecraft, который взаимодействует с DiscordSRV и запретает отправку сообщений в Discord, если они приходят из чата, отличного от "Global", можно следующим образом. Я приведу пример кода, который использует события и интеграцию с DiscordSRV для достижения описанного поведения.
### Основная идея
Мы будем слушать события, связанные с сообщениями, и проверять, является ли они частью чата "Global". Если нет, мы предотвратим их отправку в Discord.
### Шаги по созданию плагина
1. **Импорт необходимых библиотек:** Убедитесь, что у вас настроены зависимости для Bukkit API и DiscordSRV.
2. **Создание класса основного плагина:**
```java
package your.package.name;
import github.scarsz.discordsrv.dependencies.jda.api.entities.TextChannel;
import github.scarsz.discordsrv.DiscordSRV;
import github.scarsz.discordsrv.dependencies.jda.api.entities.TextChannel;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.plugin.java.JavaPlugin;
import ru.brikster.chatty.api.events.ChattyMessageEvent;
public class ChatPriority extends JavaPlugin implements Listener {
@Override
public void onEnable() {
// Регистрация события
getServer().getPluginManager().registerEvents(this, this);
}
@EventHandler(priority = EventPriority.HIGHEST)
public void onChattyMessage(ChattyMessageEvent event) {
// Проверьте, является ли чат "Global"
if (!event.getChat().getName().equalsIgnoreCase("Global")) {
// Остановка обработки сообщения для обрезки перед отправкой в Discord
event.setCancelled(true);
} else {
// Логика отправки в Discord
String message = event.getSender().getName() + ": " + event.getPlainMessage();
TextChannel channel = DiscordSRV.getPlugin().getDestinationTextChannelForGameChannelName("global");
if (channel != null) {
channel.sendMessage(message).queue();
}
}
}
}
```
### Описание кода:
- **Импорт событий:** Мы используем событие `ChattyMessageEvent`, чтобы получить доступ к сообщениям в чате.
- **Проверка имени чата:** Мы проверяем, является ли имя чата "Global". Если нет, мы останавливаем дальнейшую обработку.
- **Отправка в Discord:** Если чат "Global", мы формируем сообщение и отправляем его в соответствующий Discord канал.
### Важно
- Убедитесь, что в `plugin.yml` указано правильное название основного класса плагина.
- Убедитесь, что у вашего сервера есть доступ ко всем необходимым библиотекам, включая DiscordSRV и Chatty API.
- Вам может понадобиться добавить дополнительные проверки и логгирование, чтобы улучшить диагностику и надежность.
Этот код является базовым шаблоном, и его нужно адаптировать под конкретные задачи и архитектуру вашего проекта.
User: Плагин не должен отправлять сообщение в дискорд самостоятельно, а лишь передавать его Discord SRV если оно в чате global.
Assistant: Если ваша цель заключается в том, чтобы плагин фильтровал сообщения, передаваемые в DiscordSRV, но не отправлял их самостоятельно, вы можете просто отменить события для всех сообщений, которые не находятся в нужном чате. DiscordSRV будет автоматически обрабатывать остальные сообщения.
Вот как можно это реализовать, чтобы интегрироваться с DiscordSRV без явной отправки сообщений:
```java
package your.package.name;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.plugin.java.JavaPlugin;
import ru.brikster.chatty.api.events.ChattyMessageEvent;
public class ChatPriority extends JavaPlugin implements Listener {
@Override
public void onEnable() {
// Регистрация слушателя событий
getServer().getPluginManager().registerEvents(this, this);
}
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onChattyMessage(ChattyMessageEvent event) {
// Проверка, что имя чата не "Global"
if (!"Global".equalsIgnoreCase(event.getChat().getName())) {
// Отклонение сообщения, если оно не из чата Global
event.setCancelled(true);
}
}
}
```
### Основные моменты:
- **Отмена события:** Используя `event.setCancelled(true)`, мы предотвращаем дальнейшее распространение сообщения, если чат не является "Global". Это effectively блокирует передачу сообщения в Discord через DiscordSRV.
- **Приоритет события:** Мы используем высокий приоритет (`EventPriority.HIGHEST`) и игнорируем уже отмененные события (`ignoreCancelled = true`), чтобы быть уверенными, что наш слушатель выполнится после других обработчиков и только для сообщений, которые еще активны.
- **Отсутствие повторной отправки:** Поскольку мы не обрабатываем отправку сообщения в Discord самостоятельно, DiscordSRV будет обрабатывать только те сообщения, которые не были отменены, то есть только те, что из чата "Global".
Таким образом, все сообщения отфильтровываются на сервере, и только нужные из них доходят до Discord через существующую инфраструктуру DiscordSRV.
User: Нет, смотри, они должны отправляться в майнкрафт чат, но не должны доходить до DiscordSRV
Assistant: Если цель заключается в том, чтобы сообщения продолжали отображаться в Minecraft, но не передавались в Discord через DiscordSRV, то нужно найти способ взаимодействовать с процессом, который DiscordSRV использует для захвата сообщений из чата. Вы можете достичь этого, изменяя сообщения так, чтобы они не были распознаны DiscordSRV как сообщения для отправки, или используя внутренние механизмы DiscordSRV, если они доступны.
К сожалению, без доступа к внутреннему коду DiscordSRV сложно напрямую управлять процессом его интеграции с чатом. Однако я предоставлю подход, основанный на изменении сообщений, который может сработать:
### Перехват сообщений и их модификация
Мы можем попытаться изменить формат сообщений, чтобы DiscordSRV не распознавал их как допустимые для отправки:
```java
package your.package.name;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.plugin.java.JavaPlugin;
import ru.brikster.chatty.api.events.ChattyMessageEvent;
public class ChatPriority extends JavaPlugin implements Listener {
@Override
public void onEnable() {
getServer().getPluginManager().registerEvents(this, this);
}
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onChattyMessage(ChattyMessageEvent event) {
// Проверка, если имя чата не "Global"
String chatName = event.getChat().getName();
if (!"Global".equalsIgnoreCase(chatName)) {
// Изменяем сообщение для предотвращения его отправки в Discord
// Добавляем, например, специальный префикс, который будет отброшен позже
String modifiedMessage = "[FILTERED] " + event.getPlainMessage();
event.getRecipients().forEach(player -> {
player.sendMessage(modifiedMessage);
});
// Отменяем исходное событие, чтобы оно не обрабатывалось DiscordSRV
event.setCancelled(true);
}
}
}
```
### Объяснение:
- **Перезаписывание сообщения:** Мы вручную отправляем измененное сообщение игрокам (например, с префиксом "[FILTERED]"), имитируя поведение стандартного чата, но прерываем его для дальнейшей обработки. Таким образом, DiscordSRV, вероятно, не сможет правильно обработать сообщения с этим префиксом.
- **Отмена исходного события:** Мы отменяем изначальное событие `ChattyMessageEvent`, чтобы оно не обрабатывалось стандартными средствами, включая возможную пересылку в Discord.
Этот метод — скорее обходной путь. Правильное решение потребует более подробного изучения DiscordSRV API, чтобы понять, можно ли отключить или изменить логику передачи сообщений напрямую. Если DiscordSRV предоставляет настройки или API для фильтрации сообщений, это будет более подходящим способом для реализации такой функциональности.
User: А нельзя заменить всю эту панацею с префиксами методом из апи Discord SRV при получении сообщении из майнкрафта?
Assistant: Да, если DiscordSRV предоставляет подходящий API для фильтрации сообщений перед их отправкой в Discord, то использование этого API будет более чистым решением. В DiscordSRV существует система слушателей, которую можно использовать для перехвата и обработки сообщений перед их отправкой.
Вот пример того, как можно использовать API DiscordSRV для ограничения отправки сообщений в Discord:
### Использование DiscordSRV Listener API
DiscordSRV предоставляет возможность подписываться на события через их API. Мы можем использовать `DiscordSRV#eventBus` для регистрации слушателя событий сообщений.
Вот как это можно сделать:
```java
package your.package.name;
import github.scarsz.discordsrv.DiscordSRV;
import github.scarsz.discordsrv.dependencies.jda.api.entities.MessageChannel;
import github.scarsz.discordsrv.hooks.chat.MinecraftChatListener;
import github.scarsz.discordsrv.util.DiscordUtil;
import github.scarsz.discordsrv.dependencies.jda.api.events.message.guild.GuildMessageReceivedEvent;
import org.bukkit.plugin.java.JavaPlugin;
import ru.brikster.chatty.api.chat.Chat;
public class ChatPriority extends JavaPlugin {
@Override
public void onEnable() {
// Регистрация слушателя для обработки Minecraft сообщений
DiscordSRV.api.subscribe(event -> {
if (event instanceof MinecraftChatListener.ChatMessage) {
MinecraftChatListener.ChatMessage chatMessageEvent = (MinecraftChatListener.ChatMessage) event;
// Получение информации о чате и проверка его имени
Chat chat = chatMessageEvent.getChannel();
if (!"Global".equalsIgnoreCase(chat.getName())) {
chatMessageEvent.setCancelled(true);
}
}
});
// Регистрация плагина как слушателя событий DiscordSRV
DiscordSRV.getPlugin().getEventBus().subscribe(this);
}
}
```
### Объяснение:
- **Подписка на события:** Мы подписываемся на все события в системе DiscordSRV, а конкретно интересуемся событиями `MinecraftChatListener.ChatMessage`.
- **Проверка чата:** При получении каждого сообщения мы проверяем, относится ли оно к чату "Global". Если нет, мы отменяем обработку сообщения с помощью `chatMessageEvent.setCancelled(true)`.
### Что важно учесть:
- **Компиляция и выполнение:** Убедитесь, что ваш проект корректно настраивает зависимости от DiscordSRV. Это можно сделать через систему сборки, такую как Maven или Gradle.
- **Совместимость версий:** API DiscordSRV может изменяться, поэтому приведенный код может нуждаться в модификации, если вы используете другую версию DiscordSRV.
- **Документация и пример кода:** Ознакомьтесь с документацией DiscordSRV, так как она может предоставить дополнительные функции для более точной настройки вашего плагина.
Таким образом, использование возможности отмены событий напрямую через API DiscordSRV — это наиболее прямой и подходящий способ фильтрации сообщений между Minecraft и Discord.
User: Покажи как мне вставить depency в maven, а именно чатти
Assistant: Для добавления зависимости Chatty в ваш проект Maven, вам нужно будет обновить файл `pom.xml` вашего проекта с необходимыми данными о репозитории и зависимости. Вот как это можно сделать:
### 1. Добавьте репозиторий
Сначала добавьте репозиторий, где находится Chatty. Обычно это будет репозиторий, предоставленный автором плагина. Так как Chatty — это относительно малораспространенный плагин, его может не быть в центральном Maven репозитории.
Пример (репозиторий необходимо уточнить у разработчика Chatty):
```xml
<repositories>
<repository>
<id>some-repository-id</id>
<url>https://someurl.com/repository/maven-public/</url>
</repository>
</repositories>
```
### 2. Добавьте зависимость
После добавления репозитория, добавьте зависимость Chatty в свой `pom.xml`.
Пример:
```xml
<dependencies>
<dependency>
<groupId>ru.brikster</groupId>
<artifactId>chatty</artifactId>
<version>1.0.0</version> <!-- Укажите конкретную версию -->
<scope>provided</scope>
</dependency>
<!-- Другие зависимости -->
</dependencies>
```
### Замечания
- **Версия**: Убедитесь, что вы используете правильную версию `Chatty`. Вам может потребоваться проверить ченджлог или README Chatty для того, чтобы узнать, какая версия вам подходит.
- **Scope**: Установив `<scope>provided</scope>`, вы указываете, что эта библиотека будет предоставляться в среде выполнения (например, сервером), и её не нужно встраивать в конечный скомпилированный jar вашего плагина.
- **URL репозитория**: Уточните URL репозитория для Chatty. Это можно сделать через GitHub проекта Chatty или через его разработчиков.
После настройки `pom.xml`, вам может понадобиться выполнить команду `mvn clean install`, чтобы обновить проект и скачать все необходимые зависимости. Убедитесь, что `pom.xml` и среда разработки настроены корректно.
User: Тут есть только грейдл, как это сделать на мейвен?
plugins {
id 'maven-publish'
id 'com.github.johnrengelman.shadow' version '8.1.1'
}
tasks {
jar {
archiveClassifier = 'original'
}
shadowJar {
archiveClassifier = null
relocate 'net.kyori', 'ru.brikster.chatty.shaded.net.kyori'
dependencies {
exclude(dependency("com.google.guava:guava"))
exclude(dependency("com.google.inject:guice"))
}
}
assemble {
dependsOn shadowJar
}
}
publishing {
publications {
maven(MavenPublication) {
from components.java
artifactId = 'chatty-api'
}
}
}
Assistant: