From a32891a1b0a78cb36cd7ec4c551210471391eabb Mon Sep 17 00:00:00 2001 From: Jackson Bailey Date: Wed, 12 Jun 2024 18:01:07 -0400 Subject: [PATCH] Add basic ping-pong function --- .../wheel_terra__bootRun_.xml | 25 +++++++++++ terra/README.md | 11 +++++ terra/build.gradle.kts | 8 ++++ .../jacksonbailey/wheel/terra/PingPong.java | 43 +++++++++++++++++++ .../wheel/terra/TerraConfig.java | 10 ++++- .../wheel/terra/TerraTestConfig.java | 19 ++++++++ 6 files changed, 114 insertions(+), 2 deletions(-) create mode 100644 .idea/runConfigurations/wheel_terra__bootRun_.xml create mode 100644 terra/src/main/java/dev/jacksonbailey/wheel/terra/PingPong.java create mode 100644 terra/src/test/java/dev/jacksonbailey/wheel/terra/TerraTestConfig.java diff --git a/.idea/runConfigurations/wheel_terra__bootRun_.xml b/.idea/runConfigurations/wheel_terra__bootRun_.xml new file mode 100644 index 0000000..cad84c7 --- /dev/null +++ b/.idea/runConfigurations/wheel_terra__bootRun_.xml @@ -0,0 +1,25 @@ + + + + + + + true + true + false + false + + + \ No newline at end of file diff --git a/terra/README.md b/terra/README.md index c406e47..9728984 100644 --- a/terra/README.md +++ b/terra/README.md @@ -9,6 +9,15 @@ group of chat rooms. If you know Discord, then you know what a server refers to waste my time explaining it lol. That said, I do know that the Discord API calls them "guilds" so things will probably get a little confusing. (Especially considering [Guilds][3] are a new feature). +## Development + +1. To run, `./gradlew :terra:bootRun --args='--spring.profiles.active=live'` +2. To set some default profiles, + `tasks.named("bootRun") { systemProperty("spring.profiles.active", "live") }` +3. To run with Spring's debug mode, `./gradlew :terra:bootRun --args='--debug'`, [see here][5] +4. Run the jar directly, + `./gradlew :terra:bootJar && java -jar terra/build/libs/terra.jar --spring.profiles.active=live` + ## Notes I am going to use Spring Boot's [Dependency Management Plugin][4] instead of trying to use the @@ -53,3 +62,5 @@ Execution failed for task ':discord:generateMetadataFileForMavenJavaPublication' [3]: https://support.discord.com/hc/en-us/articles/23187611406999-Guilds-FAQ [4]: https://docs.spring.io/dependency-management-plugin/docs/current/reference/html/ + +[5]: https://stackoverflow.com/a/71402717/1858327 diff --git a/terra/build.gradle.kts b/terra/build.gradle.kts index e469cd2..dab1287 100644 --- a/terra/build.gradle.kts +++ b/terra/build.gradle.kts @@ -1,3 +1,6 @@ +import org.springframework.boot.gradle.tasks.bundling.BootJar +import org.springframework.boot.gradle.tasks.run.BootRun + plugins { id("dev.jacksonbailey.wheel.java-application-conventions") id("dev.jacksonbailey.wheel.shut-up-javadoc") @@ -29,3 +32,8 @@ dependencies { testImplementation("org.springframework.boot:spring-boot-test") testRuntimeOnly("org.junit.platform:junit-platform-launcher") } + +tasks.getByName("bootJar") { + // TODO Does this mess up publishing somehow? + this.archiveFileName.set("${archiveBaseName.get()}.${archiveExtension.get()}") +} diff --git a/terra/src/main/java/dev/jacksonbailey/wheel/terra/PingPong.java b/terra/src/main/java/dev/jacksonbailey/wheel/terra/PingPong.java new file mode 100644 index 0000000..515fca2 --- /dev/null +++ b/terra/src/main/java/dev/jacksonbailey/wheel/terra/PingPong.java @@ -0,0 +1,43 @@ +package dev.jacksonbailey.wheel.terra; + +import net.dv8tion.jda.api.JDA; +import net.dv8tion.jda.api.entities.Message; +import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel; +import net.dv8tion.jda.api.events.message.MessageReceivedEvent; +import net.dv8tion.jda.api.hooks.ListenerAdapter; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +@Component +public class PingPong extends ListenerAdapter { + + private static final Logger log = LoggerFactory.getLogger(PingPong.class); + + private final JDA jda; + + public PingPong(JDA jda) { + this.jda = jda; + // TODO This is wrong wrong wrong! + jda.addEventListener(this); + } + + @Override + public void onMessageReceived(MessageReceivedEvent event) { + if (event.getAuthor().isBot()) { + return; + } + // We don't want to respond to other bot accounts, including ourself + Message message = event.getMessage(); + String content = message.getContentRaw(); + // getContentRaw() is an atomic getter + // getContentDisplay() is a lazy getter which modifies the content for e.g. console view (strip + // discord formatting) + if (content.equals("!ping")) { + MessageChannel channel = event.getChannel(); + channel.sendMessage("Pong!") + .queue(); // Important to call .queue() on the RestAction returned by sendMessage(...) + } + } + +} diff --git a/terra/src/main/java/dev/jacksonbailey/wheel/terra/TerraConfig.java b/terra/src/main/java/dev/jacksonbailey/wheel/terra/TerraConfig.java index cc61831..5f36968 100644 --- a/terra/src/main/java/dev/jacksonbailey/wheel/terra/TerraConfig.java +++ b/terra/src/main/java/dev/jacksonbailey/wheel/terra/TerraConfig.java @@ -1,15 +1,21 @@ package dev.jacksonbailey.wheel.terra; +import net.dv8tion.jda.api.JDA; import net.dv8tion.jda.api.JDABuilder; +import net.dv8tion.jda.api.requests.GatewayIntent; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; @Configuration public class TerraConfig { @Bean - public JDABuilder jdaBuilder(TerraConfigProps terraConfigProps) { - return JDABuilder.createDefault(terraConfigProps.token()); + @Profile("live") + public JDA jda(TerraConfigProps terraConfigProps) { + return JDABuilder.createDefault(terraConfigProps.token()) + .enableIntents(GatewayIntent.MESSAGE_CONTENT) + .build(); } } diff --git a/terra/src/test/java/dev/jacksonbailey/wheel/terra/TerraTestConfig.java b/terra/src/test/java/dev/jacksonbailey/wheel/terra/TerraTestConfig.java new file mode 100644 index 0000000..f03250b --- /dev/null +++ b/terra/src/test/java/dev/jacksonbailey/wheel/terra/TerraTestConfig.java @@ -0,0 +1,19 @@ +package dev.jacksonbailey.wheel.terra; + +import static org.mockito.Mockito.mock; + +import net.dv8tion.jda.api.JDA; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; + +@Configuration +public class TerraTestConfig { + + @Bean + @Profile("!live") + public JDA jda() { + return mock(JDA.class); + } + +}