Compare commits

...

3 Commits

Author SHA1 Message Date
Alyx Gryczewski
a915138828 feat: ImageListener JDA Refactor
Revised ImageListener using JDA actions.

3-jda-refactor
2024-07-17 22:22:00 -04:00
Alyx Gryczewski
42f21bac14 feat: First JDA main class tweak
Added the JDA object and builder. Refactored the ImageListener to use JDA

3-jda-refactor
2024-07-17 22:20:57 -04:00
Alyx Gryczewski
b581cd99c0 feat: add JDA dep
3-jda-refactor
2024-07-17 22:20:09 -04:00
3 changed files with 104 additions and 99 deletions

View File

@ -26,8 +26,8 @@ repositories {
}
dependencies {
implementation("net.dv8tion:JDA:5.0.1")
implementation 'org.xerial:sqlite-jdbc:3.41.2.2'
implementation 'org.postgresql:postgresql:42.2.24'
implementation 'com.github.Kaaz:ConfigurationBuilder:0.4'
implementation 'org.javacord:javacord:3.8.0'
implementation 'com.vdurmont:emoji-java:5.1.1'
@ -37,7 +37,6 @@ dependencies {
implementation 'org.springframework.boot:spring-boot-starter-actuator:2.5.4'
implementation 'org.springframework.boot:spring-boot-starter-web:2.5.4'
// implementation 'org.springframework.boot:spring-boot-starter-data-jpa:2.5.4'
testImplementation 'org.springframework.boot:spring-boot-starter-test:2.5.4'
implementation platform('com.google.cloud:libraries-bom:23.0.0')

View File

@ -9,6 +9,9 @@ import dev.salmonllama.fsbot.config.BotConfig;
import dev.salmonllama.fsbot.database.FSDB;
import dev.salmonllama.fsbot.guthix.Guthix;
import dev.salmonllama.fsbot.listeners.*;
import net.dv8tion.jda.api.JDA;
import net.dv8tion.jda.api.JDABuilder;
import net.dv8tion.jda.api.requests.GatewayIntent;
import org.javacord.api.DiscordApiBuilder;
import dev.salmonllama.fsbot.utilities.Constants;
@ -18,6 +21,8 @@ import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import java.util.EnumSet;
@SpringBootApplication
public class Main {
@ -41,13 +46,16 @@ public class Main {
// token = SecretManager.DISCORD_TOKEN.getPlainText();
}
JDA jda = JDABuilder.createLight(token, EnumSet.noneOf(GatewayIntent.class))
.addEventListeners(new ImageListener())
.build();
new DiscordApiBuilder().addIntents(Intent.MESSAGE_CONTENT).setToken(token).login().thenAccept(api -> {
@SuppressWarnings("unused")
Guthix guthix = new Guthix(api);
// Register listeners
api.addMessageCreateListener(new ImageListener());
api.addServerMemberJoinListener(new NewMemberListener());
api.addServerJoinListener(new ServerJoined());
api.addMessageCreateListener(new ThumbsListener());

View File

@ -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
}
});
});
}