132 lines
6.0 KiB
Java
132 lines
6.0 KiB
Java
package net.essentialsx.discord.listeners;
|
|
|
|
import com.earth2me.essentials.utils.FormatUtil;
|
|
import com.earth2me.essentials.utils.StringUtil;
|
|
import com.vdurmont.emoji.EmojiParser;
|
|
import net.dv8tion.jda.api.entities.Member;
|
|
import net.dv8tion.jda.api.entities.Message;
|
|
import net.dv8tion.jda.api.entities.User;
|
|
import net.dv8tion.jda.api.events.message.guild.GuildMessageReceivedEvent;
|
|
import net.dv8tion.jda.api.hooks.ListenerAdapter;
|
|
import net.ess3.api.IUser;
|
|
import net.essentialsx.api.v2.events.discord.DiscordRelayEvent;
|
|
import net.essentialsx.discord.EssentialsDiscord;
|
|
import net.essentialsx.discord.JDADiscordService;
|
|
import net.essentialsx.discord.interactions.InteractionChannelImpl;
|
|
import net.essentialsx.discord.interactions.InteractionMemberImpl;
|
|
import net.essentialsx.discord.util.DiscordUtil;
|
|
import net.essentialsx.discord.util.MessageUtil;
|
|
import org.bukkit.Bukkit;
|
|
import org.jetbrains.annotations.NotNull;
|
|
|
|
import java.util.Collections;
|
|
import java.util.List;
|
|
import java.util.logging.Level;
|
|
import java.util.logging.Logger;
|
|
import java.util.regex.Pattern;
|
|
|
|
public class DiscordListener extends ListenerAdapter {
|
|
private final static Logger logger = EssentialsDiscord.getWrappedLogger();
|
|
|
|
private final JDADiscordService plugin;
|
|
|
|
public DiscordListener(JDADiscordService plugin) {
|
|
this.plugin = plugin;
|
|
}
|
|
|
|
@Override
|
|
public void onGuildMessageReceived(@NotNull GuildMessageReceivedEvent event) {
|
|
if (event.getAuthor().isBot() && !event.isWebhookMessage() && (!plugin.getSettings().isShowBotMessages() || event.getAuthor().getId().equals(plugin.getJda().getSelfUser().getId()))) {
|
|
return;
|
|
}
|
|
|
|
if (event.isWebhookMessage() && (!plugin.getSettings().isShowWebhookMessages() || DiscordUtil.ACTIVE_WEBHOOKS.contains(event.getAuthor().getId()))) {
|
|
return;
|
|
}
|
|
|
|
// Get list of channel names that have this channel id mapped
|
|
final List<String> keys = plugin.getPlugin().getSettings().getKeysFromChannelId(event.getChannel().getIdLong());
|
|
if (keys == null || keys.size() == 0) {
|
|
if (plugin.isDebug()) {
|
|
logger.log(Level.INFO, "Skipping message due to no channel keys for id " + event.getChannel().getIdLong() + "!");
|
|
}
|
|
return;
|
|
}
|
|
|
|
final User user = event.getAuthor();
|
|
final Member member = event.getMember();
|
|
final String effectiveName = member == null ? event.getAuthor().getName() : member.getEffectiveName();
|
|
final Message message = event.getMessage();
|
|
|
|
if (!plugin.getSettings().getDiscordFilters().isEmpty()) {
|
|
for (final Pattern pattern : plugin.getSettings().getDiscordFilters()) {
|
|
if (pattern.matcher(message.getContentDisplay()).find()) {
|
|
if (plugin.isDebug()) {
|
|
logger.log(Level.INFO, "Skipping message " + message.getId() + " with content, \"" + message.getContentDisplay() + "\" as it matched the filter!");
|
|
}
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
final StringBuilder messageBuilder = new StringBuilder(message.getContentDisplay());
|
|
if (plugin.getPlugin().getSettings().isShowDiscordAttachments()) {
|
|
for (final Message.Attachment attachment : message.getAttachments()) {
|
|
messageBuilder.append(" ").append(attachment.getUrl());
|
|
}
|
|
}
|
|
|
|
// Strip message
|
|
final String strippedMessage = StringUtil.abbreviate(
|
|
messageBuilder.toString()
|
|
.replace(plugin.getSettings().isChatFilterNewlines() ? '\n' : ' ', ' ')
|
|
.trim(), plugin.getSettings().getChatDiscordMaxLength());
|
|
|
|
// Apply or strip color formatting
|
|
final String finalMessage = member == null || DiscordUtil.hasRoles(member, plugin.getPlugin().getSettings().getPermittedFormattingRoles()) ?
|
|
FormatUtil.replaceFormat(strippedMessage) : FormatUtil.stripFormat(strippedMessage);
|
|
|
|
// Don't send blank messages
|
|
if (finalMessage.trim().length() == 0) {
|
|
if (plugin.isDebug()) {
|
|
logger.log(Level.INFO, "Skipping finalized empty message " + message.getId());
|
|
}
|
|
return;
|
|
}
|
|
|
|
String formattedMessage = EmojiParser.parseToAliases(MessageUtil.formatMessage(plugin.getPlugin().getSettings().getDiscordToMcFormat(),
|
|
event.getChannel().getName(), user.getName(), user.getDiscriminator(), user.getAsTag(),
|
|
effectiveName, DiscordUtil.getRoleColorFormat(member), finalMessage, DiscordUtil.getRoleFormat(member)), EmojiParser.FitzpatrickAction.REMOVE);
|
|
|
|
for (final String group : keys) {
|
|
if (plugin.getSettings().getRelayToConsoleList().contains(group)) {
|
|
logger.info(formattedMessage);
|
|
break;
|
|
}
|
|
}
|
|
|
|
// Do not create the event specific objects if there are no listeners
|
|
if (DiscordRelayEvent.getHandlerList().getRegisteredListeners().length != 0) {
|
|
final DiscordRelayEvent relayEvent = new DiscordRelayEvent(
|
|
new InteractionMemberImpl(member), new InteractionChannelImpl(event.getChannel()),
|
|
Collections.unmodifiableList(keys), event.getMessage().getContentRaw(), formattedMessage);
|
|
Bukkit.getPluginManager().callEvent(relayEvent);
|
|
if (relayEvent.isCancelled()) {
|
|
return;
|
|
}
|
|
formattedMessage = relayEvent.getFormattedMessage();
|
|
}
|
|
|
|
for (IUser essUser : plugin.getPlugin().getEss().getOnlineUsers()) {
|
|
for (String group : keys) {
|
|
final String perm = "essentials.discord.receive." + group;
|
|
final boolean primaryOverride = plugin.getSettings().isAlwaysReceivePrimary() && group.equalsIgnoreCase("primary");
|
|
if (primaryOverride || (essUser.isPermissionSet(perm) && essUser.isAuthorized(perm))) {
|
|
essUser.sendMessage(formattedMessage);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|