From 359c3b5211b672c29b7bf65b088822cc1ac13cf8 Mon Sep 17 00:00:00 2001 From: limited_dev Date: Wed, 28 Sep 2022 00:12:20 +0200 Subject: [PATCH] feat: added basic system, added some test commands, added TokenManager --- .gitignore | 1 + build.gradle.kts | 37 +++++++++- .../java/de/limited_dev/lil_judd/Main.java | 51 ++++++++++++- .../listeners/GuildStateListener.java | 26 +++++++ .../lil_judd/listeners/ReadyListener.java | 18 +++++ .../SlashCommandInteractionListener.java | 20 ++++++ .../lil_judd/util/EmbeddedMessageHelper.java | 26 +++++++ .../de/limited_dev/lil_judd/util/Logger.java | 20 ++++++ .../lil_judd/util/SlashCommandHelper.java | 14 ++++ .../lil_judd/util/managers/TokenManager.java | 71 +++++++++++++++++++ 10 files changed, 280 insertions(+), 4 deletions(-) create mode 100644 src/main/java/de/limited_dev/lil_judd/listeners/GuildStateListener.java create mode 100644 src/main/java/de/limited_dev/lil_judd/listeners/ReadyListener.java create mode 100644 src/main/java/de/limited_dev/lil_judd/listeners/SlashCommandInteractionListener.java create mode 100644 src/main/java/de/limited_dev/lil_judd/util/EmbeddedMessageHelper.java create mode 100644 src/main/java/de/limited_dev/lil_judd/util/Logger.java create mode 100644 src/main/java/de/limited_dev/lil_judd/util/SlashCommandHelper.java create mode 100644 src/main/java/de/limited_dev/lil_judd/util/managers/TokenManager.java diff --git a/.gitignore b/.gitignore index 1dc1a34..0e8801d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ /.idea/ /.gradle/ +/data/token.judd diff --git a/build.gradle.kts b/build.gradle.kts index 5deff5b..2ebf11a 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,9 +1,10 @@ plugins { - id("java") + java + id("com.github.johnrengelman.shadow") version "7.1.2" } group = "de.limited_dev" -version = "1.0.0" +version = "0.1.0-alpha" repositories { mavenCentral() @@ -12,8 +13,40 @@ repositories { dependencies { testImplementation("org.junit.jupiter:junit-jupiter-api:5.8.1") testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.8.1") + implementation("net.dv8tion:JDA:5.0.0-alpha.20") } tasks.getByName("test") { useJUnitPlatform() +} + +tasks.withType { + manifest { + attributes["Main-Class"] = "de.limited_dev.lil_judd.Main" + } + // To add all of the dependencies + from(sourceSets.main.get().output) + + dependsOn(configurations.runtimeClasspath) + from({ + configurations.runtimeClasspath.get().filter { it.name.endsWith("jar") }.map { zipTree(it) } + }) +} + + +tasks.withType { + dependencies { + include(dependency("net.dv8tion:JDA:5.0.0-alpha.20")) + //include(dependency("com.sedmelluq:lavaplayer:1.3.77")) + } + +} + +tasks.withType{ + options.encoding = "UTF-8" +} + +java{ + sourceCompatibility = org.gradle.api.JavaVersion.VERSION_17 + targetCompatibility = org.gradle.api.JavaVersion.VERSION_17 } \ No newline at end of file diff --git a/src/main/java/de/limited_dev/lil_judd/Main.java b/src/main/java/de/limited_dev/lil_judd/Main.java index 485d8de..9a9e56b 100644 --- a/src/main/java/de/limited_dev/lil_judd/Main.java +++ b/src/main/java/de/limited_dev/lil_judd/Main.java @@ -1,7 +1,54 @@ package de.limited_dev.lil_judd; -public class Main { - public static void main(String[] args){ +import de.limited_dev.lil_judd.listeners.GuildStateListener; +import de.limited_dev.lil_judd.listeners.ReadyListener; +import de.limited_dev.lil_judd.listeners.SlashCommandInteractionListener; +import de.limited_dev.lil_judd.util.Logger; +import de.limited_dev.lil_judd.util.managers.TokenManager; +import net.dv8tion.jda.api.JDA; +import net.dv8tion.jda.api.JDABuilder; +import net.dv8tion.jda.api.OnlineStatus; +import net.dv8tion.jda.api.entities.Activity; +import net.dv8tion.jda.api.entities.Guild; +import net.dv8tion.jda.api.interactions.commands.build.Commands; +public class Main { + private static JDA jda; + private static Logger lgr = new Logger(); + private static final TokenManager tokenManager = TokenManager.getInstance(); + private static long launchTime; + + public static void main(String[] args){ + lgr.info("li'l Judd is waking up ..."); + + launchTime = System.currentTimeMillis(); + + tokenManager.load(); + + jda = JDABuilder.createDefault(tokenManager.getToken()) + .setActivity(Activity.watching("You")) + .setStatus(OnlineStatus.DO_NOT_DISTURB) + .build(); + + jda.addEventListener(new ReadyListener()); + jda.addEventListener(new SlashCommandInteractionListener()); + jda.addEventListener(new GuildStateListener()); + + + try { + jda.awaitReady(); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + + lgr.info("Ready to take over the world"); + } + + public static JDA getJda() { + return jda; + } + + public static Logger getLgr() { + return lgr; } } diff --git a/src/main/java/de/limited_dev/lil_judd/listeners/GuildStateListener.java b/src/main/java/de/limited_dev/lil_judd/listeners/GuildStateListener.java new file mode 100644 index 0000000..b5b9568 --- /dev/null +++ b/src/main/java/de/limited_dev/lil_judd/listeners/GuildStateListener.java @@ -0,0 +1,26 @@ +package de.limited_dev.lil_judd.listeners; + +import de.limited_dev.lil_judd.Main; +import de.limited_dev.lil_judd.util.Logger; +import de.limited_dev.lil_judd.util.SlashCommandHelper; +import net.dv8tion.jda.api.entities.Guild; +import net.dv8tion.jda.api.events.guild.GuildJoinEvent; +import net.dv8tion.jda.api.events.guild.GuildLeaveEvent; +import net.dv8tion.jda.api.hooks.ListenerAdapter; +import org.jetbrains.annotations.NotNull; + +public class GuildStateListener extends ListenerAdapter { + private Logger lgr = Main.getLgr(); + + @Override + public void onGuildJoin(@NotNull GuildJoinEvent event) { + lgr.info("I have been added to a guild."); + Guild g = event.getGuild(); + SlashCommandHelper.addSlashCommandsToGuild(g); + } + + @Override + public void onGuildLeave(@NotNull GuildLeaveEvent event) { + lgr.info("I have been removed from a guild."); + } +} diff --git a/src/main/java/de/limited_dev/lil_judd/listeners/ReadyListener.java b/src/main/java/de/limited_dev/lil_judd/listeners/ReadyListener.java new file mode 100644 index 0000000..5154b3e --- /dev/null +++ b/src/main/java/de/limited_dev/lil_judd/listeners/ReadyListener.java @@ -0,0 +1,18 @@ +package de.limited_dev.lil_judd.listeners; + +import de.limited_dev.lil_judd.Main; +import de.limited_dev.lil_judd.util.Logger; +import net.dv8tion.jda.api.events.ReadyEvent; +import net.dv8tion.jda.api.hooks.ListenerAdapter; +import org.jetbrains.annotations.NotNull; + +public class ReadyListener extends ListenerAdapter { + private final Logger lgr = Main.getLgr(); + + @Override + public void onReady(@NotNull ReadyEvent event) { + String usernameOfSelf = Main.getJda().getSelfUser().getName(); + lgr.info("Logged into: " + usernameOfSelf); + lgr.info(usernameOfSelf + " is ready for Freddy"); + } +} diff --git a/src/main/java/de/limited_dev/lil_judd/listeners/SlashCommandInteractionListener.java b/src/main/java/de/limited_dev/lil_judd/listeners/SlashCommandInteractionListener.java new file mode 100644 index 0000000..6439624 --- /dev/null +++ b/src/main/java/de/limited_dev/lil_judd/listeners/SlashCommandInteractionListener.java @@ -0,0 +1,20 @@ +package de.limited_dev.lil_judd.listeners; + +import de.limited_dev.lil_judd.Main; +import de.limited_dev.lil_judd.util.EmbeddedMessageHelper; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; +import net.dv8tion.jda.api.hooks.ListenerAdapter; +import org.jetbrains.annotations.NotNull; + +public class SlashCommandInteractionListener extends ListenerAdapter { + + @Override + public void onSlashCommandInteraction(@NotNull SlashCommandInteractionEvent event) { + if(event.getName().equals("ping")){ + event.reply("My connection to the home base takes **" + Main.getJda().getGatewayPing() + "ms**").queue(); + } + else if(event.getName().equals("info")){ + EmbeddedMessageHelper.sendSimpleOneLiner(event, Main.getJda().getSelfUser().getName(), "Bot information","I'm li'l Judd. I'm better then him, and you know it.", "https://external-content.duckduckgo.com/iu/?u=https%3A%2F%2Fvignette.wikia.nocookie.net%2Fsplatoon%2Fimages%2Fa%2Fa3%2FLittle_Judd_Animated.gif%2Frevision%2Flatest%3Fcb%3D20170605172120&f=1&nofb=1&ipt=f6197a3fdaf8bd6755347ba4e4c67a91320ff047969a9fa1ef4ee3bc88840ffe&ipo=images"); + } + } +} diff --git a/src/main/java/de/limited_dev/lil_judd/util/EmbeddedMessageHelper.java b/src/main/java/de/limited_dev/lil_judd/util/EmbeddedMessageHelper.java new file mode 100644 index 0000000..3311c4b --- /dev/null +++ b/src/main/java/de/limited_dev/lil_judd/util/EmbeddedMessageHelper.java @@ -0,0 +1,26 @@ +package de.limited_dev.lil_judd.util; + +import net.dv8tion.jda.api.EmbedBuilder; +import net.dv8tion.jda.api.events.Event; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; + +import java.awt.*; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +public class EmbeddedMessageHelper { + private static final DateTimeFormatter dtf = DateTimeFormatter.ofPattern("HH:mm:ss | dd/MM/yyyy"); + + public static void sendSimpleOneLiner(SlashCommandInteractionEvent event, String author, String title, String description, String thumbnailURL){ + LocalDateTime now = LocalDateTime.now(); + EmbedBuilder eb = new EmbedBuilder(); + + eb.setAuthor(author); + eb.setTitle(title); + eb.setColor(Color.ORANGE); + eb.setDescription(description); + eb.setThumbnail(thumbnailURL); + eb.setFooter(">" + dtf.format(now) + " - " + event.getUser().getName() + "#" + event.getUser().getDiscriminator()); + event.replyEmbeds(eb.build()).queue(); + } +} diff --git a/src/main/java/de/limited_dev/lil_judd/util/Logger.java b/src/main/java/de/limited_dev/lil_judd/util/Logger.java new file mode 100644 index 0000000..6f7a0aa --- /dev/null +++ b/src/main/java/de/limited_dev/lil_judd/util/Logger.java @@ -0,0 +1,20 @@ +package de.limited_dev.lil_judd.util; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +public class Logger { + private final DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yy/MM/dd HH:mm:ss"); + public void info(String msg) { + StackTraceElement caller = Thread.currentThread().getStackTrace()[2]; + LocalDateTime now = LocalDateTime.now(); + try { + System.out.println("[" + Class.forName(caller.getClassName()).getSimpleName() + "." + + caller.getMethodName() + ":" + caller.getLineNumber() + "] [" + dtf.format(now) + "] <" + msg + ">"); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + // Ich kann nicht mehr + // [Klasse.Funktion] [T/M HH:MM] + } +} diff --git a/src/main/java/de/limited_dev/lil_judd/util/SlashCommandHelper.java b/src/main/java/de/limited_dev/lil_judd/util/SlashCommandHelper.java new file mode 100644 index 0000000..a9893ee --- /dev/null +++ b/src/main/java/de/limited_dev/lil_judd/util/SlashCommandHelper.java @@ -0,0 +1,14 @@ +package de.limited_dev.lil_judd.util; + +import net.dv8tion.jda.api.entities.Guild; +import net.dv8tion.jda.api.interactions.commands.build.Commands; + +public class SlashCommandHelper { + + public static void addSlashCommandsToGuild(Guild g){ + g.updateCommands().addCommands( + Commands.slash("ping", "Pong! Display the Ping"), + Commands.slash("info", "Shows Info about me") + ).queue(); + } +} diff --git a/src/main/java/de/limited_dev/lil_judd/util/managers/TokenManager.java b/src/main/java/de/limited_dev/lil_judd/util/managers/TokenManager.java new file mode 100644 index 0000000..49932c5 --- /dev/null +++ b/src/main/java/de/limited_dev/lil_judd/util/managers/TokenManager.java @@ -0,0 +1,71 @@ +package de.limited_dev.lil_judd.util.managers; + +import java.io.*; +import java.util.Properties; + +public class TokenManager { + + private static TokenManager tokenManager; + private final String basePath = "./data/"; + private final String filename = "token.judd"; + private final String filePath = basePath + filename; + private String token; + + public static TokenManager getInstance(){ + if(tokenManager == null){ + tokenManager = new TokenManager(); + } + return tokenManager; + } + + public void load(){ + File dir = new File(basePath); + if(!dir.exists()){ + save(); + return; + } + File configFile = new File(dir, filename); + if(!configFile.exists()){ + save(); + return; + } + try{ + InputStream input = new FileInputStream(filePath); + Properties prop = new Properties(); + + prop.load(input); + token = prop.getProperty("token").equals("empty") ? null : prop.getProperty("token"); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public void save(){ + File dir = new File(basePath); + if(!dir.exists()){ + dir.mkdirs(); + } + File configFile = new File(dir, filename); + if(!configFile.exists()){ + try{ + configFile.createNewFile(); + } catch(IOException e){ + e.printStackTrace(); + } + } + try{ + OutputStream output = new FileOutputStream(filePath); + Properties prop = new Properties(); + + prop.setProperty("token", "empty"); + + prop.store(output, null); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public String getToken() { + return token; + } +}