Skip to content

Commit a60bdca

Browse files
committed
Read requirement annotations
1 parent d7b6ed2 commit a60bdca

File tree

3 files changed

+103
-51
lines changed

3 files changed

+103
-51
lines changed

src/main/java/net/dv8tion/jda/api/Permission.java

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,14 @@
1717

1818
import net.dv8tion.jda.annotations.ForRemoval;
1919
import net.dv8tion.jda.annotations.ReplaceWith;
20+
import net.dv8tion.jda.api.events.GenericEvent;
21+
import net.dv8tion.jda.api.events.annotations.RequiredPermissions;
2022
import net.dv8tion.jda.internal.utils.Checks;
2123

2224
import javax.annotation.Nonnull;
2325
import java.util.Arrays;
2426
import java.util.Collection;
27+
import java.util.Collections;
2528
import java.util.EnumSet;
2629
import java.util.stream.Collectors;
2730

@@ -350,4 +353,48 @@ public static long getRaw(@Nonnull Collection<Permission> permissions)
350353

351354
return getRaw(permissions.toArray(EMPTY_PERMISSIONS));
352355
}
356+
357+
/**
358+
* Parse the required permissions from the provided {@link GenericEvent Event Types}.
359+
*
360+
* @param events
361+
* The event types
362+
*
363+
* @throws IllegalArgumentException
364+
* If provided with null
365+
*
366+
* @return {@link EnumSet} for the required permissions
367+
*/
368+
@Nonnull
369+
@SafeVarargs
370+
public static EnumSet<Permission> fromEvents(@Nonnull Class<? extends GenericEvent>... events)
371+
{
372+
Checks.noneNull(events, "Event");
373+
return fromEvents(Arrays.asList(events));
374+
}
375+
376+
/**
377+
* Parse the required permissions from the provided {@link GenericEvent Event Types}.
378+
*
379+
* @param events
380+
* The event types
381+
*
382+
* @throws IllegalArgumentException
383+
* If provided with null
384+
*
385+
* @return {@link EnumSet} for the required permissions
386+
*/
387+
@Nonnull
388+
public static EnumSet<Permission> fromEvents(@Nonnull Collection<Class<? extends GenericEvent>> events)
389+
{
390+
Checks.noneNull(events, "Events");
391+
EnumSet<Permission> flags = EnumSet.noneOf(Permission.class);
392+
for (Class<? extends GenericEvent> event : events)
393+
{
394+
final RequiredPermissions requiredPermissions = event.getDeclaredAnnotation(RequiredPermissions.class);
395+
if (requiredPermissions != null)
396+
Collections.addAll(flags, requiredPermissions.always());
397+
}
398+
return flags;
399+
}
353400
}

src/main/java/net/dv8tion/jda/api/requests/GatewayIntent.java

Lines changed: 6 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -19,24 +19,8 @@
1919
import net.dv8tion.jda.api.entities.Member;
2020
import net.dv8tion.jda.api.entities.Message;
2121
import net.dv8tion.jda.api.events.GenericEvent;
22-
import net.dv8tion.jda.api.events.automod.AutoModExecutionEvent;
23-
import net.dv8tion.jda.api.events.automod.GenericAutoModRuleEvent;
24-
import net.dv8tion.jda.api.events.emoji.GenericEmojiEvent;
25-
import net.dv8tion.jda.api.events.guild.GuildAuditLogEntryCreateEvent;
26-
import net.dv8tion.jda.api.events.guild.GuildBanEvent;
27-
import net.dv8tion.jda.api.events.guild.GuildUnbanEvent;
28-
import net.dv8tion.jda.api.events.guild.invite.GenericGuildInviteEvent;
29-
import net.dv8tion.jda.api.events.guild.member.GenericGuildMemberEvent;
30-
import net.dv8tion.jda.api.events.guild.member.GuildMemberRemoveEvent;
31-
import net.dv8tion.jda.api.events.guild.scheduledevent.update.GenericScheduledEventUpdateEvent;
32-
import net.dv8tion.jda.api.events.guild.voice.GenericGuildVoiceEvent;
22+
import net.dv8tion.jda.api.events.annotations.RequiredIntents;
3323
import net.dv8tion.jda.api.events.message.GenericMessageEvent;
34-
import net.dv8tion.jda.api.events.message.MessageBulkDeleteEvent;
35-
import net.dv8tion.jda.api.events.message.react.GenericMessageReactionEvent;
36-
import net.dv8tion.jda.api.events.sticker.GenericGuildStickerEvent;
37-
import net.dv8tion.jda.api.events.user.UserTypingEvent;
38-
import net.dv8tion.jda.api.events.user.update.GenericUserPresenceEvent;
39-
import net.dv8tion.jda.api.events.user.update.GenericUserUpdateEvent;
4024
import net.dv8tion.jda.api.utils.cache.CacheFlag;
4125
import net.dv8tion.jda.internal.utils.Checks;
4226

