Compare commits

...

70 Commits

Author SHA1 Message Date
Lee
45a0a4332e test 2024-12-27 13:49:04 +00:00
Lee
9089767dc5 test 2024-12-27 13:48:53 +00:00
Lee
b3a6284e40 cleanup
All checks were successful
Deploy to Dokku / docker (ubuntu-latest) (push) Successful in 1m42s
2024-12-27 13:04:57 +00:00
Lee
5f099a97f0 remove some things and bump depends
All checks were successful
Deploy to Dokku / docker (ubuntu-latest) (push) Successful in 1m14s
2024-12-27 12:50:13 +00:00
577c895169 Merge remote-tracking branch 'origin/master'
Some checks failed
Deploy to Dokku / docker (ubuntu-latest) (push) Failing after 12m51s
2024-11-29 03:38:35 +00:00
6db2a01bb3 expire pastes after a month 2024-11-29 03:38:28 +00:00
Lee
4cc4334df4 Merge pull request 'Update dependency org.springframework.boot:spring-boot-starter-parent to v3.3.5' (#44) from renovate/spring-boot into master
Some checks failed
Deploy to Dokku / docker (ubuntu-latest) (push) Failing after 7s
Reviewed-on: #44
2024-11-02 23:16:31 +00:00
Lee
a4acdc2ec1 Merge pull request 'Update dependency org.apache.httpcomponents.client5:httpclient5 to v5.4.1' (#45) from renovate/org.apache.httpcomponents.client5-httpclient5-5.x into master
Some checks failed
Deploy to Dokku / docker (ubuntu-latest) (push) Has been cancelled
Reviewed-on: #45
2024-11-02 23:16:18 +00:00
Lee
7ca984e785 Merge pull request 'Update dependency io.sentry:sentry-spring-boot-starter-jakarta to v7.16.0' (#46) from renovate/io.sentry-sentry-spring-boot-starter-jakarta-7.x into master
Some checks failed
Deploy to Dokku / docker (ubuntu-latest) (push) Failing after 5s
Reviewed-on: #46
2024-11-02 23:16:13 +00:00
Lee
53730a82cf Merge pull request 'Update dependency io.mongock:mongock-bom to v5.5.0' (#47) from renovate/io.mongock-mongock-bom-5.x into master
Some checks failed
Deploy to Dokku / docker (ubuntu-latest) (push) Has been cancelled
Reviewed-on: #47
2024-11-02 23:16:06 +00:00
Lee
6f4a787ccb Merge pull request 'Update dependency io.mongock:mongock-springboot-v3 to v5.5.0' (#48) from renovate/io.mongock-mongock-springboot-v3-5.x into master
Some checks failed
Deploy to Dokku / docker (ubuntu-latest) (push) Has been cancelled
Reviewed-on: #48
2024-11-02 23:16:02 +00:00
Lee
2b588a5940 Merge pull request 'Update dependency io.mongock:mongodb-springdata-v4-driver to v5.5.0' (#49) from renovate/io.mongock-mongodb-springdata-v4-driver-5.x into master
Some checks failed
Deploy to Dokku / docker (ubuntu-latest) (push) Has been cancelled
Reviewed-on: #49
2024-11-02 23:15:56 +00:00
Lee
fe4cf3bbf4 Merge pull request 'Update eclipse-temurin Docker tag to v17.0.13_11-jre-focal' (#50) from renovate/eclipse-temurin-17.x into master
Some checks failed
Deploy to Dokku / docker (ubuntu-latest) (push) Has been cancelled
Reviewed-on: #50
2024-11-02 23:15:51 +00:00
ede931f994 Update dependency org.apache.httpcomponents.client5:httpclient5 to v5.4.1 2024-10-28 18:01:11 +00:00
d5ed2b0b13 Update dependency org.springframework.boot:spring-boot-starter-parent to v3.3.5 2024-10-24 14:01:29 +00:00
4479bce0a4 Update eclipse-temurin Docker tag to v17.0.13_11-jre-focal 2024-10-24 04:01:33 +00:00
3c80b3ca4b Update dependency io.sentry:sentry-spring-boot-starter-jakarta to v7.16.0 2024-10-23 14:01:31 +00:00
65fd68f76c Update dependency io.mongock:mongodb-springdata-v4-driver to v5.5.0 2024-10-17 00:02:24 +00:00
6640dd4368 Update dependency io.mongock:mongock-springboot-v3 to v5.5.0 2024-10-16 23:00:45 +00:00
96cb634fd4 Update dependency io.mongock:mongock-bom to v5.5.0 2024-10-16 23:00:43 +00:00
Lee
0f9a23e4a2 Update pom.xml
All checks were successful
Deploy to Dokku / docker (ubuntu-latest) (push) Successful in 55s
2024-09-02 08:25:19 +00:00
Lee
eb3d8eea29 Merge pull request 'Update dependency maven to v3.9.9' (#42) from renovate/maven-3.x into master
Some checks failed
Deploy to Dokku / docker (ubuntu-latest) (push) Has been cancelled
Reviewed-on: #42
2024-09-02 08:24:54 +00:00
Lee
7e45b5d880 Merge pull request 'Update dependency org.springframework.boot:spring-boot-starter-parent to v3.3.3' (#43) from renovate/spring-boot into master
All checks were successful
Deploy to Dokku / docker (ubuntu-latest) (push) Successful in 1m53s
Reviewed-on: #43
2024-09-01 01:50:49 +00:00
892b85ccb4 update msg log paste
All checks were successful
Deploy to Dokku / docker (ubuntu-latest) (push) Successful in 2m6s
2024-08-25 01:58:07 +01:00
f291344c45 oops
All checks were successful
Deploy to Dokku / docker (ubuntu-latest) (push) Successful in 1m25s
2024-08-22 20:47:11 +01:00
df9b0e2604 oopsie
All checks were successful
Deploy to Dokku / docker (ubuntu-latest) (push) Successful in 1m16s
2024-08-22 20:31:22 +01:00
2695a2994a add coin flip command
Some checks failed
Deploy to Dokku / docker (ubuntu-latest) (push) Failing after 1m54s
2024-08-22 20:23:11 +01:00
fa50eb9873 Update dependency org.springframework.boot:spring-boot-starter-parent to v3.3.3 2024-08-22 19:01:10 +00:00
58bb976f96 Update dependency maven to v3.9.9 2024-08-19 21:01:17 +00:00
3615ef4b92 Merge remote-tracking branch 'origin/master'
Some checks failed
Deploy to Dokku / docker (ubuntu-latest) (push) Failing after 1m31s
2024-08-15 13:59:19 +01:00
5c78ec907f fix minecraft player lookup error handling 2024-08-15 13:59:13 +01:00
Lee
c380878039 Merge pull request 'Update dependency io.sentry:sentry-spring-boot-starter-jakarta to v7.14.0' (#40) from renovate/io.sentry-sentry-spring-boot-starter-jakarta-7.x into master
All checks were successful
Deploy to Dokku / docker (ubuntu-latest) (push) Successful in 2m4s
Reviewed-on: #40
2024-08-13 17:28:28 +00:00
cfaa501377 Update dependency io.sentry:sentry-spring-boot-starter-jakarta to v7.14.0 2024-08-13 09:01:17 +00:00
Lee
6f12062311 Merge pull request 'Update dependency io.sentry:sentry-spring-boot-starter-jakarta to v7.13.0' (#39) from renovate/io.sentry-sentry-spring-boot-starter-jakarta-7.x into master
All checks were successful
Deploy to Dokku / docker (ubuntu-latest) (push) Successful in 2m19s
Reviewed-on: #39
2024-07-31 15:59:30 +00:00
3edfab3adb Update dependency io.sentry:sentry-spring-boot-starter-jakarta to v7.13.0 2024-07-31 10:00:36 +00:00
Lee
25d4b247b3 Merge pull request 'Update dependency org.springframework.boot:spring-boot-starter-parent to v3.3.2' (#38) from renovate/org.springframework.boot-spring-boot-starter-parent-3.x into master
All checks were successful
Deploy to Dokku / docker (ubuntu-latest) (push) Successful in 2m16s
Reviewed-on: #38
2024-07-30 20:52:04 +00:00
Lee
393c7741ca Merge pull request 'Update eclipse-temurin Docker tag to v17.0.12_7-jre-focal' (#18) from renovate/eclipse-temurin-17.x into master
Some checks failed
Deploy to Dokku / docker (ubuntu-latest) (push) Has been cancelled
Reviewed-on: #18
2024-07-30 20:51:59 +00:00
Lee
001836c88b Merge pull request 'Update dependency io.sentry:sentry-spring-boot-starter-jakarta to v7.12.1' (#16) from renovate/io.sentry-sentry-spring-boot-starter-jakarta-7.x into master
Some checks failed
Deploy to Dokku / docker (ubuntu-latest) (push) Has been cancelled
Reviewed-on: #16
2024-07-30 20:51:53 +00:00
Lee
be7e03d641 Merge pull request 'Update dependency se.michaelthelin.spotify:spotify-web-api-java to v8.4.1' (#19) from renovate/se.michaelthelin.spotify-spotify-web-api-java-8.x into master
Some checks failed
Deploy to Dokku / docker (ubuntu-latest) (push) Has been cancelled
Reviewed-on: #19
2024-07-30 20:51:46 +00:00
db357a63f5 Update dependency org.springframework.boot:spring-boot-starter-parent to v3.3.2 2024-07-26 12:03:33 +00:00
e50fe57ee6 Update dependency io.sentry:sentry-spring-boot-starter-jakarta to v7.12.1 2024-07-25 13:00:41 +00:00
2c017d0603 Update dependency se.michaelthelin.spotify:spotify-web-api-java to v8.4.1 2024-07-24 20:01:06 +00:00
f32d278a6c Update eclipse-temurin Docker tag to v17.0.12_7-jre-focal 2024-07-23 01:01:16 +00:00
b8ebc1de24 fix in dms
All checks were successful
Deploy to Dokku / docker (ubuntu-latest) (push) Successful in 1m9s
2024-07-16 14:40:53 +01:00
2b2e10d994 oopsie
All checks were successful
Deploy to Dokku / docker (ubuntu-latest) (push) Successful in 54s
2024-07-16 14:37:46 +01:00
8526036044 add scoresaber score summary
All checks were successful
Deploy to Dokku / docker (ubuntu-latest) (push) Successful in 1m59s
2024-07-16 14:35:02 +01:00
f5c31195da fix log title
All checks were successful
Deploy to Dokku / docker (ubuntu-latest) (push) Successful in 1m28s
2024-07-10 10:42:19 +01:00
d6175b3f92 oops
All checks were successful
Deploy to Dokku / docker (ubuntu-latest) (push) Successful in 2m14s
2024-07-10 06:00:40 +01:00
96e7518f72 fix interactions
All checks were successful
Deploy to Dokku / docker (ubuntu-latest) (push) Successful in 1m19s
2024-07-09 23:02:12 +01:00
f1bc2b2aaa add user validation to moderation and to user lookup
All checks were successful
Deploy to Dokku / docker (ubuntu-latest) (push) Successful in 1m18s
2024-07-09 20:34:56 +01:00
4ec65c8d6e validate id when getting user
All checks were successful
Deploy to Dokku / docker (ubuntu-latest) (push) Successful in 1m11s
2024-07-09 20:24:50 +01:00
38465f544d fix past tense
All checks were successful
Deploy to Dokku / docker (ubuntu-latest) (push) Successful in 1m19s
2024-07-09 20:19:21 +01:00
a3f4e2b918 finish moderation
All checks were successful
Deploy to Dokku / docker (ubuntu-latest) (push) Successful in 2m2s
2024-07-09 19:46:48 +01:00
bc57834366 fix spelling
All checks were successful
Deploy to Dokku / docker (ubuntu-latest) (push) Successful in 1m14s
2024-07-07 07:02:49 +01:00
87a56700ec add stat channels feature
All checks were successful
Deploy to Dokku / docker (ubuntu-latest) (push) Successful in 1m25s
2024-07-07 06:50:25 +01:00
6d98977198 Merge remote-tracking branch 'origin/master'
All checks were successful
Deploy to Dokku / docker (ubuntu-latest) (push) Successful in 1m30s
2024-07-07 05:50:21 +01:00
1256d2ddf9 change bot motd 2024-07-07 05:46:48 +01:00
Lee
7cf970df77 Merge pull request 'Update dependency org.apache.maven.plugins:maven-shade-plugin to v3.6.0' (#14) from renovate/org.apache.maven.plugins-maven-shade-plugin-3.x into master
All checks were successful
Deploy to Dokku / docker (ubuntu-latest) (push) Successful in 1m7s
Reviewed-on: #14
2024-07-07 02:35:48 +00:00
Lee
52557b5c65 Merge pull request 'Update dependency io.sentry:sentry-spring-boot-starter-jakarta to v7.11.0' (#13) from renovate/io.sentry-sentry-spring-boot-starter-jakarta-7.x into master
Some checks failed
Deploy to Dokku / docker (ubuntu-latest) (push) Has been cancelled
Reviewed-on: #13
2024-07-07 02:35:24 +00:00
898a39e99c change some command categories
All checks were successful
Deploy to Dokku / docker (ubuntu-latest) (push) Successful in 1m26s
2024-07-07 03:01:36 +01:00
7a66ed4d87 Update dependency org.apache.maven.plugins:maven-shade-plugin to v3.6.0 2024-07-07 02:00:30 +00:00
5cc504d4ed Update dependency io.sentry:sentry-spring-boot-starter-jakarta to v7.11.0 2024-07-07 02:00:28 +00:00
29b44edc6b Merge remote-tracking branch 'origin/master'
All checks were successful
Deploy to Dokku / docker (ubuntu-latest) (push) Successful in 1m38s
2024-07-07 02:18:16 +01:00
2a7e2acc88 cleanup 2024-07-07 02:18:10 +01:00
Lee
0d92a49d95 Merge pull request 'Update dependency io.mongock:mongock-bom to v5.4.4' (#12) from renovate/io.mongock-mongock-bom-5.x into master
All checks were successful
Deploy to Dokku / docker (ubuntu-latest) (push) Successful in 17s
Reviewed-on: #12
2024-07-07 01:00:59 +00:00
Lee
2d8779d8e0 Merge pull request 'Update dependency com.google.code.gson:gson to v2.11.0' (#11) from renovate/com.google.code.gson-gson-2.x into master
Some checks failed
Deploy to Dokku / docker (ubuntu-latest) (push) Has been cancelled
Reviewed-on: #11
2024-07-07 01:00:50 +00:00
765805fa7a Update dependency io.mongock:mongock-bom to v5.4.4 2024-07-07 01:00:30 +00:00
1d36479a82 Update dependency com.google.code.gson:gson to v2.11.0 2024-07-07 01:00:28 +00:00
Lee
9d6f3b9fef Merge pull request 'Update dependency org.projectlombok:lombok to v1.18.34' (#10) from renovate/org.projectlombok-lombok-1.x into master
All checks were successful
Deploy to Dokku / docker (ubuntu-latest) (push) Successful in 1m9s
Reviewed-on: #10
2024-07-07 00:44:25 +00:00
cb82716a17 Update dependency org.projectlombok:lombok to v1.18.34 2024-07-07 00:42:58 +00:00
249 changed files with 4890 additions and 5224 deletions

View File

@ -16,4 +16,4 @@
# under the License. # under the License.
wrapperVersion=3.3.2 wrapperVersion=3.3.2
distributionType=only-script distributionType=only-script
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.8/apache-maven-3.9.8-bin.zip distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.9/apache-maven-3.9.9-bin.zip

View File

@ -1,5 +1,5 @@
# Stage 1: Build the application # Stage 1: Build the application
FROM maven:3.9.8-eclipse-temurin-17-alpine AS builder FROM 3.9.9-eclipse-temurin-21-alpine AS builder
# Set the working directory # Set the working directory
WORKDIR /home/container WORKDIR /home/container
@ -11,7 +11,7 @@ COPY . .
RUN mvn package -q -Dmaven.test.skip -DskipTests -T2C RUN mvn package -q -Dmaven.test.skip -DskipTests -T2C
# Stage 2: Create the final lightweight image # Stage 2: Create the final lightweight image
FROM eclipse-temurin:17.0.11_9-jre-focal FROM eclipse-temurin:17.0.13_11-jre-focal
# Set the working directory # Set the working directory
WORKDIR /home/container WORKDIR /home/container

102
pom.xml
View File

@ -5,7 +5,7 @@
<parent> <parent>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId> <artifactId>spring-boot-starter-parent</artifactId>
<version>3.3.1</version> <version>3.4.1</version>
<relativePath/> <!-- lookup parent from repository --> <relativePath/> <!-- lookup parent from repository -->
</parent> </parent>
@ -16,57 +16,31 @@
<description>Bat Bot for Discord</description> <description>Bat Bot for Discord</description>
<properties> <properties>
<java.version>17</java.version> <java.version>21</java.version>
</properties> </properties>
<!-- Build Config -->
<build> <build>
<finalName>${project.artifactId}</finalName> <finalName>${project.artifactId}</finalName>
<plugins> <plugins>
<!-- Used for compiling the source code with the proper Java version --> <!-- Spring -->
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>maven-compiler-plugin</artifactId> <artifactId>spring-boot-maven-plugin</artifactId>
<version>3.13.0</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<!-- Enable incremental builds, this is reversed due to -->
<!-- a bug as seen in https://issues.apache.org/jira/browse/MCOMPILER-209 -->
<useIncrementalCompilation>false</useIncrementalCompilation>
</configuration>
</plugin>
<!-- Handles shading of dependencies in the final output jar -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.5.3</version>
<configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
</configuration>
<executions> <executions>
<execution> <execution>
<phase>package</phase> <id>build-info</id>
<goals> <goals>
<goal>shade</goal> <goal>build-info</goal>
</goals> </goals>
<configuration>
<additionalProperties>
<description>${project.description}</description>
</additionalProperties>
</configuration>
</execution> </execution>
</executions> </executions>
</plugin> </plugin>
<!-- Specify the apps main class -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>cc.fascinated.bat.BatApplication</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins> </plugins>
</build> </build>
@ -75,11 +49,6 @@
<id>jitpack.io</id> <id>jitpack.io</id>
<url>https://jitpack.io</url> <url>https://jitpack.io</url>
</repository> </repository>
<repository>
<id>fascinated-repo-public</id>
<name>Fascinated's Repository</name>
<url>https://repo.fascinated.cc/public</url>
</repository>
</repositories> </repositories>
<dependencies> <dependencies>
@ -99,26 +68,7 @@
<dependency> <dependency>
<groupId>io.sentry</groupId> <groupId>io.sentry</groupId>
<artifactId>sentry-spring-boot-starter-jakarta</artifactId> <artifactId>sentry-spring-boot-starter-jakarta</artifactId>
<version>7.10.0</version> <version>7.16.0</version>
</dependency>
<dependency>
<groupId>io.mongock</groupId>
<artifactId>mongock-bom</artifactId>
<version>5.2.4</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>io.mongock</groupId>
<artifactId>mongock-springboot-v3</artifactId>
<version>5.4.4</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>io.mongock</groupId>
<artifactId>mongodb-springdata-v4-driver</artifactId>
<version>5.4.4</version>
<scope>compile</scope>
</dependency> </dependency>
<!-- Redis for caching --> <!-- Redis for caching -->
@ -142,7 +92,7 @@
<dependency> <dependency>
<groupId>org.projectlombok</groupId> <groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId> <artifactId>lombok</artifactId>
<version>1.18.32</version> <version>1.18.34</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency> <dependency>
@ -154,31 +104,19 @@
<dependency> <dependency>
<groupId>com.google.code.gson</groupId> <groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId> <artifactId>gson</artifactId>
<version>2.10.1</version> <version>2.11.0</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.apache.httpcomponents.client5</groupId> <groupId>org.apache.httpcomponents.client5</groupId>
<artifactId>httpclient5</artifactId> <artifactId>httpclient5</artifactId>
<version>5.3.1</version> <version>5.4.1</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>net.jodah</groupId> <groupId>net.jodah</groupId>
<artifactId>expiringmap</artifactId> <artifactId>expiringmap</artifactId>
<version>0.5.11</version> <version>0.5.11</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>se.michaelthelin.spotify</groupId>
<artifactId>spotify-web-api-java</artifactId>
<version>8.4.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>uk.co.conoregan</groupId>
<artifactId>themoviedbapi</artifactId>
<version>2.1.1</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<dependency> <dependency>
@ -187,9 +125,9 @@
<version>1.12.0</version> <version>1.12.0</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>xyz.mcutils</groupId> <groupId>com.github.Steppschuh</groupId>
<artifactId>mcutils-java-library</artifactId> <artifactId>Java-Markdown-Generator</artifactId>
<version>1.2.4</version> <version>1.3.2</version>
</dependency> </dependency>
</dependencies> </dependencies>
</project> </project>

View File

@ -5,7 +5,6 @@ import cc.fascinated.bat.event.EventListener;
import cc.fascinated.bat.service.EventService; import cc.fascinated.bat.service.EventService;
import com.google.gson.Gson; import com.google.gson.Gson;
import com.google.gson.GsonBuilder; import com.google.gson.GsonBuilder;
import io.mongock.runner.springboot.EnableMongock;
import lombok.NonNull; import lombok.NonNull;
import lombok.SneakyThrows; import lombok.SneakyThrows;
import lombok.extern.log4j.Log4j2; import lombok.extern.log4j.Log4j2;
@ -21,7 +20,6 @@ import java.util.Objects;
@EnableScheduling @EnableScheduling
@SpringBootApplication @SpringBootApplication
@EnableMongock
@Log4j2(topic = "Bat") @Log4j2(topic = "Bat")
public class BatApplication { public class BatApplication {
public static Gson GSON = new GsonBuilder().create(); public static Gson GSON = new GsonBuilder().create();

View File

@ -1,9 +1,9 @@
package cc.fascinated.bat.features.afk; package cc.fascinated.bat.afk;
import cc.fascinated.bat.features.Feature; import cc.fascinated.bat.common.feature.Feature;
import cc.fascinated.bat.features.FeatureProfile; import cc.fascinated.bat.common.feature.FeatureProfile;
import cc.fascinated.bat.features.afk.command.AfkCommand; import cc.fascinated.bat.afk.command.AfkCommand;
import cc.fascinated.bat.service.CommandService; import cc.fascinated.bat.service.OldCommandService;
import lombok.NonNull; import lombok.NonNull;
import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@ -13,7 +13,7 @@ import org.springframework.stereotype.Component;
*/ */
@Component @Component
public class AfkFeature extends Feature { public class AfkFeature extends Feature {
public AfkFeature(@NonNull ApplicationContext context, @NonNull CommandService commandService) { public AfkFeature(@NonNull ApplicationContext context, @NonNull OldCommandService commandService) {
super("AFK", FeatureProfile.FeatureState.DISABLED, true); super("AFK", FeatureProfile.FeatureState.DISABLED, true);
registerCommand(commandService, context.getBean(AfkCommand.class)); registerCommand(commandService, context.getBean(AfkCommand.class));

View File

@ -1,9 +1,9 @@
package cc.fascinated.bat.features.afk; package cc.fascinated.bat.afk;
import cc.fascinated.bat.event.EventListener; import cc.fascinated.bat.event.EventListener;
import cc.fascinated.bat.features.afk.profile.AfkProfile; import cc.fascinated.bat.afk.profile.AfkProfile;
import cc.fascinated.bat.model.BatGuild; import cc.fascinated.bat.common.model.BatGuild;
import cc.fascinated.bat.model.BatUser; import cc.fascinated.bat.common.model.BatUser;
import lombok.NonNull; import lombok.NonNull;
import net.dv8tion.jda.api.entities.Message; import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.User; import net.dv8tion.jda.api.entities.User;

View File

@ -1,9 +1,9 @@
package cc.fascinated.bat.features.afk; package cc.fascinated.bat.afk;
import cc.fascinated.bat.event.EventListener; import cc.fascinated.bat.event.EventListener;
import cc.fascinated.bat.features.afk.profile.AfkProfile; import cc.fascinated.bat.afk.profile.AfkProfile;
import cc.fascinated.bat.model.BatGuild; import cc.fascinated.bat.common.model.BatGuild;
import cc.fascinated.bat.model.BatUser; import cc.fascinated.bat.common.model.BatUser;
import lombok.NonNull; import lombok.NonNull;
import net.dv8tion.jda.api.events.message.MessageReceivedEvent; import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;

View File

@ -1,14 +1,15 @@
package cc.fascinated.bat.features.afk.command; package cc.fascinated.bat.afk.command;
import cc.fascinated.bat.command.BatCommand; import cc.fascinated.bat.common.oldcommand.BatCommand;
import cc.fascinated.bat.command.Category; import cc.fascinated.bat.common.oldcommand.Category;
import cc.fascinated.bat.command.CommandInfo; import cc.fascinated.bat.common.oldcommand.CommandInfo;
import cc.fascinated.bat.common.MemberUtils; import cc.fascinated.bat.common.MemberUtils;
import cc.fascinated.bat.features.afk.profile.AfkProfile; import cc.fascinated.bat.afk.profile.AfkProfile;
import cc.fascinated.bat.model.BatGuild; import cc.fascinated.bat.common.model.BatGuild;
import cc.fascinated.bat.model.BatUser; import cc.fascinated.bat.common.model.BatUser;
import lombok.NonNull; import lombok.NonNull;
import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel; import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel;
import net.dv8tion.jda.api.interactions.commands.OptionMapping; import net.dv8tion.jda.api.interactions.commands.OptionMapping;
import net.dv8tion.jda.api.interactions.commands.OptionType; import net.dv8tion.jda.api.interactions.commands.OptionType;
@ -29,14 +30,16 @@ public class AfkCommand extends BatCommand {
/** /**
* Fired when this command is executed. * Fired when this command is executed.
* *
* @param guild the guild the command was executed in, if any * @param guild the guild the command was executed in, if any
* @param user the user who executed the command * @param user the user who executed the command
* @param channel the channel the command was executed in * @param channel the channel the command was executed in
* @param member the member who executed the command, null if not a guild * @param member the member who executed the command, null if not a guild
* @param event the event that invoked this command * @param commandMessage
* @param arguments
* @param event the event that invoked this command
*/ */
@Override @Override
public void execute(BatGuild guild, @NonNull BatUser user, @NonNull MessageChannel channel, Member member, @NonNull SlashCommandInteraction event) { public void execute(BatGuild guild, @NonNull BatUser user, @NonNull MessageChannel channel, Member member, Message commandMessage, String[] arguments, SlashCommandInteraction event) {
AfkProfile profile = guild.getProfile(AfkProfile.class); AfkProfile profile = guild.getProfile(AfkProfile.class);
String reason = null; String reason = null;
OptionMapping reasonOption = event.getOption("reason"); OptionMapping reasonOption = event.getOption("reason");

View File

@ -1,7 +1,7 @@
package cc.fascinated.bat.features.afk.profile; package cc.fascinated.bat.afk.profile;
import cc.fascinated.bat.common.Serializable; import cc.fascinated.bat.common.Serializable;
import cc.fascinated.bat.model.BatGuild; import cc.fascinated.bat.common.model.BatGuild;
import com.google.gson.Gson; import com.google.gson.Gson;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import net.dv8tion.jda.api.entities.Guild; import net.dv8tion.jda.api.entities.Guild;

View File

@ -1,9 +1,9 @@
package cc.fascinated.bat.features.autorole; package cc.fascinated.bat.autorole;
import cc.fascinated.bat.features.Feature; import cc.fascinated.bat.common.feature.Feature;
import cc.fascinated.bat.features.FeatureProfile; import cc.fascinated.bat.common.feature.FeatureProfile;
import cc.fascinated.bat.features.autorole.command.AutoRoleCommand; import cc.fascinated.bat.autorole.command.AutoRoleCommand;
import cc.fascinated.bat.service.CommandService; import cc.fascinated.bat.service.OldCommandService;
import lombok.NonNull; import lombok.NonNull;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContext;
@ -15,7 +15,7 @@ import org.springframework.stereotype.Component;
@Component @Component
public class AutoRoleFeature extends Feature { public class AutoRoleFeature extends Feature {
@Autowired @Autowired
public AutoRoleFeature(@NonNull ApplicationContext context, @NonNull CommandService commandService) { public AutoRoleFeature(@NonNull ApplicationContext context, @NonNull OldCommandService commandService) {
super("Auto Role", FeatureProfile.FeatureState.DISABLED, true); super("Auto Role", FeatureProfile.FeatureState.DISABLED, true);
registerCommand(commandService, context.getBean(AutoRoleCommand.class)); registerCommand(commandService, context.getBean(AutoRoleCommand.class));

View File

@ -1,9 +1,9 @@
package cc.fascinated.bat.features.autorole; package cc.fascinated.bat.autorole;
import cc.fascinated.bat.event.EventListener; import cc.fascinated.bat.event.EventListener;
import cc.fascinated.bat.features.autorole.profile.AutoRoleProfile; import cc.fascinated.bat.autorole.profile.AutoRoleProfile;
import cc.fascinated.bat.model.BatGuild; import cc.fascinated.bat.common.model.BatGuild;
import cc.fascinated.bat.model.BatUser; import cc.fascinated.bat.common.model.BatUser;
import cc.fascinated.bat.service.FeatureService; import cc.fascinated.bat.service.FeatureService;
import lombok.NonNull; import lombok.NonNull;
import lombok.extern.log4j.Log4j2; import lombok.extern.log4j.Log4j2;

View File

@ -1,14 +1,15 @@
package cc.fascinated.bat.features.autorole.command; package cc.fascinated.bat.autorole.command;
import cc.fascinated.bat.command.BatCommand; import cc.fascinated.bat.common.oldcommand.BatCommand;
import cc.fascinated.bat.command.CommandInfo; import cc.fascinated.bat.common.oldcommand.CommandInfo;
import cc.fascinated.bat.common.EmbedUtils; import cc.fascinated.bat.common.EmbedUtils;
import cc.fascinated.bat.common.RoleUtils; import cc.fascinated.bat.common.RoleUtils;
import cc.fascinated.bat.features.autorole.profile.AutoRoleProfile; import cc.fascinated.bat.autorole.profile.AutoRoleProfile;
import cc.fascinated.bat.model.BatGuild; import cc.fascinated.bat.common.model.BatGuild;
import cc.fascinated.bat.model.BatUser; import cc.fascinated.bat.common.model.BatUser;
import lombok.NonNull; import lombok.NonNull;
import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.Role; import net.dv8tion.jda.api.entities.Role;
import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel; import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel;
import net.dv8tion.jda.api.interactions.commands.OptionMapping; import net.dv8tion.jda.api.interactions.commands.OptionMapping;
@ -30,7 +31,7 @@ public class AddSubCommand extends BatCommand {
} }
@Override @Override
public void execute(BatGuild guild, @NonNull BatUser user, @NonNull MessageChannel channel, Member member, @NonNull SlashCommandInteraction event) { public void execute(BatGuild guild, @NonNull BatUser user, @NonNull MessageChannel channel, Member member, Message commandMessage, String[] arguments, SlashCommandInteraction event) {
AutoRoleProfile profile = guild.getProfile(AutoRoleProfile.class); AutoRoleProfile profile = guild.getProfile(AutoRoleProfile.class);
// Check if the guild has reached the maximum auto roles count // Check if the guild has reached the maximum auto roles count
int maxRoleSlots = AutoRoleProfile.getMaxRoleSlots(guild); int maxRoleSlots = AutoRoleProfile.getMaxRoleSlots(guild);
@ -43,12 +44,7 @@ public class AddSubCommand extends BatCommand {
} }
OptionMapping option = event.getOption("role"); OptionMapping option = event.getOption("role");
if (option == null) { assert option != null;
event.replyEmbeds(EmbedUtils.errorEmbed()
.setDescription("Please provide a role to add")
.build()).queue();
return;
}
Role role = option.getAsRole(); Role role = option.getAsRole();
// Check if the role is already in the auto roles list // Check if the role is already in the auto roles list

View File

@ -1,8 +1,8 @@
package cc.fascinated.bat.features.autorole.command; package cc.fascinated.bat.autorole.command;
import cc.fascinated.bat.command.BatCommand; import cc.fascinated.bat.common.oldcommand.BatCommand;
import cc.fascinated.bat.command.Category; import cc.fascinated.bat.common.oldcommand.Category;
import cc.fascinated.bat.command.CommandInfo; import cc.fascinated.bat.common.oldcommand.CommandInfo;
import lombok.NonNull; import lombok.NonNull;
import net.dv8tion.jda.api.Permission; import net.dv8tion.jda.api.Permission;
import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContext;

View File

@ -1,13 +1,14 @@
package cc.fascinated.bat.features.autorole.command; package cc.fascinated.bat.autorole.command;
import cc.fascinated.bat.command.BatCommand; import cc.fascinated.bat.common.oldcommand.BatCommand;
import cc.fascinated.bat.command.CommandInfo; import cc.fascinated.bat.common.oldcommand.CommandInfo;
import cc.fascinated.bat.common.EmbedUtils; import cc.fascinated.bat.common.EmbedUtils;
import cc.fascinated.bat.features.autorole.profile.AutoRoleProfile; import cc.fascinated.bat.autorole.profile.AutoRoleProfile;
import cc.fascinated.bat.model.BatGuild; import cc.fascinated.bat.common.model.BatGuild;
import cc.fascinated.bat.model.BatUser; import cc.fascinated.bat.common.model.BatUser;
import lombok.NonNull; import lombok.NonNull;
import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel; import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel;
import net.dv8tion.jda.api.interactions.commands.SlashCommandInteraction; import net.dv8tion.jda.api.interactions.commands.SlashCommandInteraction;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@ -19,7 +20,7 @@ import org.springframework.stereotype.Component;
@CommandInfo(name = "clear", description = "Clears all auto roles") @CommandInfo(name = "clear", description = "Clears all auto roles")
public class ClearSubCommand extends BatCommand { public class ClearSubCommand extends BatCommand {
@Override @Override
public void execute(BatGuild guild, @NonNull BatUser user, @NonNull MessageChannel channel, Member member, @NonNull SlashCommandInteraction event) { public void execute(BatGuild guild, @NonNull BatUser user, @NonNull MessageChannel channel, Member member, Message commandMessage, String[] arguments, SlashCommandInteraction event) {
AutoRoleProfile profile = guild.getProfile(AutoRoleProfile.class); AutoRoleProfile profile = guild.getProfile(AutoRoleProfile.class);
profile.reset(); profile.reset();

View File

@ -1,14 +1,15 @@
package cc.fascinated.bat.features.autorole.command; package cc.fascinated.bat.autorole.command;
import cc.fascinated.bat.command.BatCommand; import cc.fascinated.bat.common.oldcommand.BatCommand;
import cc.fascinated.bat.command.CommandInfo; import cc.fascinated.bat.common.oldcommand.CommandInfo;
import cc.fascinated.bat.common.EmbedUtils; import cc.fascinated.bat.common.EmbedUtils;
import cc.fascinated.bat.features.autorole.profile.AutoRoleProfile; import cc.fascinated.bat.autorole.profile.AutoRoleProfile;
import cc.fascinated.bat.model.BatGuild; import cc.fascinated.bat.common.model.BatGuild;
import cc.fascinated.bat.model.BatUser; import cc.fascinated.bat.common.model.BatUser;
import lombok.NonNull; import lombok.NonNull;
import net.dv8tion.jda.api.EmbedBuilder; import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel; import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel;
import net.dv8tion.jda.api.interactions.commands.SlashCommandInteraction; import net.dv8tion.jda.api.interactions.commands.SlashCommandInteraction;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@ -20,7 +21,7 @@ import org.springframework.stereotype.Component;
@CommandInfo(name = "list", description = "Lists all auto roles") @CommandInfo(name = "list", description = "Lists all auto roles")
public class ListSubCommand extends BatCommand { public class ListSubCommand extends BatCommand {
@Override @Override
public void execute(BatGuild guild, @NonNull BatUser user, @NonNull MessageChannel channel, Member member, @NonNull SlashCommandInteraction event) { public void execute(BatGuild guild, @NonNull BatUser user, @NonNull MessageChannel channel, Member member, Message commandMessage, String[] arguments, SlashCommandInteraction event) {
AutoRoleProfile profile = guild.getProfile(AutoRoleProfile.class); AutoRoleProfile profile = guild.getProfile(AutoRoleProfile.class);
if (profile.getRoles().isEmpty()) { if (profile.getRoles().isEmpty()) {
event.replyEmbeds(EmbedUtils.errorEmbed() event.replyEmbeds(EmbedUtils.errorEmbed()

View File

@ -1,13 +1,14 @@
package cc.fascinated.bat.features.autorole.command; package cc.fascinated.bat.autorole.command;
import cc.fascinated.bat.command.BatCommand; import cc.fascinated.bat.common.oldcommand.BatCommand;
import cc.fascinated.bat.command.CommandInfo; import cc.fascinated.bat.common.oldcommand.CommandInfo;
import cc.fascinated.bat.common.EmbedUtils; import cc.fascinated.bat.common.EmbedUtils;
import cc.fascinated.bat.features.autorole.profile.AutoRoleProfile; import cc.fascinated.bat.autorole.profile.AutoRoleProfile;
import cc.fascinated.bat.model.BatGuild; import cc.fascinated.bat.common.model.BatGuild;
import cc.fascinated.bat.model.BatUser; import cc.fascinated.bat.common.model.BatUser;
import lombok.NonNull; import lombok.NonNull;
import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.Role; import net.dv8tion.jda.api.entities.Role;
import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel; import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel;
import net.dv8tion.jda.api.interactions.commands.OptionMapping; import net.dv8tion.jda.api.interactions.commands.OptionMapping;
@ -29,15 +30,10 @@ public class RemoveSubCommand extends BatCommand {
} }
@Override @Override
public void execute(BatGuild guild, @NonNull BatUser user, @NonNull MessageChannel channel, Member member, @NonNull SlashCommandInteraction event) { public void execute(BatGuild guild, @NonNull BatUser user, @NonNull MessageChannel channel, Member member, Message commandMessage, String[] arguments, SlashCommandInteraction event) {
AutoRoleProfile profile = guild.getProfile(AutoRoleProfile.class); AutoRoleProfile profile = guild.getProfile(AutoRoleProfile.class);
OptionMapping option = event.getOption("role"); OptionMapping option = event.getOption("role");
if (option == null) { assert option != null;
event.replyEmbeds(EmbedUtils.errorEmbed()
.setDescription("Please provide a role to remove")
.build()).queue();
return;
}
Role role = option.getAsRole(); Role role = option.getAsRole();
if (!profile.hasRole(role.getId())) { if (!profile.hasRole(role.getId())) {

View File

@ -1,16 +1,17 @@
package cc.fascinated.bat.features.autorole.command; package cc.fascinated.bat.autorole.command;
import cc.fascinated.bat.command.BatCommand; import cc.fascinated.bat.common.oldcommand.BatCommand;
import cc.fascinated.bat.command.CommandInfo; import cc.fascinated.bat.common.oldcommand.CommandInfo;
import cc.fascinated.bat.common.EmbedDescriptionBuilder; import cc.fascinated.bat.common.DescriptionBuilder;
import cc.fascinated.bat.common.EmbedUtils; import cc.fascinated.bat.common.EmbedUtils;
import cc.fascinated.bat.features.autorole.profile.AutoRoleProfile; import cc.fascinated.bat.autorole.profile.AutoRoleProfile;
import cc.fascinated.bat.model.BatGuild; import cc.fascinated.bat.common.model.BatGuild;
import cc.fascinated.bat.model.BatUser; import cc.fascinated.bat.common.model.BatUser;
import lombok.NonNull; import lombok.NonNull;
import lombok.extern.log4j.Log4j2; import lombok.extern.log4j.Log4j2;
import net.dv8tion.jda.api.entities.Guild; import net.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.Role; import net.dv8tion.jda.api.entities.Role;
import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel; import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel;
import net.dv8tion.jda.api.interactions.commands.SlashCommandInteraction; import net.dv8tion.jda.api.interactions.commands.SlashCommandInteraction;
@ -29,7 +30,7 @@ import java.util.Map;
@CommandInfo(name = "sync", description = "Gives everyone their missing auto roles") @CommandInfo(name = "sync", description = "Gives everyone their missing auto roles")
public class SyncSubCommand extends BatCommand { public class SyncSubCommand extends BatCommand {
@Override @Override
public void execute(BatGuild guild, @NonNull BatUser user, @NonNull MessageChannel channel, Member member, @NonNull SlashCommandInteraction event) { public void execute(BatGuild guild, @NonNull BatUser user, @NonNull MessageChannel channel, Member member, Message commandMessage, String[] arguments, SlashCommandInteraction event) {
AutoRoleProfile profile = guild.getProfile(AutoRoleProfile.class); AutoRoleProfile profile = guild.getProfile(AutoRoleProfile.class);
if (profile.getRoles().isEmpty()) { if (profile.getRoles().isEmpty()) {
event.replyEmbeds(EmbedUtils.errorEmbed() event.replyEmbeds(EmbedUtils.errorEmbed()
@ -90,7 +91,7 @@ public class SyncSubCommand extends BatCommand {
// We're finished giving all the roles // We're finished giving all the roles
if (finished == members.size()) { if (finished == members.size()) {
EmbedDescriptionBuilder description = new EmbedDescriptionBuilder( DescriptionBuilder description = new DescriptionBuilder(
"Successfully gave auto roles to `%s` member%s".formatted( "Successfully gave auto roles to `%s` member%s".formatted(
members.size(), members.size(),
members.size() == 1 ? "" : "s" members.size() == 1 ? "" : "s"

View File

@ -1,7 +1,7 @@
package cc.fascinated.bat.features.autorole.profile; package cc.fascinated.bat.autorole.profile;
import cc.fascinated.bat.common.Serializable; import cc.fascinated.bat.common.Serializable;
import cc.fascinated.bat.model.BatGuild; import cc.fascinated.bat.common.model.BatGuild;
import cc.fascinated.bat.service.DiscordService; import cc.fascinated.bat.service.DiscordService;
import com.google.gson.Gson; import com.google.gson.Gson;
import lombok.Getter; import lombok.Getter;

View File

@ -1,22 +1,22 @@
package cc.fascinated.bat.features.base; package cc.fascinated.bat.base;
import cc.fascinated.bat.features.Feature; import cc.fascinated.bat.common.feature.Feature;
import cc.fascinated.bat.features.FeatureProfile; import cc.fascinated.bat.common.feature.FeatureProfile;
import cc.fascinated.bat.features.base.commands.botadmin.BotAdminCommand; import cc.fascinated.bat.base.commands.botadmin.BotAdminCommand;
import cc.fascinated.bat.features.base.commands.fun.EightBallCommand; import cc.fascinated.bat.base.commands.fun.CoinFlipCommand;
import cc.fascinated.bat.features.base.commands.fun.PPSizeCommand; import cc.fascinated.bat.base.commands.fun.EightBallCommand;
import cc.fascinated.bat.features.base.commands.fun.image.ImageCommand; import cc.fascinated.bat.base.commands.fun.PPSizeCommand;
import cc.fascinated.bat.features.base.commands.general.*; import cc.fascinated.bat.base.commands.fun.image.ImageCommand;
import cc.fascinated.bat.features.base.commands.general.avatar.AvatarCommand; import cc.fascinated.bat.base.commands.general.*;
import cc.fascinated.bat.features.base.commands.general.banner.BannerCommand; import cc.fascinated.bat.base.commands.general.avatar.AvatarCommand;
import cc.fascinated.bat.features.base.commands.utility.lookup.LookupCommand; import cc.fascinated.bat.base.commands.general.banner.BannerCommand;
import cc.fascinated.bat.features.base.commands.utility.lookup.UserSubCommand; import cc.fascinated.bat.base.commands.server.MemberCountCommand;
import cc.fascinated.bat.features.base.commands.server.MemberCountCommand; import cc.fascinated.bat.base.commands.server.PremiumCommand;
import cc.fascinated.bat.features.base.commands.server.PremiumCommand; import cc.fascinated.bat.base.commands.server.channel.ChannelCommand;
import cc.fascinated.bat.features.base.commands.server.channel.ChannelCommand; import cc.fascinated.bat.base.commands.server.feature.FeatureCommand;
import cc.fascinated.bat.features.base.commands.server.feature.FeatureCommand; import cc.fascinated.bat.base.commands.utility.PastebinCommand;
import cc.fascinated.bat.features.base.commands.utility.PastebinCommand; import cc.fascinated.bat.base.commands.utility.lookup.LookupCommand;
import cc.fascinated.bat.service.CommandService; import cc.fascinated.bat.service.OldCommandService;
import lombok.NonNull; import lombok.NonNull;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContext;
@ -28,7 +28,7 @@ import org.springframework.stereotype.Component;
@Component @Component
public class BaseFeature extends Feature { public class BaseFeature extends Feature {
@Autowired @Autowired
public BaseFeature(@NonNull ApplicationContext context, @NonNull CommandService commandService) { public BaseFeature(@NonNull ApplicationContext context, @NonNull OldCommandService commandService) {
super("Base", FeatureProfile.FeatureState.ENABLED, false); super("Base", FeatureProfile.FeatureState.ENABLED, false);
super.registerCommand(commandService, context.getBean(PremiumCommand.class)); super.registerCommand(commandService, context.getBean(PremiumCommand.class));
@ -38,7 +38,6 @@ public class BaseFeature extends Feature {
super.registerCommand(commandService, context.getBean(VoteCommand.class)); super.registerCommand(commandService, context.getBean(VoteCommand.class));
super.registerCommand(commandService, context.getBean(PingCommand.class)); super.registerCommand(commandService, context.getBean(PingCommand.class));
super.registerCommand(commandService, context.getBean(InviteCommand.class)); super.registerCommand(commandService, context.getBean(InviteCommand.class));
super.registerCommand(commandService, context.getBean(HelpCommand.class));
super.registerCommand(commandService, context.getBean(BotStatsCommand.class)); super.registerCommand(commandService, context.getBean(BotStatsCommand.class));
super.registerCommand(commandService, context.getBean(BannerCommand.class)); super.registerCommand(commandService, context.getBean(BannerCommand.class));
super.registerCommand(commandService, context.getBean(AvatarCommand.class)); super.registerCommand(commandService, context.getBean(AvatarCommand.class));
@ -48,5 +47,6 @@ public class BaseFeature extends Feature {
super.registerCommand(commandService, context.getBean(LookupCommand.class)); super.registerCommand(commandService, context.getBean(LookupCommand.class));
super.registerCommand(commandService, context.getBean(PPSizeCommand.class)); super.registerCommand(commandService, context.getBean(PPSizeCommand.class));
super.registerCommand(commandService, context.getBean(PastebinCommand.class)); super.registerCommand(commandService, context.getBean(PastebinCommand.class));
super.registerCommand(commandService, context.getBean(CoinFlipCommand.class));
} }
} }

View File

@ -1,9 +1,9 @@
package cc.fascinated.bat.features.base.commands.botadmin; package cc.fascinated.bat.base.commands.botadmin;
import cc.fascinated.bat.command.BatCommand; import cc.fascinated.bat.common.oldcommand.BatCommand;
import cc.fascinated.bat.command.CommandInfo; import cc.fascinated.bat.common.oldcommand.CommandInfo;
import cc.fascinated.bat.features.base.commands.botadmin.premium.PremiumRemoveSubCommand; import cc.fascinated.bat.base.commands.botadmin.premium.PremiumRemoveSubCommand;
import cc.fascinated.bat.features.base.commands.botadmin.premium.PremiumSetSubCommand; import cc.fascinated.bat.base.commands.botadmin.premium.PremiumSetSubCommand;
import lombok.NonNull; import lombok.NonNull;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContext;

View File

@ -1,13 +1,14 @@
package cc.fascinated.bat.features.base.commands.botadmin.premium; package cc.fascinated.bat.base.commands.botadmin.premium;
import cc.fascinated.bat.command.BatCommand; import cc.fascinated.bat.common.oldcommand.BatCommand;
import cc.fascinated.bat.command.CommandInfo; import cc.fascinated.bat.common.oldcommand.CommandInfo;
import cc.fascinated.bat.model.BatGuild; import cc.fascinated.bat.common.model.BatGuild;
import cc.fascinated.bat.model.BatUser; import cc.fascinated.bat.common.model.BatUser;
import cc.fascinated.bat.premium.PremiumProfile; import cc.fascinated.bat.premium.PremiumProfile;
import cc.fascinated.bat.service.GuildService; import cc.fascinated.bat.service.GuildService;
import lombok.NonNull; import lombok.NonNull;
import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel; import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel;
import net.dv8tion.jda.api.interactions.commands.OptionMapping; import net.dv8tion.jda.api.interactions.commands.OptionMapping;
import net.dv8tion.jda.api.interactions.commands.OptionType; import net.dv8tion.jda.api.interactions.commands.OptionType;
@ -31,7 +32,7 @@ public class PremiumRemoveSubCommand extends BatCommand {
} }
@Override @Override
public void execute(BatGuild guild, @NonNull BatUser user, @NonNull MessageChannel channel, Member member, @NonNull SlashCommandInteraction event) { public void execute(BatGuild guild, @NonNull BatUser user, @NonNull MessageChannel channel, Member member, Message commandMessage, String[] arguments, SlashCommandInteraction event) {
OptionMapping guildOption = event.getOption("guild"); OptionMapping guildOption = event.getOption("guild");
if (guildOption == null) { if (guildOption == null) {
event.reply("Please provide a guild id").queue(); event.reply("Please provide a guild id").queue();

View File

@ -1,13 +1,14 @@
package cc.fascinated.bat.features.base.commands.botadmin.premium; package cc.fascinated.bat.base.commands.botadmin.premium;
import cc.fascinated.bat.command.BatCommand; import cc.fascinated.bat.common.oldcommand.BatCommand;
import cc.fascinated.bat.command.CommandInfo; import cc.fascinated.bat.common.oldcommand.CommandInfo;
import cc.fascinated.bat.model.BatGuild; import cc.fascinated.bat.common.model.BatGuild;
import cc.fascinated.bat.model.BatUser; import cc.fascinated.bat.common.model.BatUser;
import cc.fascinated.bat.premium.PremiumProfile; import cc.fascinated.bat.premium.PremiumProfile;
import cc.fascinated.bat.service.GuildService; import cc.fascinated.bat.service.GuildService;
import lombok.NonNull; import lombok.NonNull;
import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel; import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel;
import net.dv8tion.jda.api.interactions.commands.OptionMapping; import net.dv8tion.jda.api.interactions.commands.OptionMapping;
import net.dv8tion.jda.api.interactions.commands.OptionType; import net.dv8tion.jda.api.interactions.commands.OptionType;
@ -34,7 +35,7 @@ public class PremiumSetSubCommand extends BatCommand {
} }
@Override @Override
public void execute(BatGuild guild, @NonNull BatUser user, @NonNull MessageChannel channel, Member member, @NonNull SlashCommandInteraction event) { public void execute(BatGuild guild, @NonNull BatUser user, @NonNull MessageChannel channel, Member member, Message commandMessage, String[] arguments, SlashCommandInteraction event) {
OptionMapping guildOption = event.getOption("guild"); OptionMapping guildOption = event.getOption("guild");
if (guildOption == null) { if (guildOption == null) {
event.reply("Please provide a guild id").queue(); event.reply("Please provide a guild id").queue();

View File

@ -0,0 +1,40 @@
package cc.fascinated.bat.base.commands.fun;
import cc.fascinated.bat.common.oldcommand.BatCommand;
import cc.fascinated.bat.common.oldcommand.CommandInfo;
import cc.fascinated.bat.common.model.BatGuild;
import cc.fascinated.bat.common.model.BatUser;
import lombok.NonNull;
import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel;
import net.dv8tion.jda.api.interactions.commands.SlashCommandInteraction;
import org.springframework.stereotype.Component;
import java.util.Random;
/**
* @author Fascinated (fascinated7)
*/
@CommandInfo(
name = "coinflip",
description = "Flips a coin",
userInstall = true
)
@Component
public class CoinFlipCommand extends BatCommand {
@Override
public void execute(BatGuild guild, @NonNull BatUser user, @NonNull MessageChannel channel, Member member,
Message commandMessage, String[] arguments, SlashCommandInteraction event) {
event.reply("%s, you flipped a coin and got **%s**!".formatted(user.getDiscordUser().getAsMention(), flip())).queue();
}
/**
* Flips a coin
*
* @return The result of the coin flip
*/
public String flip() {
return new Random().nextBoolean() ? "heads" : "tails";
}
}

View File

@ -1,15 +1,15 @@
package cc.fascinated.bat.features.base.commands.fun; package cc.fascinated.bat.base.commands.fun;
import cc.fascinated.bat.command.BatCommand; import cc.fascinated.bat.common.oldcommand.BatCommand;
import cc.fascinated.bat.command.Category; import cc.fascinated.bat.common.oldcommand.Category;
import cc.fascinated.bat.command.CommandInfo; import cc.fascinated.bat.common.oldcommand.CommandInfo;
import cc.fascinated.bat.common.EmbedUtils; import cc.fascinated.bat.common.EmbedUtils;
import cc.fascinated.bat.model.BatGuild; import cc.fascinated.bat.common.model.BatGuild;
import cc.fascinated.bat.model.BatUser; import cc.fascinated.bat.common.model.BatUser;
import lombok.NonNull; import lombok.NonNull;
import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel; import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel;
import net.dv8tion.jda.api.interactions.commands.OptionMapping;
import net.dv8tion.jda.api.interactions.commands.OptionType; import net.dv8tion.jda.api.interactions.commands.OptionType;
import net.dv8tion.jda.api.interactions.commands.SlashCommandInteraction; import net.dv8tion.jda.api.interactions.commands.SlashCommandInteraction;
import net.dv8tion.jda.api.interactions.commands.build.OptionData; import net.dv8tion.jda.api.interactions.commands.build.OptionData;
@ -19,7 +19,13 @@ import org.springframework.stereotype.Component;
* @author Fascinated (fascinated7) * @author Fascinated (fascinated7)
*/ */
@Component @Component
@CommandInfo(name = "8ball", description = "Ask the magic 8ball a question", guildOnly = false, userInstall = true, category = Category.FUN) @CommandInfo(
name = "8ball", description = "Ask the magic 8ball a question",
guildOnly = false,
userInstall = true,
prefixAllowed = true,
category = Category.FUN
)
public class EightBallCommand extends BatCommand { public class EightBallCommand extends BatCommand {
private final String[] responses = new String[]{ private final String[] responses = new String[]{
"It is certain", "It is certain",
@ -49,16 +55,18 @@ public class EightBallCommand extends BatCommand {
} }
@Override @Override
public void execute(BatGuild guild, @NonNull BatUser user, @NonNull MessageChannel channel, Member member, @NonNull SlashCommandInteraction event) { public void execute(BatGuild guild, @NonNull BatUser user, @NonNull MessageChannel channel, Member member, Message commandMessage, String[] arguments, SlashCommandInteraction event) {
OptionMapping questionOption = event.getOption("question"); String question = super.getArgument("question", arguments, 0, true, event).getAsString();
if (questionOption == null) { if (question == null) {
super.replyEmbed(commandMessage, event, EmbedUtils.errorEmbed()
.setDescription("You need to provide a question to ask the 8ball")
);
return; return;
} }
String question = questionOption.getAsString();
String response = responses[(int) (Math.random() * responses.length)]; String response = responses[(int) (Math.random() * responses.length)];
event.replyEmbeds(EmbedUtils.successEmbed() super.replyEmbed(commandMessage, event, EmbedUtils.successEmbed()
.setDescription("You asked: `%s`\n\n:8ball: The magic 8ball says: `%s`".formatted(question, response)) .setDescription("You asked: `%s`\n\n:8ball: The magic 8ball says: `%s`".formatted(question, response))
.build()) );
.queue();
} }
} }

View File

@ -1,14 +1,16 @@
package cc.fascinated.bat.features.base.commands.fun; package cc.fascinated.bat.base.commands.fun;
import cc.fascinated.bat.command.BatCommand; import cc.fascinated.bat.common.oldcommand.BatCommand;
import cc.fascinated.bat.command.CommandInfo; import cc.fascinated.bat.common.oldcommand.Category;
import cc.fascinated.bat.common.EmbedDescriptionBuilder; import cc.fascinated.bat.common.oldcommand.CommandInfo;
import cc.fascinated.bat.common.DescriptionBuilder;
import cc.fascinated.bat.common.EmbedUtils; import cc.fascinated.bat.common.EmbedUtils;
import cc.fascinated.bat.common.MathUtils; import cc.fascinated.bat.common.MathUtils;
import cc.fascinated.bat.model.BatGuild; import cc.fascinated.bat.common.model.BatGuild;
import cc.fascinated.bat.model.BatUser; import cc.fascinated.bat.common.model.BatUser;
import lombok.NonNull; import lombok.NonNull;
import net.dv8tion.jda.api.entities.Member; 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.entities.User;
import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel; import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel;
import net.dv8tion.jda.api.interactions.commands.OptionMapping; import net.dv8tion.jda.api.interactions.commands.OptionMapping;
@ -24,7 +26,8 @@ import org.springframework.stereotype.Component;
@CommandInfo( @CommandInfo(
name = "ppsize", name = "ppsize",
description = "Get the size of someone's pp", description = "Get the size of someone's pp",
userInstall = true userInstall = true,
category = Category.FUN
) )
public class PPSizeCommand extends BatCommand { public class PPSizeCommand extends BatCommand {
public PPSizeCommand() { public PPSizeCommand() {
@ -32,14 +35,14 @@ public class PPSizeCommand extends BatCommand {
} }
@Override @Override
public void execute(BatGuild guild, @NonNull BatUser user, @NonNull MessageChannel channel, Member member, @NonNull SlashCommandInteraction event) { public void execute(BatGuild guild, @NonNull BatUser user, @NonNull MessageChannel channel, Member member, Message commandMessage, String[] arguments, SlashCommandInteraction event) {
OptionMapping userOption = event.getOption("user"); OptionMapping userOption = event.getOption("user");
assert userOption != null; // This should never be null assert userOption != null; // This should never be null
User target = userOption.getAsUser(); User target = userOption.getAsUser();
int size = (int) MathUtils.random(1, 12); int size = (int) MathUtils.random(1, 12);
event.replyEmbeds(EmbedUtils.genericEmbed() event.replyEmbeds(EmbedUtils.genericEmbed()
.setDescription(new EmbedDescriptionBuilder("PP Size") .setDescription(new DescriptionBuilder("PP Size")
.appendLine(""" .appendLine("""
The size of %s's pp is %s inches The size of %s's pp is %s inches
**8%sD** **8%sD**

View File

@ -1,14 +1,15 @@
package cc.fascinated.bat.features.base.commands.fun.image; package cc.fascinated.bat.base.commands.fun.image;
import cc.fascinated.bat.command.BatCommand; import cc.fascinated.bat.common.oldcommand.BatCommand;
import cc.fascinated.bat.command.CommandInfo; import cc.fascinated.bat.common.oldcommand.CommandInfo;
import cc.fascinated.bat.common.EmbedUtils; import cc.fascinated.bat.common.EmbedUtils;
import cc.fascinated.bat.common.WebRequest; import cc.fascinated.bat.common.WebRequest;
import cc.fascinated.bat.model.BatGuild; import cc.fascinated.bat.common.model.BatGuild;
import cc.fascinated.bat.model.BatUser; import cc.fascinated.bat.common.model.BatUser;
import cc.fascinated.bat.model.token.thecatapi.CatImageToken; import cc.fascinated.bat.common.model.token.thecatapi.CatImageToken;
import lombok.NonNull; import lombok.NonNull;
import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel; import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel;
import net.dv8tion.jda.api.interactions.commands.SlashCommandInteraction; import net.dv8tion.jda.api.interactions.commands.SlashCommandInteraction;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@ -20,7 +21,7 @@ import org.springframework.stereotype.Component;
@CommandInfo(name = "cat", description = "Get a random cat image") @CommandInfo(name = "cat", description = "Get a random cat image")
public class CatSubCommand extends BatCommand { public class CatSubCommand extends BatCommand {
@Override @Override
public void execute(BatGuild guild, @NonNull BatUser user, @NonNull MessageChannel channel, Member member, @NonNull SlashCommandInteraction event) { public void execute(BatGuild guild, @NonNull BatUser user, @NonNull MessageChannel channel, Member member, Message commandMessage, String[] arguments, SlashCommandInteraction event) {
CatImageToken[] responseEntity = WebRequest.getAsEntity("https://api.thecatapi.com/v1/images/search", CatImageToken[].class); CatImageToken[] responseEntity = WebRequest.getAsEntity("https://api.thecatapi.com/v1/images/search", CatImageToken[].class);
if (responseEntity == null || responseEntity.length == 0) { if (responseEntity == null || responseEntity.length == 0) {
event.reply("Failed to get a cat image!").queue(); event.reply("Failed to get a cat image!").queue();

View File

@ -1,14 +1,15 @@
package cc.fascinated.bat.features.base.commands.fun.image; package cc.fascinated.bat.base.commands.fun.image;
import cc.fascinated.bat.command.BatCommand; import cc.fascinated.bat.common.oldcommand.BatCommand;
import cc.fascinated.bat.command.CommandInfo; import cc.fascinated.bat.common.oldcommand.CommandInfo;
import cc.fascinated.bat.common.EmbedUtils; import cc.fascinated.bat.common.EmbedUtils;
import cc.fascinated.bat.common.WebRequest; import cc.fascinated.bat.common.WebRequest;
import cc.fascinated.bat.model.BatGuild; import cc.fascinated.bat.common.model.BatGuild;
import cc.fascinated.bat.model.BatUser; import cc.fascinated.bat.common.model.BatUser;
import cc.fascinated.bat.model.token.dogceo.RandomImage; import cc.fascinated.bat.common.model.token.dogceo.RandomImage;
import lombok.NonNull; import lombok.NonNull;
import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel; import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel;
import net.dv8tion.jda.api.interactions.commands.SlashCommandInteraction; import net.dv8tion.jda.api.interactions.commands.SlashCommandInteraction;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@ -20,7 +21,7 @@ import org.springframework.stereotype.Component;
@CommandInfo(name = "dog", description = "Get a random dog image") @CommandInfo(name = "dog", description = "Get a random dog image")
public class DogSubCommand extends BatCommand { public class DogSubCommand extends BatCommand {
@Override @Override
public void execute(BatGuild guild, @NonNull BatUser user, @NonNull MessageChannel channel, Member member, @NonNull SlashCommandInteraction event) { public void execute(BatGuild guild, @NonNull BatUser user, @NonNull MessageChannel channel, Member member, Message commandMessage, String[] arguments, SlashCommandInteraction event) {
RandomImage responseEntity = WebRequest.getAsEntity("https://dog.ceo/api/breeds/image/random", RandomImage.class); RandomImage responseEntity = WebRequest.getAsEntity("https://dog.ceo/api/breeds/image/random", RandomImage.class);
if (responseEntity == null) { if (responseEntity == null) {
event.reply("Failed to get a dog image!").queue(); event.reply("Failed to get a dog image!").queue();

View File

@ -1,14 +1,15 @@
package cc.fascinated.bat.features.base.commands.fun.image; package cc.fascinated.bat.base.commands.fun.image;
import cc.fascinated.bat.command.BatCommand; import cc.fascinated.bat.common.oldcommand.BatCommand;
import cc.fascinated.bat.command.CommandInfo; import cc.fascinated.bat.common.oldcommand.CommandInfo;
import cc.fascinated.bat.common.EmbedUtils; import cc.fascinated.bat.common.EmbedUtils;
import cc.fascinated.bat.common.WebRequest; import cc.fascinated.bat.common.WebRequest;
import cc.fascinated.bat.model.BatGuild; import cc.fascinated.bat.common.model.BatGuild;
import cc.fascinated.bat.model.BatUser; import cc.fascinated.bat.common.model.BatUser;
import cc.fascinated.bat.model.token.randomd.RandomDuck; import cc.fascinated.bat.common.model.token.randomd.RandomDuck;
import lombok.NonNull; import lombok.NonNull;
import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel; import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel;
import net.dv8tion.jda.api.interactions.commands.SlashCommandInteraction; import net.dv8tion.jda.api.interactions.commands.SlashCommandInteraction;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@ -20,7 +21,7 @@ import org.springframework.stereotype.Component;
@CommandInfo(name = "duck", description = "Get a random duck image") @CommandInfo(name = "duck", description = "Get a random duck image")
public class DuckSubCommand extends BatCommand { public class DuckSubCommand extends BatCommand {
@Override @Override
public void execute(BatGuild guild, @NonNull BatUser user, @NonNull MessageChannel channel, Member member, @NonNull SlashCommandInteraction event) { public void execute(BatGuild guild, @NonNull BatUser user, @NonNull MessageChannel channel, Member member, Message commandMessage, String[] arguments, SlashCommandInteraction event) {
RandomDuck responseEntity = WebRequest.getAsEntity("https://random-d.uk/api/v2/random", RandomDuck.class); RandomDuck responseEntity = WebRequest.getAsEntity("https://random-d.uk/api/v2/random", RandomDuck.class);
if (responseEntity == null) { if (responseEntity == null) {
event.reply("Failed to get a duck image!").queue(); event.reply("Failed to get a duck image!").queue();

View File

@ -1,14 +1,15 @@
package cc.fascinated.bat.features.base.commands.fun.image; package cc.fascinated.bat.base.commands.fun.image;
import cc.fascinated.bat.command.BatCommand; import cc.fascinated.bat.common.oldcommand.BatCommand;
import cc.fascinated.bat.command.CommandInfo; import cc.fascinated.bat.common.oldcommand.CommandInfo;
import cc.fascinated.bat.common.EmbedUtils; import cc.fascinated.bat.common.EmbedUtils;
import cc.fascinated.bat.common.WebRequest; import cc.fascinated.bat.common.WebRequest;
import cc.fascinated.bat.model.BatGuild; import cc.fascinated.bat.common.model.BatGuild;
import cc.fascinated.bat.model.BatUser; import cc.fascinated.bat.common.model.BatUser;
import cc.fascinated.bat.model.token.randomfox.RandomFoxToken; import cc.fascinated.bat.common.model.token.randomfox.RandomFoxToken;
import lombok.NonNull; import lombok.NonNull;
import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel; import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel;
import net.dv8tion.jda.api.interactions.commands.SlashCommandInteraction; import net.dv8tion.jda.api.interactions.commands.SlashCommandInteraction;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@ -20,7 +21,7 @@ import org.springframework.stereotype.Component;
@CommandInfo(name = "fox", description = "Get a random fox image") @CommandInfo(name = "fox", description = "Get a random fox image")
public class FoxSubCommand extends BatCommand { public class FoxSubCommand extends BatCommand {
@Override @Override
public void execute(BatGuild guild, @NonNull BatUser user, @NonNull MessageChannel channel, Member member, @NonNull SlashCommandInteraction event) { public void execute(BatGuild guild, @NonNull BatUser user, @NonNull MessageChannel channel, Member member, Message commandMessage, String[] arguments, SlashCommandInteraction event) {
RandomFoxToken responseEntity = WebRequest.getAsEntity("https://randomfox.ca/floof/", RandomFoxToken.class); RandomFoxToken responseEntity = WebRequest.getAsEntity("https://randomfox.ca/floof/", RandomFoxToken.class);
if (responseEntity == null) { if (responseEntity == null) {
event.reply("Failed to get a fox image!").queue(); event.reply("Failed to get a fox image!").queue();

View File

@ -1,8 +1,8 @@
package cc.fascinated.bat.features.base.commands.fun.image; package cc.fascinated.bat.base.commands.fun.image;
import cc.fascinated.bat.command.BatCommand; import cc.fascinated.bat.common.oldcommand.BatCommand;
import cc.fascinated.bat.command.Category; import cc.fascinated.bat.common.oldcommand.Category;
import cc.fascinated.bat.command.CommandInfo; import cc.fascinated.bat.common.oldcommand.CommandInfo;
import lombok.NonNull; import lombok.NonNull;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContext;

View File

@ -1,17 +1,18 @@
package cc.fascinated.bat.features.base.commands.general; package cc.fascinated.bat.base.commands.general;
import cc.fascinated.bat.command.BatCommand; import cc.fascinated.bat.common.oldcommand.BatCommand;
import cc.fascinated.bat.command.Category; import cc.fascinated.bat.common.oldcommand.Category;
import cc.fascinated.bat.command.CommandInfo; import cc.fascinated.bat.common.oldcommand.CommandInfo;
import cc.fascinated.bat.common.*; import cc.fascinated.bat.common.*;
import cc.fascinated.bat.model.BatGuild; import cc.fascinated.bat.common.model.BatGuild;
import cc.fascinated.bat.model.BatUser; import cc.fascinated.bat.common.model.BatUser;
import cc.fascinated.bat.service.DiscordService; import cc.fascinated.bat.service.DiscordService;
import cc.fascinated.bat.service.GuildService; import cc.fascinated.bat.service.GuildService;
import cc.fascinated.bat.service.UserService; import cc.fascinated.bat.service.UserService;
import lombok.NonNull; import lombok.NonNull;
import net.dv8tion.jda.api.JDA; import net.dv8tion.jda.api.JDA;
import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel; import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel;
import net.dv8tion.jda.api.interactions.commands.SlashCommandInteraction; import net.dv8tion.jda.api.interactions.commands.SlashCommandInteraction;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@ -38,12 +39,12 @@ public class BotStatsCommand extends BatCommand {
} }
@Override @Override
public void execute(BatGuild guild, @NonNull BatUser user, @NonNull MessageChannel channel, Member member, @NonNull SlashCommandInteraction event) { public void execute(BatGuild guild, @NonNull BatUser user, @NonNull MessageChannel channel, Member member, Message commandMessage, String[] arguments, SlashCommandInteraction event) {
JDA jda = DiscordService.JDA; JDA jda = DiscordService.JDA;
long memoryUsed = (runtime.totalMemory() - runtime.freeMemory()); long memoryUsed = (runtime.totalMemory() - runtime.freeMemory());
event.replyEmbeds(EmbedUtils.genericEmbed().setDescription( event.replyEmbeds(EmbedUtils.genericEmbed().setDescription(
new EmbedDescriptionBuilder("Bat Statistics") new DescriptionBuilder("Bat Statistics")
.appendLine("Guilds: **%s**".formatted(NumberFormatter.format(jda.getGuilds().size())), true) .appendLine("Guilds: **%s**".formatted(NumberFormatter.format(jda.getGuilds().size())), true)
.appendLine("Users: **%s**".formatted(NumberFormatter.format(jda.getUsers().size())), true) .appendLine("Users: **%s**".formatted(NumberFormatter.format(jda.getUsers().size())), true)
.appendLine("Gateway Ping: **%sms**".formatted(jda.getGatewayPing()), true) .appendLine("Gateway Ping: **%sms**".formatted(jda.getGatewayPing()), true)

View File

@ -1,14 +1,15 @@
package cc.fascinated.bat.features.base.commands.general; package cc.fascinated.bat.base.commands.general;
import cc.fascinated.bat.Consts; import cc.fascinated.bat.Consts;
import cc.fascinated.bat.command.BatCommand; import cc.fascinated.bat.common.oldcommand.BatCommand;
import cc.fascinated.bat.command.Category; import cc.fascinated.bat.common.oldcommand.Category;
import cc.fascinated.bat.command.CommandInfo; import cc.fascinated.bat.common.oldcommand.CommandInfo;
import cc.fascinated.bat.common.EmbedUtils; import cc.fascinated.bat.common.EmbedUtils;
import cc.fascinated.bat.model.BatGuild; import cc.fascinated.bat.common.model.BatGuild;
import cc.fascinated.bat.model.BatUser; import cc.fascinated.bat.common.model.BatUser;
import lombok.NonNull; import lombok.NonNull;
import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel; import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel;
import net.dv8tion.jda.api.interactions.commands.SlashCommandInteraction; import net.dv8tion.jda.api.interactions.commands.SlashCommandInteraction;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@ -20,7 +21,7 @@ import org.springframework.stereotype.Component;
@CommandInfo(name = "invite", description = "Invite the bot to your server!", guildOnly = false, category = Category.GENERAL) @CommandInfo(name = "invite", description = "Invite the bot to your server!", guildOnly = false, category = Category.GENERAL)
public class InviteCommand extends BatCommand { public class InviteCommand extends BatCommand {
@Override @Override
public void execute(BatGuild guild, @NonNull BatUser user, @NonNull MessageChannel channel, Member member, @NonNull SlashCommandInteraction event) { public void execute(BatGuild guild, @NonNull BatUser user, @NonNull MessageChannel channel, Member member, Message commandMessage, String[] arguments, SlashCommandInteraction event) {
event.replyEmbeds(EmbedUtils.genericEmbed() event.replyEmbeds(EmbedUtils.genericEmbed()
.setDescription("You can invite the bot to your server by clicking [here](%s)".formatted(Consts.INVITE_URL)) .setDescription("You can invite the bot to your server by clicking [here](%s)".formatted(Consts.INVITE_URL))
.build()) .build())

View File

@ -1,13 +1,14 @@
package cc.fascinated.bat.features.base.commands.general; package cc.fascinated.bat.base.commands.general;
import cc.fascinated.bat.command.BatCommand; import cc.fascinated.bat.common.oldcommand.BatCommand;
import cc.fascinated.bat.command.Category; import cc.fascinated.bat.common.oldcommand.Category;
import cc.fascinated.bat.command.CommandInfo; import cc.fascinated.bat.common.oldcommand.CommandInfo;
import cc.fascinated.bat.model.BatGuild; import cc.fascinated.bat.common.model.BatGuild;
import cc.fascinated.bat.model.BatUser; import cc.fascinated.bat.common.model.BatUser;
import cc.fascinated.bat.service.DiscordService; import cc.fascinated.bat.service.DiscordService;
import lombok.NonNull; import lombok.NonNull;
import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel; import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel;
import net.dv8tion.jda.api.interactions.commands.SlashCommandInteraction; import net.dv8tion.jda.api.interactions.commands.SlashCommandInteraction;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@ -16,10 +17,16 @@ import org.springframework.stereotype.Component;
* @author Fascinated (fascinated7) * @author Fascinated (fascinated7)
*/ */
@Component @Component
@CommandInfo(name = "ping", description = "Gets the ping of the bot", guildOnly = false, userInstall = true, category = Category.GENERAL) @CommandInfo(
name = "ping",
description = "Gets the ping of the bot",
guildOnly = false,
userInstall = true,
category = Category.GENERAL
)
public class PingCommand extends BatCommand { public class PingCommand extends BatCommand {
@Override @Override
public void execute(BatGuild guild, @NonNull BatUser user, @NonNull MessageChannel channel, Member member, @NonNull SlashCommandInteraction event) { public void execute(BatGuild guild, @NonNull BatUser user, @NonNull MessageChannel channel, Member member, Message commandMessage, String[] arguments, SlashCommandInteraction event) {
long time = System.currentTimeMillis(); long time = System.currentTimeMillis();
event.reply("Pinging...").queue(response -> { event.reply("Pinging...").queue(response -> {
response.editOriginal("Gateway response time: `%sms`\nAPI response time `%sms`".formatted( response.editOriginal("Gateway response time: `%sms`\nAPI response time `%sms`".formatted(

View File

@ -1,14 +1,15 @@
package cc.fascinated.bat.features.base.commands.general; package cc.fascinated.bat.base.commands.general;
import cc.fascinated.bat.command.BatCommand; import cc.fascinated.bat.common.oldcommand.BatCommand;
import cc.fascinated.bat.command.Category; import cc.fascinated.bat.common.oldcommand.Category;
import cc.fascinated.bat.command.CommandInfo; import cc.fascinated.bat.common.oldcommand.CommandInfo;
import cc.fascinated.bat.common.EmbedDescriptionBuilder; import cc.fascinated.bat.common.DescriptionBuilder;
import cc.fascinated.bat.common.EmbedUtils; import cc.fascinated.bat.common.EmbedUtils;
import cc.fascinated.bat.model.BatGuild; import cc.fascinated.bat.common.model.BatGuild;
import cc.fascinated.bat.model.BatUser; import cc.fascinated.bat.common.model.BatUser;
import lombok.NonNull; import lombok.NonNull;
import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel; import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel;
import net.dv8tion.jda.api.interactions.commands.SlashCommandInteraction; import net.dv8tion.jda.api.interactions.commands.SlashCommandInteraction;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@ -25,8 +26,8 @@ public class VoteCommand extends BatCommand {
}; };
@Override @Override
public void execute(BatGuild guild, @NonNull BatUser user, @NonNull MessageChannel channel, Member member, @NonNull SlashCommandInteraction event) { public void execute(BatGuild guild, @NonNull BatUser user, @NonNull MessageChannel channel, Member member, Message commandMessage, String[] arguments, SlashCommandInteraction event) {
EmbedDescriptionBuilder description = new EmbedDescriptionBuilder("Vote Links"); DescriptionBuilder description = new DescriptionBuilder("Vote Links");
description.appendLine("Vote for the bot on the following websites to support us!", false); description.appendLine("Vote for the bot on the following websites to support us!", false);
for (String link : VOTE_LINKS) { for (String link : VOTE_LINKS) {
description.appendLine(link, true); description.appendLine(link, true);

View File

@ -1,8 +1,8 @@
package cc.fascinated.bat.features.base.commands.general.avatar; package cc.fascinated.bat.base.commands.general.avatar;
import cc.fascinated.bat.command.BatCommand; import cc.fascinated.bat.common.oldcommand.BatCommand;
import cc.fascinated.bat.command.Category; import cc.fascinated.bat.common.oldcommand.Category;
import cc.fascinated.bat.command.CommandInfo; import cc.fascinated.bat.common.oldcommand.CommandInfo;
import lombok.NonNull; import lombok.NonNull;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContext;

View File

@ -1,13 +1,14 @@
package cc.fascinated.bat.features.base.commands.general.avatar; package cc.fascinated.bat.base.commands.general.avatar;
import cc.fascinated.bat.command.BatCommand; import cc.fascinated.bat.common.oldcommand.BatCommand;
import cc.fascinated.bat.command.Category; import cc.fascinated.bat.common.oldcommand.Category;
import cc.fascinated.bat.command.CommandInfo; import cc.fascinated.bat.common.oldcommand.CommandInfo;
import cc.fascinated.bat.common.EmbedUtils; import cc.fascinated.bat.common.EmbedUtils;
import cc.fascinated.bat.model.BatGuild; import cc.fascinated.bat.common.model.BatGuild;
import cc.fascinated.bat.model.BatUser; import cc.fascinated.bat.common.model.BatUser;
import lombok.NonNull; import lombok.NonNull;
import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel; import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel;
import net.dv8tion.jda.api.interactions.commands.SlashCommandInteraction; import net.dv8tion.jda.api.interactions.commands.SlashCommandInteraction;
import net.dv8tion.jda.api.utils.ImageProxy; import net.dv8tion.jda.api.utils.ImageProxy;
@ -20,9 +21,8 @@ import org.springframework.stereotype.Component;
@CommandInfo(name = "guild", description = "View the avatar of the guild", category = Category.GENERAL) @CommandInfo(name = "guild", description = "View the avatar of the guild", category = Category.GENERAL)
public class GuildSubCommand extends BatCommand { public class GuildSubCommand extends BatCommand {
@Override @Override
public void execute(BatGuild guild, @NonNull BatUser user, @NonNull MessageChannel channel, Member member, @NonNull SlashCommandInteraction event) { public void execute(BatGuild guild, @NonNull BatUser user, @NonNull MessageChannel channel, Member member, Message commandMessage, String[] arguments, SlashCommandInteraction event) {
ImageProxy icon = guild.getDiscordGuild().getIcon(); ImageProxy icon = guild.getDiscordGuild().getIcon();
if (icon == null) { if (icon == null) {
event.replyEmbeds(EmbedUtils.errorEmbed() event.replyEmbeds(EmbedUtils.errorEmbed()
.setDescription("**%s** does not have an avatar!".formatted(guild.getName())) .setDescription("**%s** does not have an avatar!".formatted(guild.getName()))

View File

@ -1,13 +1,14 @@
package cc.fascinated.bat.features.base.commands.general.avatar; package cc.fascinated.bat.base.commands.general.avatar;
import cc.fascinated.bat.command.BatCommand; import cc.fascinated.bat.common.oldcommand.BatCommand;
import cc.fascinated.bat.command.Category; import cc.fascinated.bat.common.oldcommand.Category;
import cc.fascinated.bat.command.CommandInfo; import cc.fascinated.bat.common.oldcommand.CommandInfo;
import cc.fascinated.bat.common.EmbedUtils; import cc.fascinated.bat.common.EmbedUtils;
import cc.fascinated.bat.model.BatGuild; import cc.fascinated.bat.common.model.BatGuild;
import cc.fascinated.bat.model.BatUser; import cc.fascinated.bat.common.model.BatUser;
import lombok.NonNull; import lombok.NonNull;
import net.dv8tion.jda.api.entities.Member; 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.entities.User;
import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel; import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel;
import net.dv8tion.jda.api.interactions.commands.OptionMapping; import net.dv8tion.jda.api.interactions.commands.OptionMapping;
@ -27,17 +28,11 @@ public class UserSubCommand extends BatCommand {
} }
@Override @Override
public void execute(BatGuild guild, @NonNull BatUser user, @NonNull MessageChannel channel, Member member, @NonNull SlashCommandInteraction event) { public void execute(BatGuild guild, @NonNull BatUser user, @NonNull MessageChannel channel, Member member, Message commandMessage, String[] arguments, SlashCommandInteraction event) {
OptionMapping userOption = event.getOption("user"); OptionMapping userOption = event.getOption("user");
if (userOption == null) { assert userOption != null;
event.replyEmbeds(EmbedUtils.errorEmbed()
.setDescription("You must provide a user to view the avatar of!")
.build())
.queue();
return;
}
User target = userOption.getAsUser(); User target = userOption.getAsUser();
event.replyEmbeds(EmbedUtils.genericEmbed() event.replyEmbeds(EmbedUtils.genericEmbed()
.setAuthor("%s's Avatar".formatted(target.getName()), null, target.getEffectiveAvatarUrl()) .setAuthor("%s's Avatar".formatted(target.getName()), null, target.getEffectiveAvatarUrl())
.setImage(target.getEffectiveAvatarUrl()) .setImage(target.getEffectiveAvatarUrl())

View File

@ -1,8 +1,8 @@
package cc.fascinated.bat.features.base.commands.general.banner; package cc.fascinated.bat.base.commands.general.banner;
import cc.fascinated.bat.command.BatCommand; import cc.fascinated.bat.common.oldcommand.BatCommand;
import cc.fascinated.bat.command.Category; import cc.fascinated.bat.common.oldcommand.Category;
import cc.fascinated.bat.command.CommandInfo; import cc.fascinated.bat.common.oldcommand.CommandInfo;
import lombok.NonNull; import lombok.NonNull;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContext;

View File

@ -1,13 +1,14 @@
package cc.fascinated.bat.features.base.commands.general.banner; package cc.fascinated.bat.base.commands.general.banner;
import cc.fascinated.bat.command.BatCommand; import cc.fascinated.bat.common.oldcommand.BatCommand;
import cc.fascinated.bat.command.Category; import cc.fascinated.bat.common.oldcommand.Category;
import cc.fascinated.bat.command.CommandInfo; import cc.fascinated.bat.common.oldcommand.CommandInfo;
import cc.fascinated.bat.common.EmbedUtils; import cc.fascinated.bat.common.EmbedUtils;
import cc.fascinated.bat.model.BatGuild; import cc.fascinated.bat.common.model.BatGuild;
import cc.fascinated.bat.model.BatUser; import cc.fascinated.bat.common.model.BatUser;
import lombok.NonNull; import lombok.NonNull;
import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel; import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel;
import net.dv8tion.jda.api.interactions.commands.SlashCommandInteraction; import net.dv8tion.jda.api.interactions.commands.SlashCommandInteraction;
import net.dv8tion.jda.api.utils.ImageProxy; import net.dv8tion.jda.api.utils.ImageProxy;
@ -20,7 +21,7 @@ import org.springframework.stereotype.Component;
@CommandInfo(name = "guild", description = "View the banner of the guild", category = Category.GENERAL) @CommandInfo(name = "guild", description = "View the banner of the guild", category = Category.GENERAL)
public class GuildSubCommand extends BatCommand { public class GuildSubCommand extends BatCommand {
@Override @Override
public void execute(BatGuild guild, @NonNull BatUser user, @NonNull MessageChannel channel, Member member, @NonNull SlashCommandInteraction event) { public void execute(BatGuild guild, @NonNull BatUser user, @NonNull MessageChannel channel, Member member, Message commandMessage, String[] arguments, SlashCommandInteraction event) {
ImageProxy banner = guild.getDiscordGuild().getBanner(); ImageProxy banner = guild.getDiscordGuild().getBanner();
if (banner == null) { if (banner == null) {
event.replyEmbeds(EmbedUtils.errorEmbed() event.replyEmbeds(EmbedUtils.errorEmbed()

View File

@ -1,13 +1,14 @@
package cc.fascinated.bat.features.base.commands.general.banner; package cc.fascinated.bat.base.commands.general.banner;
import cc.fascinated.bat.command.BatCommand; import cc.fascinated.bat.common.oldcommand.BatCommand;
import cc.fascinated.bat.command.Category; import cc.fascinated.bat.common.oldcommand.Category;
import cc.fascinated.bat.command.CommandInfo; import cc.fascinated.bat.common.oldcommand.CommandInfo;
import cc.fascinated.bat.common.EmbedUtils; import cc.fascinated.bat.common.EmbedUtils;
import cc.fascinated.bat.model.BatGuild; import cc.fascinated.bat.common.model.BatGuild;
import cc.fascinated.bat.model.BatUser; import cc.fascinated.bat.common.model.BatUser;
import lombok.NonNull; import lombok.NonNull;
import net.dv8tion.jda.api.entities.Member; 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.entities.User;
import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel; import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel;
import net.dv8tion.jda.api.interactions.commands.OptionMapping; import net.dv8tion.jda.api.interactions.commands.OptionMapping;
@ -28,16 +29,9 @@ public class UserSubCommand extends BatCommand {
} }
@Override @Override
public void execute(BatGuild guild, @NonNull BatUser user, @NonNull MessageChannel channel, Member member, @NonNull SlashCommandInteraction event) { public void execute(BatGuild guild, @NonNull BatUser user, @NonNull MessageChannel channel, Member member, Message commandMessage, String[] arguments, SlashCommandInteraction event) {
OptionMapping userOption = event.getOption("user"); OptionMapping userOption = event.getOption("user");
if (userOption == null) { assert userOption != null;
event.replyEmbeds(EmbedUtils.errorEmbed()
.setDescription("You must provide a user to view the banner of!")
.build())
.queue();
return;
}
User target = userOption.getAsUser(); User target = userOption.getAsUser();
ImageProxy banner = target.retrieveProfile().complete().getBanner(); ImageProxy banner = target.retrieveProfile().complete().getBanner();
if (banner == null) { if (banner == null) {

View File

@ -1,14 +1,15 @@
package cc.fascinated.bat.features.base.commands.server; package cc.fascinated.bat.base.commands.server;
import cc.fascinated.bat.command.BatCommand; import cc.fascinated.bat.common.oldcommand.BatCommand;
import cc.fascinated.bat.command.CommandInfo; import cc.fascinated.bat.common.oldcommand.CommandInfo;
import cc.fascinated.bat.common.EmbedUtils; import cc.fascinated.bat.common.EmbedUtils;
import cc.fascinated.bat.common.NumberFormatter; import cc.fascinated.bat.common.NumberFormatter;
import cc.fascinated.bat.model.BatGuild; import cc.fascinated.bat.common.model.BatGuild;
import cc.fascinated.bat.model.BatUser; import cc.fascinated.bat.common.model.BatUser;
import lombok.NonNull; import lombok.NonNull;
import net.dv8tion.jda.api.entities.Guild; import net.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel; import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel;
import net.dv8tion.jda.api.interactions.commands.SlashCommandInteraction; import net.dv8tion.jda.api.interactions.commands.SlashCommandInteraction;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@ -20,7 +21,7 @@ import org.springframework.stereotype.Component;
@CommandInfo(name = "membercount", description = "View the member count of the server!") @CommandInfo(name = "membercount", description = "View the member count of the server!")
public class MemberCountCommand extends BatCommand { public class MemberCountCommand extends BatCommand {
@Override @Override
public void execute(BatGuild guild, @NonNull BatUser user, @NonNull MessageChannel channel, Member member, @NonNull SlashCommandInteraction event) { public void execute(BatGuild guild, @NonNull BatUser user, @NonNull MessageChannel channel, Member member, Message commandMessage, String[] arguments, SlashCommandInteraction event) {
Guild discordGuild = guild.getDiscordGuild(); Guild discordGuild = guild.getDiscordGuild();
int totalMembers = 0, totalUsers = 0, totalBots = 0; int totalMembers = 0, totalUsers = 0, totalBots = 0;
for (Member guildMember : discordGuild.getMembers()) { for (Member guildMember : discordGuild.getMembers()) {

View File

@ -1,15 +1,16 @@
package cc.fascinated.bat.features.base.commands.server; package cc.fascinated.bat.base.commands.server;
import cc.fascinated.bat.command.BatCommand; import cc.fascinated.bat.common.oldcommand.BatCommand;
import cc.fascinated.bat.command.CommandInfo; import cc.fascinated.bat.common.oldcommand.CommandInfo;
import cc.fascinated.bat.common.EmbedUtils; import cc.fascinated.bat.common.EmbedUtils;
import cc.fascinated.bat.model.BatGuild; import cc.fascinated.bat.common.model.BatGuild;
import cc.fascinated.bat.model.BatUser; import cc.fascinated.bat.common.model.BatUser;
import cc.fascinated.bat.premium.PremiumProfile; import cc.fascinated.bat.premium.PremiumProfile;
import lombok.NonNull; import lombok.NonNull;
import net.dv8tion.jda.api.EmbedBuilder; import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.Permission; import net.dv8tion.jda.api.Permission;
import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel; import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel;
import net.dv8tion.jda.api.interactions.commands.SlashCommandInteraction; import net.dv8tion.jda.api.interactions.commands.SlashCommandInteraction;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@ -21,7 +22,7 @@ import org.springframework.stereotype.Component;
@CommandInfo(name = "premium", description = "View the premium information for the guild", requiredPermissions = Permission.ADMINISTRATOR) @CommandInfo(name = "premium", description = "View the premium information for the guild", requiredPermissions = Permission.ADMINISTRATOR)
public class PremiumCommand extends BatCommand { public class PremiumCommand extends BatCommand {
@Override @Override
public void execute(BatGuild guild, @NonNull BatUser user, @NonNull MessageChannel channel, Member member, @NonNull SlashCommandInteraction event) { public void execute(BatGuild guild, @NonNull BatUser user, @NonNull MessageChannel channel, Member member, Message commandMessage, String[] arguments, SlashCommandInteraction event) {
PremiumProfile premium = guild.getPremiumProfile(); PremiumProfile premium = guild.getPremiumProfile();
EmbedBuilder embed = EmbedUtils.genericEmbed().setAuthor("Premium Information"); EmbedBuilder embed = EmbedUtils.genericEmbed().setAuthor("Premium Information");
if (premium.hasPremium()) { if (premium.hasPremium()) {

View File

@ -1,8 +1,8 @@
package cc.fascinated.bat.features.base.commands.server.channel; package cc.fascinated.bat.base.commands.server.channel;
import cc.fascinated.bat.command.BatCommand; import cc.fascinated.bat.common.oldcommand.BatCommand;
import cc.fascinated.bat.command.Category; import cc.fascinated.bat.common.oldcommand.Category;
import cc.fascinated.bat.command.CommandInfo; import cc.fascinated.bat.common.oldcommand.CommandInfo;
import lombok.NonNull; import lombok.NonNull;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContext;

View File

@ -1,13 +1,14 @@
package cc.fascinated.bat.features.base.commands.server.channel; package cc.fascinated.bat.base.commands.server.channel;
import cc.fascinated.bat.command.BatCommand; import cc.fascinated.bat.common.oldcommand.BatCommand;
import cc.fascinated.bat.command.CommandInfo; import cc.fascinated.bat.common.oldcommand.CommandInfo;
import cc.fascinated.bat.common.EmbedUtils; import cc.fascinated.bat.common.EmbedUtils;
import cc.fascinated.bat.model.BatGuild; import cc.fascinated.bat.common.model.BatGuild;
import cc.fascinated.bat.model.BatUser; import cc.fascinated.bat.common.model.BatUser;
import lombok.NonNull; import lombok.NonNull;
import net.dv8tion.jda.api.Permission; import net.dv8tion.jda.api.Permission;
import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.channel.Channel; import net.dv8tion.jda.api.entities.channel.Channel;
import net.dv8tion.jda.api.entities.channel.concrete.TextChannel; import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel; import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel;
@ -27,7 +28,7 @@ public class RemoveTopicSubCommand extends BatCommand {
} }
@Override @Override
public void execute(BatGuild guild, @NonNull BatUser user, @NonNull MessageChannel channel, Member member, @NonNull SlashCommandInteraction event) { public void execute(BatGuild guild, @NonNull BatUser user, @NonNull MessageChannel channel, Member member, Message commandMessage, String[] arguments, SlashCommandInteraction event) {
Channel target = event.getOption("channel") == null ? channel : event.getOption("channel").getAsChannel(); Channel target = event.getOption("channel") == null ? channel : event.getOption("channel").getAsChannel();
if (!(target instanceof TextChannel textChannel)) { if (!(target instanceof TextChannel textChannel)) {
event.replyEmbeds(EmbedUtils.errorEmbed() event.replyEmbeds(EmbedUtils.errorEmbed()

View File

@ -1,13 +1,14 @@
package cc.fascinated.bat.features.base.commands.server.channel; package cc.fascinated.bat.base.commands.server.channel;
import cc.fascinated.bat.command.BatCommand; import cc.fascinated.bat.common.oldcommand.BatCommand;
import cc.fascinated.bat.command.CommandInfo; import cc.fascinated.bat.common.oldcommand.CommandInfo;
import cc.fascinated.bat.common.EmbedUtils; import cc.fascinated.bat.common.EmbedUtils;
import cc.fascinated.bat.model.BatGuild; import cc.fascinated.bat.common.model.BatGuild;
import cc.fascinated.bat.model.BatUser; import cc.fascinated.bat.common.model.BatUser;
import lombok.NonNull; import lombok.NonNull;
import net.dv8tion.jda.api.Permission; import net.dv8tion.jda.api.Permission;
import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.channel.Channel; import net.dv8tion.jda.api.entities.channel.Channel;
import net.dv8tion.jda.api.entities.channel.concrete.TextChannel; import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel; import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel;
@ -32,7 +33,7 @@ public class SetTopicSubCommand extends BatCommand {
} }
@Override @Override
public void execute(BatGuild guild, @NonNull BatUser user, @NonNull MessageChannel channel, Member member, @NonNull SlashCommandInteraction event) { public void execute(BatGuild guild, @NonNull BatUser user, @NonNull MessageChannel channel, Member member, Message commandMessage, String[] arguments, SlashCommandInteraction event) {
Channel target = event.getOption("channel") == null ? channel : Objects.requireNonNull(event.getOption("channel")).getAsChannel(); Channel target = event.getOption("channel") == null ? channel : Objects.requireNonNull(event.getOption("channel")).getAsChannel();
if (!(target instanceof TextChannel textChannel)) { if (!(target instanceof TextChannel textChannel)) {
event.replyEmbeds(EmbedUtils.errorEmbed() event.replyEmbeds(EmbedUtils.errorEmbed()

View File

@ -1,12 +1,13 @@
package cc.fascinated.bat.features.base.commands.server.channel; package cc.fascinated.bat.base.commands.server.channel;
import cc.fascinated.bat.command.BatCommand; import cc.fascinated.bat.common.oldcommand.BatCommand;
import cc.fascinated.bat.command.CommandInfo; import cc.fascinated.bat.common.oldcommand.CommandInfo;
import cc.fascinated.bat.common.EmbedUtils; import cc.fascinated.bat.common.EmbedUtils;
import cc.fascinated.bat.model.BatGuild; import cc.fascinated.bat.common.model.BatGuild;
import cc.fascinated.bat.model.BatUser; import cc.fascinated.bat.common.model.BatUser;
import lombok.NonNull; import lombok.NonNull;
import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.channel.Channel; import net.dv8tion.jda.api.entities.channel.Channel;
import net.dv8tion.jda.api.entities.channel.concrete.TextChannel; import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel; import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel;
@ -26,7 +27,7 @@ public class ViewTopicSubCommand extends BatCommand {
} }
@Override @Override
public void execute(BatGuild guild, @NonNull BatUser user, @NonNull MessageChannel channel, Member member, @NonNull SlashCommandInteraction event) { public void execute(BatGuild guild, @NonNull BatUser user, @NonNull MessageChannel channel, Member member, Message commandMessage, String[] arguments, SlashCommandInteraction event) {
Channel target = event.getOption("channel") == null ? channel : event.getOption("channel").getAsChannel(); Channel target = event.getOption("channel") == null ? channel : event.getOption("channel").getAsChannel();
if (!(target instanceof TextChannel textChannel)) { if (!(target instanceof TextChannel textChannel)) {
event.replyEmbeds(EmbedUtils.errorEmbed() event.replyEmbeds(EmbedUtils.errorEmbed()

View File

@ -1,15 +1,16 @@
package cc.fascinated.bat.features.base.commands.server.feature; package cc.fascinated.bat.base.commands.server.feature;
import cc.fascinated.bat.command.BatCommand; import cc.fascinated.bat.common.oldcommand.BatCommand;
import cc.fascinated.bat.command.CommandInfo; import cc.fascinated.bat.common.oldcommand.CommandInfo;
import cc.fascinated.bat.common.EmbedUtils; import cc.fascinated.bat.common.EmbedUtils;
import cc.fascinated.bat.features.Feature; import cc.fascinated.bat.common.feature.Feature;
import cc.fascinated.bat.features.FeatureProfile; import cc.fascinated.bat.common.feature.FeatureProfile;
import cc.fascinated.bat.model.BatGuild; import cc.fascinated.bat.common.model.BatGuild;
import cc.fascinated.bat.model.BatUser; import cc.fascinated.bat.common.model.BatUser;
import cc.fascinated.bat.service.FeatureService; import cc.fascinated.bat.service.FeatureService;
import lombok.NonNull; import lombok.NonNull;
import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel; import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel;
import net.dv8tion.jda.api.interactions.commands.OptionMapping; import net.dv8tion.jda.api.interactions.commands.OptionMapping;
import net.dv8tion.jda.api.interactions.commands.OptionType; import net.dv8tion.jda.api.interactions.commands.OptionType;
@ -30,7 +31,7 @@ public class DisableSubCommand extends BatCommand {
} }
@Override @Override
public void execute(BatGuild guild, @NonNull BatUser user, @NonNull MessageChannel channel, Member member, @NonNull SlashCommandInteraction event) { public void execute(BatGuild guild, @NonNull BatUser user, @NonNull MessageChannel channel, Member member, Message commandMessage, String[] arguments, SlashCommandInteraction event) {
FeatureProfile featureProfile = guild.getFeatureProfile(); FeatureProfile featureProfile = guild.getFeatureProfile();
OptionMapping featureOption = event.getOption("feature"); OptionMapping featureOption = event.getOption("feature");
if (featureOption == null) { if (featureOption == null) {

View File

@ -1,15 +1,16 @@
package cc.fascinated.bat.features.base.commands.server.feature; package cc.fascinated.bat.base.commands.server.feature;
import cc.fascinated.bat.command.BatCommand; import cc.fascinated.bat.common.oldcommand.BatCommand;
import cc.fascinated.bat.command.CommandInfo; import cc.fascinated.bat.common.oldcommand.CommandInfo;
import cc.fascinated.bat.common.EmbedUtils; import cc.fascinated.bat.common.EmbedUtils;
import cc.fascinated.bat.features.Feature; import cc.fascinated.bat.common.feature.Feature;
import cc.fascinated.bat.features.FeatureProfile; import cc.fascinated.bat.common.feature.FeatureProfile;
import cc.fascinated.bat.model.BatGuild; import cc.fascinated.bat.common.model.BatGuild;
import cc.fascinated.bat.model.BatUser; import cc.fascinated.bat.common.model.BatUser;
import cc.fascinated.bat.service.FeatureService; import cc.fascinated.bat.service.FeatureService;
import lombok.NonNull; import lombok.NonNull;
import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel; import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel;
import net.dv8tion.jda.api.interactions.commands.OptionMapping; import net.dv8tion.jda.api.interactions.commands.OptionMapping;
import net.dv8tion.jda.api.interactions.commands.OptionType; import net.dv8tion.jda.api.interactions.commands.OptionType;
@ -30,7 +31,7 @@ public class EnableSubCommand extends BatCommand {
} }
@Override @Override
public void execute(BatGuild guild, @NonNull BatUser user, @NonNull MessageChannel channel, Member member, @NonNull SlashCommandInteraction event) { public void execute(BatGuild guild, @NonNull BatUser user, @NonNull MessageChannel channel, Member member, Message commandMessage, String[] arguments, SlashCommandInteraction event) {
FeatureProfile featureProfile = guild.getFeatureProfile(); FeatureProfile featureProfile = guild.getFeatureProfile();
OptionMapping featureOption = event.getOption("feature"); OptionMapping featureOption = event.getOption("feature");
if (featureOption == null) { if (featureOption == null) {

View File

@ -1,8 +1,8 @@
package cc.fascinated.bat.features.base.commands.server.feature; package cc.fascinated.bat.base.commands.server.feature;
import cc.fascinated.bat.command.BatCommand; import cc.fascinated.bat.common.oldcommand.BatCommand;
import cc.fascinated.bat.command.Category; import cc.fascinated.bat.common.oldcommand.Category;
import cc.fascinated.bat.command.CommandInfo; import cc.fascinated.bat.common.oldcommand.CommandInfo;
import lombok.NonNull; import lombok.NonNull;
import net.dv8tion.jda.api.Permission; import net.dv8tion.jda.api.Permission;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;

View File

@ -1,15 +1,16 @@
package cc.fascinated.bat.features.base.commands.server.feature; package cc.fascinated.bat.base.commands.server.feature;
import cc.fascinated.bat.command.BatCommand; import cc.fascinated.bat.common.oldcommand.BatCommand;
import cc.fascinated.bat.command.CommandInfo; import cc.fascinated.bat.common.oldcommand.CommandInfo;
import cc.fascinated.bat.common.EmbedUtils; import cc.fascinated.bat.common.EmbedUtils;
import cc.fascinated.bat.features.Feature; import cc.fascinated.bat.common.feature.Feature;
import cc.fascinated.bat.features.FeatureProfile; import cc.fascinated.bat.common.feature.FeatureProfile;
import cc.fascinated.bat.model.BatGuild; import cc.fascinated.bat.common.model.BatGuild;
import cc.fascinated.bat.model.BatUser; import cc.fascinated.bat.common.model.BatUser;
import cc.fascinated.bat.service.FeatureService; import cc.fascinated.bat.service.FeatureService;
import lombok.NonNull; import lombok.NonNull;
import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel; import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel;
import net.dv8tion.jda.api.interactions.commands.SlashCommandInteraction; import net.dv8tion.jda.api.interactions.commands.SlashCommandInteraction;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@ -21,7 +22,7 @@ import org.springframework.stereotype.Component;
@CommandInfo(name = "list", description = "Lists the features and their states") @CommandInfo(name = "list", description = "Lists the features and their states")
public class ListSubCommand extends BatCommand { public class ListSubCommand extends BatCommand {
@Override @Override
public void execute(BatGuild guild, @NonNull BatUser user, @NonNull MessageChannel channel, Member member, @NonNull SlashCommandInteraction event) { public void execute(BatGuild guild, @NonNull BatUser user, @NonNull MessageChannel channel, Member member, Message commandMessage, String[] arguments, SlashCommandInteraction event) {
StringBuilder featureStates = new StringBuilder(); StringBuilder featureStates = new StringBuilder();
for (Feature feature : FeatureService.INSTANCE.getFeaturesSorted()) { for (Feature feature : FeatureService.INSTANCE.getFeaturesSorted()) {
FeatureProfile featureProfile = guild.getFeatureProfile(); FeatureProfile featureProfile = guild.getFeatureProfile();

View File

@ -1,14 +1,16 @@
package cc.fascinated.bat.features.base.commands.utility; package cc.fascinated.bat.base.commands.utility;
import cc.fascinated.bat.command.BatCommand; import cc.fascinated.bat.common.oldcommand.BatCommand;
import cc.fascinated.bat.command.CommandInfo; import cc.fascinated.bat.common.oldcommand.Category;
import cc.fascinated.bat.common.EmbedDescriptionBuilder; import cc.fascinated.bat.common.oldcommand.CommandInfo;
import cc.fascinated.bat.common.DescriptionBuilder;
import cc.fascinated.bat.common.EmbedUtils; import cc.fascinated.bat.common.EmbedUtils;
import cc.fascinated.bat.common.PasteUtils; import cc.fascinated.bat.common.PasteUtils;
import cc.fascinated.bat.model.BatGuild; import cc.fascinated.bat.common.model.BatGuild;
import cc.fascinated.bat.model.BatUser; import cc.fascinated.bat.common.model.BatUser;
import lombok.NonNull; import lombok.NonNull;
import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel; import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel;
import net.dv8tion.jda.api.interactions.commands.OptionMapping; import net.dv8tion.jda.api.interactions.commands.OptionMapping;
import net.dv8tion.jda.api.interactions.commands.OptionType; import net.dv8tion.jda.api.interactions.commands.OptionType;
@ -23,7 +25,8 @@ import org.springframework.stereotype.Component;
@CommandInfo( @CommandInfo(
name = "pastebin", name = "pastebin",
description = "Uploads the given text to Paste", description = "Uploads the given text to Paste",
userInstall = true userInstall = true,
category = Category.UTILITY
) )
public class PastebinCommand extends BatCommand { public class PastebinCommand extends BatCommand {
public PastebinCommand() { public PastebinCommand() {
@ -33,7 +36,7 @@ public class PastebinCommand extends BatCommand {
} }
@Override @Override
public void execute(BatGuild guild, @NonNull BatUser user, @NonNull MessageChannel channel, Member member, @NonNull SlashCommandInteraction event) { public void execute(BatGuild guild, @NonNull BatUser user, @NonNull MessageChannel channel, Member member, Message commandMessage, String[] arguments, SlashCommandInteraction event) {
OptionMapping textOption = event.getOption("text"); OptionMapping textOption = event.getOption("text");
assert textOption != null; assert textOption != null;
String text = textOption.getAsString(); String text = textOption.getAsString();
@ -41,9 +44,11 @@ public class PastebinCommand extends BatCommand {
// Upload the text to pastebin // Upload the text to pastebin
String url = PasteUtils.uploadPaste(text).getUrl(); String url = PasteUtils.uploadPaste(text).getUrl();
event.replyEmbeds(EmbedUtils.successEmbed() event.replyEmbeds(EmbedUtils.successEmbed()
.setDescription(new EmbedDescriptionBuilder("The text has been uploaded to Paste!") .setDescription(new DescriptionBuilder("The text has been uploaded to Paste!")
.appendLine("URL: %s".formatted(url), true) .appendLine("URL: %s".formatted(url), true)
.build()) .build())
.build()).queue(); .build())
.setEphemeral(true)
.queue();
} }
} }

View File

@ -1,8 +1,8 @@
package cc.fascinated.bat.features.base.commands.utility.lookup; package cc.fascinated.bat.base.commands.utility.lookup;
import cc.fascinated.bat.command.BatCommand; import cc.fascinated.bat.common.oldcommand.BatCommand;
import cc.fascinated.bat.command.Category; import cc.fascinated.bat.common.oldcommand.Category;
import cc.fascinated.bat.command.CommandInfo; import cc.fascinated.bat.common.oldcommand.CommandInfo;
import lombok.NonNull; import lombok.NonNull;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContext;

View File

@ -0,0 +1,75 @@
package cc.fascinated.bat.base.commands.utility.lookup;
import cc.fascinated.bat.common.oldcommand.BatCommand;
import cc.fascinated.bat.common.oldcommand.CommandInfo;
import cc.fascinated.bat.common.DescriptionBuilder;
import cc.fascinated.bat.common.EmbedUtils;
import cc.fascinated.bat.common.model.BatGuild;
import cc.fascinated.bat.common.model.BatUser;
import cc.fascinated.bat.service.UserService;
import lombok.NonNull;
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.entities.channel.middleman.MessageChannel;
import net.dv8tion.jda.api.interactions.commands.OptionMapping;
import net.dv8tion.jda.api.interactions.commands.OptionType;
import net.dv8tion.jda.api.interactions.commands.SlashCommandInteraction;
import net.dv8tion.jda.api.interactions.commands.build.OptionData;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* @author Fascinated (fascinated7)
*/
@Component("lookup.user:sub")
@CommandInfo(name = "user", description = "Lookup a user")
public class UserSubCommand extends BatCommand {
private final UserService userService;
@Autowired
public UserSubCommand(@NonNull UserService userService) {
this.userService = userService;
super.addOptions(new OptionData(OptionType.STRING, "id", "The id of the user", true));
}
@Override
public void execute(BatGuild guild, @NonNull BatUser user, @NonNull MessageChannel channel, Member member, Message commandMessage, String[] arguments, SlashCommandInteraction event) {
OptionMapping idOption = event.getOption("id");
if (idOption == null) {
return;
}
User target = userService.getUser(idOption.getAsString()).getDiscordUser();
if (target == null) {
event.replyEmbeds(EmbedUtils.errorEmbed()
.setDescription("User `%s` not found".formatted(idOption.getAsString()))
.build())
.setEphemeral(true)
.queue();
return;
}
// The flags of the user (eg. Discord Partner, Hypesquad Events, etc.)
StringBuilder flags = new StringBuilder();
for (User.UserFlag flag : target.getFlags()) {
flags.append("`").append(flag.getName()).append("`, ");
}
String name = target.getGlobalName() == null ? target.getName() : target.getGlobalName().replaceAll("`", "");
target.retrieveProfile().queue(profile -> event.replyEmbeds(EmbedUtils.genericEmbed()
.setDescription(new DescriptionBuilder("User Lookup")
.appendLine("Name: `%s`".formatted(name), true)
.appendLine("Username: `%s`".formatted(target.getName()), true)
.appendLine("ID: `%s`".formatted(target.getId()), true)
.appendLine("Flags: %s".formatted(flags.toString().isEmpty() ? "None" : flags.substring(0, flags.length() - 2)), true)
.appendLine("Joined Discord: <t:%s:R>".formatted(target.getTimeCreated().toEpochSecond()), true)
.appendLine("Avatar: %s".formatted(target.getAvatar() == null ? "None"
: "[click here](%s)".formatted(target.getAvatar().getUrl(4096))), true)
.appendLine("Banner: %s".formatted(profile.getBanner() == null ? "None"
: "[click here](%s)".formatted(profile.getBanner().getUrl(4096))), true)
.build())
.setThumbnail(target.getAvatar() == null ? null : target.getAvatar().getUrl(4096))
.build())
.setEphemeral(true)
.queue());
}
}

View File

@ -1,12 +1,12 @@
package cc.fascinated.bat.features.birthday; package cc.fascinated.bat.birthday;
import cc.fascinated.bat.event.EventListener; import cc.fascinated.bat.event.EventListener;
import cc.fascinated.bat.features.Feature; import cc.fascinated.bat.common.feature.Feature;
import cc.fascinated.bat.features.FeatureProfile; import cc.fascinated.bat.common.feature.FeatureProfile;
import cc.fascinated.bat.features.birthday.command.BirthdayCommand; import cc.fascinated.bat.birthday.command.BirthdayCommand;
import cc.fascinated.bat.features.birthday.profile.BirthdayProfile; import cc.fascinated.bat.birthday.profile.BirthdayProfile;
import cc.fascinated.bat.model.BatGuild; import cc.fascinated.bat.common.model.BatGuild;
import cc.fascinated.bat.service.CommandService; import cc.fascinated.bat.service.OldCommandService;
import cc.fascinated.bat.service.DiscordService; import cc.fascinated.bat.service.DiscordService;
import cc.fascinated.bat.service.GuildService; import cc.fascinated.bat.service.GuildService;
import lombok.NonNull; import lombok.NonNull;
@ -22,7 +22,7 @@ import org.springframework.stereotype.Component;
public class BirthdayFeature extends Feature implements EventListener { public class BirthdayFeature extends Feature implements EventListener {
private final GuildService guildService; private final GuildService guildService;
public BirthdayFeature(@NonNull ApplicationContext context, @NonNull CommandService commandService, @NonNull GuildService guildService) { public BirthdayFeature(@NonNull ApplicationContext context, @NonNull OldCommandService commandService, @NonNull GuildService guildService) {
super("Birthday", FeatureProfile.FeatureState.DISABLED, true); super("Birthday", FeatureProfile.FeatureState.DISABLED, true);
this.guildService = guildService; this.guildService = guildService;

View File

@ -1,4 +1,4 @@
package cc.fascinated.bat.features.birthday; package cc.fascinated.bat.birthday;
import cc.fascinated.bat.common.Serializable; import cc.fascinated.bat.common.Serializable;
import com.google.gson.Gson; import com.google.gson.Gson;

View File

@ -1,8 +1,8 @@
package cc.fascinated.bat.features.birthday.command; package cc.fascinated.bat.birthday.command;
import cc.fascinated.bat.command.BatCommand; import cc.fascinated.bat.common.oldcommand.BatCommand;
import cc.fascinated.bat.command.Category; import cc.fascinated.bat.common.oldcommand.Category;
import cc.fascinated.bat.command.CommandInfo; import cc.fascinated.bat.common.oldcommand.CommandInfo;
import lombok.NonNull; import lombok.NonNull;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContext;

View File

@ -1,15 +1,16 @@
package cc.fascinated.bat.features.birthday.command; package cc.fascinated.bat.birthday.command;
import cc.fascinated.bat.command.BatCommand; import cc.fascinated.bat.common.oldcommand.BatCommand;
import cc.fascinated.bat.command.CommandInfo; import cc.fascinated.bat.common.oldcommand.CommandInfo;
import cc.fascinated.bat.common.EmbedUtils; import cc.fascinated.bat.common.EmbedUtils;
import cc.fascinated.bat.common.TextChannelUtils; import cc.fascinated.bat.common.TextChannelUtils;
import cc.fascinated.bat.features.birthday.profile.BirthdayProfile; import cc.fascinated.bat.birthday.profile.BirthdayProfile;
import cc.fascinated.bat.model.BatGuild; import cc.fascinated.bat.common.model.BatGuild;
import cc.fascinated.bat.model.BatUser; import cc.fascinated.bat.common.model.BatUser;
import lombok.NonNull; import lombok.NonNull;
import net.dv8tion.jda.api.Permission; import net.dv8tion.jda.api.Permission;
import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.channel.ChannelType; import net.dv8tion.jda.api.entities.channel.ChannelType;
import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel; import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel;
import net.dv8tion.jda.api.entities.channel.unions.GuildChannelUnion; import net.dv8tion.jda.api.entities.channel.unions.GuildChannelUnion;
@ -32,7 +33,7 @@ public class ChannelSubCommand extends BatCommand {
} }
@Override @Override
public void execute(BatGuild guild, @NonNull BatUser user, @NonNull MessageChannel channel, Member member, @NonNull SlashCommandInteraction event) { public void execute(BatGuild guild, @NonNull BatUser user, @NonNull MessageChannel channel, Member member, Message commandMessage, String[] arguments, SlashCommandInteraction event) {
BirthdayProfile profile = guild.getBirthdayProfile(); BirthdayProfile profile = guild.getBirthdayProfile();
OptionMapping option = event.getOption("channel"); OptionMapping option = event.getOption("channel");
if (option == null) { if (option == null) {

View File

@ -1,14 +1,15 @@
package cc.fascinated.bat.features.birthday.command; package cc.fascinated.bat.birthday.command;
import cc.fascinated.bat.command.BatCommand; import cc.fascinated.bat.common.oldcommand.BatCommand;
import cc.fascinated.bat.command.CommandInfo; import cc.fascinated.bat.common.oldcommand.CommandInfo;
import cc.fascinated.bat.common.EmbedUtils; import cc.fascinated.bat.common.EmbedUtils;
import cc.fascinated.bat.features.birthday.profile.BirthdayProfile; import cc.fascinated.bat.birthday.profile.BirthdayProfile;
import cc.fascinated.bat.model.BatGuild; import cc.fascinated.bat.common.model.BatGuild;
import cc.fascinated.bat.model.BatUser; import cc.fascinated.bat.common.model.BatUser;
import lombok.NonNull; import lombok.NonNull;
import net.dv8tion.jda.api.Permission; import net.dv8tion.jda.api.Permission;
import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel; import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel;
import net.dv8tion.jda.api.interactions.commands.OptionMapping; import net.dv8tion.jda.api.interactions.commands.OptionMapping;
import net.dv8tion.jda.api.interactions.commands.OptionType; import net.dv8tion.jda.api.interactions.commands.OptionType;
@ -30,17 +31,12 @@ public class MessageSubCommand extends BatCommand {
} }
@Override @Override
public void execute(BatGuild guild, @NonNull BatUser user, @NonNull MessageChannel channel, Member member, @NonNull SlashCommandInteraction event) { public void execute(BatGuild guild, @NonNull BatUser user, @NonNull MessageChannel channel, Member member, Message commandMessage, String[] arguments, SlashCommandInteraction event) {
BirthdayProfile profile = guild.getBirthdayProfile(); BirthdayProfile profile = guild.getBirthdayProfile();
OptionMapping messageOption = event.getOption("message"); OptionMapping messageOption = event.getOption("message");
if (messageOption == null) { assert messageOption != null;
event.replyEmbeds(EmbedUtils.errorEmbed()
.setDescription("You must provide a message")
.build()).queue();
return;
}
String message = messageOption.getAsString(); String message = messageOption.getAsString();
if (message.length() > 2000) { if (message.length() > 2000) {
event.replyEmbeds(EmbedUtils.errorEmbed() event.replyEmbeds(EmbedUtils.errorEmbed()
.setDescription("The message must be less than 2000 characters") .setDescription("The message must be less than 2000 characters")

View File

@ -1,14 +1,15 @@
package cc.fascinated.bat.features.birthday.command; package cc.fascinated.bat.birthday.command;
import cc.fascinated.bat.command.BatCommand; import cc.fascinated.bat.common.oldcommand.BatCommand;
import cc.fascinated.bat.command.CommandInfo; import cc.fascinated.bat.common.oldcommand.CommandInfo;
import cc.fascinated.bat.common.EmbedUtils; import cc.fascinated.bat.common.EmbedUtils;
import cc.fascinated.bat.features.birthday.UserBirthday; import cc.fascinated.bat.birthday.UserBirthday;
import cc.fascinated.bat.features.birthday.profile.BirthdayProfile; import cc.fascinated.bat.birthday.profile.BirthdayProfile;
import cc.fascinated.bat.model.BatGuild; import cc.fascinated.bat.common.model.BatGuild;
import cc.fascinated.bat.model.BatUser; import cc.fascinated.bat.common.model.BatUser;
import lombok.NonNull; import lombok.NonNull;
import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel; import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel;
import net.dv8tion.jda.api.interactions.commands.OptionMapping; import net.dv8tion.jda.api.interactions.commands.OptionMapping;
import net.dv8tion.jda.api.interactions.commands.OptionType; import net.dv8tion.jda.api.interactions.commands.OptionType;
@ -30,17 +31,12 @@ public class PrivateSubCommand extends BatCommand {
} }
@Override @Override
public void execute(BatGuild guild, @NonNull BatUser user, @NonNull MessageChannel channel, Member member, @NonNull SlashCommandInteraction event) { public void execute(BatGuild guild, @NonNull BatUser user, @NonNull MessageChannel channel, Member member, Message commandMessage, String[] arguments, SlashCommandInteraction event) {
BirthdayProfile profile = guild.getBirthdayProfile(); BirthdayProfile profile = guild.getBirthdayProfile();
OptionMapping enabledOption = event.getOption("enabled"); OptionMapping enabledOption = event.getOption("enabled");
if (enabledOption == null) { assert enabledOption != null;
event.replyEmbeds(EmbedUtils.errorEmbed()
.setDescription("You must provide whether your birthday is private or not")
.build()).queue();
return;
}
boolean enabled = enabledOption.getAsBoolean(); boolean enabled = enabledOption.getAsBoolean();
UserBirthday birthday = profile.getBirthday(user.getId()); UserBirthday birthday = profile.getBirthday(user.getId());
if (birthday == null) { if (birthday == null) {
event.replyEmbeds(EmbedUtils.errorEmbed() event.replyEmbeds(EmbedUtils.errorEmbed()

View File

@ -1,13 +1,14 @@
package cc.fascinated.bat.features.birthday.command; package cc.fascinated.bat.birthday.command;
import cc.fascinated.bat.command.BatCommand; import cc.fascinated.bat.common.oldcommand.BatCommand;
import cc.fascinated.bat.command.CommandInfo; import cc.fascinated.bat.common.oldcommand.CommandInfo;
import cc.fascinated.bat.common.EmbedUtils; import cc.fascinated.bat.common.EmbedUtils;
import cc.fascinated.bat.features.birthday.profile.BirthdayProfile; import cc.fascinated.bat.birthday.profile.BirthdayProfile;
import cc.fascinated.bat.model.BatGuild; import cc.fascinated.bat.common.model.BatGuild;
import cc.fascinated.bat.model.BatUser; import cc.fascinated.bat.common.model.BatUser;
import lombok.NonNull; import lombok.NonNull;
import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel; import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel;
import net.dv8tion.jda.api.interactions.commands.SlashCommandInteraction; import net.dv8tion.jda.api.interactions.commands.SlashCommandInteraction;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@ -20,7 +21,7 @@ import org.springframework.stereotype.Component;
@CommandInfo(name = "remove", description = "Remove your birthday from this guild") @CommandInfo(name = "remove", description = "Remove your birthday from this guild")
public class RemoveSubCommand extends BatCommand { public class RemoveSubCommand extends BatCommand {
@Override @Override
public void execute(BatGuild guild, @NonNull BatUser user, @NonNull MessageChannel channel, Member member, @NonNull SlashCommandInteraction event) { public void execute(BatGuild guild, @NonNull BatUser user, @NonNull MessageChannel channel, Member member, Message commandMessage, String[] arguments, SlashCommandInteraction event) {
BirthdayProfile profile = guild.getBirthdayProfile(); BirthdayProfile profile = guild.getBirthdayProfile();
profile.removeBirthday(user.getId()); profile.removeBirthday(user.getId());

View File

@ -1,14 +1,15 @@
package cc.fascinated.bat.features.birthday.command; package cc.fascinated.bat.birthday.command;
import cc.fascinated.bat.command.BatCommand; import cc.fascinated.bat.common.oldcommand.BatCommand;
import cc.fascinated.bat.command.CommandInfo; import cc.fascinated.bat.common.oldcommand.CommandInfo;
import cc.fascinated.bat.common.EmbedUtils; import cc.fascinated.bat.common.EmbedUtils;
import cc.fascinated.bat.features.birthday.UserBirthday; import cc.fascinated.bat.birthday.UserBirthday;
import cc.fascinated.bat.features.birthday.profile.BirthdayProfile; import cc.fascinated.bat.birthday.profile.BirthdayProfile;
import cc.fascinated.bat.model.BatGuild; import cc.fascinated.bat.common.model.BatGuild;
import cc.fascinated.bat.model.BatUser; import cc.fascinated.bat.common.model.BatUser;
import lombok.NonNull; import lombok.NonNull;
import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel; import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel;
import net.dv8tion.jda.api.interactions.commands.OptionMapping; import net.dv8tion.jda.api.interactions.commands.OptionMapping;
import net.dv8tion.jda.api.interactions.commands.OptionType; import net.dv8tion.jda.api.interactions.commands.OptionType;
@ -36,7 +37,7 @@ public class SetSubCommand extends BatCommand {
} }
@Override @Override
public void execute(BatGuild guild, @NonNull BatUser user, @NonNull MessageChannel channel, Member member, @NonNull SlashCommandInteraction event) { public void execute(BatGuild guild, @NonNull BatUser user, @NonNull MessageChannel channel, Member member, Message commandMessage, String[] arguments, SlashCommandInteraction event) {
BirthdayProfile profile = guild.getBirthdayProfile(); BirthdayProfile profile = guild.getBirthdayProfile();
if (!profile.hasChannelSetup()) { if (!profile.hasChannelSetup()) {
event.replyEmbeds(EmbedUtils.errorEmbed() event.replyEmbeds(EmbedUtils.errorEmbed()
@ -46,13 +47,9 @@ public class SetSubCommand extends BatCommand {
} }
OptionMapping birthdayOption = event.getOption("birthday"); OptionMapping birthdayOption = event.getOption("birthday");
if (birthdayOption == null) { assert birthdayOption != null;
event.replyEmbeds(EmbedUtils.errorEmbed()
.setDescription("You must provide a birthday")
.build()).queue();
return;
}
String birthdayString = birthdayOption.getAsString(); String birthdayString = birthdayOption.getAsString();
Date birthday = parseBirthday(birthdayString); Date birthday = parseBirthday(birthdayString);
if (birthday == null) { if (birthday == null) {
event.replyEmbeds(EmbedUtils.errorEmbed() event.replyEmbeds(EmbedUtils.errorEmbed()

View File

@ -1,15 +1,16 @@
package cc.fascinated.bat.features.birthday.command; package cc.fascinated.bat.birthday.command;
import cc.fascinated.bat.command.BatCommand; import cc.fascinated.bat.common.oldcommand.BatCommand;
import cc.fascinated.bat.command.CommandInfo; import cc.fascinated.bat.common.oldcommand.CommandInfo;
import cc.fascinated.bat.common.EmbedUtils; import cc.fascinated.bat.common.EmbedUtils;
import cc.fascinated.bat.features.birthday.UserBirthday; import cc.fascinated.bat.birthday.UserBirthday;
import cc.fascinated.bat.features.birthday.profile.BirthdayProfile; import cc.fascinated.bat.birthday.profile.BirthdayProfile;
import cc.fascinated.bat.model.BatGuild; import cc.fascinated.bat.common.model.BatGuild;
import cc.fascinated.bat.model.BatUser; import cc.fascinated.bat.common.model.BatUser;
import cc.fascinated.bat.service.UserService; import cc.fascinated.bat.service.UserService;
import lombok.NonNull; import lombok.NonNull;
import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel; import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel;
import net.dv8tion.jda.api.interactions.commands.OptionMapping; import net.dv8tion.jda.api.interactions.commands.OptionMapping;
import net.dv8tion.jda.api.interactions.commands.OptionType; import net.dv8tion.jda.api.interactions.commands.OptionType;
@ -34,7 +35,7 @@ public class ViewSubCommand extends BatCommand {
} }
@Override @Override
public void execute(BatGuild guild, @NonNull BatUser user, @NonNull MessageChannel channel, Member member, @NonNull SlashCommandInteraction event) { public void execute(BatGuild guild, @NonNull BatUser user, @NonNull MessageChannel channel, Member member, Message commandMessage, String[] arguments, SlashCommandInteraction event) {
BirthdayProfile profile = guild.getBirthdayProfile(); BirthdayProfile profile = guild.getBirthdayProfile();
if (!profile.hasChannelSetup()) { if (!profile.hasChannelSetup()) {
event.replyEmbeds(EmbedUtils.errorEmbed() event.replyEmbeds(EmbedUtils.errorEmbed()

View File

@ -1,9 +1,9 @@
package cc.fascinated.bat.features.birthday.profile; package cc.fascinated.bat.birthday.profile;
import cc.fascinated.bat.common.ChannelUtils; import cc.fascinated.bat.common.ChannelUtils;
import cc.fascinated.bat.common.Serializable; import cc.fascinated.bat.common.Serializable;
import cc.fascinated.bat.features.birthday.UserBirthday; import cc.fascinated.bat.birthday.UserBirthday;
import cc.fascinated.bat.model.BatGuild; import cc.fascinated.bat.common.model.BatGuild;
import com.google.gson.Gson; import com.google.gson.Gson;
import lombok.Getter; import lombok.Getter;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;

View File

@ -1,144 +1,138 @@
package cc.fascinated.bat.command; package cc.fascinated.bat.command;
import cc.fascinated.bat.features.Feature;
import cc.fascinated.bat.model.BatGuild;
import cc.fascinated.bat.model.BatUser;
import lombok.AccessLevel;
import lombok.Getter; import lombok.Getter;
import lombok.NonNull; import lombok.NonNull;
import lombok.Setter; import lombok.Setter;
import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.hooks.ListenerAdapter;
import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel; import net.dv8tion.jda.api.interactions.commands.DefaultMemberPermissions;
import net.dv8tion.jda.api.interactions.IntegrationType; import net.dv8tion.jda.api.interactions.commands.build.Commands;
import net.dv8tion.jda.api.interactions.InteractionContextType;
import net.dv8tion.jda.api.interactions.commands.SlashCommandInteraction;
import net.dv8tion.jda.api.interactions.commands.build.OptionData; import net.dv8tion.jda.api.interactions.commands.build.OptionData;
import net.dv8tion.jda.api.interactions.commands.build.SubcommandData; import net.dv8tion.jda.api.interactions.commands.build.SlashCommandData;
import net.dv8tion.jda.internal.interactions.CommandDataImpl; import net.dv8tion.jda.api.interactions.commands.build.SubcommandGroupData;
import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.EnumSet; import java.util.List;
import java.util.HashMap;
import java.util.Map;
/** /**
* @author Braydon * @author Braydon
*/ */
@Getter @Setter@Getter
public abstract class BatCommand { public abstract class BatCommand extends ListenerAdapter implements IBatCommand {
/** /**
* The info of this command. * The snowflake of this command, if it
* was successfully registered on Discord.
*/ */
@NonNull private Long snowflake;
private final InternalCommandInfo info;
/** /**
* The feature this command belongs to. * The data for this command.
*/ */
@Setter @NonNull private final SlashCommandData commandData;
private Feature feature;
/** /**
* The snowflake of this command, set when * The category of this command.
* this command is registered with Discord.
*/ */
@Setter @NonNull private final CommandCategory category;
private long snowflake;
/** /**
* The sub commands of this command, if any. * The sub-commands for this command.
*/ */
private final Map<String, BatCommand> subCommands = Collections.synchronizedMap(new HashMap<>()); @NonNull private final List<BatSubCommand> subCommands = Collections.synchronizedList(new ArrayList<>());
/** public BatCommand(@NonNull String name, @NonNull String description, @NonNull CommandCategory category, @NonNull OptionData... options) {
* The internal data for this command. this(name, description, category, DefaultMemberPermissions.ENABLED, options);
*/ }
@Setter(AccessLevel.PRIVATE)
private CommandDataImpl commandData;
/** public BatCommand(@NonNull String name, @NonNull String description, @NonNull CommandCategory category, @NonNull DefaultMemberPermissions defaultPermissions, @NonNull OptionData... options) {
* The internal subcommand data for this command. commandData = Commands.slash(name, description)
*/ .setDefaultPermissions(defaultPermissions)
@Setter(AccessLevel.PRIVATE) .addOptions(options);
private SubcommandData subcommandData; this.category = category;
public BatCommand() {
if (!getClass().isAnnotationPresent(CommandInfo.class)) {
throw new IllegalStateException("Missing @CommandInfo annotation in " + getClass().getSimpleName());
}
info = new InternalCommandInfo(getClass().getAnnotation(CommandInfo.class));
commandData = new CommandDataImpl(info.getName(), info.getDescription())
.setIntegrationTypes(info.isUserInstall() ?
EnumSet.of(IntegrationType.USER_INSTALL) :
EnumSet.of(IntegrationType.GUILD_INSTALL)
).setContexts(info.isGuildOnly() ?
EnumSet.of(InteractionContextType.GUILD) :
EnumSet.of(InteractionContextType.GUILD, InteractionContextType.BOT_DM, InteractionContextType.PRIVATE_CHANNEL)
);
} }
/** /**
* Fired when this command is executed. * Get the name of this command.
* *
* @param guild the guild the command was executed in, if any * @return the command name
* @param user the user who executed the command
* @param channel the channel the command was executed in
* @param member the member who executed the command, null if not a guild
* @param event the event that invoked this command
*/ */
public void execute(BatGuild guild, @NonNull BatUser user, @NonNull MessageChannel channel, Member member, @NonNull SlashCommandInteraction event) { @Override @NonNull
public String getName() {
return commandData.getName();
} }
/** /**
* Register the given sub commands. * Get the full name of this command.
* *
* @param commands the commands to register * @return the full name
*/ */
protected final void addSubCommands(@NonNull BatCommand... commands) { @Override @NonNull
for (BatCommand command : commands) { public String getFullName() {
// Copy info from the parent command return getName();
if (command.getInfo().getCategory() != info.getCategory()) { }
command.getInfo().setCategory(info.getCategory());
}
if (command.getInfo().getPermissions().length == 0) {
command.getInfo().setPermissions(info.getPermissions());
}
if (command.getInfo().isGuildOnly() != info.isGuildOnly()) {
command.getInfo().setGuildOnly(info.isGuildOnly());
}
if (command.getInfo().isBotOwnerOnly() != info.isBotOwnerOnly()) {
command.getInfo().setBotOwnerOnly(info.isBotOwnerOnly());
}
command.setSubcommandData(new SubcommandData(command.getInfo().getName(), command.getInfo().getDescription())); /**
for (OptionData option : command.getCommandData().getOptions()) { * Get the description of this command.
command.getSubcommandData().addOptions(option); *
* @return the command description
*/
@Override @NonNull
public String getDescription() {
return commandData.getDescription();
}
/**
* Get the mentionable name of this command.
*
* @return the mentionable name
*/
@Override @NonNull
public final String getMentionable() {
return "</%s:%s>".formatted(getName(), getSnowflake());
}
/**
* Register a sub-command to this command.
*
* @param subCommand the sub-command to register
*/
protected final void withSubCommand(@NonNull BatSubCommand subCommand) {
subCommands.add(subCommand);
// Add the sub-command to the command data
if (subCommand.getGroupName() == null) { // No command group
getCommandData().addSubcommands(subCommand.getCommandData());
} else {
// Add to any existing command group, otherwise create a new one
for (SubcommandGroupData subCommandGroup : getCommandData().getSubcommandGroups()) {
if (subCommand.getGroupName().equals(subCommandGroup.getName())) {
subCommandGroup.addSubcommands(subCommand.getCommandData());
return;
}
} }
commandData.addSubcommands(command.getSubcommandData()); getCommandData().addSubcommandGroups(new SubcommandGroupData(
subCommands.put(command.getInfo().getName(), command); subCommand.getGroupName(),
"The " + subCommand.getGroupName() + " group for /" + getName() + " " + subCommand.getName()
).addSubcommands(subCommand.getCommandData()));
} }
} }
/** /**
* Add the given options * Get a sub-command by name.
* to this command.
* *
* @param options the options to add * @param group the sub-command group, null if none
* @param name the sub-command name
* @return the sub-command, null if not found
*/ */
protected final void addOptions(OptionData... options) { public final BatSubCommand getSubCommand(String group, @NonNull String name) {
commandData.addOptions(options); for (BatSubCommand subCommand : subCommands) {
} String commandGroup = subCommand.getGroupName();
/** // Check if groups match (both null or both equal)
* Get the sub command by its class. boolean groupsMatch = (group == null && commandGroup == null) ||
* (commandGroup != null && commandGroup.equals(group));
* @param clazz the class of the sub command if (subCommand.getName().equals(name) && groupsMatch) {
* @return the sub command return subCommand;
*/
public BatCommand getSubCommand(Class<? extends BatCommand> clazz) {
for (Map.Entry<String, BatCommand> entry : subCommands.entrySet()) {
if (entry.getValue().getClass().equals(clazz)) {
return entry.getValue();
} }
} }
return null; return null;

View File

@ -0,0 +1,82 @@
package cc.fascinated.bat.command;
import lombok.Getter;
import lombok.NonNull;
import lombok.Setter;
import net.dv8tion.jda.api.interactions.commands.build.OptionData;
import net.dv8tion.jda.api.interactions.commands.build.SubcommandData;
/**
* A sub-command for a {@link BatCommand}.
*
* @author Braydon
*/
@Setter @Getter
public abstract class BatSubCommand implements IBatCommand {
/**
* The parent of this sub-command.
*/
@NonNull private final BatCommand parent;
/**
* The snowflake of this sub=command, if it
* was successfully registered on Discord.
*/
private Long snowflake;
/**
* The full name of this command, including the
* parent name, category, and sub-command name.
*/
private String fullName;
/**
* The optional group name for this sub-command.
*/
private final String groupName;
/**
* The data for this sub-command.
*/
@NonNull private final SubcommandData commandData;
public BatSubCommand(@NonNull BatCommand parent, @NonNull String name, @NonNull String description, @NonNull OptionData... options) {
this(parent, null, name, description, options);
}
public BatSubCommand(@NonNull BatCommand parent, String groupName, @NonNull String name, @NonNull String description, @NonNull OptionData... options) {
this.parent = parent;
this.groupName = groupName;
commandData = new SubcommandData(name, description).addOptions(options);
}
/**
* Get the name of this command.
*
* @return the command name
*/
@Override @NonNull
public String getName() {
return commandData.getName();
}
/**
* Get the description of this command.
*
* @return the command description
*/
@Override @NonNull
public String getDescription() {
return commandData.getDescription();
}
/**
* Get the mentionable name of this command.
*
* @return the mentionable name
*/
@Override @NonNull
public final String getMentionable() {
return "</%s:%s>".formatted(getFullName(), getSnowflake());
}
}

View File

@ -0,0 +1,25 @@
package cc.fascinated.bat.command;
import lombok.Getter;
import lombok.NonNull;
import net.dv8tion.jda.api.entities.emoji.Emoji;
/**
* The categories of {@link BatCommand}'s.
*
* @author Braydon
*/
@Getter
public enum CommandCategory {
GENERAL("⚙️"),
GUILD("🏠");
/**
* The emoji for this category.
*/
@NonNull private final Emoji emoji;
CommandCategory(@NonNull String unicode) {
emoji = Emoji.fromUnicode(unicode);
}
}

View File

@ -0,0 +1,97 @@
package cc.fascinated.bat.command;
import cc.fascinated.bat.common.EnumUtils;
import cc.fascinated.bat.common.InteractionResponder;
import cc.fascinated.bat.common.model.BatGuild;
import lombok.NonNull;
import net.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.events.interaction.command.CommandAutoCompleteInteractionEvent;
import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
import net.dv8tion.jda.api.interactions.commands.Command;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
/**
* A base Rufus command.
*
* @author Braydon
*/
public interface IBatCommand {
/**
* Get the name of this command.
*
* @return the command name
*/
@NonNull String getName();
/**
* Get the full name of this command.
*
* @return the full name
*/
@NonNull String getFullName();
/**
* Get the description of this command.
*
* @return the command description
*/
@NonNull String getDescription();
/**
* Get the mentionable name of this command.
*
* @return the mentionable name
*/
@NonNull String getMentionable();
/**
* Fired when this command is executed.
* <p>
* If this command has {@link BatSubCommand}'s, this
* will not be invoked for the parent, and instead only
* for the sub-commands.
* </p>
*
* @param guild the ticket guild that executed this command
* @param discordGuild the Discord guild that executed this command
* @param member the member that executed this command
* @param responder the responder to the interaction
* @param event the event that triggered this command
*/
default void execute(@NonNull BatGuild guild, @NonNull Guild discordGuild, @NonNull Member member, @NonNull InteractionResponder responder, @NonNull SlashCommandInteractionEvent event) {
event.deferReply().queue(); // Thinking by default
}
/**
* Auto complete this command.
*
* @param guild the ticket guild that executed this command
* @param discordGuild the Discord guild that executed this command
* @param member the member that executed this command
* @param event the event that triggered this auto completion
* @return the choices to auto complete
*/
@NonNull
default List<Command.Choice> autoComplete(@NonNull BatGuild guild, @NonNull Guild discordGuild, @NonNull Member member, @NonNull CommandAutoCompleteInteractionEvent event) {
return List.of();
}
/**
* Get the choices for an enum.
*
* @param enumClass the enum class to get the choices for
* @return the enum choices
* @param <T> the enum type
*/
@NonNull
default <T extends Enum<T>> List<Command.Choice> getEnumChoices(@NonNull Class<T> enumClass) {
return Arrays.stream(enumClass.getEnumConstants())
.map(constant -> new Command.Choice(EnumUtils.getEnumName(constant), constant.name()))
.collect(Collectors.toList());
}
}

View File

@ -0,0 +1,16 @@
package cc.fascinated.bat.command.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* Commands annotated with this will only
* be executable by the bot owner.
*
* @author Braydon
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface BotOwner { }

View File

@ -0,0 +1,16 @@
package cc.fascinated.bat.command.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* Commands annotated with this will send
* "thinking..." message when executed.
*
* @author Braydon
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Thinking {}

View File

@ -0,0 +1,186 @@
package cc.fascinated.bat.command.command;
import cc.fascinated.bat.common.BatEmoji;
import cc.fascinated.bat.common.Colors;
import cc.fascinated.bat.common.InteractionResponder;
import cc.fascinated.bat.common.MiscUtils;
import cc.fascinated.bat.common.model.BatGuild;
import cc.fascinated.bat.service.CommandService;
import cc.fascinated.bat.service.DiscordService;
import jakarta.annotation.Nonnull;
import lombok.NonNull;
import cc.fascinated.bat.command.CommandCategory;
import cc.fascinated.bat.command.IBatCommand;
import cc.fascinated.bat.command.BatCommand;
import cc.fascinated.bat.command.BatSubCommand;
import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.MessageEmbed;
import net.dv8tion.jda.api.entities.emoji.Emoji;
import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
import net.dv8tion.jda.api.events.interaction.component.ButtonInteractionEvent;
import net.dv8tion.jda.api.events.interaction.component.StringSelectInteractionEvent;
import net.dv8tion.jda.api.interactions.components.ActionRow;
import net.dv8tion.jda.api.interactions.components.LayoutComponent;
import net.dv8tion.jda.api.interactions.components.buttons.Button;
import net.dv8tion.jda.api.interactions.components.selections.StringSelectMenu;
import org.jetbrains.annotations.NotNull;
import org.springframework.boot.info.BuildProperties;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
/**
* @author Braydon
*/
public final class HelpCommand extends BatCommand {
private static final String CATEGORY_DROPDOWN_ID = "select-category";
private static final String MAIN_MENU_BUTTON_ID = "main-help-menu";
/**
* The command service to use for the registry.
*/
@NonNull private final CommandService commandService;
/**
* The build properties for this app, null if not available.
*/
private final BuildProperties buildProperties;
public HelpCommand(@NonNull CommandService commandService, BuildProperties buildProperties) {
super("helpbob", "View the commands for Rufus", CommandCategory.GENERAL);
this.commandService = commandService;
this.buildProperties = buildProperties;
}
/**
* Fired when this command is executed.
* <p>
* If this command has {@link BatSubCommand}'s, this
* will not be invoked for the parent, and instead only
* for the sub-commands.
* </p>
*
* @param guild the ticket guild that executed this command
* @param discordGuild the Discord guild that executed this command
* @param member the member that executed this command
* @param responder the responder to the interaction
* @param event the event that triggered this command
*/
@Override
public void execute(@NonNull BatGuild guild, @NonNull Guild discordGuild, @NonNull Member member, @NonNull InteractionResponder responder, @NonNull SlashCommandInteractionEvent event) {
responder.reply(true, buildMainMenu(member, discordGuild), buildMainMenuComponents(discordGuild).toArray(new LayoutComponent[0])).queue();
}
@Override
public void onStringSelectInteraction(@NotNull StringSelectInteractionEvent event) {
// Switch to the selected category
if (event.getComponentId().equals(CATEGORY_DROPDOWN_ID)) {
event.editMessageEmbeds(buildCategoryEmbed(Objects.requireNonNull(event.getMember()), CommandCategory.valueOf(event.getSelectedOptions().getFirst().getValue())))
.setComponents(
ActionRow.of(buildCategoryMenu()),
ActionRow.of(Button.primary(MAIN_MENU_BUTTON_ID, "Main Menu").withEmoji(Emoji.fromUnicode("🏠")))
).queue();
}
}
@Override
public void onButtonInteraction(@NotNull ButtonInteractionEvent event) {
// Switch to the main menu
if (event.getComponentId().equals(MAIN_MENU_BUTTON_ID)) {
event.editMessageEmbeds(buildMainMenu(Objects.requireNonNull(event.getMember()),
Objects.requireNonNull(event.getGuild()))).setComponents(buildMainMenuComponents(event.getGuild())).queue();
}
}
/**
* Build the embed for the main menu.
*
* @param member the member to build for
* @param discordGuild the discord guild
* @return the main menu
*/
@NonNull
private MessageEmbed buildMainMenu(@NonNull Member member, @NonNull Guild discordGuild) {
String categoryNames = Arrays.stream(CommandCategory.values())
.map(category -> "- **%s Commands**: `%s`".formatted(MiscUtils.capitalize(category.name()), commandService.getCommands(member, category).size()))
.collect(Collectors.joining("\n"));
// Send the help menu
return new EmbedBuilder()
.setColor(Colors.DEFAULT)
.setTitle(BatEmoji.RUFUS + " Rufus Help Menu")
.setDescription(MiscUtils.arrayToString(
"Rufus is a smart and efficient Discord bot that streamlines ticket management for your server. With a focus on simplicity and responsiveness, Rufus helps your staff team handle support requests, bug reports, and general inquiries with ease.",
"",
"Here are my commands:",
categoryNames,
"",
"To get a list of commands for an individual category, select it from the dropdown below. Interested and wanna use me in your server? [Invite Me](" + MiscUtils.getInviteUrl(discordGuild.getJDA()) + ")!"
)).setFooter("Rufus v%s".formatted(buildProperties == null ? "0" : buildProperties.getVersion())).build();
}
/**
* Build the components for the main menu.
*
* @param guild the guild to use for the JDA instance
* @return the components
*/
@NonNull
private List<LayoutComponent> buildMainMenuComponents(@NonNull Guild guild) {
return Arrays.asList(
ActionRow.of(buildCategoryMenu()),
ActionRow.of(
Button.link("https://rufus.rainnny.club", "Support Server").withEmoji(Emoji.fromUnicode("🏠")),
Button.link(MiscUtils.getInviteUrl(guild.getJDA()), "Invite Me").withEmoji(Emoji.fromUnicode("🤖"))
)
);
}
/**
* Build the dropdown menu for categories.
*
* @return the category dropdown menu
*/
@NonNull
private StringSelectMenu buildCategoryMenu() {
StringSelectMenu.Builder categoryDropdown = StringSelectMenu.create(CATEGORY_DROPDOWN_ID).setPlaceholder("👉🏼 Select a category...");
for (CommandCategory category : CommandCategory.values()) {
categoryDropdown.addOption(MiscUtils.capitalize(category.name()) + " Commands", category.name(), category.getEmoji());
}
return categoryDropdown.build();
}
/**
* Build the embed for the category menu.
*
* @param member the member to build for
* @param category the category to build for
* @return the category menu
*/
@NonNull
private MessageEmbed buildCategoryEmbed(@NonNull Member member, @NonNull CommandCategory category) {
// Build the command list
StringBuilder commands = new StringBuilder();
for (IBatCommand command : commandService.getCommands(member, category)) {
// Skip parents that have sub-commands
if (command instanceof BatCommand parentCommand && !parentCommand.getSubCommands().isEmpty()) {
continue;
}
commands.append("- ").append(command.getMentionable()).append(" - ").append(command.getDescription()).append("\n");
}
// Build the embed
return new EmbedBuilder()
.setColor(Colors.DEFAULT)
.setTitle(category.getEmoji().getFormatted() + " " + MiscUtils.capitalize(category.name()) + " Commands")
.setDescription(MiscUtils.arrayToString(
"Here are the commands for the " + MiscUtils.capitalize(category.name()) + " category:",
"",
commands.toString()
)).setFooter("Rufus v%s".formatted(buildProperties == null ? "0" : buildProperties.getVersion())).build();
}
}

View File

@ -0,0 +1,44 @@
package cc.fascinated.bat.common;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
/**
* Emojis used by Rufus.
*
* @author Braydon
*/
@AllArgsConstructor @RequiredArgsConstructor @Getter
public enum BatEmoji {
RUFUS("rufus", "1319317309608689674"),
LOADING("loading", "1319483685787013212", true),
SUCCESS("success", "1319483459781132410"),
CROSS("cross", "1319483437928677446");
/**
* The name of this emoji.
*/
@NonNull private final String name;
/**
* The ID of this emoji.
*/
@NonNull private final String id;
/**
* Whether this emoji is animated.
*/
private boolean animated;
/**
* Get the formatted emoji.
*
* @return the formatted emoji
*/
@Override @NonNull
public String toString() {
return (animated ? "<a:" : "<:") + name + ":" + id + ">";
}
}

View File

@ -3,12 +3,18 @@ package cc.fascinated.bat.common;
import lombok.experimental.UtilityClass; import lombok.experimental.UtilityClass;
import java.time.Instant; import java.time.Instant;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.Date; import java.util.Date;
import java.util.Locale;
@UtilityClass @UtilityClass
public class DateUtils { public class DateUtils {
private static final ZoneId ZONE_ID = ZoneId.of("Europe/London");
private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ISO_INSTANT; private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ISO_INSTANT;
private static final DateTimeFormatter SIMPLE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss z")
.withLocale(Locale.UK)
.withZone(ZONE_ID);
/** /**
* Gets the date from a string. * Gets the date from a string.
@ -19,4 +25,14 @@ public class DateUtils {
public static Date getDateFromString(String date) { public static Date getDateFromString(String date) {
return Date.from(Instant.from(FORMATTER.parse(date))); return Date.from(Instant.from(FORMATTER.parse(date)));
} }
/**
* Formats a date to a string.
*
* @param date The date to format.
* @return The formatted date.
*/
public String formatDate(Date date) {
return SIMPLE_FORMATTER.format(date.toInstant());
}
} }

View File

@ -5,13 +5,13 @@ import lombok.NonNull;
/** /**
* @author Fascinated (fascinated7) * @author Fascinated (fascinated7)
*/ */
public class EmbedDescriptionBuilder { public class DescriptionBuilder {
/** /**
* Where the description is stored * Where the description is stored
*/ */
private final StringBuilder builder = new StringBuilder(); private final StringBuilder builder = new StringBuilder();
public EmbedDescriptionBuilder(String title) { public DescriptionBuilder(String title) {
if (title == null) { if (title == null) {
return; return;
} }
@ -19,19 +19,19 @@ public class EmbedDescriptionBuilder {
} }
@NonNull @NonNull
public EmbedDescriptionBuilder appendLine(@NonNull String line, boolean arrow) { public DescriptionBuilder appendLine(@NonNull String line, boolean arrow) {
builder.append(arrow ? "" : "").append(line).append("\n"); builder.append(arrow ? "" : "").append(line).append("\n");
return this; return this;
} }
@NonNull @NonNull
public EmbedDescriptionBuilder appendSubtitle(@NonNull String title) { public DescriptionBuilder appendSubtitle(@NonNull String title) {
builder.append("**").append(title).append("**").append("\n"); builder.append("**").append(title).append("**").append("\n");
return this; return this;
} }
@NonNull @NonNull
public EmbedDescriptionBuilder emptyLine() { public DescriptionBuilder emptyLine() {
builder.append("\n"); builder.append("\n");
return this; return this;
} }

View File

@ -0,0 +1,105 @@
package cc.fascinated.bat.common;
import cc.fascinated.bat.service.InteractionService;
import lombok.Getter;
import net.dv8tion.jda.api.entities.emoji.Emoji;
import net.dv8tion.jda.api.events.interaction.component.ButtonInteractionEvent;
import net.dv8tion.jda.api.events.interaction.component.StringSelectInteractionEvent;
import net.dv8tion.jda.api.interactions.components.ActionRow;
import net.dv8tion.jda.api.interactions.components.buttons.Button;
import net.dv8tion.jda.api.interactions.components.selections.SelectOption;
import net.dv8tion.jda.api.interactions.components.selections.StringSelectMenu;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Consumer;
/**
* @author Fascinated (fascinated7)
*/
@Getter
public class InteractionBuilder {
/**
* The button interactions
*/
private final Map<Button, Consumer<ButtonInteractionEvent>> buttonInteractions = new HashMap<>();
/**
* The select menu interactions
*/
private final Map<SelectOption, Consumer<StringSelectInteractionEvent>> selectMenuInteractions = new HashMap<>();
/**
* The select menu id
*/
private String selectMenuId;
public InteractionBuilder() {
InteractionService.INSTANCE.addInteractionBuilder(this);
}
/**
* Adds a button to the interaction builder
*
* @param display The display of the button
* @param onClick The consumer to run when the button is clicked
* @return - The interaction builder
*/
public InteractionBuilder addButton(String display, Consumer<ButtonInteractionEvent> onClick) {
String id = StringUtils.randomString(8);
this.buttonInteractions.put(Button.primary(id, display), onClick);
return this;
}
/**
* Adds a URL button to the interaction builder
*
* @param display The display of the button
* @param url The url to open when the button is clicked
* @return - The interaction builder
*/
public InteractionBuilder addUrlButton(String display, String url, Emoji emoji) {
this.buttonInteractions.put(Button.link(url, display).withEmoji(emoji), event -> {});
return this;
}
/**
* Adds a string selection to the interaction builder
*
* @param display the name of the selection
* @param description the description of the selection
* @param emoji the emoji of the selection
* @param onClick the consumer to run when the selection is clicked
* @return the interaction builder
*/
public InteractionBuilder addStringSelect(String display, String description, Emoji emoji, Consumer<StringSelectInteractionEvent> onClick) {
String id = StringUtils.randomString(8);
this.selectMenuInteractions.put(SelectOption.of(display, id).withDescription(description).withEmoji(emoji), onClick);
return this;
}
/**
* Builds the interactions into an action row
*
* @return The action row
*/
public List<ActionRow> build() {
List<ActionRow> components = new ArrayList<>();
if (!this.getButtonInteractions().isEmpty()) {
List<Button> buttons = new ArrayList<>(this.getButtonInteractions().keySet());
components.add(ActionRow.of(buttons));
}
if (!this.getSelectMenuInteractions().isEmpty()) {
List<SelectOption> options = new ArrayList<>(this.getSelectMenuInteractions().keySet());
String id = StringUtils.randomString(8);
this.selectMenuId = id;
components.add(ActionRow.of(StringSelectMenu.create(id)
.addOptions(options)
.build()));
}
return components;
}
}

View File

@ -0,0 +1,294 @@
package cc.fascinated.bat.common;
import cc.fascinated.bat.Consts;
import lombok.AllArgsConstructor;
import lombok.NonNull;
import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.MessageEmbed;
import net.dv8tion.jda.api.interactions.InteractionHook;
import net.dv8tion.jda.api.interactions.callbacks.IReplyCallback;
import net.dv8tion.jda.api.interactions.components.LayoutComponent;
import net.dv8tion.jda.api.requests.RestAction;
import net.dv8tion.jda.api.requests.restaction.WebhookMessageCreateAction;
import net.dv8tion.jda.api.requests.restaction.interactions.ReplyCallbackAction;
import java.awt.*;
/**
* A simple utility class to make
* responding to interactions easier.
*
* @author Braydon
*/
@AllArgsConstructor
public final class InteractionResponder {
/**
* The interaction event to respond to.
*/
@NonNull private final IReplyCallback event;
/**
* Respond to the interaction with a generic embed.
*
* @param content the content to respond with
* @param args the optional arguments to format the content with
* @return the reply action
*/
@NonNull
public RestAction<Message> replyGenericEmbed(@NonNull String content, Object... args) {
return replyGenericEmbed(content, args, (LayoutComponent[]) null);
}
/**
* Respond to the interaction with a generic embed.
*
* @param content the content to respond with
* @param args the optional arguments to format the content with
* @param components the optional components to add to the message
* @return the reply action
*/
@NonNull
public RestAction<Message> replyGenericEmbed(@NonNull String content, Object[] args, LayoutComponent... components) {
return replyGenericEmbed(false, content, args, components);
}
/**
* Respond to the interaction with a generic embed.
*
* @param ephemeral whether the message should be ephemeral
* @param content the content to respond with
* @param args the optional arguments to format the content with
* @return the reply action
*/
@NonNull
public RestAction<Message> replyGenericEmbed(boolean ephemeral, @NonNull String content, Object... args) {
return replyGenericEmbed(ephemeral, content, args, (LayoutComponent[]) null);
}
/**
* Respond to the interaction with a generic embed.
*
* @param ephemeral whether the message should be ephemeral
* @param content the content to respond with
* @param components the optional components to add to the message
* @return the reply action
*/
@NonNull
public RestAction<Message> replyGenericEmbed(boolean ephemeral, @NonNull String content, LayoutComponent... components) {
return replyGenericEmbed(ephemeral, content, null, components);
}
/**
* Respond to the interaction with a generic embed.
*
* @param ephemeral whether the message should be ephemeral
* @param content the content to respond with
* @param args the optional arguments to format the content with
* @param components the optional components to add to the message
* @return the reply action
*/
@NonNull
public RestAction<Message> replyGenericEmbed(boolean ephemeral, @NonNull String content, Object[] args, LayoutComponent... components) {
content = format(content, args);
return reply(ephemeral, buildGenericEmbed(content, args), components);
}
/**
* Build a generic embed.
*
* @param content the content to respond with
* @param args the optional arguments to format the content with
* @return the embed
*/
@NonNull
public MessageEmbed buildGenericEmbed(@NonNull String content, Object... args) {
content = format(content, args);
return new EmbedBuilder()
.setColor(Colors.DEFAULT)
.setDescription(format(content, args))
.build();
}
/**
* Respond to the interaction with a success embed.
*
* @param content the content to respond with
* @param args the optional arguments to format the content with
* @return the reply action
*/
@NonNull
public RestAction<Message> replySuccess(@NonNull String content, Object... args) {
return replySuccess(false, content, args);
}
/**
* Respond to the interaction with a success embed.
*
* @param content the content to respond with
* @param args the optional arguments to format the content with
* @param components the optional components to add to the message
* @return the reply action
*/
@NonNull
public RestAction<Message> replySuccess(@NonNull String content, Object[] args, LayoutComponent... components) {
return replySuccess(false, content, args, components);
}
/**
* Respond to the interaction with a success embed.
*
* @param ephemeral whether the message should be ephemeral
* @param content the content to respond with
* @param args the optional arguments to format the content with
* @return the reply action
*/
@NonNull
public RestAction<Message> replySuccess(boolean ephemeral, @NonNull String content, Object... args) {
return replySuccess(ephemeral, content, args, (LayoutComponent[]) null);
}
/**
* Respond to the interaction with a success embed.
*
* @param ephemeral whether the message should be ephemeral
* @param content the content to respond with
* @param args the optional arguments to format the content with
* @param components the optional components to add to the message
* @return the reply action
*/
@NonNull
public RestAction<Message> replySuccess(boolean ephemeral, @NonNull String content, Object[] args, LayoutComponent... components) {
content = format(content, args);
return reply(ephemeral, new EmbedBuilder()
.setColor(Color.GREEN)
.setDescription(BatEmoji.SUCCESS + " " + content)
.build(), components);
}
/**
* Respond to the interaction with an error embed.
*
* @param error the error to respond with
* @param args the optional arguments to format the error with
* @return the reply action
*/
@NonNull
public RestAction<Message> replyError(@NonNull String error, Object... args) {
return replyError(false, error, args);
}
/**
* Respond to the interaction with an error embed.
*
* @param ephemeral whether the message should be ephemeral
* @param error the error to respond with
* @param args the optional arguments to format the error with
* @return the reply action
*/
@NonNull
public RestAction<Message> replyError(boolean ephemeral, @NonNull String error, Object... args) {
error = format(error, args);
return reply(ephemeral, new EmbedBuilder()
.setColor(Color.RED)
.setDescription(BatEmoji.CROSS + " " + error)
.build());
}
/**
* Respond to the interaction with an embed.
*
* @param embed the embed to respond with
* @return the reply action
*/
@NonNull
public RestAction<Message> reply(@NonNull MessageEmbed embed) {
return reply(false, embed);
}
/**
* Respond to the interaction with an embed.
*
* @param embed the embed to respond with
* @param components the optional components to add to the message
* @return the reply action
*/
@NonNull
public RestAction<Message> reply(@NonNull MessageEmbed embed, LayoutComponent... components) {
return reply(false, embed, components);
}
/**
* Respond to the interaction with an embed.
*
* @param ephemeral whether the message should be ephemeral
* @param embed the embed to respond with
* @return the reply action
*/
@NonNull
public RestAction<Message> reply(boolean ephemeral, @NonNull MessageEmbed embed) {
return reply(ephemeral, embed, (LayoutComponent[]) null);
}
/**
* Respond to the interaction with an embed.
*
* @param ephemeral whether the message should be ephemeral
* @param embed the embed to respond with
* @param components the optional components to add to the message
* @return the reply action
*/
@NonNull
public RestAction<Message> reply(boolean ephemeral, @NonNull MessageEmbed embed, LayoutComponent... components) {
boolean hasComponents = components != null && (components.length > 0);
if (event.isAcknowledged()) {
WebhookMessageCreateAction<Message> action = event.getHook()
.setEphemeral(ephemeral)
.sendMessageEmbeds(embed);
return hasComponents ? action.setComponents(components) : action;
}
ReplyCallbackAction action = event.replyEmbeds(embed).setEphemeral(ephemeral);
return (hasComponents ? action.setComponents(components) : action).flatMap(InteractionHook::retrieveOriginal);
}
/**
* Respond to the interaction with a message.
*
* @param content the message to respond with
* @param args the optional arguments to format the message with
* @return the reply action
*/
@NonNull
public RestAction<Message> reply(@NonNull String content, Object... args) {
return reply(false, content, args);
}
/**
* Respond to the interaction with a message.
*
* @param ephemeral whether the message should be ephemeral
* @param content the message to respond with
* @param args the optional arguments to format the message with
* @return the reply action
*/
@NonNull
public RestAction<Message> reply(boolean ephemeral, @NonNull String content, Object... args) {
content = format(content, args);
if (event.isAcknowledged()) {
return event.getHook().setEphemeral(ephemeral).sendMessage(content);
}
return event.reply(content).setEphemeral(ephemeral).flatMap(InteractionHook::retrieveOriginal);
}
/**
* Format the given content with the given arguments.
*
* @param content the content to format
* @param args the arguments to format with
* @return the formatted content
*/
@NonNull
private String format(@NonNull String content, Object... args) {
return args != null && (args.length > 0) ? content.formatted(args) : content;
}
}

View File

@ -1,7 +1,7 @@
package cc.fascinated.bat.common; package cc.fascinated.bat.common;
import cc.fascinated.bat.model.BatGuild; import cc.fascinated.bat.common.model.BatGuild;
import cc.fascinated.bat.model.BatUser; import cc.fascinated.bat.common.model.BatUser;
import lombok.experimental.UtilityClass; import lombok.experimental.UtilityClass;
import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.Role; import net.dv8tion.jda.api.entities.Role;

View File

@ -0,0 +1,96 @@
package cc.fascinated.bat.common;
import lombok.NonNull;
import lombok.experimental.UtilityClass;
import net.dv8tion.jda.api.JDA;
import java.util.Arrays;
import java.util.Objects;
import java.util.stream.Collectors;
@UtilityClass
public final class MiscUtils {
/**
* Get the invite url for the bot.
*
* @param jda the JDA instance
* @return the invite url
*/
@NonNull
public static String getInviteUrl(@NonNull JDA jda) {
return "https://discord.com/oauth2/authorize?client_id=" + jda.getSelfUser().getId();
}
/**
* Convert an array of strings to a single string.
*
* @param lines the lines to convert
* @return the string
*/
@NonNull
public static String arrayToString(String... lines) {
return Arrays.stream(lines)
.filter(Objects::nonNull)
.collect(Collectors.joining("\n"));
}
/**
* Capitalize the first letter of
* every word in the given string.
*
* @param input the input to capitalize
* @return the capitalized string
*/
@NonNull
public static String capitalize(@NonNull String input) {
input = input.toLowerCase().replace('_', ' ');
StringBuilder result = new StringBuilder();
boolean capitalizeNext = true;
for (char character : input.toCharArray()) {
if (Character.isSpaceChar(character)) {
capitalizeNext = true;
result.append(character);
} else if (capitalizeNext) {
result.append(Character.toUpperCase(character));
capitalizeNext = false;
} else {
result.append(character);
}
}
return result.toString();
}
/**
* Get the enum constant with the given
* name from the given enum class.
*
* @param enumClass the enum class
* @param enumName the enum name
* @param <T> the enum type
* @return the enum constant, null if not found
*/
public static <T extends Enum<T>> T getEnum(@NonNull Class<T> enumClass, String enumName) {
return getEnum(enumClass, enumName, null);
}
/**
* Get the enum constant with the given
* name from the given enum class.
*
* @param enumClass the enum class
* @param enumName the enum name
* @param defaultValue the default value
* @param <T> the enum type
* @return the enum constant, default value if not found
*/
public static <T extends Enum<T>> T getEnum(@NonNull Class<T> enumClass, String enumName, T defaultValue) {
if (enumName == null) {
return defaultValue;
}
try {
return Enum.valueOf(enumClass, enumName);
} catch (IllegalArgumentException ex) {
return defaultValue;
}
}
}

View File

@ -1,7 +1,7 @@
package cc.fascinated.bat.common; package cc.fascinated.bat.common;
import cc.fascinated.bat.BatApplication; import cc.fascinated.bat.BatApplication;
import cc.fascinated.bat.model.token.paste.PasteUploadToken; import cc.fascinated.bat.common.model.token.paste.PasteUploadToken;
import lombok.SneakyThrows; import lombok.SneakyThrows;
import lombok.experimental.UtilityClass; import lombok.experimental.UtilityClass;
import lombok.extern.log4j.Log4j2; import lombok.extern.log4j.Log4j2;
@ -18,7 +18,7 @@ import java.net.http.HttpResponse;
@Log4j2(topic = "PasteUtils") @Log4j2(topic = "PasteUtils")
public class PasteUtils { public class PasteUtils {
private static final String PASTE_URL = "https://paste.fascinated.cc/"; private static final String PASTE_URL = "https://paste.fascinated.cc/";
private static final String PASTE_UPLOAD_URL = PASTE_URL + "api/upload"; private static final String PASTE_UPLOAD_URL = PASTE_URL + "api/upload?expires=" + 60 * 60 * 24 * 30; // 30 days
private static final HttpClient httpClient = HttpClient.newHttpClient(); private static final HttpClient httpClient = HttpClient.newHttpClient();
/** /**

View File

@ -1,6 +1,6 @@
package cc.fascinated.bat.common; package cc.fascinated.bat.common;
import cc.fascinated.bat.model.BatGuild; import cc.fascinated.bat.common.model.BatGuild;
import lombok.experimental.UtilityClass; import lombok.experimental.UtilityClass;
import net.dv8tion.jda.api.Permission; import net.dv8tion.jda.api.Permission;
import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.Member;
@ -26,6 +26,17 @@ public class RoleUtils {
return member.getRoles().stream().anyMatch(r -> r.getPosition() > role.getPosition()); return member.getRoles().stream().anyMatch(r -> r.getPosition() > role.getPosition());
} }
/**
* Checks if a member has a higher role than the specified role
*
* @param member the member to check
* @param targetMember the member to check against
* @return if the member has a higher role
*/
public static boolean hasHigherRole(Member member, Member targetMember) {
return member.getRoles().stream().anyMatch(r -> targetMember.getRoles().stream().anyMatch(tr -> tr.getPosition() < r.getPosition()));
}
/** /**
* Gets the formatted permissions of a role * Gets the formatted permissions of a role
* *

View File

@ -1,71 +0,0 @@
package cc.fascinated.bat.common;
import cc.fascinated.bat.model.BatUser;
import cc.fascinated.bat.service.SpotifyService;
import lombok.NonNull;
import lombok.experimental.UtilityClass;
import lombok.extern.log4j.Log4j2;
import se.michaelthelin.spotify.model_objects.miscellaneous.CurrentlyPlaying;
import se.michaelthelin.spotify.model_objects.specification.Track;
/**
* @author Fascinated (fascinated7)
*/
@UtilityClass
@Log4j2(topic = "Spotify Utils")
public class SpotifyUtils {
/**
* Gets the URL of the track that is currently playing.
*
* @param currentlyPlaying The currently playing object.
* @return The URL of the track that is currently playing.
*/
public static String getTrackUrl(CurrentlyPlaying currentlyPlaying) {
return "https://open.spotify.com/track/" + currentlyPlaying.getItem().getId();
}
/**
* Gets the formatted time of the currently playing track
*
* @param currentlyPlaying the currently playing track
* @return the formatted time
*/
public static String getFormattedTime(@NonNull CurrentlyPlaying currentlyPlaying) {
Track track = (Track) currentlyPlaying.getItem();
int currentMinutes = currentlyPlaying.getProgress_ms() / 1000 / 60;
int currentSeconds = currentlyPlaying.getProgress_ms() / 1000 % 60;
int totalMinutes = track.getDurationMs() / 1000 / 60;
int totalSeconds = track.getDurationMs() / 1000 % 60;
return "`%02d:%02d`/`%02d:%02d`".formatted(currentMinutes, currentSeconds, totalMinutes, totalSeconds);
}
/**
* Get the next track that is playing
*
* @param user The user to get the track for
* @param oldName The name of the old track
* @return The new track
*/
public static CurrentlyPlaying getNewTrack(@NonNull SpotifyService spotifyService, @NonNull BatUser user, @NonNull String oldName) {
int checks = 0;
try {
Thread.sleep(150);
while (checks < 10) {
CurrentlyPlaying currentlyPlaying = spotifyService.getCurrentlyPlayingTrack(user);
Track track = (Track) currentlyPlaying.getItem();
if (track.getName().equals(oldName)) {
Thread.sleep(250);
checks++;
} else {
log.info("Found new track \"{}\" in {} check{}", track.getName(), checks, checks == 1 ? "" : "s");
return currentlyPlaying;
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
}

View File

@ -1,22 +0,0 @@
package cc.fascinated.bat.common.beatsaber.leaderboard;
import lombok.AllArgsConstructor;
import lombok.Getter;
@AllArgsConstructor @Getter
public class Leaderboard {
/**
* The name of the leaderboard.
*/
private final String name;
/**
* The version of the leaderboard.
*/
private int curveVersion;
/**
* The curve of the leaderboard.
*/
private final LeaderboardCurvePoint[] curve;
}

View File

@ -1,10 +0,0 @@
package cc.fascinated.bat.common.beatsaber.leaderboard;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter @AllArgsConstructor
public class LeaderboardCurvePoint {
private final double a;
private final double b;
}

View File

@ -1,167 +0,0 @@
package cc.fascinated.bat.common.beatsaber.leaderboard.impl;
import cc.fascinated.bat.common.MathUtils;
import cc.fascinated.bat.common.beatsaber.leaderboard.Leaderboard;
import cc.fascinated.bat.common.beatsaber.leaderboard.LeaderboardCurvePoint;
import cc.fascinated.bat.model.token.beatsaber.scoresaber.ScoreSaberScoreToken;
import lombok.extern.log4j.Log4j2;
import java.util.ArrayList;
import java.util.List;
@Log4j2(topic = "ScoreSaber Leaderboard")
public class ScoreSaberLeaderboard extends Leaderboard {
public static final ScoreSaberLeaderboard INSTANCE = new ScoreSaberLeaderboard();
/**
* The base multiplier for stars.
*/
private final double starMultiplier = 42.11;
/**
* no idea, ngl
*/
private final double weightCoefficient = 0.965;
public ScoreSaberLeaderboard() {
super("ScoreSaber", 1, new LeaderboardCurvePoint[] {
new LeaderboardCurvePoint(1.0, 5.367394282890631),
new LeaderboardCurvePoint(0.9995, 5.019543595874787),
new LeaderboardCurvePoint(0.999, 4.715470646416203),
new LeaderboardCurvePoint(0.99825, 4.325027383589547),
new LeaderboardCurvePoint(0.9975, 3.996793606763322),
new LeaderboardCurvePoint(0.99625, 3.5526145337555373),
new LeaderboardCurvePoint(0.995, 3.2022017597337955),
new LeaderboardCurvePoint(0.99375, 2.9190155639254955),
new LeaderboardCurvePoint(0.9925, 2.685667856592722),
new LeaderboardCurvePoint(0.99125, 2.4902905794106913),
new LeaderboardCurvePoint(0.99, 2.324506282149922),
new LeaderboardCurvePoint(0.9875, 2.058947159052738),
new LeaderboardCurvePoint(0.985, 1.8563887693647105),
new LeaderboardCurvePoint(0.9825, 1.697536248647543),
new LeaderboardCurvePoint(0.98, 1.5702410055532239),
new LeaderboardCurvePoint(0.9775, 1.4664726399289512),
new LeaderboardCurvePoint(0.975, 1.3807102743105126),
new LeaderboardCurvePoint(0.9725, 1.3090333065057616),
new LeaderboardCurvePoint(0.97, 1.2485807759957321),
new LeaderboardCurvePoint(0.965, 1.1552120359501035),
new LeaderboardCurvePoint(0.96, 1.0871883573850478),
new LeaderboardCurvePoint(0.955, 1.0388633331418984),
new LeaderboardCurvePoint(0.95, 1.0),
new LeaderboardCurvePoint(0.94, 0.9417362980580238),
new LeaderboardCurvePoint(0.93, 0.9039994071865736),
new LeaderboardCurvePoint(0.92, 0.8728710341448851),
new LeaderboardCurvePoint(0.91, 0.8488375988124467),
new LeaderboardCurvePoint(0.9, 0.825756123560842),
new LeaderboardCurvePoint(0.875, 0.7816934560296046),
new LeaderboardCurvePoint(0.85, 0.7462290664143185),
new LeaderboardCurvePoint(0.825, 0.7150465663454271),
new LeaderboardCurvePoint(0.8, 0.6872268862950283),
new LeaderboardCurvePoint(0.75, 0.6451808210101443),
new LeaderboardCurvePoint(0.7, 0.6125565959114954),
new LeaderboardCurvePoint(0.65, 0.5866010012767576),
new LeaderboardCurvePoint(0.6, 0.18223233667439062),
new LeaderboardCurvePoint(0.0, 0.0)
});
}
/**
* Gets the modifier for the given accuracy.
*
* @param accuracy The accuracy.
* @return The modifier.
*/
public double getModifier(double accuracy) {
accuracy = MathUtils.clamp(accuracy, 0, 100) / 100;
LeaderboardCurvePoint prev = this.getCurve()[1];
for (LeaderboardCurvePoint point : this.getCurve()) {
if (point.getA() <= accuracy) {
double distance = (prev.getA() - accuracy) / (prev.getA() - point.getA());
return MathUtils.lerp(prev.getB(), point.getB(), distance);
}
prev = point;
}
return 0;
}
/**
* Gets the pp for the given accuracy and stars.
*
* @param accuracy The accuracy.
* @param stars The stars.
* @return The pp.
*/
public double getPP(double accuracy, double stars) {
double pp = stars * this.starMultiplier;
double modifier = this.getModifier(accuracy);
return modifier * pp;
}
/**
* Gets the total pp for the given scores.
*
* @param scores The scores.
* @return The total pp.
*/
private double getTotalPP(List<ScoreSaberScoreToken> scores, int startIdx) {
double totalPP = 0;
for (int i = 0; i < scores.size(); i++) {
totalPP += Math.pow(this.weightCoefficient, i + startIdx) * scores.get(i).getPp();
}
return totalPP;
}
/**
* Gets the pp at the given index for the given scores.
*
* @param bottomScores The scores.
* @param idx The index.
* @return The pp.
*/
private double getRawPPAtIdx(List<ScoreSaberScoreToken> bottomScores, int idx, double expected) {
double oldBottomPP = this.getTotalPP(bottomScores, idx);
double newBottomPP = this.getTotalPP(bottomScores, idx + 1);
return (expected + oldBottomPP - newBottomPP) / Math.pow(this.weightCoefficient, idx);
}
/**
* Gets the raw pp per global pp for the given scores.
*
* @param scores The scores.
* @param expectedPP The expected pp.
* @return The raw pp per global pp.
*/
public double getRawPerGlobalPP(List<ScoreSaberScoreToken> scores, double expectedPP) {
int left = 0;
int right = scores.size() - 1;
int boundaryIdx = -1;
// Sort by PP
scores.sort((a, b) -> Double.compare(b.getPp(), a.getPp()));
while (left <= right) {
int mid = (left + right) / 2;
double bottomPP = this.getTotalPP(scores.subList(mid, scores.size()), mid);
List<ScoreSaberScoreToken> bottomSlice = new ArrayList<>(scores.subList(mid, scores.size()));
bottomSlice.add(0, scores.get(mid));
double modifiedBottomPP = this.getTotalPP(bottomSlice, mid);
double diff = modifiedBottomPP - bottomPP;
if (diff > expectedPP) {
boundaryIdx = mid;
left = mid + 1;
} else {
right = mid - 1;
}
}
if (boundaryIdx == -1) {
return this.getRawPPAtIdx(scores, 0, expectedPP);
} else {
return this.getRawPPAtIdx(scores.subList(boundaryIdx + 1, scores.size()), boundaryIdx + 1, expectedPP);
}
}
}

View File

@ -1,7 +1,7 @@
package cc.fascinated.bat.features; package cc.fascinated.bat.common.feature;
import cc.fascinated.bat.command.BatCommand; import cc.fascinated.bat.common.oldcommand.BatCommand;
import cc.fascinated.bat.service.CommandService; import cc.fascinated.bat.service.OldCommandService;
import lombok.Getter; import lombok.Getter;
import lombok.NonNull; import lombok.NonNull;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
@ -35,7 +35,7 @@ public abstract class Feature {
* @param commandService The command service * @param commandService The command service
* @param command The command to register * @param command The command to register
*/ */
public void registerCommand(@NonNull CommandService commandService, @NonNull BatCommand command) { public void registerCommand(@NonNull OldCommandService commandService, @NonNull BatCommand command) {
command.setFeature(this); command.setFeature(this);
for (BatCommand subCommand : command.getSubCommands().values()) { for (BatCommand subCommand : command.getSubCommands().values()) {
subCommand.setFeature(this); subCommand.setFeature(this);

View File

@ -1,4 +1,4 @@
package cc.fascinated.bat.features; package cc.fascinated.bat.common.feature;
import cc.fascinated.bat.common.Serializable; import cc.fascinated.bat.common.Serializable;
import com.google.gson.Gson; import com.google.gson.Gson;

View File

@ -1,17 +1,18 @@
package cc.fascinated.bat.model; package cc.fascinated.bat.common.model;
import cc.fascinated.bat.BatApplication; import cc.fascinated.bat.BatApplication;
import cc.fascinated.bat.common.ProfileHolder; import cc.fascinated.bat.common.ProfileHolder;
import cc.fascinated.bat.common.Serializable; import cc.fascinated.bat.common.Serializable;
import cc.fascinated.bat.features.FeatureProfile; import cc.fascinated.bat.common.feature.FeatureProfile;
import cc.fascinated.bat.features.birthday.profile.BirthdayProfile; import cc.fascinated.bat.birthday.profile.BirthdayProfile;
import cc.fascinated.bat.features.counter.CounterProfile; import cc.fascinated.bat.counter.CounterProfile;
import cc.fascinated.bat.features.leveling.LevelingProfile; import cc.fascinated.bat.leveling.LevelingProfile;
import cc.fascinated.bat.features.logging.LogProfile; import cc.fascinated.bat.logging.LogProfile;
import cc.fascinated.bat.features.minecraft.MinecraftProfile; import cc.fascinated.bat.moderation.punish.PunishmentProfile;
import cc.fascinated.bat.features.namehistory.profile.guild.NameHistoryProfile; import cc.fascinated.bat.namehistory.profile.guild.NameHistoryProfile;
import cc.fascinated.bat.features.reminder.ReminderProfile; import cc.fascinated.bat.reminder.ReminderProfile;
import cc.fascinated.bat.features.welcomer.WelcomerProfile; import cc.fascinated.bat.statschannel.StatsChannelProfile;
import cc.fascinated.bat.welcomer.WelcomerProfile;
import cc.fascinated.bat.premium.PremiumProfile; import cc.fascinated.bat.premium.PremiumProfile;
import cc.fascinated.bat.service.DiscordService; import cc.fascinated.bat.service.DiscordService;
import cc.fascinated.bat.service.MongoService; import cc.fascinated.bat.service.MongoService;
@ -19,9 +20,8 @@ import com.mongodb.client.model.ReplaceOptions;
import lombok.Getter; import lombok.Getter;
import lombok.NonNull; import lombok.NonNull;
import lombok.Setter; import lombok.Setter;
import lombok.extern.log4j.Log4j2;
import net.dv8tion.jda.api.entities.Guild; import net.dv8tion.jda.api.entities.Guild;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.annotation.Id; import org.springframework.data.annotation.Id;
import java.util.Date; import java.util.Date;
@ -33,8 +33,10 @@ import java.util.Map;
*/ */
@Getter @Getter
@Setter @Setter
@Log4j2
public class BatGuild extends ProfileHolder { public class BatGuild extends ProfileHolder {
private static final Logger log = LoggerFactory.getLogger(BatGuild.class); private static final String DEFAULT_PREFIX = "!";
/** /**
* The document that belongs to this guild * The document that belongs to this guild
*/ */
@ -47,6 +49,11 @@ public class BatGuild extends ProfileHolder {
@Id @Id
private final String id; private final String id;
/**
* The prefix of the guild
*/
private final String prefix;
/** /**
* The time this guild was joined * The time this guild was joined
*/ */
@ -61,6 +68,7 @@ public class BatGuild extends ProfileHolder {
this.id = id; this.id = id;
this.document = document; this.document = document;
boolean newAccount = this.document.isEmpty(); boolean newAccount = this.document.isEmpty();
this.prefix = newAccount ? DEFAULT_PREFIX : (String) document.getOrDefault("prefix", DEFAULT_PREFIX);
this.createdAt = newAccount ? new Date() : document.getDate("createdAt"); this.createdAt = newAccount ? new Date() : document.getDate("createdAt");
Guild guild = DiscordService.JDA.getGuildById(id); Guild guild = DiscordService.JDA.getGuildById(id);
@ -172,12 +180,21 @@ public class BatGuild extends ProfileHolder {
} }
/** /**
* Gets the minecraft profile * Gets the stats channel profile
* *
* @return the minecraft profile * @return the stats channel profile
*/ */
public MinecraftProfile getMinecraftProfile() { public StatsChannelProfile getStatsChannelProfile() {
return getProfile(MinecraftProfile.class); return getProfile(StatsChannelProfile.class);
}
/**
* Gets the punishment profile
*
* @return the punishment profile
*/
public PunishmentProfile getPunishmentProfile() {
return getProfile(PunishmentProfile.class);
} }
/** /**

View File

@ -1,11 +1,10 @@
package cc.fascinated.bat.model; package cc.fascinated.bat.common.model;
import cc.fascinated.bat.BatApplication; import cc.fascinated.bat.BatApplication;
import cc.fascinated.bat.common.ProfileHolder; import cc.fascinated.bat.common.ProfileHolder;
import cc.fascinated.bat.common.Serializable; import cc.fascinated.bat.common.Serializable;
import cc.fascinated.bat.common.UserUtils; import cc.fascinated.bat.common.UserUtils;
import cc.fascinated.bat.features.namehistory.profile.user.NameHistoryProfile; import cc.fascinated.bat.namehistory.profile.user.NameHistoryProfile;
import cc.fascinated.bat.features.scoresaber.profile.user.ScoreSaberProfile;
import cc.fascinated.bat.service.DiscordService; import cc.fascinated.bat.service.DiscordService;
import cc.fascinated.bat.service.MongoService; import cc.fascinated.bat.service.MongoService;
import com.mongodb.client.model.ReplaceOptions; import com.mongodb.client.model.ReplaceOptions;
@ -87,15 +86,6 @@ public class BatUser extends ProfileHolder {
return user; return user;
} }
/**
* Gets the user's ScoreSaber profile
*
* @return the user's ScoreSaber profile
*/
public ScoreSaberProfile getScoreSaberProfile() {
return getProfile(ScoreSaberProfile.class);
}
/** /**
* Gets the user's name history profile * Gets the user's name history profile
* *

View File

@ -1,4 +1,4 @@
package cc.fascinated.bat.model; package cc.fascinated.bat.common.model;
import cc.fascinated.bat.common.ChannelUtils; import cc.fascinated.bat.common.ChannelUtils;
import cc.fascinated.bat.common.UserUtils; import cc.fascinated.bat.common.UserUtils;

View File

@ -1,4 +1,4 @@
package cc.fascinated.bat.model.token.beatsaber.scoresaber; package cc.fascinated.bat.common.model.token.beatsaber.scoresaber;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Getter;

View File

@ -1,4 +1,4 @@
package cc.fascinated.bat.model.token.beatsaber.scoresaber; package cc.fascinated.bat.common.model.token.beatsaber.scoresaber;
import lombok.Getter; import lombok.Getter;
import lombok.ToString; import lombok.ToString;

View File

@ -1,4 +1,4 @@
package cc.fascinated.bat.model.token.beatsaber.scoresaber; package cc.fascinated.bat.common.model.token.beatsaber.scoresaber;
import lombok.Getter; import lombok.Getter;
import lombok.ToString; import lombok.ToString;

View File

@ -1,4 +1,4 @@
package cc.fascinated.bat.model.token.beatsaber.scoresaber; package cc.fascinated.bat.common.model.token.beatsaber.scoresaber;
import lombok.Getter; import lombok.Getter;
import lombok.ToString; import lombok.ToString;

View File

@ -1,4 +1,4 @@
package cc.fascinated.bat.model.token.beatsaber.scoresaber; package cc.fascinated.bat.common.model.token.beatsaber.scoresaber;
import lombok.Getter; import lombok.Getter;
import lombok.ToString; import lombok.ToString;

View File

@ -1,4 +1,4 @@
package cc.fascinated.bat.model.token.beatsaber.scoresaber; package cc.fascinated.bat.common.model.token.beatsaber.scoresaber;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;

View File

@ -1,4 +1,4 @@
package cc.fascinated.bat.model.token.dogceo; package cc.fascinated.bat.common.model.token.dogceo;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Getter;

View File

@ -1,4 +1,4 @@
package cc.fascinated.bat.model.token.paste; package cc.fascinated.bat.common.model.token.paste;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Getter;

View File

@ -1,4 +1,4 @@
package cc.fascinated.bat.model.token.randomd; package cc.fascinated.bat.common.model.token.randomd;
import lombok.Getter; import lombok.Getter;

View File

@ -1,4 +1,4 @@
package cc.fascinated.bat.model.token.randomfox; package cc.fascinated.bat.common.model.token.randomfox;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Getter;

View File

@ -1,4 +1,4 @@
package cc.fascinated.bat.model.token.thecatapi; package cc.fascinated.bat.common.model.token.thecatapi;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Getter;

View File

@ -0,0 +1,248 @@
package cc.fascinated.bat.common.oldcommand;
import cc.fascinated.bat.common.feature.Feature;
import cc.fascinated.bat.common.model.BatGuild;
import cc.fascinated.bat.common.model.BatUser;
import lombok.*;
import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel;
import net.dv8tion.jda.api.interactions.IntegrationType;
import net.dv8tion.jda.api.interactions.InteractionContextType;
import net.dv8tion.jda.api.interactions.commands.OptionMapping;
import net.dv8tion.jda.api.interactions.commands.SlashCommandInteraction;
import net.dv8tion.jda.api.interactions.commands.build.OptionData;
import net.dv8tion.jda.api.interactions.commands.build.SubcommandData;
import net.dv8tion.jda.internal.interactions.CommandDataImpl;
import java.util.Collections;
import java.util.EnumSet;
import java.util.HashMap;
import java.util.Map;
/**
* @author Braydon
*/
@Getter
public abstract class BatCommand {
/**
* The info of this command.
*/
@NonNull
private final InternalCommandInfo info;
/**
* The feature this command belongs to.
*/
@Setter
private Feature feature;
/**
* The snowflake of this command, set when
* this command is registered with Discord.
*/
@Setter
private long snowflake;
/**
* The sub commands of this command, if any.
*/
private final Map<String, BatCommand> subCommands = Collections.synchronizedMap(new HashMap<>());
/**
* The internal data for this command.
*/
@Setter(AccessLevel.PRIVATE)
private CommandDataImpl commandData;
/**
* The internal subcommand data for this command.
*/
@Setter(AccessLevel.PRIVATE)
private SubcommandData subcommandData;
public BatCommand() {
if (!getClass().isAnnotationPresent(CommandInfo.class)) {
throw new IllegalStateException("Missing @CommandInfo annotation in " + getClass().getSimpleName());
}
info = new InternalCommandInfo(getClass().getAnnotation(CommandInfo.class));
commandData = new CommandDataImpl(info.getName(), info.getDescription())
// .setDefaultPermissions(DefaultMemberPermissions.enabledFor(info.getPermissions()))
.setIntegrationTypes(info.isUserInstall() ?
EnumSet.of(IntegrationType.USER_INSTALL) :
EnumSet.of(IntegrationType.GUILD_INSTALL)
).setContexts(info.isGuildOnly() ?
EnumSet.of(InteractionContextType.GUILD) :
EnumSet.of(InteractionContextType.GUILD, InteractionContextType.BOT_DM, InteractionContextType.PRIVATE_CHANNEL)
);
}
/**
* Fired when this command is executed.
*
* @param guild the guild the command was executed in, if any
* @param user the user who executed the command
* @param channel the channel the command was executed in
* @param member the member who executed the command, null if not a guild
* @param commandMessage the message that invoked this command, if any
* @param arguments the arguments of the command, if any
* @param event the event that invoked this command, if any
*/
public void execute(BatGuild guild, @NonNull BatUser user, @NonNull MessageChannel channel, Member member,
Message commandMessage, String[] arguments, SlashCommandInteraction event) {
}
/**
* Register the given sub commands.
*
* @param commands the commands to register
*/
protected final void addSubCommands(@NonNull BatCommand... commands) {
for (BatCommand command : commands) {
// Copy info from the parent command
if (command.getInfo().getCategory() != info.getCategory()) {
command.getInfo().setCategory(info.getCategory());
}
if (command.getInfo().getPermissions().length == 0) {
command.getInfo().setPermissions(info.getPermissions());
}
if (command.getInfo().isGuildOnly() != info.isGuildOnly()) {
command.getInfo().setGuildOnly(info.isGuildOnly());
}
if (command.getInfo().isBotOwnerOnly() != info.isBotOwnerOnly()) {
command.getInfo().setBotOwnerOnly(info.isBotOwnerOnly());
}
command.setSubcommandData(new SubcommandData(command.getInfo().getName(), command.getInfo().getDescription()));
for (OptionData option : command.getCommandData().getOptions()) {
command.getSubcommandData().addOptions(option);
}
commandData.addSubcommands(command.getSubcommandData());
subCommands.put(command.getInfo().getName(), command);
}
}
/**
* Add the given options
* to this command.
*
* @param options the options to add
*/
protected final void addOptions(OptionData... options) {
commandData.addOptions(options);
}
/**
* Get the sub command by its class.
*
* @param clazz the class of the sub command
* @return the sub command
*/
public BatCommand getSubCommand(Class<? extends BatCommand> clazz) {
for (Map.Entry<String, BatCommand> entry : subCommands.entrySet()) {
if (entry.getValue().getClass().equals(clazz)) {
return entry.getValue();
}
}
return null;
}
/**
* Reply to the message or interaction with the given contents.
*
* @param message the message to reply to, null if interaction
* @param interaction the interaction to reply to, null if message
* @param contents the contents to reply with
*/
public void replyMessage(Message message, SlashCommandInteraction interaction, String contents) {
if (message != null) {
message.reply(contents).queue();
} else {
interaction.reply(contents).queue();
}
}
/**
* Reply to the message or interaction with the given embed.
*
* @param message the message to reply to, null if interaction
* @param interaction the interaction to reply to, null if message
* @param builder the embed builder to reply with
*/
public void replyEmbed(Message message, SlashCommandInteraction interaction, EmbedBuilder builder) {
if (message != null) {
message.replyEmbeds(builder.build()).queue();
} else {
interaction.replyEmbeds(builder.build()).queue();
}
}
/**
* Get the argument from the command.
*
* @param option the option to get from the slash command
* @param arguments the arguments of the invoked command
* @param argumentIndex the index of the argument in the command
* @param concatenateLeftover whether to concatenate the leftover arguments
* @param event the event that invoked the command
* @return the argument
*/
public Argument getArgument(String option, String[] arguments, int argumentIndex, boolean concatenateLeftover, SlashCommandInteraction event) {
return new Argument(option, arguments, argumentIndex, concatenateLeftover, event);
}
@AllArgsConstructor
public static class Argument {
/**
* The option to get from the slash command.
*/
private final String option;
/**
* The arguments of the invoked command.
*/
private final String[] arguments;
/**
* The index of the argument in the command.
*/
private final int argumentIndex;
/**
* Whether to concatenate the leftover arguments.
*/
private final boolean concatenateLeftover;
/**
* The event that invoked the command.
*/
private final SlashCommandInteraction event;
/**
* Get the argument from the command.
*
* @return the argument
*/
public String getAsString() {
if (event != null) { // Get the option from the event
OptionMapping option = event.getOption(this.option);
if (option == null) {
return null;
}
return option.getAsString();
}
if (arguments.length < argumentIndex) { // Check if the argument index is out of bounds
return null;
}
if (concatenateLeftover) { // Concatenate the leftover arguments
StringBuilder builder = new StringBuilder();
for (int i = argumentIndex; i < arguments.length; i++) {
builder.append(arguments[i]).append(" ");
}
return builder.toString().trim();
}
return arguments[argumentIndex]; // Get the argument at the index
}
}
}

Some files were not shown because too many files have changed in this diff Show More