Skip to content

Commit a7fcf5b

Browse files
authored
Add user installed commands (#1084)
* Add user installed dab command * Additional detached checks
1 parent e88cb2e commit a7fcf5b

File tree

11 files changed

+97
-10
lines changed

11 files changed

+97
-10
lines changed

ninbot-app/src/main/java/dev/nincodedo/ninbot/components/dab/DabMessageInteraction.java

+12-2
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,12 @@
44
import dev.nincodedo.nincord.message.MessageContextInteractionEventMessageExecutor;
55
import dev.nincodedo.nincord.message.MessageExecutor;
66
import net.dv8tion.jda.api.events.interaction.command.MessageContextInteractionEvent;
7+
import net.dv8tion.jda.api.interactions.IntegrationType;
78
import org.jetbrains.annotations.NotNull;
89
import org.springframework.stereotype.Component;
910

11+
import java.util.Set;
12+
1013
@Component
1114
public class DabMessageInteraction implements MessageContextCommand {
1215

@@ -16,18 +19,25 @@ public class DabMessageInteraction implements MessageContextCommand {
1619
this.dabber = dabber;
1720
}
1821

22+
@Override
23+
public Set<IntegrationType> allowedIntegrations() {
24+
return IntegrationType.ALL;
25+
}
26+
1927
@Override
2028
public MessageExecutor execute(@NotNull MessageContextInteractionEvent event,
2129
@NotNull MessageContextInteractionEventMessageExecutor messageExecutor) {
2230
messageExecutor.setOverrideMessage(event.getInteraction().getTarget());
23-
dabber.dabOnMessage(messageExecutor, event.getJDA().getShardManager(), event.getUser());
2431
var user = event.getTarget().getAuthor();
2532
var guild = event.getGuild();
26-
if (guild != null) {
33+
if (guild != null && !guild.isDetached()) {
34+
dabber.dabOnMessage(messageExecutor, event.getJDA().getShardManager(), event.getUser());
2735
var member = guild.getMember(user);
2836
if (member != null) {
2937
messageExecutor.addMessageResponse(dabber.buildDabMessage(member));
3038
}
39+
} else if (guild != null && guild.isDetached()) {
40+
messageExecutor.addMessageResponse(dabber.buildDabMessage(event.getTarget().getAuthor()));
3141
}
3242
return messageExecutor;
3343
}

ninbot-app/src/main/java/dev/nincodedo/ninbot/components/dab/Dabber.java

+9-1
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,8 @@ void dabOnMessage(MessageExecutor messageExecutor, ShardManager shardManager, Us
5858
messageExecutor.addReaction(getDabResponse().getEmojiList());
5959
}
6060

61-
var emoteList = shardManager.getEmojis().stream()
61+
var emoteList = shardManager.getEmojis()
62+
.stream()
6263
.filter(emoji -> emoji.getName().contains("dab"))
6364
.sorted(StreamUtils.shuffle())
6465
.distinct()
@@ -80,4 +81,11 @@ MessageCreateData buildDabMessage(@NotNull Member target) {
8081
.addContent(target.getEffectiveName())
8182
.build();
8283
}
84+
85+
public MessageCreateData buildDabMessage(User target) {
86+
return new MessageCreateBuilder().addContent("<:ninbotdab:786750382771535902>")
87+
.addContent(" ")
88+
.addContent(target.getEffectiveName())
89+
.build();
90+
}
8391
}

ninbot-app/src/main/java/dev/nincodedo/ninbot/components/dab/HugeDabMessageInteraction.java

+8
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
package dev.nincodedo.ninbot.components.dab;
22

3+
import net.dv8tion.jda.api.interactions.IntegrationType;
34
import org.springframework.stereotype.Component;
45

6+
import java.util.Set;
7+
58
@Component
69
public class HugeDabMessageInteraction extends DabMessageInteraction {
710
HugeDabMessageInteraction(HugeDabber hugeDabber) {
@@ -12,4 +15,9 @@ public class HugeDabMessageInteraction extends DabMessageInteraction {
1215
public String getName() {
1316
return DabCommandName.HUGEDAB.get();
1417
}
18+
19+
@Override
20+
public Set<IntegrationType> allowedIntegrations() {
21+
return Set.of(IntegrationType.GUILD_INSTALL);
22+
}
1523
}

ninbot-shared-parent/pom.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
<packaging>pom</packaging>
1414
<name>Ninbot Shared Parent Pom</name>
1515
<properties>
16-
<JDA.version>5.1.2</JDA.version>
16+
<JDA.version>5.3.0</JDA.version>
1717
<annotations.version>26.0.1</annotations.version>
1818
<archunit.version>1.3.0</archunit.version>
1919
<assertj-core.version>3.26.3</assertj-core.version>

nincord-common/src/main/java/dev/nincodedo/nincord/command/AutoCompleteCommand.java

+8
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,21 @@
11
package dev.nincodedo.nincord.command;
22

33
import net.dv8tion.jda.api.events.interaction.command.CommandAutoCompleteInteractionEvent;
4+
import net.dv8tion.jda.api.interactions.IntegrationType;
5+
6+
import java.util.Set;
47

58
public interface AutoCompleteCommand extends Command<CommandAutoCompleteInteractionEvent> {
69
@Override
710
default boolean isAbleToRegisterOnGuild() {
811
return false;
912
}
1013

14+
@Override
15+
default Set<IntegrationType> allowedIntegrations() {
16+
return Set.of(IntegrationType.UNKNOWN);
17+
}
18+
1119
@Override
1220
default CommandType getType() {
1321
return CommandType.AUTO_COMPLETE;

nincord-common/src/main/java/dev/nincodedo/nincord/command/Command.java

+6
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@
22

33
import dev.nincodedo.nincord.message.MessageExecutor;
44
import net.dv8tion.jda.api.interactions.DiscordLocale;
5+
import net.dv8tion.jda.api.interactions.IntegrationType;
56
import net.dv8tion.jda.api.interactions.commands.DefaultMemberPermissions;
67
import org.jetbrains.annotations.NotNull;
78

89
import java.util.Locale;
910
import java.util.ResourceBundle;
11+
import java.util.Set;
1012

1113
public interface Command<F> {
1214
Locale defaultLocale = Locale.ENGLISH;
@@ -45,4 +47,8 @@ default String resource(String resourceBundleKey) {
4547
default DefaultMemberPermissions getPermissions() {
4648
return DefaultMemberPermissions.ENABLED;
4749
}
50+
51+
default Set<IntegrationType> allowedIntegrations() {
52+
return Set.of(IntegrationType.GUILD_INSTALL);
53+
}
4854
}

nincord-common/src/main/java/dev/nincodedo/nincord/command/CommandRegistration.java

+14-6
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
import net.dv8tion.jda.api.JDA;
99
import net.dv8tion.jda.api.events.session.ReadyEvent;
1010
import net.dv8tion.jda.api.hooks.ListenerAdapter;
11+
import net.dv8tion.jda.api.interactions.IntegrationType;
12+
import net.dv8tion.jda.api.interactions.InteractionContextType;
1113
import net.dv8tion.jda.api.interactions.commands.build.CommandData;
1214
import net.dv8tion.jda.api.interactions.commands.build.Commands;
1315
import net.dv8tion.jda.api.interactions.commands.build.SlashCommandData;
@@ -40,8 +42,8 @@ private void registerCommands(JDA jda) {
4042
}
4143
try {
4244
List<CommandData> commandDataList = commands.stream()
43-
.filter(Command::isAbleToRegisterOnGuild)
44-
.map(this::convertToGuildCommandData)
45+
.filter(command -> !command.allowedIntegrations().contains(IntegrationType.UNKNOWN))
46+
.map(this::convertToCommandData)
4547
.toList();
4648
jda.updateCommands()
4749
.addCommands(commandDataList)
@@ -58,12 +60,14 @@ private void registerCommands(JDA jda) {
5860
* @param command Ninbot command to convert
5961
* @return JDA CommandData
6062
*/
61-
private CommandData convertToGuildCommandData(Command<?> command) {
63+
private CommandData convertToCommandData(Command<?> command) {
6264
return switch (command) {
6365
case SlashCommand slashCommand -> {
6466
SlashCommandData slashCommandData = Commands.slash(slashCommand.getName(),
6567
slashCommand.getDescription())
66-
.setDefaultPermissions(slashCommand.getPermissions());
68+
.setDefaultPermissions(slashCommand.getPermissions())
69+
.setContexts(InteractionContextType.ALL)
70+
.setIntegrationTypes(slashCommand.allowedIntegrations());
6771
try {
6872
if (!slashCommand.getCommandOptions().isEmpty()) {
6973
slashCommand.getCommandOptions().forEach(slashCommandData::addOptions);
@@ -78,9 +82,13 @@ private CommandData convertToGuildCommandData(Command<?> command) {
7882
yield slashCommandData;
7983
}
8084
case UserContextCommand userContextCommand -> Commands.user(userContextCommand.getName())
81-
.setDefaultPermissions(userContextCommand.getPermissions());
85+
.setDefaultPermissions(userContextCommand.getPermissions())
86+
.setContexts(InteractionContextType.ALL)
87+
.setIntegrationTypes(userContextCommand.allowedIntegrations());
8288
case MessageContextCommand messageContextCommand -> Commands.message(messageContextCommand.getName())
83-
.setDefaultPermissions(messageContextCommand.getPermissions());
89+
.setDefaultPermissions(messageContextCommand.getPermissions())
90+
.setContexts(InteractionContextType.ALL)
91+
.setIntegrationTypes(messageContextCommand.allowedIntegrations());
8492
default -> Commands.context(net.dv8tion.jda.api.interactions.commands.Command.Type.UNKNOWN, "null");
8593
};
8694
}

nincord-common/src/main/java/dev/nincodedo/nincord/command/component/ButtonInteraction.java

+8
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,12 @@
55
import dev.nincodedo.nincord.message.ButtonInteractionCommandMessageExecutor;
66
import dev.nincodedo.nincord.message.MessageExecutor;
77
import net.dv8tion.jda.api.events.interaction.component.ButtonInteractionEvent;
8+
import net.dv8tion.jda.api.interactions.IntegrationType;
89
import org.jetbrains.annotations.NotNull;
910
import org.slf4j.Logger;
1011

12+
import java.util.Set;
13+
1114
public interface ButtonInteraction extends Command<ButtonInteractionEvent>, Interaction {
1215

1316
@Override
@@ -20,6 +23,11 @@ default boolean isAbleToRegisterOnGuild() {
2023
return false;
2124
}
2225

26+
@Override
27+
default Set<IntegrationType> allowedIntegrations() {
28+
return Set.of(IntegrationType.UNKNOWN);
29+
}
30+
2331
@Override
2432
default MessageExecutor execute(@NotNull ButtonInteractionEvent event) {
2533
var componentDataOptional = getComponentDataFromEvent(event);

nincord-common/src/main/java/dev/nincodedo/nincord/command/component/ModalInteraction.java

+8
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,12 @@
55
import dev.nincodedo.nincord.message.MessageExecutor;
66
import dev.nincodedo.nincord.message.ModalInteractionCommandMessageExecutor;
77
import net.dv8tion.jda.api.events.interaction.ModalInteractionEvent;
8+
import net.dv8tion.jda.api.interactions.IntegrationType;
89
import org.jetbrains.annotations.NotNull;
910
import org.slf4j.Logger;
1011

12+
import java.util.Set;
13+
1114
public interface ModalInteraction extends Command<ModalInteractionEvent>,
1215
Interaction {
1316
@Override
@@ -36,5 +39,10 @@ default boolean isAbleToRegisterOnGuild() {
3639
return false;
3740
}
3841

42+
@Override
43+
default Set<IntegrationType> allowedIntegrations() {
44+
return Set.of(IntegrationType.UNKNOWN);
45+
}
46+
3947
Logger log();
4048
}

nincord-common/src/main/java/dev/nincodedo/nincord/command/component/StringSelectMenuInteraction.java

+8
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,12 @@
55
import dev.nincodedo.nincord.message.MessageExecutor;
66
import dev.nincodedo.nincord.message.StringSelectMenuInteractionCommandMessageExecutor;
77
import net.dv8tion.jda.api.events.interaction.component.StringSelectInteractionEvent;
8+
import net.dv8tion.jda.api.interactions.IntegrationType;
89
import org.jetbrains.annotations.NotNull;
910
import org.slf4j.Logger;
1011

12+
import java.util.Set;
13+
1114
public interface StringSelectMenuInteraction extends Command<StringSelectInteractionEvent>, Interaction {
1215
@Override
1316
default CommandType getType() {
@@ -19,6 +22,11 @@ default boolean isAbleToRegisterOnGuild() {
1922
return false;
2023
}
2124

25+
@Override
26+
default Set<IntegrationType> allowedIntegrations() {
27+
return Set.of(IntegrationType.UNKNOWN);
28+
}
29+
2230
MessageExecutor execute(@NotNull StringSelectInteractionEvent event,
2331
@NotNull StringSelectMenuInteractionCommandMessageExecutor messageExecutor,
2432
@NotNull ComponentData componentData);

nincord-common/src/main/java/dev/nincodedo/nincord/logging/FormatLogObject.java

+15
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@ public static String guildName(Guild guild) {
3333
if (guild == null) {
3434
return "null guild";
3535
}
36+
if (guild.isDetached()) {
37+
return NAME_ID_ENTITY_FORMAT.formatted("Detached Guild", guild.getId());
38+
}
3639
return NAME_ID_ENTITY_FORMAT.formatted(guild.getName(), guild.getId());
3740
}
3841

@@ -46,6 +49,9 @@ public static String guildInfo(Guild guild) {
4649
if (guild == null) {
4750
return "null guild";
4851
}
52+
if (guild.isDetached()) {
53+
return "Server %s".formatted(guildName(guild));
54+
}
4955
return "Server %s, Owner %s".formatted(guildName(guild), memberInfo(guild.retrieveOwner().complete()));
5056
}
5157

@@ -56,6 +62,9 @@ public static String guildInfo(Guild guild) {
5662
* @return String of member name(member id)
5763
*/
5864
public static String memberInfo(Member member) {
65+
if (member.isDetached()) {
66+
return NAME_ID_ENTITY_FORMAT.formatted("Detached Member", member.getId());
67+
}
5968
return NAME_ID_ENTITY_FORMAT.formatted(member.getEffectiveName(), member.getId());
6069
}
6170

@@ -69,6 +78,9 @@ public static String channelInfo(Channel channel) {
6978
if (channel == null) {
7079
return "null channel";
7180
}
81+
if (channel.isDetached()) {
82+
return NAME_ID_ENTITY_FORMAT.formatted("Detached Channel", channel.getId());
83+
}
7284
return NAME_ID_ENTITY_FORMAT.formatted(channel.getName(), channel.getId());
7385
}
7486

@@ -95,6 +107,9 @@ public static String roleInfo(Role role) {
95107
if (role == null) {
96108
return "null role";
97109
}
110+
if (role.isDetached()) {
111+
return NAME_ID_ENTITY_FORMAT.formatted("Detached Role", role.getId());
112+
}
98113
return NAME_ID_ENTITY_FORMAT.formatted(role.getName(), role.getId());
99114
}
100115
}

0 commit comments

Comments
 (0)