diff --git a/src/main/java/dev/salmonllama/fsbot/listeners/ImageListener.java b/src/main/java/dev/salmonllama/fsbot/listeners/ImageListener.java index 65f65c1..3555395 100644 --- a/src/main/java/dev/salmonllama/fsbot/listeners/ImageListener.java +++ b/src/main/java/dev/salmonllama/fsbot/listeners/ImageListener.java @@ -4,19 +4,18 @@ package dev.salmonllama.fsbot.listeners; -import com.vdurmont.emoji.EmojiParser; import dev.salmonllama.fsbot.config.BotConfig; import dev.salmonllama.fsbot.database.controllers.GalleryController; import dev.salmonllama.fsbot.database.controllers.OutfitController; import dev.salmonllama.fsbot.database.controllers.UserBlacklistController; import dev.salmonllama.fsbot.database.models.Outfit; import dev.salmonllama.fsbot.endpoints.imgur.ImgurAPIConnection; -import org.javacord.api.entity.channel.ServerTextChannel; -import org.javacord.api.entity.message.MessageAttachment; -import org.javacord.api.entity.message.embed.EmbedBuilder; -import org.javacord.api.event.message.MessageCreateEvent; -import org.javacord.api.listener.message.MessageCreateListener; -import org.javacord.api.util.logging.ExceptionLogger; +import net.dv8tion.jda.api.EmbedBuilder; +import net.dv8tion.jda.api.entities.Message; +import net.dv8tion.jda.api.entities.channel.concrete.TextChannel; +import net.dv8tion.jda.api.entities.emoji.Emoji; +import net.dv8tion.jda.api.events.message.MessageReceivedEvent; +import net.dv8tion.jda.api.hooks.ListenerAdapter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -24,11 +23,11 @@ import java.awt.Color; import java.util.UUID; -public class ImageListener implements MessageCreateListener { +public class ImageListener extends ListenerAdapter { private static final Logger logger = LoggerFactory.getLogger(ImageListener.class); @Override - public void onMessageCreate(MessageCreateEvent event) { + public void onMessageReceived(MessageReceivedEvent event) { // Check for valid source -> DONE -> WORKING // Check for gallery channel presence -> DONE -> WORKING // Check for images (attached files and links from approved sources) -> DONE -> WORKING (approved links to be added later) @@ -37,52 +36,52 @@ public class ImageListener implements MessageCreateListener { // Send confirmation && log event -> IN PROGRESS (waiting for logger upgrade) // Check for production environment to avoid uploading dev images to Imgur -> DONE -> WORKING - if (!event.getMessageAuthor().isRegularUser()) { + if (event.getAuthor().isBot() || event.getAuthor().isSystem()) { // Ignore anything that is a webhook or a bot message return; } - if (UserBlacklistController.exists(event.getMessageAuthor().getIdAsString()).join()) { + if (UserBlacklistController.exists(event.getAuthor().getId()).join()) { return; } // Only works in Server Text Channels - event.getChannel().asServerTextChannel().ifPresent(channel -> { - // Only works in registered Gallery Channels - GalleryController.galleryExists(channel.getIdAsString()).thenAccept(exists -> { - if (exists) { - // Check the message for images - if (event.getMessageAttachments().stream().anyMatch(MessageAttachment::isImage)) { - event.getMessageAttachments().stream().filter(MessageAttachment::isImage).forEach(image -> { - // Check the ENVIRONMENT env-var. If PROD -> Upload to imgur and store. If not, just store - // Upload the image(s) to Imgur, store in database, log the stored images. + var channel = event.getChannel().asTextChannel(); - if (System.getenv("ENVIRONMENT") != null) { - // Upload the image(s) to Imgur, store in database, log the stored images. - uploadAndStore(event, channel, image); - } else { - // Store the image(s) in database, log the stored images. - store(event, channel, image); - } - }); - } + // Only works in registered Gallery Channels + GalleryController.galleryExists(channel.getId()).thenAccept(exists -> { + if (exists) { + // Check the message for images + if (event.getMessage().getAttachments().stream().anyMatch(Message.Attachment::isImage)) { + event.getMessage().getAttachments().stream().filter(Message.Attachment::isImage).forEach(image -> { + // Check the ENVIRONMENT env-var. If PROD -> Upload to imgur and store. If not, just store + // Upload the image(s) to Imgur, store in database, log the stored images. + + if (System.getenv("ENVIRONMENT") != null) { + // Upload the image(s) to Imgur, store in database, log the stored images. + uploadAndStore(event, channel, image); + } else { + // Store the image(s) in database, log the stored images. + store(event, channel, image); + } + }); } - }).exceptionally(ExceptionLogger.get()); + } }); } - private void uploadAndStore(MessageCreateEvent event, ServerTextChannel channel, MessageAttachment image) { + private void uploadAndStore(MessageReceivedEvent event, TextChannel channel, Message.Attachment image) { ImgurAPIConnection imgur = new ImgurAPIConnection(); // Upload to Imgur - imgur.uploadImage(image.getUrl().toString()).thenAccept(upload -> { + imgur.uploadImage(image.getUrl()).thenAccept(upload -> { // Store in the database Outfit.OutfitBuilder outfitBuilder = new Outfit.OutfitBuilder() .setId(upload.getId()) - .setMeta(event.getMessageContent()) - .setDiscordName(event.getMessageAuthor().getDiscriminatedName()) + .setMeta(event.getMessage().getContentRaw()) + .setDiscordName(event.getAuthor().getName()) .setLink(upload.getLink()) - .setSubmitter(event.getMessageAuthor().getIdAsString()) + .setSubmitter(event.getAuthor().getId()) .setDeleteHash(upload.getDeleteHash()); storeAndLog(event, channel, outfitBuilder); @@ -90,99 +89,98 @@ public class ImageListener implements MessageCreateListener { EmbedBuilder errorEmbed = new EmbedBuilder() .setTitle("Error!") .setColor(Color.RED) - .setAuthor(event.getApi().getYourself()) + .setAuthor(event.getJDA().getSelfUser().getName(), null, event.getJDA().getSelfUser().getAvatarUrl()) .setDescription(e.getMessage()); - event.getChannel().sendMessage(errorEmbed); + event.getChannel().sendMessageEmbeds(errorEmbed.build()).queue(); return null; }); } - private void store(MessageCreateEvent event, ServerTextChannel channel, MessageAttachment image) { + private void store(MessageReceivedEvent event, TextChannel channel, Message.Attachment image) { // Store in the database Outfit.OutfitBuilder outfitBuilder = new Outfit.OutfitBuilder() .setId(UUID.randomUUID().toString()) - .setMeta(event.getMessageContent()) - .setDiscordName(event.getMessageAuthor().getDiscriminatedName()) - .setLink(event.getMessageAttachments().get(0).getUrl().toString()) - .setSubmitter(event.getMessageAuthor().getIdAsString()) + .setMeta(event.getMessage().getContentRaw()) + .setDiscordName(event.getAuthor().getName()) + .setLink(event.getMessage().getAttachments().get(0).getUrl()) + .setSubmitter(event.getAuthor().getId()) .setDeleteHash("DUMMY-DELETE-HASH"); storeAndLog(event, channel, outfitBuilder); } - private void storeAndLog(MessageCreateEvent event, ServerTextChannel channel, Outfit.OutfitBuilder outfitBuilder) { - GalleryController.getTag(channel.getIdAsString()).thenAccept(tag -> { + private void storeAndLog(MessageReceivedEvent event, TextChannel eventChannel, Outfit.OutfitBuilder outfitBuilder) { + GalleryController.getTag(eventChannel.getId()).thenAccept(tag -> { outfitBuilder.setTag(tag); Outfit outfit = outfitBuilder.build(); OutfitController.insert(outfit).thenAcceptAsync((Void) -> { // Log the outfit - // TODO: START ZAMMY LOG - if (outfit.getTag().equals("necro-contest")) - { - event.getApi().getServerTextChannelById(BotConfig.CONTEST_LOG).ifPresentOrElse(chnl -> - { - EmbedBuilder response = new EmbedBuilder() - .setTitle("Outfit Added") - .setAuthor(event.getMessageAuthor()) - .setThumbnail(outfit.getLink()) - .setFooter(String.format("%s | %s", outfit.getTag(), outfit.getId())) - .setUrl(outfit.getLink()) - .setColor(Color.GREEN) - .addField("Uploaded:", outfit.getCreated().toString()) - .addField("Discord Name:", outfit.getDiscordName()); +// // TODO: START ZAMMY LOG +// if (outfit.getTag().equals("necro-contest")) +// { +// event.getJDA().getTextChannelById(BotConfig.CONTEST_LOG).ifPresentOrElse(chnl -> +// { +// EmbedBuilder response = new EmbedBuilder() +// .setTitle("Outfit Added") +// .setAuthor(event.getMessageAuthor()) +// .setThumbnail(outfit.getLink()) +// .setFooter(String.format("%s | %s", outfit.getTag(), outfit.getId())) +// .setUrl(outfit.getLink()) +// .setColor(Color.GREEN) +// .addField("Uploaded:", outfit.getCreated().toString()) +// .addField("Discord Name:", outfit.getDiscordName()); +// +// if (!outfit.getMeta().equals("")) { +// response.addField("Meta:", outfit.getMeta()); +// } +// +// chnl.sendMessage(response); +// logger.info(String.format("Outfit from %s successfully added to the running event.", event.getMessageAuthor().getDiscriminatedName())); +// +// // Add the reaction to the original message +// GalleryController.getEmoji(channel.getIdAsString()).thenAcceptAsync( +// emoji -> event.getMessage().addReaction(EmojiParser.parseToUnicode(emoji)) +// ).exceptionally(ExceptionLogger.get()); +// }, () -> +// { +// // Fallback error message to me +// event.getApi().getUserById(BotConfig.BOT_OWNER).thenAcceptAsync( +// user -> user.sendMessage("Could not find CONTEST_LOG") +// ); +// }); +// } +// // TODO: END ZAMMY LOG - if (!outfit.getMeta().equals("")) { - response.addField("Meta:", outfit.getMeta()); - } - - chnl.sendMessage(response); - logger.info(String.format("Outfit from %s successfully added to the running event.", event.getMessageAuthor().getDiscriminatedName())); - - // Add the reaction to the original message - GalleryController.getEmoji(channel.getIdAsString()).thenAcceptAsync( - emoji -> event.getMessage().addReaction(EmojiParser.parseToUnicode(emoji)) - ).exceptionally(ExceptionLogger.get()); - }, () -> - { - // Fallback error message to me - event.getApi().getUserById(BotConfig.BOT_OWNER).thenAcceptAsync( - user -> user.sendMessage("Could not find CONTEST_LOG") - ); - }); - } - // TODO: END ZAMMY LOG - - event.getApi().getServerTextChannelById(BotConfig.OUTFIT_LOG).ifPresentOrElse(chnl -> { + var logChannel = event.getJDA().getTextChannelById(BotConfig.OUTFIT_LOG); + if (logChannel != null) { EmbedBuilder response = new EmbedBuilder() .setTitle("Outfit Added") - .setAuthor(event.getMessageAuthor()) + .setAuthor(event.getAuthor().getName(), null, event.getAuthor().getAvatarUrl()) .setThumbnail(outfit.getLink()) .setFooter(String.format("%s | %s", outfit.getTag(), outfit.getId())) .setUrl(outfit.getLink()) .setColor(Color.GREEN) - .addField("Uploaded:", outfit.getCreated().toString()) - .addField("Discord Name:", outfit.getDiscordName()); + .addField("Uploaded:", outfit.getCreated().toString(), false) + .addField("Discord Name:", outfit.getDiscordName(), false); - if (!outfit.getMeta().equals("")) { - response.addField("Meta:", outfit.getMeta()); + if (!outfit.getMeta().isEmpty()) { + response.addField("Meta:", outfit.getMeta(), false); } - chnl.sendMessage(response); - logger.info(String.format("Outfit from %s successfully added.", event.getMessageAuthor().getDiscriminatedName())); + logChannel.sendMessageEmbeds(response.build()).queue(); + logger.info(String.format("Outfit from %s successfully added.", event.getAuthor().getName())); - // Add the reaction to the original message - GalleryController.getEmoji(channel.getIdAsString()).thenAcceptAsync( - emoji -> event.getMessage().addReaction(EmojiParser.parseToUnicode(emoji)) - ).exceptionally(ExceptionLogger.get()); - }, () -> { - // Fallback error message to me - event.getApi().getUserById(BotConfig.BOT_OWNER).thenAcceptAsync( - user -> user.sendMessage("Could not find OUTFIT LOG") + // Add the emoji reaction to the message + GalleryController.getEmoji(eventChannel.getId()).thenAcceptAsync( + emoji -> event.getMessage().addReaction(Emoji.fromUnicode(emoji)) ); - }); + } else { + // TODO: Fallback error logging in owner DMs + // May need to wrap the JDA object in a further abstracted object that contains owner attributes + } }); }); }