102 lines
4.6 KiB
Java
102 lines
4.6 KiB
Java
package net.essentialsx.discord.listeners;
|
|
|
|
import com.earth2me.essentials.utils.FormatUtil;
|
|
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.discord.JDADiscordService;
|
|
import net.essentialsx.discord.util.DiscordUtil;
|
|
import net.essentialsx.discord.util.MessageUtil;
|
|
import org.apache.commons.lang.StringUtils;
|
|
import org.jetbrains.annotations.NotNull;
|
|
|
|
import java.util.List;
|
|
import java.util.logging.Level;
|
|
import java.util.logging.Logger;
|
|
|
|
public class DiscordListener extends ListenerAdapter {
|
|
private final static Logger logger = Logger.getLogger("EssentialsDiscord");
|
|
|
|
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 Message message = event.getMessage();
|
|
|
|
assert member != null; // Member will never be null
|
|
|
|
if (plugin.getSettings().getDiscordFilter() != null && plugin.getSettings().getDiscordFilter().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 = StringUtils.abbreviate(
|
|
messageBuilder.toString()
|
|
.replace(plugin.getSettings().isChatFilterNewlines() ? '\n' : ' ', ' ')
|
|
.trim(), plugin.getSettings().getChatDiscordMaxLength());
|
|
|
|
// Apply or strip color formatting
|
|
final String finalMessage = 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;
|
|
}
|
|
|
|
final String formattedMessage = EmojiParser.parseToAliases(MessageUtil.formatMessage(plugin.getPlugin().getSettings().getDiscordToMcFormat(),
|
|
event.getChannel().getName(), user.getName(), user.getDiscriminator(), user.getAsTag(),
|
|
member.getEffectiveName(), DiscordUtil.getRoleColorFormat(member), finalMessage), EmojiParser.FitzpatrickAction.REMOVE);
|
|
|
|
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);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|