Skip to content

Commit c2e81c7

Browse files
Big-Iron-CheemsMineGame159
authored andcommitted
Complete refactor of the bot
- update dependencies - collect all environment variables for ease of maintenance - update slash commands
1 parent c85e3db commit c2e81c7

18 files changed

+86
-87
lines changed

build.gradle

+3-3
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ repositories {
1111
}
1212

1313
dependencies {
14-
implementation "net.dv8tion:JDA:5.0.0-beta.6"
15-
implementation "com.konghq:unirest-java:3.14.2:standalone"
16-
implementation "ch.qos.logback:logback-classic:1.4.6"
14+
implementation "net.dv8tion:JDA:5.0.0-beta.19"
15+
implementation "com.konghq:unirest-java:3.14.5:standalone"
16+
implementation "ch.qos.logback:logback-classic:1.4.14"
1717
}
1818

1919
tasks.withType(JavaCompile).configureEach {
+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
distributionBase=GRADLE_USER_HOME
22
distributionPath=wrapper/dists
3-
distributionUrl=https\://services.gradle.org/distributions/gradle-8.0.2-bin.zip
3+
distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-bin.zip
44
zipStoreBase=GRADLE_USER_HOME
55
zipStorePath=wrapper/dists
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package org.meteordev.meteorbot;
2+
3+
public enum Env {
4+
DISCORD_TOKEN("DISCORD_TOKEN"),
5+
API_BASE("API_BASE"),
6+
BACKEND_TOKEN("BACKEND_TOKEN"),
7+
GUILD_ID("GUILD_ID"),
8+
COPE_NN_ID("COPE_NN_ID"),
9+
MEMBER_COUNT_ID("MEMBER_COUNT_ID"),
10+
DOWNLOAD_COUNT_ID("DOWNLOAD_COUNT_ID"),
11+
UPTIME_URL("UPTIME_URL");
12+
13+
public final String value;
14+
15+
Env(String key) {
16+
this.value = System.getenv(key);
17+
}
18+
}

src/main/java/org/meteordev/meteorbot/InfoChannels.java

+8-12
Original file line numberDiff line numberDiff line change
@@ -7,44 +7,40 @@
77

88
import java.util.concurrent.Executors;
99
import java.util.concurrent.TimeUnit;
10-
import java.util.function.Supplier;
10+
import java.util.function.LongSupplier;
1111

1212
public class InfoChannels extends ListenerAdapter {
13-
private static final String GUILD_ID = System.getenv("GUILD_ID");
14-
private static final String MEMBER_COUNT_ID = System.getenv("MEMBER_COUNT_ID");
15-
private static final String DOWNLOAD_COUNT_ID = System.getenv("DOWNLOAD_COUNT_ID");
16-
1713
private static final int UPDATE_PERIOD = 6;
1814
private static int delay;
1915

2016
@Override
2117
public void onReady(ReadyEvent event) {
22-
Guild guild = event.getJDA().getGuildById(GUILD_ID);
18+
Guild guild = event.getJDA().getGuildById(Env.GUILD_ID.value);
2319
if (guild == null) {
2420
MeteorBot.LOG.warn("Failed to fetch guild when initialising info channels.");
2521
return;
2622
}
2723

28-
if (MEMBER_COUNT_ID == null || DOWNLOAD_COUNT_ID == null) {
24+
if (Env.MEMBER_COUNT_ID.value == null || Env.DOWNLOAD_COUNT_ID.value == null) {
2925
MeteorBot.LOG.warn("Must define info channel id's for them to function.");
3026
return;
3127
}
3228

33-
VoiceChannel memberCount = guild.getVoiceChannelById(MEMBER_COUNT_ID);
34-
VoiceChannel downloads = guild.getVoiceChannelById(DOWNLOAD_COUNT_ID);
29+
VoiceChannel memberCount = guild.getVoiceChannelById(Env.MEMBER_COUNT_ID.value);
30+
VoiceChannel downloads = guild.getVoiceChannelById(Env.DOWNLOAD_COUNT_ID.value);
3531
if (memberCount == null || downloads == null) {
3632
MeteorBot.LOG.warn("Failed to fetch channels when initialising info channels.");
3733
return;
3834
}
3935

4036
updateChannel(downloads, () -> Utils.apiGet("stats").asJson().getBody().getObject().getLong("downloads"));
41-
updateChannel(memberCount, () -> (long) MeteorBot.SERVER.getMemberCount());
37+
updateChannel(memberCount, guild::getMemberCount);
4238
}
4339

44-
private static void updateChannel(VoiceChannel channel, Supplier<Long> supplier) {
40+
private static void updateChannel(VoiceChannel channel, LongSupplier supplier) {
4541
Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate(() -> {
4642
String name = channel.getName();
47-
name = name.substring(0, name.lastIndexOf(':') + 1) + " " + Utils.formatLong(supplier.get());
43+
name = "%s %s".formatted(name.substring(0, name.lastIndexOf(':') + 1), Utils.formatLong(supplier.getAsLong()));
4844
channel.getManager().setName(name).complete();
4945
}, delay, UPDATE_PERIOD, TimeUnit.MINUTES);
5046

src/main/java/org/meteordev/meteorbot/MeteorBot.java

+16-23
Original file line numberDiff line numberDiff line change
@@ -20,18 +20,15 @@
2020
import org.slf4j.Logger;
2121

2222
public class MeteorBot extends ListenerAdapter {
23-
private static final String[] HELLOS = { "hi", "hello", "howdy", "bonjour", "ciao", "hej", "hola", "yo" };
23+
private static final String[] HELLOS = {"hi", "hello", "howdy", "bonjour", "ciao", "hej", "hola", "yo"};
2424

2525
public static final Logger LOG = JDALogger.getLog("Meteor Bot");
26-
public static final String BACKEND_TOKEN = System.getenv("BACKEND_TOKEN");
2726

28-
public static JDA BOT;
29-
public static Guild SERVER;
30-
public static RichCustomEmoji COPE_NN;
27+
private Guild server;
28+
private RichCustomEmoji copeEmoji;
3129

3230
public static void main(String[] args) {
33-
String token = System.getenv("DISCORD_TOKEN");
34-
31+
String token = Env.DISCORD_TOKEN.value;
3532
if (token == null) {
3633
MeteorBot.LOG.error("Must specify discord bot token.");
3734
return;
@@ -46,51 +43,47 @@ public static void main(String[] args) {
4643

4744
@Override
4845
public void onReady(ReadyEvent event) {
49-
BOT = event.getJDA();
50-
BOT.getPresence().setActivity(Activity.playing("Meteor Client"));
46+
JDA bot = event.getJDA();
47+
bot.getPresence().setActivity(Activity.playing("Meteor Client"));
5148

52-
SERVER = BOT.getGuildById(System.getenv("GUILD_ID"));
53-
if (SERVER == null) {
49+
server = bot.getGuildById(Env.GUILD_ID.value);
50+
if (server == null) {
5451
MeteorBot.LOG.error("Couldn't find the specified server.");
55-
System.exit(0);
52+
System.exit(1);
5653
}
5754

58-
COPE_NN = SERVER.getEmojiById(System.getenv("COPE_NN_ID"));
55+
copeEmoji = server.getEmojiById(Env.COPE_NN_ID.value);
5956

6057
LOG.info("Meteor Bot started");
6158
}
6259

6360
@Override
6461
public void onMessageReceived(MessageReceivedEvent event) {
65-
if (!event.isFromType(ChannelType.TEXT) || !event.isFromGuild() || !event.getGuild().equals(SERVER)) return;
62+
if (!event.isFromType(ChannelType.TEXT) || !event.isFromGuild() || !event.getGuild().equals(server)) return;
6663

6764
String content = event.getMessage().getContentRaw();
68-
if (!content.contains(BOT.getSelfUser().getAsMention())) return;
69-
70-
boolean found = false;
65+
if (!content.contains(event.getJDA().getSelfUser().getAsMention())) return;
7166

7267
for (String hello : HELLOS) {
7368
if (content.toLowerCase().contains(hello)) {
74-
found = true;
7569
event.getMessage().reply(hello + " :)").queue();
70+
return;
7671
}
7772
}
7873

79-
if (!found) {
80-
event.getMessage().addReaction(content.toLowerCase().contains("cope") ? COPE_NN : Emoji.fromUnicode("\uD83D\uDC4B")).queue();
81-
}
74+
event.getMessage().addReaction(content.toLowerCase().contains("cope") ? copeEmoji : Emoji.fromUnicode("\uD83D\uDC4B")).queue();
8275
}
8376

8477
@Override
8578
public void onGuildMemberJoin(@NotNull GuildMemberJoinEvent event) {
86-
if (BACKEND_TOKEN == null) return;
79+
if (Env.BACKEND_TOKEN.value == null) return;
8780

8881
Utils.apiPost("discord/userJoined").queryString("id", event.getMember().getId()).asEmpty();
8982
}
9083

9184
@Override
9285
public void onGuildMemberRemove(@NotNull GuildMemberRemoveEvent event) {
93-
if (BACKEND_TOKEN == null) return;
86+
if (Env.BACKEND_TOKEN.value == null) return;
9487

9588
Utils.apiPost("discord/userLeft").asEmpty();
9689
}

src/main/java/org/meteordev/meteorbot/Uptime.java

+3-5
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,16 @@
99
import java.util.concurrent.TimeUnit;
1010

1111
public class Uptime extends ListenerAdapter {
12-
private static final String UPTIME_URL = System.getenv("UPTIME_URL");
13-
1412
@Override
1513
public void onReady(@NotNull ReadyEvent event) {
16-
if (UPTIME_URL == null) {
14+
if (Env.UPTIME_URL.value == null) {
1715
MeteorBot.LOG.warn("Uptime URL not configured, uptime requests will not be made");
1816
return;
1917
}
2018

2119
Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate(() -> {
22-
String url = UPTIME_URL;
23-
if (url.endsWith("ping=")) url += MeteorBot.BOT.getGatewayPing();
20+
String url = Env.UPTIME_URL.value;
21+
if (url.endsWith("ping=")) url += event.getJDA().getGatewayPing();
2422

2523
Unirest.get(url).asEmpty();
2624
}, 0, 60, TimeUnit.SECONDS);

src/main/java/org/meteordev/meteorbot/Utils.java

+8-13
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,17 @@
88
import java.awt.*;
99
import java.text.NumberFormat;
1010
import java.time.temporal.ChronoUnit;
11-
import java.util.List;
1211
import java.util.Locale;
1312
import java.util.regex.Matcher;
1413
import java.util.regex.Pattern;
1514

16-
public class Utils {
15+
public abstract class Utils {
1716
private static final Pattern TIME_PATTERN = Pattern.compile("^(\\d+)(ms|s|m|h|d|w)$");
18-
public static final Color COLOR = new Color(145, 61, 226);
17+
private static final Color COLOR = new Color(145, 61, 226);
18+
private static final String[] SUFFIXES = {"k", "m", "b", "t"};
1919

20-
private static final List<String> suffixes = List.of("k", "m", "b", "t");
21-
22-
private static final String API_BASE = System.getenv("API_BASE");
23-
private static final String BACKEND_TOKEN = System.getenv("BACKEND_TOKEN");
20+
private Utils() {
21+
}
2422

2523
public static long parseAmount(String parse) {
2624
Matcher matcher = TIME_PATTERN.matcher(parse);
@@ -64,7 +62,6 @@ public static String unitToString(ChronoUnit unit) {
6462
};
6563
}
6664

67-
6865
public static String formatLong(long value) {
6966
String formatted = NumberFormat.getNumberInstance(Locale.UK).format(value);
7067
String first = formatted, second = "", suffix = "";
@@ -73,7 +70,7 @@ public static String formatLong(long value) {
7370
int firstComma = formatted.indexOf(',');
7471
first = formatted.substring(0, firstComma);
7572
second = "." + formatted.substring(firstComma + 1, firstComma + 3);
76-
suffix = suffixes.get(formatted.replaceAll("[^\",\"]", "").length() - 1);
73+
suffix = SUFFIXES[formatted.replaceAll("[^\",\"]", "").length() - 1];
7774
}
7875

7976
return first + second + suffix;
@@ -88,12 +85,10 @@ public static EmbedBuilder embed(String format, Object... args) {
8885
}
8986

9087
public static GetRequest apiGet(String path) {
91-
return Unirest.get(API_BASE + path);
88+
return Unirest.get(Env.API_BASE.value + path);
9289
}
9390

9491
public static HttpRequestWithBody apiPost(String path) {
95-
HttpRequestWithBody req = Unirest.post(API_BASE + path);
96-
req.header("Authorization", BACKEND_TOKEN);
97-
return req;
92+
return Unirest.post(Env.API_BASE.value + path).header("Authorization", Env.BACKEND_TOKEN.value);
9893
}
9994
}

src/main/java/org/meteordev/meteorbot/command/Command.java

+3-4
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,13 @@
88
public abstract class Command {
99
public final String name, description;
1010

11-
public Command(String name, String description) {
11+
protected Command(String name, String description) {
1212
this.name = name;
1313
this.description = description;
1414
}
1515

1616
public abstract SlashCommandData build(SlashCommandData data);
17+
1718
public abstract void run(SlashCommandInteractionEvent event);
1819

1920
public static Member parseMember(SlashCommandInteractionEvent event) {
@@ -24,9 +25,7 @@ public static Member parseMember(SlashCommandInteractionEvent event) {
2425
}
2526

2627
Member member = memberOption.getAsMember();
27-
if (member == null) {
28-
event.reply("Couldn't find that member.").setEphemeral(true).queue();
29-
}
28+
if (member == null) event.reply("Couldn't find that member.").setEphemeral(true).queue();
3029

3130
return member;
3231
}

src/main/java/org/meteordev/meteorbot/command/Commands.java

+9-8
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import net.dv8tion.jda.api.interactions.commands.build.CommandData;
77
import net.dv8tion.jda.internal.interactions.CommandDataImpl;
88
import org.jetbrains.annotations.NotNull;
9+
import org.meteordev.meteorbot.Env;
910
import org.meteordev.meteorbot.MeteorBot;
1011
import org.meteordev.meteorbot.command.commands.LinkCommand;
1112
import org.meteordev.meteorbot.command.commands.StatsCommand;
@@ -25,10 +26,10 @@
2526
import java.util.Map;
2627

2728
public class Commands extends ListenerAdapter {
28-
private static final Map<String, Command> commands = new HashMap<>();
29+
private static final Map<String, Command> BOT_COMMANDS = new HashMap<>();
2930

3031
public static void add(Command command) {
31-
commands.put(command.name, command);
32+
BOT_COMMANDS.put(command.name, command);
3233
}
3334

3435
@Override
@@ -46,28 +47,28 @@ public void onReady(@NotNull ReadyEvent event) {
4647
add(new CapyCommand());
4748
add(new CatCommand());
4849
add(new DogCommand());
49-
add(new MonkyCommand());
50+
add(new MonkeyCommand());
5051
add(new PandaCommand());
5152

5253
add(new StatsCommand());
53-
if (MeteorBot.BACKEND_TOKEN != null) {
54+
if (Env.BACKEND_TOKEN.value != null) {
5455
add(new LinkCommand());
5556
}
5657

5758
List<CommandData> commandData = new ArrayList<>();
5859

59-
for (Command command : commands.values()) {
60+
for (Command command : BOT_COMMANDS.values()) {
6061
commandData.add(command.build(new CommandDataImpl(command.name, command.description)));
6162
}
6263

63-
MeteorBot.BOT.updateCommands().addCommands(commandData).complete();
64+
event.getJDA().updateCommands().addCommands(commandData).complete();
6465

65-
MeteorBot.LOG.info("Loaded {} commands", commands.size());
66+
MeteorBot.LOG.info("Loaded {} commands", BOT_COMMANDS.size());
6667
}
6768

6869
@Override
6970
public void onSlashCommandInteraction(@NotNull SlashCommandInteractionEvent event) {
70-
Command command = commands.get(event.getName());
71+
Command command = BOT_COMMANDS.get(event.getName());
7172
if (command == null) return;
7273

7374
command.run(event);

src/main/java/org/meteordev/meteorbot/command/commands/StatsCommand.java

+4-5
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
import java.util.regex.Pattern;
1515

1616
public class StatsCommand extends Command {
17-
private static final Pattern DATE_PATTERN = Pattern.compile("[0-9]{2}-[0-9]{2}-[0-9]{4}");
17+
private static final Pattern DATE_PATTERN = Pattern.compile("\\d{2}-\\d{2}-\\d{4}");
1818

1919
public StatsCommand() {
2020
super("stats", "Shows various stats about Meteor.");
@@ -32,11 +32,10 @@ public void run(SlashCommandInteractionEvent event) {
3232

3333
if (option != null && DATE_PATTERN.matcher(option.getAsString()).matches()) {
3434
date = option.getAsString();
35-
}
36-
else {
35+
} else {
3736
Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
3837
calendar.setTime(new Date());
39-
date = String.format("%02d-%02d-%d", calendar.get(Calendar.DATE), calendar.get(Calendar.MONTH) + 1, calendar.get(Calendar.YEAR));
38+
date = "%02d-%02d-%d".formatted(calendar.get(Calendar.DATE), calendar.get(Calendar.MONTH) + 1, calendar.get(Calendar.YEAR));
4039
}
4140

4241
if (date == null) {
@@ -53,6 +52,6 @@ public void run(SlashCommandInteractionEvent event) {
5352

5453
int joins = json.getInt("joins"), leaves = json.getInt("leaves");
5554

56-
event.replyEmbeds(Utils.embed("**Date**: " + json.getString("date") + "\n**Joins**: " + joins + "\n**Leaves**: " + leaves + "\n**Gained**: " + (joins - leaves) + "\n**Downloads**: " + json.getInt("downloads")).build()).queue();
55+
event.replyEmbeds(Utils.embed("**Date**: %s\n**Joins**: %d\n**Leaves**: %d\n**Gained**: %d\n**Downloads**: %d".formatted(json.getString("date"), joins, leaves, joins - leaves, json.getInt("downloads"))).build()).queue();
5756
}
5857
}

src/main/java/org/meteordev/meteorbot/command/commands/help/FaqCommand.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ public class FaqCommand extends HelpCommand {
66
public FaqCommand() {
77
super(
88
"faq",
9-
"tells someone to read the faq",
9+
"Tells someone to read the faq",
1010
"The FAQ answers your question, please read it.",
1111
Button.link("https://meteorclient.com/faq", "FAQ")
1212
);

src/main/java/org/meteordev/meteorbot/command/commands/help/HelpCommand.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@
88
import org.meteordev.meteorbot.command.Command;
99

1010
public abstract class HelpCommand extends Command {
11-
protected ItemComponent[] components;
11+
protected final ItemComponent[] components;
1212
protected final String message;
1313

14-
public HelpCommand(String name, String description, String message, ItemComponent... components) {
14+
protected HelpCommand(String name, String description, String message, ItemComponent... components) {
1515
super(name, description);
1616

1717
this.message = message;

0 commit comments

Comments
 (0)