Essentials/EssentialsDiscord/src/main/java/net/essentialsx/discord/listeners/BukkitListener.java

192 lines
11 KiB
Java

package net.essentialsx.discord.listeners;
import com.earth2me.essentials.Console;
import com.earth2me.essentials.utils.DateUtil;
import com.earth2me.essentials.utils.FormatUtil;
import net.ess3.api.events.AfkStatusChangeEvent;
import net.ess3.api.events.MuteStatusChangeEvent;
import net.essentialsx.api.v2.events.AsyncUserDataLoadEvent;
import net.essentialsx.api.v2.events.discord.DiscordChatMessageEvent;
import net.essentialsx.api.v2.events.discord.DiscordMessageEvent;
import net.essentialsx.api.v2.services.discord.MessageType;
import net.essentialsx.discord.JDADiscordService;
import net.essentialsx.discord.util.MessageUtil;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.PlayerDeathEvent;
import org.bukkit.event.player.AsyncPlayerChatEvent;
import org.bukkit.event.player.PlayerKickEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import java.text.MessageFormat;
import java.util.UUID;
public class BukkitListener implements Listener {
private final static String AVATAR_URL = "https://crafthead.net/helm/{uuid}";
private final JDADiscordService jda;
public BukkitListener(JDADiscordService jda) {
this.jda = jda;
}
/**
* Processes messages from all other events.
* This way it allows other plugins to modify route/message or just cancel it.
*/
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onDiscordMessage(DiscordMessageEvent event) {
jda.sendMessage(event, event.getMessage(), event.isAllowGroupMentions());
}
// Bukkit Events
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onMute(MuteStatusChangeEvent event) {
if (!event.getValue()) {
sendDiscordMessage(MessageType.DefaultTypes.MUTE,
MessageUtil.formatMessage(jda.getSettings().getUnmuteFormat(),
MessageUtil.sanitizeDiscordMarkdown(event.getAffected().getName()),
MessageUtil.sanitizeDiscordMarkdown(event.getAffected().getDisplayName())));
} else if (event.getTimestamp().isPresent()) {
final boolean console = event.getController() == null;
final MessageFormat msg = event.getReason() == null ? jda.getSettings().getTempMuteFormat() : jda.getSettings().getTempMuteReasonFormat();
sendDiscordMessage(MessageType.DefaultTypes.MUTE,
MessageUtil.formatMessage(msg,
MessageUtil.sanitizeDiscordMarkdown(event.getAffected().getName()),
MessageUtil.sanitizeDiscordMarkdown(event.getAffected().getDisplayName()),
MessageUtil.sanitizeDiscordMarkdown(console ? Console.NAME : event.getController().getName()),
MessageUtil.sanitizeDiscordMarkdown(console ? Console.DISPLAY_NAME : event.getController().getDisplayName()),
DateUtil.formatDateDiff(event.getTimestamp().get()),
MessageUtil.sanitizeDiscordMarkdown(event.getReason())));
} else {
final boolean console = event.getController() == null;
final MessageFormat msg = event.getReason() == null ? jda.getSettings().getPermMuteFormat() : jda.getSettings().getPermMuteReasonFormat();
sendDiscordMessage(MessageType.DefaultTypes.MUTE,
MessageUtil.formatMessage(msg,
MessageUtil.sanitizeDiscordMarkdown(event.getAffected().getName()),
MessageUtil.sanitizeDiscordMarkdown(event.getAffected().getDisplayName()),
MessageUtil.sanitizeDiscordMarkdown(console ? Console.NAME : event.getController().getName()),
MessageUtil.sanitizeDiscordMarkdown(console ? Console.DISPLAY_NAME : event.getController().getDisplayName()),
MessageUtil.sanitizeDiscordMarkdown(event.getReason())));
}
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onChat(AsyncPlayerChatEvent event) {
final Player player = event.getPlayer();
Bukkit.getScheduler().runTask(jda.getPlugin(), () -> {
final DiscordChatMessageEvent chatEvent = new DiscordChatMessageEvent(event.getPlayer(), event.getMessage());
chatEvent.setCancelled(!jda.getSettings().isShowAllChat() && !event.getRecipients().containsAll(Bukkit.getOnlinePlayers()));
Bukkit.getPluginManager().callEvent(chatEvent);
if (chatEvent.isCancelled()) {
return;
}
sendDiscordMessage(MessageType.DefaultTypes.CHAT,
MessageUtil.formatMessage(jda.getSettings().getMcToDiscordFormat(player),
MessageUtil.sanitizeDiscordMarkdown(player.getName()),
MessageUtil.sanitizeDiscordMarkdown(player.getDisplayName()),
player.hasPermission("essentials.discord.markdown") ? chatEvent.getMessage() : MessageUtil.sanitizeDiscordMarkdown(chatEvent.getMessage()),
MessageUtil.sanitizeDiscordMarkdown(player.getWorld().getName()),
MessageUtil.sanitizeDiscordMarkdown(FormatUtil.stripEssentialsFormat(jda.getPlugin().getEss().getPermissionsHandler().getPrefix(player))),
MessageUtil.sanitizeDiscordMarkdown(FormatUtil.stripEssentialsFormat(jda.getPlugin().getEss().getPermissionsHandler().getSuffix(player)))),
player.hasPermission("essentials.discord.ping"),
jda.getSettings().isShowAvatar() ? AVATAR_URL.replace("{uuid}", player.getUniqueId().toString()) : null,
jda.getSettings().isShowName() ? player.getName() : null,
player.getUniqueId());
});
}
@EventHandler(priority = EventPriority.MONITOR)
public void onJoin(AsyncUserDataLoadEvent event) {
// Delay join to let nickname load
if (event.getJoinMessage() != null) {
sendDiscordMessage(MessageType.DefaultTypes.JOIN,
MessageUtil.formatMessage(jda.getSettings().getJoinFormat(event.getUser().getBase()),
MessageUtil.sanitizeDiscordMarkdown(event.getUser().getName()),
MessageUtil.sanitizeDiscordMarkdown(event.getUser().getDisplayName()),
MessageUtil.sanitizeDiscordMarkdown(event.getJoinMessage())),
false,
jda.getSettings().isShowAvatar() ? AVATAR_URL.replace("{uuid}", event.getUser().getBase().getUniqueId().toString()) : null,
jda.getSettings().isShowName() ? event.getUser().getName() : null,
event.getUser().getBase().getUniqueId());
}
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onQuit(PlayerQuitEvent event) {
if (event.getQuitMessage() != null) {
sendDiscordMessage(MessageType.DefaultTypes.LEAVE,
MessageUtil.formatMessage(jda.getSettings().getQuitFormat(event.getPlayer()),
MessageUtil.sanitizeDiscordMarkdown(event.getPlayer().getName()),
MessageUtil.sanitizeDiscordMarkdown(event.getPlayer().getDisplayName()),
MessageUtil.sanitizeDiscordMarkdown(event.getQuitMessage())),
false,
jda.getSettings().isShowAvatar() ? AVATAR_URL.replace("{uuid}", event.getPlayer().getUniqueId().toString()) : null,
jda.getSettings().isShowName() ? event.getPlayer().getName() : null,
event.getPlayer().getUniqueId());
}
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onDeath(PlayerDeathEvent event) {
sendDiscordMessage(MessageType.DefaultTypes.DEATH,
MessageUtil.formatMessage(jda.getSettings().getDeathFormat(event.getEntity()),
MessageUtil.sanitizeDiscordMarkdown(event.getEntity().getName()),
MessageUtil.sanitizeDiscordMarkdown(event.getEntity().getDisplayName()),
MessageUtil.sanitizeDiscordMarkdown(event.getDeathMessage())),
false,
jda.getSettings().isShowAvatar() ? AVATAR_URL.replace("{uuid}", event.getEntity().getUniqueId().toString()) : null,
jda.getSettings().isShowName() ? event.getEntity().getName() : null,
event.getEntity().getUniqueId());
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onAfk(AfkStatusChangeEvent event) {
final MessageFormat format;
if (event.getValue()) {
format = jda.getSettings().getAfkFormat(event.getAffected().getBase());
} else {
format = jda.getSettings().getUnAfkFormat(event.getAffected().getBase());
}
sendDiscordMessage(MessageType.DefaultTypes.AFK,
MessageUtil.formatMessage(format,
MessageUtil.sanitizeDiscordMarkdown(event.getAffected().getName()),
MessageUtil.sanitizeDiscordMarkdown(event.getAffected().getDisplayName())),
false,
jda.getSettings().isShowAvatar() ? AVATAR_URL.replace("{uuid}", event.getAffected().getBase().getUniqueId().toString()) : null,
jda.getSettings().isShowName() ? event.getAffected().getName() : null,
event.getAffected().getBase().getUniqueId());
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onKick(PlayerKickEvent event) {
sendDiscordMessage(MessageType.DefaultTypes.KICK,
MessageUtil.formatMessage(jda.getSettings().getKickFormat(),
MessageUtil.sanitizeDiscordMarkdown(event.getPlayer().getName()),
MessageUtil.sanitizeDiscordMarkdown(event.getPlayer().getDisplayName()),
MessageUtil.sanitizeDiscordMarkdown(event.getReason())));
}
private void sendDiscordMessage(final MessageType messageType, final String message) {
sendDiscordMessage(messageType, message, false, null, null, null);
}
private void sendDiscordMessage(final MessageType messageType, final String message, final boolean allowPing, final String avatarUrl, final String name, final UUID uuid) {
if (jda.getPlugin().getSettings().getMessageChannel(messageType.getKey()).equalsIgnoreCase("none")) {
return;
}
final DiscordMessageEvent event = new DiscordMessageEvent(messageType, FormatUtil.stripFormat(message), allowPing, avatarUrl, name, uuid);
if (Bukkit.getServer().isPrimaryThread()) {
Bukkit.getPluginManager().callEvent(event);
} else {
Bukkit.getScheduler().runTask(jda.getPlugin(), () -> Bukkit.getPluginManager().callEvent(event));
}
}
}