From b0b7773d91a0edee5987b4cb0886c3b8a2b56914 Mon Sep 17 00:00:00 2001 From: amy null Date: Thu, 25 Nov 2021 13:03:37 -0500 Subject: [PATCH] feature: Guild scheduled events (closes #633) --- .../catnip/entity/guild/ScheduledEvent.java | 201 ++++++++++++++++++ .../catnip/entity/guild/audit/ActionType.java | 15 +- .../catnip/entity/impl/EntityBuilder.java | 38 +++- .../catnip/entity/impl/guild/GuildImpl.java | 4 +- .../entity/impl/guild/ScheduledEventImpl.java | 84 ++++++++ .../mewna/catnip/entity/util/Permission.java | 2 +- .../com/mewna/catnip/shard/DiscordEvent.java | 92 ++++---- .../mewna/catnip/shard/DispatchEmitter.java | 5 + .../com/mewna/catnip/shard/GatewayIntent.java | 13 ++ 9 files changed, 405 insertions(+), 49 deletions(-) create mode 100644 src/main/java/com/mewna/catnip/entity/guild/ScheduledEvent.java create mode 100644 src/main/java/com/mewna/catnip/entity/impl/guild/ScheduledEventImpl.java diff --git a/src/main/java/com/mewna/catnip/entity/guild/ScheduledEvent.java b/src/main/java/com/mewna/catnip/entity/guild/ScheduledEvent.java new file mode 100644 index 0000000000..9c66286884 --- /dev/null +++ b/src/main/java/com/mewna/catnip/entity/guild/ScheduledEvent.java @@ -0,0 +1,201 @@ +/* + * Copyright (c) 2021 amy, All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors + * may be used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package com.mewna.catnip.entity.guild; + +import com.mewna.catnip.entity.partials.GuildEntity; +import com.mewna.catnip.entity.partials.Snowflake; +import com.mewna.catnip.entity.partials.Timestamped; +import com.mewna.catnip.entity.user.User; +import lombok.Getter; + +import javax.annotation.CheckReturnValue; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.time.OffsetDateTime; +import java.util.List; + +/** + * @author amy + * @since 11/25/21. + */ +public interface ScheduledEvent extends Snowflake, GuildEntity, Timestamped { + @Nullable + @CheckReturnValue + default String channelId() { + return Long.toUnsignedString(channelIdAsLong()); + } + + @CheckReturnValue + long channelIdAsLong(); + + @Nullable + @CheckReturnValue + default String creatorId() { + return Long.toUnsignedString(creatorIdAsLong()); + } + + @CheckReturnValue + long creatorIdAsLong(); + + @CheckReturnValue + String name(); + + @Nullable + @CheckReturnValue + String description(); + + @Nonnull + @CheckReturnValue + default OffsetDateTime scheduledStartTime() { + return parseTimestamp(scheduledStartTimeRaw()); + } + + @Nonnull + @CheckReturnValue + String scheduledStartTimeRaw(); + + @Nullable + @CheckReturnValue + default OffsetDateTime scheduledEndTime() { + return parseTimestamp(scheduledEndTimeRaw()); + } + + @Nullable + @CheckReturnValue + String scheduledEndTimeRaw(); + + @Nonnull + @CheckReturnValue + PrivacyLevel privacyLevel(); + + @Nonnull + @CheckReturnValue + EventStatus status(); + + @Nonnull + @CheckReturnValue + EventEntityType entityType(); + + @Nullable + @CheckReturnValue + String entityId(); + + @Nullable + @CheckReturnValue + EntityMetadata entityMetadata(); + + @Nullable + @CheckReturnValue + User creator(); + + @CheckReturnValue + int userCount(); + + enum PrivacyLevel { + PUBLIC(1), + GUILD_ONLY(2), + ; + + @Getter + private final int key; + + PrivacyLevel(final int key) { + this.key = key; + } + + @Nonnull + public static PrivacyLevel byKey(final int key) { + for(final PrivacyLevel level : values()) { + if(level.key == key) { + return level; + } + } + throw new IllegalArgumentException("No privacy level for key " + key); + } + } + + enum EventEntityType { + NONE(0), + STAGE_INSTANCE(1), + VOICE(2), + EXTERNAL(3), + ; + + @Getter + private final int key; + + EventEntityType(final int key) { + this.key = key; + } + + @Nonnull + public static EventEntityType byKey(final int key) { + for(final EventEntityType level : values()) { + if(level.key == key) { + return level; + } + } + throw new IllegalArgumentException("No event entity type for key " + key); + } + } + + enum EventStatus { + SCHEDULED(1), + ACTIVE(2), + COMPLETED(3), + CANCELED(4), + ; + + @Getter + private final int key; + + EventStatus(final int key) { + this.key = key; + } + + @Nonnull + public static EventStatus byKey(final int key) { + for(final EventStatus level : values()) { + if(level.key == key) { + return level; + } + } + throw new IllegalArgumentException("No event status for key " + key); + } + } + + interface EntityMetadata { + @Nullable + @CheckReturnValue + List speakerIds(); + + @Nullable + @CheckReturnValue + String location(); + } +} diff --git a/src/main/java/com/mewna/catnip/entity/guild/audit/ActionType.java b/src/main/java/com/mewna/catnip/entity/guild/audit/ActionType.java index 214c1f6c0d..dc98b2f283 100644 --- a/src/main/java/com/mewna/catnip/entity/guild/audit/ActionType.java +++ b/src/main/java/com/mewna/catnip/entity/guild/audit/ActionType.java @@ -72,7 +72,20 @@ public enum ActionType { MESSAGE_UNPIN(75), INTEGRATION_CREATE(80), INTEGRATION_UPDATE(81), - INTEGRATION_DELETE(82); + INTEGRATION_DELETE(82), + STAGE_INSTANCE_CREATE(83), + STAGE_INSTANCE_UPDATE(84), + STAGE_INSTANCE_DELETE(85), + STICKER_CREATE(90), + STICKER_UPDATE(91), + STICKER_DELETE(92), + GUILD_SCHEDULED_EVENT_CREATE(100), + GUILD_SCHEDULED_EVENT_UPDATE(101), + GUILD_SCHEDULED_EVENT_DELETE(102), + THREAD_CREATE(110), + THREAD_UPDATE(111), + THREAD_DELETE(112), + ; @Getter private final int value; diff --git a/src/main/java/com/mewna/catnip/entity/impl/EntityBuilder.java b/src/main/java/com/mewna/catnip/entity/impl/EntityBuilder.java index d243430796..73114dd31b 100644 --- a/src/main/java/com/mewna/catnip/entity/impl/EntityBuilder.java +++ b/src/main/java/com/mewna/catnip/entity/impl/EntityBuilder.java @@ -40,6 +40,10 @@ import com.mewna.catnip.entity.guild.Invite.InviteGuild; import com.mewna.catnip.entity.guild.Invite.Inviter; import com.mewna.catnip.entity.guild.PermissionOverride.OverrideType; +import com.mewna.catnip.entity.guild.ScheduledEvent.EntityMetadata; +import com.mewna.catnip.entity.guild.ScheduledEvent.EventEntityType; +import com.mewna.catnip.entity.guild.ScheduledEvent.EventStatus; +import com.mewna.catnip.entity.guild.ScheduledEvent.PrivacyLevel; import com.mewna.catnip.entity.guild.audit.*; import com.mewna.catnip.entity.impl.channel.*; import com.mewna.catnip.entity.impl.channel.ThreadChannelImpl.ThreadMemberImpl; @@ -48,6 +52,7 @@ import com.mewna.catnip.entity.impl.guild.InviteImpl.InviteChannelImpl; import com.mewna.catnip.entity.impl.guild.InviteImpl.InviteGuildImpl; import com.mewna.catnip.entity.impl.guild.InviteImpl.InviterImpl; +import com.mewna.catnip.entity.impl.guild.ScheduledEventImpl.EntityMetadataImpl; import com.mewna.catnip.entity.impl.guild.audit.*; import com.mewna.catnip.entity.impl.interaction.CustomIdInteractionDataImpl; import com.mewna.catnip.entity.impl.interaction.InteractionMemberImpl; @@ -102,7 +107,7 @@ * @author natanbc * @since 9/2/18. */ -@SuppressWarnings({"WeakerAccess", "OverlyCoupledClass", "DuplicatedCode"}) +@SuppressWarnings({"WeakerAccess", "OverlyCoupledClass", "DuplicatedCode", "ClassCanBeRecord"}) public final class EntityBuilder { private final Catnip catnip; @@ -1795,4 +1800,35 @@ public ThreadMembersUpdate createThreadMembersUpdate(@Nonnull final JsonObject d .removedMembers(toStringList(data.getArray("removed_members", new JsonArray()))) .build()); } + + @Nonnull + @CheckReturnValue + public ScheduledEvent createScheduledEvent(@Nonnull final JsonObject data) { + return delegate(ScheduledEvent.class, ScheduledEventImpl.builder() + .idAsLong(Long.parseUnsignedLong(data.getString("id"))) + .guildIdAsLong(Long.parseUnsignedLong(data.getString("guild_id"))) + .channelIdAsLong(Long.parseUnsignedLong(data.getString("channel_id", "0"))) + .creatorIdAsLong(Long.parseUnsignedLong(data.getString("creator_id", "0"))) + .name(data.getString("name")) + .description(data.getString("description")) + .scheduledStartTimeRaw(data.getString("scheduled_start_time")) + .scheduledEndTimeRaw(data.getString("scheduled_end_time")) + .privacyLevel(PrivacyLevel.byKey(data.getInt("privacy_level"))) + .status(EventStatus.byKey(data.getInt("status"))) + .entityType(EventEntityType.byKey(data.getInt("entity_type"))) + .entityId(data.getString("entity_id")) + .entityMetadata(createScheduledEventEntityMetadata(data.getObject("entity_metadata"))) + .creator(data.has("creator") ? createUser(data.getObject("creator")) : null) + .userCount(data.getInt("user_count", 0)) + .build()); + } + + @Nonnull + @CheckReturnValue + public EntityMetadata createScheduledEventEntityMetadata(@Nonnull final JsonObject data) { + return delegate(EntityMetadata.class, EntityMetadataImpl.builder() + .speakerIds(data.has("speaker_ids") ? toStringList(data.getArray("speaker_ids")) : List.of()) + .location(data.getString("location")) + .build()); + } } diff --git a/src/main/java/com/mewna/catnip/entity/impl/guild/GuildImpl.java b/src/main/java/com/mewna/catnip/entity/impl/guild/GuildImpl.java index 1f6ef32cdd..87158bcbaa 100644 --- a/src/main/java/com/mewna/catnip/entity/impl/guild/GuildImpl.java +++ b/src/main/java/com/mewna/catnip/entity/impl/guild/GuildImpl.java @@ -28,8 +28,6 @@ package com.mewna.catnip.entity.impl.guild; import com.mewna.catnip.Catnip; -import com.mewna.catnip.entity.RequiresCatnip; -import com.mewna.catnip.entity.partials.Timestamped; import com.mewna.catnip.entity.guild.Guild; import com.mewna.catnip.entity.guild.GuildFeature; import com.mewna.catnip.entity.util.ImageOptions; @@ -55,7 +53,7 @@ @Accessors(fluent = true) @NoArgsConstructor @AllArgsConstructor -public class GuildImpl implements Guild, RequiresCatnip, Timestamped { +public class GuildImpl implements Guild { private transient Catnip catnip; private long idAsLong; diff --git a/src/main/java/com/mewna/catnip/entity/impl/guild/ScheduledEventImpl.java b/src/main/java/com/mewna/catnip/entity/impl/guild/ScheduledEventImpl.java new file mode 100644 index 0000000000..280e445370 --- /dev/null +++ b/src/main/java/com/mewna/catnip/entity/impl/guild/ScheduledEventImpl.java @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2021 amy, All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its contributors + * may be used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package com.mewna.catnip.entity.impl.guild; + +import com.mewna.catnip.Catnip; +import com.mewna.catnip.entity.RequiresCatnip; +import com.mewna.catnip.entity.guild.ScheduledEvent; +import com.mewna.catnip.entity.user.User; +import lombok.*; +import lombok.experimental.Accessors; + +import javax.annotation.Nonnull; +import java.util.List; + +/** + * @author amy + * @since 11/25/21. + */ +@Getter +@Setter +@Builder +@Accessors(fluent = true) +@NoArgsConstructor +@AllArgsConstructor +public class ScheduledEventImpl implements ScheduledEvent, RequiresCatnip { + private transient Catnip catnip; + + private long idAsLong; + private long guildIdAsLong; + private long channelIdAsLong; + private long creatorIdAsLong; + private String name; + private String description; + private String scheduledStartTimeRaw; + private String scheduledEndTimeRaw; + private PrivacyLevel privacyLevel; + private EventStatus status; + private EventEntityType entityType; + private String entityId; + private EntityMetadata entityMetadata; + private User creator; + private int userCount; + + @Override + public void catnip(@Nonnull final Catnip catnip) { + this.catnip = catnip; + } + + @Getter + @Setter + @Builder + @Accessors(fluent = true) + @NoArgsConstructor + @AllArgsConstructor + public static class EntityMetadataImpl implements EntityMetadata { + private List speakerIds; + private String location; + } +} diff --git a/src/main/java/com/mewna/catnip/entity/util/Permission.java b/src/main/java/com/mewna/catnip/entity/util/Permission.java index e6b19e63ee..48db29c00c 100644 --- a/src/main/java/com/mewna/catnip/entity/util/Permission.java +++ b/src/main/java/com/mewna/catnip/entity/util/Permission.java @@ -73,7 +73,7 @@ public enum Permission { MANAGE_EMOJIS_AND_STICKERS(1L << 30, false, "Manage Emojis & Stickers"), USE_APPLICATION_COMMANDS(1L << 31, true, "Use Application Commands"), REQUEST_TO_SPEAK(1L << 32L, true, "Request To Speak"), - MANAGE_EVENTS(1L << 33, false, "Manage Guild Events"), // This permission is still an experiment, but will come soon + MANAGE_EVENTS(1L << 33, false, "Manage Guild Events"), MANAGE_THREADS(1L << 34, true, "Manage Threads"), /** * Replaced by {@link #CREATE_PUBLIC_THREADS}. See https://github.com/discord/discord-api-docs/pull/3672 diff --git a/src/main/java/com/mewna/catnip/shard/DiscordEvent.java b/src/main/java/com/mewna/catnip/shard/DiscordEvent.java index a2f13b4bff..7f66912e9b 100644 --- a/src/main/java/com/mewna/catnip/shard/DiscordEvent.java +++ b/src/main/java/com/mewna/catnip/shard/DiscordEvent.java @@ -50,51 +50,54 @@ * @author amy * @since 9/2/18. */ -@SuppressWarnings("unused") +@SuppressWarnings({"unused", "rawtypes"}) public interface DiscordEvent { // @formatter:off - EventType CHANNEL_CREATE = event(Raw.CHANNEL_CREATE, Channel.class); - DoubleEventType CHANNEL_UPDATE = doubleEvent(Raw.CHANNEL_UPDATE, Channel.class, Channel.class); - EventType CHANNEL_DELETE = event(Raw.CHANNEL_DELETE, Channel.class); - EventType CHANNEL_PINS_UPDATE = event(Raw.CHANNEL_PINS_UPDATE, ChannelPinsUpdate.class); - EventType WEBHOOKS_UPDATE = event(Raw.WEBHOOKS_UPDATE, WebhooksUpdate.class); - EventType GUILD_CREATE = event(Raw.GUILD_CREATE, Guild.class); - EventType GUILD_AVAILABLE = event(Raw.GUILD_AVAILABLE, Guild.class); - EventType GUILD_DELETE = event(Raw.GUILD_DELETE, Guild.class); - EventType GUILD_UNAVAILABLE = event(Raw.GUILD_UNAVAILABLE, UnavailableGuild.class); - DoubleEventType GUILD_UPDATE = doubleEvent(Raw.GUILD_UPDATE, Guild.class, Guild.class); - EventType GUILD_EMOJIS_UPDATE = event(Raw.GUILD_EMOJIS_UPDATE, EmojiUpdate.class); - EventType GUILD_MEMBER_ADD = event(Raw.GUILD_MEMBER_ADD, Member.class); - EventType GUILD_MEMBER_REMOVE = event(Raw.GUILD_MEMBER_REMOVE, Member.class); - DoubleEventType GUILD_MEMBER_UPDATE = doubleEvent(Raw.GUILD_MEMBER_UPDATE, Member.class, PartialMember.class); - EventType GUILD_ROLE_CREATE = event(Raw.GUILD_ROLE_CREATE, Role.class); - DoubleEventType GUILD_ROLE_UPDATE = doubleEvent(Raw.GUILD_ROLE_UPDATE, Role.class, Role.class); - EventType GUILD_ROLE_DELETE = event(Raw.GUILD_ROLE_DELETE, PartialRole.class); - DoubleEventType USER_UPDATE = doubleEvent(Raw.USER_UPDATE, User.class, User.class); - EventType VOICE_SERVER_UPDATE = event(Raw.VOICE_SERVER_UPDATE, VoiceServerUpdate.class); - EventType INVITE_CREATE = event(Raw.INVITE_CREATE, Invite.class); - EventType INVITE_DELETE = event(Raw.INVITE_CREATE, Invite.class); - EventType MESSAGE_CREATE = event(Raw.MESSAGE_CREATE, Message.class); - EventType MESSAGE_UPDATE = event(Raw.MESSAGE_UPDATE, Message.class); - EventType MESSAGE_EMBEDS_UPDATE = event(Raw.MESSAGE_EMBEDS_UPDATE, MessageEmbedUpdate.class); - EventType MESSAGE_DELETE = event(Raw.MESSAGE_DELETE, DeletedMessage.class); - EventType MESSAGE_DELETE_BULK = event(Raw.MESSAGE_DELETE_BULK, BulkDeletedMessages.class); - EventType GUILD_INTEGRATIONS_UPDATE = event(Raw.GUILD_INTEGRATIONS_UPDATE, String.class); - EventType GUILD_BAN_ADD = event(Raw.GUILD_BAN_ADD, GatewayGuildBan.class); - EventType GUILD_BAN_REMOVE = event(Raw.GUILD_BAN_REMOVE, GatewayGuildBan.class); - EventType MESSAGE_REACTION_ADD = event(Raw.MESSAGE_REACTION_ADD, ReactionUpdate.class); - EventType MESSAGE_REACTION_REMOVE = event(Raw.MESSAGE_REACTION_REMOVE, ReactionUpdate.class); - EventType MESSAGE_REACTION_REMOVE_EMOJI = event(Raw.MESSAGE_REACTION_REMOVE_EMOJI, ReactionUpdate.class); - EventType MESSAGE_REACTION_REMOVE_ALL = event(Raw.MESSAGE_REACTION_REMOVE_ALL, BulkRemovedReactions.class); - DoubleEventType PRESENCE_UPDATE = doubleEvent(Raw.PRESENCE_UPDATE, Presence.class, PresenceUpdate.class); - EventType READY = event(Raw.READY, Ready.class); - EventType RESUMED = event(Raw.RESUMED, Resumed.class); - EventType TYPING_START = event(Raw.TYPING_START, TypingUser.class); - EventType VOICE_STATE_UPDATE = event(Raw.VOICE_STATE_UPDATE, VoiceState.class); - EventType INTERACTION_CREATE = event(Raw.INTERACTION_CREATE, Interaction.class); - EventType THREAD_CREATE = event(Raw.THREAD_CREATE, ThreadChannel.class); - DoubleEventType THREAD_UPDATE = doubleEvent(Raw.THREAD_UPDATE, ThreadChannel.class, ThreadChannel.class); - EventType THREAD_DELETE = event(Raw.THREAD_DELETE, ThreadChannel.class); + EventType CHANNEL_CREATE = event( Raw.CHANNEL_CREATE, Channel.class); + DoubleEventType CHANNEL_UPDATE = doubleEvent(Raw.CHANNEL_UPDATE, Channel.class, Channel.class); + EventType CHANNEL_DELETE = event( Raw.CHANNEL_DELETE, Channel.class); + EventType CHANNEL_PINS_UPDATE = event( Raw.CHANNEL_PINS_UPDATE, ChannelPinsUpdate.class); + EventType WEBHOOKS_UPDATE = event( Raw.WEBHOOKS_UPDATE, WebhooksUpdate.class); + EventType GUILD_CREATE = event( Raw.GUILD_CREATE, Guild.class); + EventType GUILD_AVAILABLE = event( Raw.GUILD_AVAILABLE, Guild.class); + EventType GUILD_DELETE = event( Raw.GUILD_DELETE, Guild.class); + EventType GUILD_UNAVAILABLE = event( Raw.GUILD_UNAVAILABLE, UnavailableGuild.class); + DoubleEventType GUILD_UPDATE = doubleEvent(Raw.GUILD_UPDATE, Guild.class, Guild.class); + EventType GUILD_EMOJIS_UPDATE = event( Raw.GUILD_EMOJIS_UPDATE, EmojiUpdate.class); + EventType GUILD_MEMBER_ADD = event( Raw.GUILD_MEMBER_ADD, Member.class); + EventType GUILD_MEMBER_REMOVE = event( Raw.GUILD_MEMBER_REMOVE, Member.class); + DoubleEventType GUILD_MEMBER_UPDATE = doubleEvent(Raw.GUILD_MEMBER_UPDATE, Member.class, PartialMember.class); + EventType GUILD_ROLE_CREATE = event( Raw.GUILD_ROLE_CREATE, Role.class); + DoubleEventType GUILD_ROLE_UPDATE = doubleEvent(Raw.GUILD_ROLE_UPDATE, Role.class, Role.class); + EventType GUILD_ROLE_DELETE = event( Raw.GUILD_ROLE_DELETE, PartialRole.class); + DoubleEventType USER_UPDATE = doubleEvent(Raw.USER_UPDATE, User.class, User.class); + EventType VOICE_SERVER_UPDATE = event( Raw.VOICE_SERVER_UPDATE, VoiceServerUpdate.class); + EventType INVITE_CREATE = event( Raw.INVITE_CREATE, Invite.class); + EventType INVITE_DELETE = event( Raw.INVITE_CREATE, Invite.class); + EventType MESSAGE_CREATE = event( Raw.MESSAGE_CREATE, Message.class); + EventType MESSAGE_UPDATE = event( Raw.MESSAGE_UPDATE, Message.class); + EventType MESSAGE_EMBEDS_UPDATE = event( Raw.MESSAGE_EMBEDS_UPDATE, MessageEmbedUpdate.class); + EventType MESSAGE_DELETE = event( Raw.MESSAGE_DELETE, DeletedMessage.class); + EventType MESSAGE_DELETE_BULK = event( Raw.MESSAGE_DELETE_BULK, BulkDeletedMessages.class); + EventType GUILD_INTEGRATIONS_UPDATE = event( Raw.GUILD_INTEGRATIONS_UPDATE, String.class); + EventType GUILD_BAN_ADD = event( Raw.GUILD_BAN_ADD, GatewayGuildBan.class); + EventType GUILD_BAN_REMOVE = event( Raw.GUILD_BAN_REMOVE, GatewayGuildBan.class); + EventType MESSAGE_REACTION_ADD = event( Raw.MESSAGE_REACTION_ADD, ReactionUpdate.class); + EventType MESSAGE_REACTION_REMOVE = event( Raw.MESSAGE_REACTION_REMOVE, ReactionUpdate.class); + EventType MESSAGE_REACTION_REMOVE_EMOJI = event( Raw.MESSAGE_REACTION_REMOVE_EMOJI, ReactionUpdate.class); + EventType MESSAGE_REACTION_REMOVE_ALL = event( Raw.MESSAGE_REACTION_REMOVE_ALL, BulkRemovedReactions.class); + DoubleEventType PRESENCE_UPDATE = doubleEvent(Raw.PRESENCE_UPDATE, Presence.class, PresenceUpdate.class); + EventType READY = event( Raw.READY, Ready.class); + EventType RESUMED = event( Raw.RESUMED, Resumed.class); + EventType TYPING_START = event( Raw.TYPING_START, TypingUser.class); + EventType VOICE_STATE_UPDATE = event( Raw.VOICE_STATE_UPDATE, VoiceState.class); + EventType INTERACTION_CREATE = event( Raw.INTERACTION_CREATE, Interaction.class); + EventType THREAD_CREATE = event( Raw.THREAD_CREATE, ThreadChannel.class); + DoubleEventType THREAD_UPDATE = doubleEvent(Raw.THREAD_UPDATE, ThreadChannel.class, ThreadChannel.class); + EventType THREAD_DELETE = event( Raw.THREAD_DELETE, ThreadChannel.class); + EventType GUILD_SCHEDULED_EVENT_CREATE = event( Raw.GUILD_SCHEDULED_EVENT_CREATE, ScheduledEvent.class); + EventType GUILD_SCHEDULED_EVENT_UPDATE = event( Raw.GUILD_SCHEDULED_EVENT_UPDATE, ScheduledEvent.class); + EventType GUILD_SCHEDULED_EVENT_DELETE = event( Raw.GUILD_SCHEDULED_EVENT_DELETE, ScheduledEvent.class); // @formatter:on /** @@ -169,6 +172,9 @@ interface Raw { String THREAD_LIST_SYNC = "THREAD_LIST_SYNC"; String THREAD_MEMBER_UPDATE = "THREAD_MEMBER_UPDATE"; String THREAD_MEMBERS_UPDATE = "THREAD_MEMBERS_UPDATE"; + String GUILD_SCHEDULED_EVENT_CREATE = "GUILD_SCHEDULED_EVENT_CREATE"; + String GUILD_SCHEDULED_EVENT_UPDATE = "GUILD_SCHEDULED_EVENT_UPDATE"; + String GUILD_SCHEDULED_EVENT_DELETE = "GUILD_SCHEDULED_EVENT_DELETE"; // @formatter:on } } diff --git a/src/main/java/com/mewna/catnip/shard/DispatchEmitter.java b/src/main/java/com/mewna/catnip/shard/DispatchEmitter.java index 4d37e02d85..f5c06b7a7f 100644 --- a/src/main/java/com/mewna/catnip/shard/DispatchEmitter.java +++ b/src/main/java/com/mewna/catnip/shard/DispatchEmitter.java @@ -323,6 +323,11 @@ private void emit0(@Nonnull final JsonObject payload) { Raw.APPLICATION_COMMAND_UPDATE, Raw.APPLICATION_COMMAND_DELETE -> catnip.dispatchManager().dispatchEvent(type, catnip.entityBuilder().createApplicationCommand(data)); + // Guild events + case Raw.GUILD_SCHEDULED_EVENT_CREATE -> catnip.dispatchManager().dispatchEvent(type, catnip.entityBuilder().createScheduledEvent(data)); + case Raw.GUILD_SCHEDULED_EVENT_UPDATE -> catnip.dispatchManager().dispatchEvent(type, catnip.entityBuilder().createScheduledEvent(data)); + case Raw.GUILD_SCHEDULED_EVENT_DELETE -> catnip.dispatchManager().dispatchEvent(type, catnip.entityBuilder().createScheduledEvent(data)); + // Other case Raw.GUILD_MEMBERS_CHUNK -> { // End-users don't really have a use for an event here; diff --git a/src/main/java/com/mewna/catnip/shard/GatewayIntent.java b/src/main/java/com/mewna/catnip/shard/GatewayIntent.java index 8d1323ee58..8620d16468 100644 --- a/src/main/java/com/mewna/catnip/shard/GatewayIntent.java +++ b/src/main/java/com/mewna/catnip/shard/GatewayIntent.java @@ -250,6 +250,19 @@ public enum GatewayIntent { TYPING_START )), + /** + *
    + *
  • {@link DiscordEvent#GUILD_SCHEDULED_EVENT_CREATE}
  • + *
  • {@link DiscordEvent#GUILD_SCHEDULED_EVENT_UPDATE}
  • + *
  • {@link DiscordEvent#GUILD_SCHEDULED_EVENT_DELETE}
  • + *
+ */ + GUILD_SCHEDULED_EVENTS(1 << 16, false, List.of( + GUILD_SCHEDULED_EVENT_CREATE, + GUILD_SCHEDULED_EVENT_UPDATE, + GUILD_SCHEDULED_EVENT_DELETE + )), + ; public static final Set ALL_INTENTS = Set.of(values());