@@ -394,44 +378,15 @@ public static EnumSet<GatewayIntent> fromEvents(@Nonnull Class<? extends Generic
394378
@Nonnull
395379
public static EnumSet<GatewayIntent> fromEvents(@Nonnull Collection<Class<? extends GenericEvent>> events)
396380
{
381+
Checks.noneNull(events, "Events");
397382
EnumSet<GatewayIntent> intents = EnumSet.noneOf(GatewayIntent.class);
398383
for (Class<? extends GenericEvent> event : events)
399384
{
400-
Checks.notNull(event, "Event");
401-
402-
if (GenericUserPresenceEvent.class.isAssignableFrom(event))
403-
intents.add(GUILD_PRESENCES);
404-
else if (GenericUserUpdateEvent.class.isAssignableFrom(event) || GenericGuildMemberEvent.class.isAssignableFrom(event) || GuildMemberRemoveEvent.class.isAssignableFrom(event))
405-
intents.add(GUILD_MEMBERS);
406-
407-
else if (GuildBanEvent.class.isAssignableFrom(event) || GuildUnbanEvent.class.isAssignableFrom(event) || GuildAuditLogEntryCreateEvent.class.isAssignableFrom(event))
408-
intents.add(GUILD_MODERATION);
409-
else if (GenericEmojiEvent.class.isAssignableFrom(event) || GenericGuildStickerEvent.class.isAssignableFrom(event))
410-
intents.add(GUILD_EMOJIS_AND_STICKERS);
411-
else if (GenericScheduledEventUpdateEvent.class.isAssignableFrom(event))
412-
intents.add(SCHEDULED_EVENTS);
413-
else if (GenericGuildInviteEvent.class.isAssignableFrom(event))
414-
intents.add(GUILD_INVITES);
415-
else if (GenericGuildVoiceEvent.class.isAssignableFrom(event))
416-
intents.add(GUILD_VOICE_STATES);
417-
418-
else if (MessageBulkDeleteEvent.class.isAssignableFrom(event))
419-
intents.add(GUILD_MESSAGES);
420-
421-
else if (GenericMessageReactionEvent.class.isAssignableFrom(event))
422-
Collections.addAll(intents, GUILD_MESSAGE_REACTIONS, DIRECT_MESSAGE_REACTIONS);
423-
424-
else if (GenericMessageEvent.class.isAssignableFrom(event))
425-
Collections.addAll(intents, GUILD_MESSAGES, DIRECT_MESSAGES);
426-
427-
else if (UserTypingEvent.class.isAssignableFrom(event))
428-
Collections.addAll(intents, GUILD_MESSAGE_TYPING, DIRECT_MESSAGE_TYPING);
429-
430-
else if (AutoModExecutionEvent.class.isAssignableFrom(event))
431-
intents.add(AUTO_MODERATION_EXECUTION);
432-
else if (GenericAutoModRuleEvent.class.isAssignableFrom(event))
433-
intents.add(AUTO_MODERATION_CONFIGURATION);
385+
final RequiredIntents requiredIntents = event.getDeclaredAnnotation(RequiredIntents.class);
386+
if (requiredIntents != null)
387+
Collections.addAll(intents, requiredIntents.always());
434388
}
389+
435390
return intents;
436391
}
437392

src/main/java/net/dv8tion/jda/api/utils/cache/CacheFlag.java

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,16 @@
2121
import net.dv8tion.jda.api.entities.Role;
2222
import net.dv8tion.jda.api.entities.channel.attribute.IPostContainer;
2323
import net.dv8tion.jda.api.entities.channel.concrete.ThreadChannel;
24+
import net.dv8tion.jda.api.events.GenericEvent;
25+
import net.dv8tion.jda.api.events.annotations.RequiredCacheFlags;
2426
import net.dv8tion.jda.api.requests.GatewayIntent;
27+
import net.dv8tion.jda.internal.utils.Checks;
2528

2629
import javax.annotation.Nonnull;
2730
import javax.annotation.Nullable;
31+
import java.util.Arrays;
32+
import java.util.Collection;
33+
import java.util.Collections;
2834
import java.util.EnumSet;
2935

3036
/**
@@ -137,4 +143,48 @@ public static EnumSet<CacheFlag> getPrivileged()
137143
{
138144
return EnumSet.copyOf(privileged);
139145
}
146+
147+
/**
148+
* Parse the required cache flags from the provided {@link GenericEvent Event Types}.
149+
*
150+
* @param events
151+
* The event types
152+
*
153+
* @throws IllegalArgumentException
154+
* If provided with null
155+
*
156+
* @return {@link EnumSet} for the required cache flags
157+
*/
158+
@Nonnull
159+
@SafeVarargs
160+
public static EnumSet<CacheFlag> fromEvents(@Nonnull Class<? extends GenericEvent>... events)
161+
{
162+
Checks.noneNull(events, "Event");
163+
return fromEvents(Arrays.asList(events));
164+
}
165+
166+
/**
167+
* Parse the required cache flags from the provided {@link GenericEvent Event Types}.
168+
*
169+
* @param events
170+
* The event types
171+
*
172+
* @throws IllegalArgumentException
173+
* If provided with null
174+
*
175+
* @return {@link EnumSet} for the required cache flags
176+
*/
177+
@Nonnull
178+
public static EnumSet<CacheFlag> fromEvents(@Nonnull Collection<Class<? extends GenericEvent>> events)
179+
{
180+
Checks.noneNull(events, "Events");
181+
EnumSet<CacheFlag> flags = EnumSet.noneOf(CacheFlag.class);
182+
for (Class<? extends GenericEvent> event : events)
183+
{
184+
final RequiredCacheFlags requiredCacheFlags = event.getDeclaredAnnotation(RequiredCacheFlags.class);
185+
if (requiredCacheFlags != null)
186+
Collections.addAll(flags, requiredCacheFlags.always());
187+
}
188+
return flags;
189+
}
140190
}

0 commit comments

Comments
 (0)