Skip to content

Commit

Permalink
feat: guild only #20
Browse files Browse the repository at this point in the history
  • Loading branch information
yaansz committed Oct 7, 2024
1 parent 27a7c21 commit bf0a35b
Show file tree
Hide file tree
Showing 4 changed files with 122 additions and 11 deletions.
15 changes: 14 additions & 1 deletion src/main/java/com/softawii/Main.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,17 @@
import com.softawii.curupira.v2.integration.BasicContextProvider;
import net.dv8tion.jda.api.JDA;
import net.dv8tion.jda.api.JDABuilder;
import net.dv8tion.jda.api.requests.GatewayIntent;
import net.dv8tion.jda.api.utils.MemberCachePolicy;
import net.dv8tion.jda.api.utils.cache.CacheFlag;
import okhttp3.Cache;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Main {

private static final Logger logger = LoggerFactory.getLogger(Main.class);
Expand All @@ -24,9 +32,14 @@ public static void main(String[] args) throws InterruptedException, NoSuchMethod
context.registerInstance(ComplexController.class, new ComplexController());
context.registerInstance(TranslatedController.class, new TranslatedController());
context.registerInstance(AutoMenuController.class, new AutoMenuController());
context.registerInstance(AdminController.class, new AdminController());

JDABuilder builder = JDABuilder.createDefault(token);
JDABuilder builder = JDABuilder.createDefault(token)
.enableCache(CacheFlag.CLIENT_STATUS, CacheFlag.ONLINE_STATUS)
.enableIntents(GatewayIntent.GUILD_PRESENCES, GatewayIntent.GUILD_MEMBERS)
.setMemberCachePolicy(MemberCachePolicy.ALL);
JDA JDA = builder.build();
JDA.awaitReady();

boolean reset = false;
CurupiraBoot curupira = new CurupiraBoot(JDA, context, reset, pkg);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
String parent() default "";
String description() default "";
boolean hidden() default false;
long guildId() default 0L;
// Protection properties
// TODO: V2.1 Owners Only
Permission[] permissions() default {};
Expand All @@ -25,5 +26,4 @@
String resource() default "";
DiscordLocale[] locales() default {};
DiscordLocale defaultLocale() default DiscordLocale.ENGLISH_US;

}
36 changes: 27 additions & 9 deletions src/main/java/com/softawii/curupira/v2/core/InteractionMapper.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import com.softawii.curupira.v2.integration.ContextProvider;
import com.softawii.curupira.v2.utils.ScanUtils;
import net.dv8tion.jda.api.JDA;
import net.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.events.interaction.GenericInteractionCreateEvent;
import net.dv8tion.jda.api.events.interaction.ModalInteractionEvent;
import net.dv8tion.jda.api.events.interaction.command.CommandAutoCompleteInteractionEvent;
Expand All @@ -20,6 +21,7 @@
import net.dv8tion.jda.api.interactions.DiscordLocale;
import net.dv8tion.jda.api.interactions.commands.Command;
import net.dv8tion.jda.api.interactions.commands.DefaultMemberPermissions;
import net.dv8tion.jda.api.interactions.commands.build.CommandData;
import net.dv8tion.jda.api.interactions.commands.build.SubcommandData;
import net.dv8tion.jda.api.interactions.commands.build.SubcommandGroupData;
import net.dv8tion.jda.api.interactions.commands.localization.LocalizationFunction;
Expand All @@ -35,6 +37,8 @@

