Skip to content

Commit 59dcd16

Browse files
committed
Improve rules command
1 parent 9641fc7 commit 59dcd16

File tree

4 files changed

+57
-22
lines changed

4 files changed

+57
-22
lines changed

src/watcher/java/com/mcmoddev/mmdbot/watcher/rules/RuleAgreementChecker.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,8 @@ public void run() {
4040
final var now = Instant.now();
4141
// 24h < joinTime < 48h
4242
guild.findMembers(it ->
43-
it.getTimeJoined().isBefore(OffsetDateTime.from(now.minus(1, ChronoUnit.DAYS)))
44-
&& it.getTimeJoined().isAfter(OffsetDateTime.from(now.minus(2, ChronoUnit.DAYS)))
43+
it.getTimeJoined().toInstant().isBefore(now.minus(1, ChronoUnit.DAYS))
44+
&& it.getTimeJoined().toInstant().isAfter(now.minus(2, ChronoUnit.DAYS))
4545
&& !it.getUser().isBot()
4646
&& it.getRoles().stream().noneMatch(role -> role.getIdLong() == roleId)
4747
)

src/watcher/java/com/mcmoddev/mmdbot/watcher/rules/RuleCommand.java

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import com.jagrosh.jdautilities.command.SlashCommandEvent;
2626
import com.mcmoddev.mmdbot.watcher.TheWatcher;
2727
import com.mcmoddev.mmdbot.watcher.util.database.RulesDAO;
28+
import net.dv8tion.jda.api.MessageBuilder;
2829
import net.dv8tion.jda.api.entities.Guild;
2930
import net.dv8tion.jda.api.interactions.commands.OptionMapping;
3031
import net.dv8tion.jda.api.interactions.commands.OptionType;
@@ -52,8 +53,11 @@ protected void execute(final SlashCommandEvent event) {
5253
.setEphemeral(true)
5354
.queue();
5455
} else {
55-
event.replyEmbeds(rule.asEmbed(id)
56-
.setAuthor(event.getGuild().getName(), null, event.getGuild().getIconUrl())
56+
event.reply(new MessageBuilder()
57+
.setEmbeds(rule.asEmbed(id)
58+
.setAuthor(event.getGuild().getName(), null, event.getGuild().getIconUrl())
59+
.build())
60+
.setContent("See the server's rules in <#%s>.".formatted(UpdateRulesCommand.getRulesChannel(event.getGuild())))
5761
.build())
5862
.queue();
5963
}
@@ -72,9 +76,12 @@ protected void execute(final CommandEvent event) {
7276
if (rule == null) {
7377
event.reply("Unknown rule nr. " + id);
7478
} else {
75-
event.reply(rule.asEmbed(id)
79+
event.reply(new MessageBuilder()
80+
.setEmbeds(rule.asEmbed(id)
7681
.setAuthor(event.getGuild().getName(), null, event.getGuild().getIconUrl())
77-
.build());
82+
.build())
83+
.setContent("See the server's rules in <#%s>.".formatted(UpdateRulesCommand.getRulesChannel(event.getGuild())))
84+
.build());
7885
}
7986
}
8087

src/watcher/java/com/mcmoddev/mmdbot/watcher/rules/RuleParser.java

Lines changed: 39 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828
import org.jetbrains.annotations.NotNull;
2929

3030
import javax.annotation.Nullable;
31-
import java.net.URL;
3231
import java.util.ArrayList;
3332
import java.util.List;
3433
import java.util.function.BiConsumer;
@@ -40,19 +39,28 @@ public static List<Message> parse(String message, BiConsumer<Integer, RuleData>
4039
try {
4140
final List<Message> messages = new ArrayList<>();
4241
final List<String> lines = List.of(message.split("\n"));
43-
final var rulesIndex = lines.indexOf(lines.stream().filter(it -> it.trim().equals("## Rules")).findFirst().orElse(""));
42+
final var rulesIndex = lines.indexOf(lines.stream().filter(it -> it.trim().equals("<rules>")).findFirst().orElse(""));
4443
int rulesEnd = lines.size() - 1;
4544
for (int i = rulesIndex; i < lines.size(); i++) {
4645
if (lines.get(i).trim().equals("<rulesEnd/>")) {
4746
rulesEnd = i;
4847
break;
4948
}
5049
}
50+
final var embedsIndex = lines.indexOf(lines.stream().filter(it -> it.trim().equals("<embeds>")).findFirst().orElse(""));
51+
int embedsEnd = lines.size() - 1;
52+
for (int i = embedsIndex; i < lines.size(); i++) {
53+
if (lines.get(i).trim().equals("<embedsEnd/>")) {
54+
embedsEnd = i;
55+
break;
56+
}
57+
}
58+
final var embeds = getEmbeds(IntStream.range(embedsIndex + 1, embedsEnd).mapToObj(lines::get).toList());
5159
final var messagesUntilRules = IntStream.range(0, rulesIndex).mapToObj(lines::get).toList();
5260
final var rules = collectRules(IntStream.range(rulesIndex + 1, rulesEnd).mapToObj(lines::get).toList());
53-
final var afterRules = IntStream.range(rulesEnd + 1, lines.size()).mapToObj(lines::get).toList();
61+
final var afterRules = IntStream.range(rulesEnd + 1, embedsIndex).mapToObj(lines::get).toList();
5462

55-
messages.addAll(splitIntoMessages(messagesUntilRules));
63+
messages.addAll(splitIntoMessages(messagesUntilRules, embeds));
5664

5765
final List<MessageEmbed> currentEmbeds = new ArrayList<>();
5866
for (int i = 0; i < rules.size(); i++) {
@@ -67,7 +75,7 @@ public static List<Message> parse(String message, BiConsumer<Integer, RuleData>
6775
}
6876
if (!currentEmbeds.isEmpty()) messages.add(new MessageBuilder().setEmbeds(currentEmbeds).build());
6977

70-
messages.addAll(splitIntoMessages(afterRules));
78+
messages.addAll(splitIntoMessages(afterRules, embeds));
7179

7280
return messages;
7381
} catch (Exception s) {
@@ -76,7 +84,7 @@ public static List<Message> parse(String message, BiConsumer<Integer, RuleData>
7684
}
7785
}
7886

79-
private static List<Message> splitIntoMessages(final List<String> lines) {
87+
private static List<Message> splitIntoMessages(final List<String> lines, final List<MessageEmbed> embedRegistry) {
8088
final List<Message> messages = new ArrayList<>();
8189
if (lines.isEmpty()) return messages;
8290
AccessibleBuilder current;
@@ -85,8 +93,8 @@ private static List<Message> splitIntoMessages(final List<String> lines) {
8593
if (firstLine.startsWith("img=https://")) {
8694
messages.add(new AccessibleBuilder().setContent(firstLine.substring("img=".length())).build());
8795
current = new AccessibleBuilder();
88-
} else if (firstLine.startsWith("embed=https://")) {
89-
current = new AccessibleBuilder().addEmbed(EmbedParser.parse(readText(firstLine.substring("embed=".length()))).build());
96+
} else if (firstLine.startsWith("embed=")) {
97+
current = new AccessibleBuilder().addEmbed(embedRegistry.get(Integer.parseInt(firstLine.substring("embed=".length()))));
9098
} else {
9199
current = new AccessibleBuilder().append(firstLine);
92100
}
@@ -98,12 +106,12 @@ private static List<Message> splitIntoMessages(final List<String> lines) {
98106
messages.add(new AccessibleBuilder().setContent(it.substring("img=".length())).build());
99107
current = new AccessibleBuilder();
100108
continue;
101-
} else if (it.startsWith("embed=https://")) {
109+
} else if (it.startsWith("embed=")) {
102110
if (current.getEmbeds().size() >= Message.MAX_EMBED_COUNT) {
103111
messages.add(current.build());
104112
current = new AccessibleBuilder();
105113
}
106-
current.addEmbed(EmbedParser.parse(readText(it.substring("embed=".length()))).build());
114+
current.addEmbed(embedRegistry.get(Integer.parseInt(it.substring("embed=".length()))));
107115
continue;
108116
}
109117

@@ -113,6 +121,12 @@ private static List<Message> splitIntoMessages(final List<String> lines) {
113121
current = new AccessibleBuilder();
114122
}
115123

124+
if (it.trim().startsWith("-----")) {
125+
messages.add(current.build());
126+
current = new AccessibleBuilder();
127+
continue;
128+
}
129+
116130
if ((current + "\n" + it).length() > Message.MAX_CONTENT_LENGTH) {
117131
messages.add(current.build());
118132
current = new AccessibleBuilder();
@@ -126,12 +140,22 @@ private static List<Message> splitIntoMessages(final List<String> lines) {
126140
return messages;
127141
}
128142

129-
private static String readText(String url) {
130-
try (final var is = new URL(url).openStream()) {
131-
return new String(is.readAllBytes());
132-
} catch (Exception ignored) {
133-
return "";
143+
private static List<MessageEmbed> getEmbeds(final List<String> lines) {
144+
final List<MessageEmbed> embeds = new ArrayList<>();
145+
StringBuilder current = new StringBuilder();
146+
for (final String line : lines) {
147+
if (line.startsWith("-----")) {
148+
embeds.add(EmbedParser.parse(current.toString()).build());
149+
current = new StringBuilder();
150+
continue;
151+
}
152+
if (!current.isEmpty())
153+
current.append('\n');
154+
if (!line.isBlank())
155+
current.append(line);
134156
}
157+
if (!current.isEmpty()) embeds.add(EmbedParser.parse(current.toString()).build());
158+
return embeds;
135159
}
136160

137161
private static List<RuleData> collectRules(final List<String> lines) {

src/watcher/java/com/mcmoddev/mmdbot/watcher/rules/UpdateRulesCommand.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,9 @@
2828
import com.mcmoddev.mmdbot.watcher.TheWatcher;
2929
import com.mcmoddev.mmdbot.watcher.util.database.RulesDAO;
3030
import net.dv8tion.jda.api.Permission;
31+
import net.dv8tion.jda.api.entities.Guild;
3132
import net.dv8tion.jda.api.entities.Message;
3233
import net.dv8tion.jda.api.entities.MessageHistory;
33-
import net.dv8tion.jda.api.entities.emoji.Emoji;
3434
import net.dv8tion.jda.api.events.GenericEvent;
3535
import net.dv8tion.jda.api.events.interaction.component.ButtonInteractionEvent;
3636
import net.dv8tion.jda.api.interactions.commands.OptionMapping;
@@ -198,4 +198,8 @@ public static long getAcceptedRulesRole(long guildId) {
198198
return 0L;
199199
}
200200
}
201+
202+
public static String getRulesChannel(Guild guild) {
203+
return TheWatcher.getInstance().getJdbi().withExtension(RulesDAO.class, it -> it.get(guild.getIdLong(), RULES_CHANNEL_KEY));
204+
}
201205
}

0 commit comments

Comments
 (0)