public class InteractionMapper {

private record CommandInfo(CommandDataImpl command, Long guildId) {}

private final Logger logger;
private final JDA jda;
private final ContextProvider context;
Expand All @@ -44,7 +48,7 @@ public class InteractionMapper {
private final ExceptionMapper exceptionMapper;
private final Map<String, CommandHandler> commands;
private final Map<String, InteractionHandler> interactions;
private final Map<String, CommandDataImpl> data;
private final Map<String, CommandInfo> data;

public InteractionMapper(JDA jda, ContextProvider context, ExceptionMapper exceptionMapper, boolean registerCommandsToDiscord, String ... packages) {
this.logger = LoggerFactory.getLogger(InteractionMapper.class);
Expand All @@ -64,9 +68,20 @@ public InteractionMapper(JDA jda, ContextProvider context, ExceptionMapper excep

private void apply() {
if(registerCommandsToDiscord) {
for(Map.Entry<String, CommandDataImpl> entry : data.entrySet()) {
this.logger.info("Apply command: {}", entry.getValue());
jda.upsertCommand(entry.getValue()).queue();
for(Map.Entry<String, CommandInfo> entry : data.entrySet()) {
if(entry.getValue().guildId == 0L) {
this.logger.info("Apply command: {}", entry.getValue().command);
jda.upsertCommand(entry.getValue().command).queue();
} else {
Guild guild = jda.getGuildById(entry.getValue().guildId);

if(guild != null) {
this.logger.info("Apply command: {}, Guild: {}", entry.getValue().command, guild.getId());
guild.upsertCommand(entry.getValue().command).queue();
} else {
this.logger.info("Fail to add command: {}, Guild: {}", entry.getValue().command, entry.getValue().guildId);
}
}
}
}
}
Expand Down Expand Up @@ -217,22 +232,25 @@ private void registerCommand(CommandHandler handler, DiscordController controlle
commandData.setDefaultPermissions(DefaultMemberPermissions.enabledFor(controllerInfo.permissions()));
commandData.setGuildOnly(controllerInfo.environment() == DiscordEnvironment.SERVER);
if(localization != null) commandData.setLocalizationFunction(localization);
this.data.put(name[0], commandData);

CommandInfo info = new CommandInfo(commandData, controllerInfo.guildId());

this.data.put(name[0], info);
}

// only 1 level of subcommands /foo
if(name.length == 1) {
this.data.get(name[0]).addOptions(handler.getOptions());
this.data.get(name[0]).command.addOptions(handler.getOptions());
}
// 2 levels of subcommands /foo bar
else if(name.length == 2) {
SubcommandData subcommandData = new SubcommandData(name[1], commandInfo.description());
subcommandData.addOptions(handler.getOptions());
this.data.get(name[0]).addSubcommands(subcommandData);
this.data.get(name[0]).command.addSubcommands(subcommandData);
}
// 3 levels of subcommands /foo bar baz
else if (name.length == 3) {
this.data.get(name[0]).getSubcommandGroups().stream().filter(group -> group.getName().equals(name[1])).findFirst().ifPresentOrElse(group -> {
this.data.get(name[0]).command.getSubcommandGroups().stream().filter(group -> group.getName().equals(name[1])).findFirst().ifPresentOrElse(group -> {
SubcommandData subcommandData = new SubcommandData(name[2], commandInfo.description());
subcommandData.addOptions(handler.getOptions());
group.addSubcommands(subcommandData);
Expand All @@ -241,7 +259,7 @@ else if (name.length == 3) {
SubcommandData subcommandData = new SubcommandData(name[2], commandInfo.description());
subcommandData.addOptions(handler.getOptions());
groupData.addSubcommands(subcommandData);
this.data.get(name[0]).addSubcommandGroups(groupData);
this.data.get(name[0]).command.addSubcommandGroups(groupData);
});
}
}
Expand Down
80 changes: 80 additions & 0 deletions src/main/java/com/softawii/example/controller/AdminController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
package com.softawii.example.controller;

import com.softawii.curupira.v2.annotations.DiscordController;
import com.softawii.curupira.v2.annotations.commands.DiscordCommand;
import com.softawii.curupira.v2.annotations.interactions.DiscordButton;
import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.JDA;
import net.dv8tion.jda.api.Permission;
import net.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.entities.MessageEmbed;
import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
import net.dv8tion.jda.api.events.interaction.component.ButtonInteractionEvent;
import net.dv8tion.jda.api.interactions.callbacks.IReplyCallback;
import net.dv8tion.jda.api.interactions.components.buttons.Button;

import java.awt.*;
import java.util.List;

@DiscordController(value = "admin", description = "hello!", guildId = 856534404779868180L, permissions = Permission.ADMINISTRATOR)
public class AdminController {

private static final int guildPageSize = 5;
private static final String adminGuildNextPage = "admin-guild-next-page";
private static final String adminGuildPrevPage = "admin-guild-prev-page";

private MessageEmbed paginateGuilds(List<Guild> guilds, int page) {
int maxPages = (int) Math.ceil((double) guilds.size() / AdminController.guildPageSize);

if(page < 0) {
page = 0;
} else if(page >= maxPages) {
page = maxPages - 1;
}

// Get the guilds for the current page
int start = page * AdminController.guildPageSize;
int end = Math.min(start + AdminController.guildPageSize, guilds.size());
List<Guild> guildsPage = guilds.subList(start, end);

EmbedBuilder embed = new EmbedBuilder()
.setTitle("Guilds (Page " + (page + 1) + "/" + maxPages + ")")
.setColor(Color.CYAN);

for (Guild guild : guildsPage) {
embed.addField(guild.getName(), "ID: " + guild.getId(), false);
}

return embed.build();
}

private void sendGetGuildsResponse(IReplyCallback event, JDA jda, int page) {
int maxPages = (int) Math.ceil((double) jda.getGuilds().size() / AdminController.guildPageSize);

Button next = Button.primary(adminGuildNextPage + ':' + (page + 1), "Next").withDisabled(page == maxPages - 1);
Button prev = Button.primary(adminGuildPrevPage + ':' + (page - 1), "Previous").withDisabled(page == 0);

MessageEmbed embed = paginateGuilds(jda.getGuilds(), page);

event.replyEmbeds(embed).addActionRow(prev, next).setEphemeral(true).queue();
}

@DiscordCommand(name = "guilds", description = "list all guilds", ephemeral = true)
public void getGuildsCommand(SlashCommandInteractionEvent event, JDA jda) {
sendGetGuildsResponse(event, jda, 0);
}

@DiscordButton(name = adminGuildPrevPage)
public void getPreviousPage(ButtonInteractionEvent event, JDA jda) {
int page = Integer.parseInt(event.getComponentId().split(":")[1]);
sendGetGuildsResponse(event, jda, page);
event.getMessage().delete().queue();
}

@DiscordButton(name = adminGuildNextPage)
public void getNextPage(ButtonInteractionEvent event, JDA jda) {
int page = Integer.parseInt(event.getComponentId().split(":")[1]);
sendGetGuildsResponse(event, jda, page);
event.getMessage().delete().queue();
}
}

0 comments on commit bf0a35b

Please sign in to comment.