From 9741415cc5c679cad2bc9b67a8046fc663bc6e32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20Spie=C3=9F?= Date: Sun, 23 Oct 2022 21:38:35 +0200 Subject: [PATCH] Improve channel update handling (#2255) --- .../internal/entities/ForumChannelImpl.java | 6 +- .../channel/concrete/TextChannelImpl.java | 4 +- .../channel/concrete/ThreadChannelImpl.java | 4 +- .../channel/concrete/VoiceChannelImpl.java | 4 +- .../attribute/IAgeRestrictedChannelMixin.java | 25 + .../attribute/ICategorizableChannelMixin.java | 3 +- .../attribute/ISlowmodeChannelMixin.java | 25 + .../mixin/attribute/ITopicChannelMixin.java | 26 + .../StandardGuildMessageChannelMixin.java | 11 +- .../internal/handle/ChannelUpdateHandler.java | 552 ++++++------------ 10 files changed, 276 insertions(+), 384 deletions(-) create mode 100644 src/main/java/net/dv8tion/jda/internal/entities/channel/mixin/attribute/IAgeRestrictedChannelMixin.java create mode 100644 src/main/java/net/dv8tion/jda/internal/entities/channel/mixin/attribute/ISlowmodeChannelMixin.java create mode 100644 src/main/java/net/dv8tion/jda/internal/entities/channel/mixin/attribute/ITopicChannelMixin.java diff --git a/src/main/java/net/dv8tion/jda/internal/entities/ForumChannelImpl.java b/src/main/java/net/dv8tion/jda/internal/entities/ForumChannelImpl.java index 08e80a51f8..8980541ac8 100644 --- a/src/main/java/net/dv8tion/jda/internal/entities/ForumChannelImpl.java +++ b/src/main/java/net/dv8tion/jda/internal/entities/ForumChannelImpl.java @@ -38,6 +38,8 @@ import net.dv8tion.jda.api.utils.messages.MessageCreateBuilder; import net.dv8tion.jda.api.utils.messages.MessageCreateData; import net.dv8tion.jda.internal.entities.channel.middleman.AbstractGuildChannelImpl; +import net.dv8tion.jda.internal.entities.channel.mixin.attribute.IAgeRestrictedChannelMixin; +import net.dv8tion.jda.internal.entities.channel.mixin.attribute.ISlowmodeChannelMixin; import net.dv8tion.jda.internal.entities.channel.mixin.attribute.IThreadContainerMixin; import net.dv8tion.jda.internal.entities.channel.mixin.attribute.IWebhookContainerMixin; import net.dv8tion.jda.internal.entities.channel.mixin.middleman.StandardGuildChannelMixin; @@ -59,7 +61,9 @@ public class ForumChannelImpl extends AbstractGuildChannelImpl GuildChannelUnion, StandardGuildChannelMixin, IWebhookContainerMixin, - IThreadContainerMixin + IThreadContainerMixin, + IAgeRestrictedChannelMixin, + ISlowmodeChannelMixin { private final TLongObjectMap overrides = MiscUtil.newLongMap(); private final SortedSnowflakeCacheViewImpl tagCache = new SortedSnowflakeCacheViewImpl<>(ForumTag.class, ForumTag::getName, Comparator.naturalOrder()); diff --git a/src/main/java/net/dv8tion/jda/internal/entities/channel/concrete/TextChannelImpl.java b/src/main/java/net/dv8tion/jda/internal/entities/channel/concrete/TextChannelImpl.java index 6a2e13043b..867cc4bbc2 100644 --- a/src/main/java/net/dv8tion/jda/internal/entities/channel/concrete/TextChannelImpl.java +++ b/src/main/java/net/dv8tion/jda/internal/entities/channel/concrete/TextChannelImpl.java @@ -28,6 +28,7 @@ import net.dv8tion.jda.api.requests.restaction.ChannelAction; import net.dv8tion.jda.internal.entities.GuildImpl; import net.dv8tion.jda.internal.entities.channel.middleman.AbstractStandardGuildMessageChannelImpl; +import net.dv8tion.jda.internal.entities.channel.mixin.attribute.ISlowmodeChannelMixin; import net.dv8tion.jda.internal.managers.channel.concrete.TextChannelManagerImpl; import net.dv8tion.jda.internal.utils.Checks; @@ -38,7 +39,8 @@ public class TextChannelImpl extends AbstractStandardGuildMessageChannelImpl implements TextChannel, - DefaultGuildChannelUnion + DefaultGuildChannelUnion, + ISlowmodeChannelMixin { private int slowmode; diff --git a/src/main/java/net/dv8tion/jda/internal/entities/channel/concrete/ThreadChannelImpl.java b/src/main/java/net/dv8tion/jda/internal/entities/channel/concrete/ThreadChannelImpl.java index 183112a410..0b6a05059b 100644 --- a/src/main/java/net/dv8tion/jda/internal/entities/channel/concrete/ThreadChannelImpl.java +++ b/src/main/java/net/dv8tion/jda/internal/entities/channel/concrete/ThreadChannelImpl.java @@ -41,6 +41,7 @@ import net.dv8tion.jda.internal.entities.EntityBuilder; import net.dv8tion.jda.internal.entities.GuildImpl; import net.dv8tion.jda.internal.entities.channel.middleman.AbstractGuildChannelImpl; +import net.dv8tion.jda.internal.entities.channel.mixin.attribute.ISlowmodeChannelMixin; import net.dv8tion.jda.internal.entities.channel.mixin.middleman.GuildMessageChannelMixin; import net.dv8tion.jda.internal.managers.channel.concrete.ThreadChannelManagerImpl; import net.dv8tion.jda.internal.requests.DeferredRestAction; @@ -60,7 +61,8 @@ public class ThreadChannelImpl extends AbstractGuildChannelImpl implements ThreadChannel, - GuildMessageChannelMixin + GuildMessageChannelMixin, + ISlowmodeChannelMixin { private final ChannelType type; private final CacheView.SimpleCacheView threadMembers = new CacheView.SimpleCacheView<>(ThreadMember.class, null); diff --git a/src/main/java/net/dv8tion/jda/internal/entities/channel/concrete/VoiceChannelImpl.java b/src/main/java/net/dv8tion/jda/internal/entities/channel/concrete/VoiceChannelImpl.java index 605a910f17..9564a3cc71 100644 --- a/src/main/java/net/dv8tion/jda/internal/entities/channel/concrete/VoiceChannelImpl.java +++ b/src/main/java/net/dv8tion/jda/internal/entities/channel/concrete/VoiceChannelImpl.java @@ -30,6 +30,7 @@ import net.dv8tion.jda.api.utils.MiscUtil; import net.dv8tion.jda.internal.entities.GuildImpl; import net.dv8tion.jda.internal.entities.channel.middleman.AbstractStandardGuildChannelImpl; +import net.dv8tion.jda.internal.entities.channel.mixin.attribute.IAgeRestrictedChannelMixin; import net.dv8tion.jda.internal.entities.channel.mixin.attribute.IWebhookContainerMixin; import net.dv8tion.jda.internal.entities.channel.mixin.middleman.AudioChannelMixin; import net.dv8tion.jda.internal.entities.channel.mixin.middleman.GuildMessageChannelMixin; @@ -46,7 +47,8 @@ public class VoiceChannelImpl extends AbstractStandardGuildChannelImpl, AudioChannelMixin, - IWebhookContainerMixin + IWebhookContainerMixin, + IAgeRestrictedChannelMixin { private final TLongObjectMap connectedMembers = MiscUtil.newLongMap(); diff --git a/src/main/java/net/dv8tion/jda/internal/entities/channel/mixin/attribute/IAgeRestrictedChannelMixin.java b/src/main/java/net/dv8tion/jda/internal/entities/channel/mixin/attribute/IAgeRestrictedChannelMixin.java new file mode 100644 index 0000000000..62e34d9854 --- /dev/null +++ b/src/main/java/net/dv8tion/jda/internal/entities/channel/mixin/attribute/IAgeRestrictedChannelMixin.java @@ -0,0 +1,25 @@ +/* + * Copyright 2015 Austin Keener, Michael Ritter, Florian Spieß, and the JDA contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.dv8tion.jda.internal.entities.channel.mixin.attribute; + +import net.dv8tion.jda.api.entities.channel.attribute.IAgeRestrictedChannel; +import net.dv8tion.jda.internal.entities.channel.mixin.middleman.GuildChannelMixin; + +public interface IAgeRestrictedChannelMixin> extends GuildChannelMixin, IAgeRestrictedChannel +{ + T setNSFW(boolean ageRestricted); +} diff --git a/src/main/java/net/dv8tion/jda/internal/entities/channel/mixin/attribute/ICategorizableChannelMixin.java b/src/main/java/net/dv8tion/jda/internal/entities/channel/mixin/attribute/ICategorizableChannelMixin.java index f927f53376..41d1175cf3 100644 --- a/src/main/java/net/dv8tion/jda/internal/entities/channel/mixin/attribute/ICategorizableChannelMixin.java +++ b/src/main/java/net/dv8tion/jda/internal/entities/channel/mixin/attribute/ICategorizableChannelMixin.java @@ -25,7 +25,8 @@ public interface ICategorizableChannelMixin parent = (IPermissionContainerMixin) getParentCategory(); if (parent == null) return true; // Channels without a parent category are always considered synced. Also the case for categories. diff --git a/src/main/java/net/dv8tion/jda/internal/entities/channel/mixin/attribute/ISlowmodeChannelMixin.java b/src/main/java/net/dv8tion/jda/internal/entities/channel/mixin/attribute/ISlowmodeChannelMixin.java new file mode 100644 index 0000000000..646c6c24ca --- /dev/null +++ b/src/main/java/net/dv8tion/jda/internal/entities/channel/mixin/attribute/ISlowmodeChannelMixin.java @@ -0,0 +1,25 @@ +/* + * Copyright 2015 Austin Keener, Michael Ritter, Florian Spieß, and the JDA contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.dv8tion.jda.internal.entities.channel.mixin.attribute; + +import net.dv8tion.jda.api.entities.channel.attribute.ISlowmodeChannel; +import net.dv8tion.jda.internal.entities.channel.mixin.middleman.GuildChannelMixin; + +public interface ISlowmodeChannelMixin> extends GuildChannelMixin, ISlowmodeChannel +{ + T setSlowmode(int slowmode); +} diff --git a/src/main/java/net/dv8tion/jda/internal/entities/channel/mixin/attribute/ITopicChannelMixin.java b/src/main/java/net/dv8tion/jda/internal/entities/channel/mixin/attribute/ITopicChannelMixin.java new file mode 100644 index 0000000000..49336bb191 --- /dev/null +++ b/src/main/java/net/dv8tion/jda/internal/entities/channel/mixin/attribute/ITopicChannelMixin.java @@ -0,0 +1,26 @@ +/* + * Copyright 2015 Austin Keener, Michael Ritter, Florian Spieß, and the JDA contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.dv8tion.jda.internal.entities.channel.mixin.attribute; + +import net.dv8tion.jda.internal.entities.channel.mixin.middleman.GuildChannelMixin; + +public interface ITopicChannelMixin> extends GuildChannelMixin +{ + T setTopic(String topic); + + String getTopic(); +} diff --git a/src/main/java/net/dv8tion/jda/internal/entities/channel/mixin/middleman/StandardGuildMessageChannelMixin.java b/src/main/java/net/dv8tion/jda/internal/entities/channel/mixin/middleman/StandardGuildMessageChannelMixin.java index dbd39e6a8a..82646a4ecb 100644 --- a/src/main/java/net/dv8tion/jda/internal/entities/channel/mixin/middleman/StandardGuildMessageChannelMixin.java +++ b/src/main/java/net/dv8tion/jda/internal/entities/channel/mixin/middleman/StandardGuildMessageChannelMixin.java @@ -19,7 +19,9 @@ import net.dv8tion.jda.api.Permission; import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.channel.middleman.StandardGuildMessageChannel; +import net.dv8tion.jda.internal.entities.channel.mixin.attribute.IAgeRestrictedChannelMixin; import net.dv8tion.jda.internal.entities.channel.mixin.attribute.IThreadContainerMixin; +import net.dv8tion.jda.internal.entities.channel.mixin.attribute.ITopicChannelMixin; import net.dv8tion.jda.internal.entities.channel.mixin.attribute.IWebhookContainerMixin; import javax.annotation.Nonnull; @@ -29,7 +31,9 @@ public interface StandardGuildMessageChannelMixin, GuildMessageChannelMixin, IThreadContainerMixin, - IWebhookContainerMixin + IAgeRestrictedChannelMixin, + IWebhookContainerMixin, + ITopicChannelMixin { // ---- Default implementations of interface ---- @Override @@ -40,9 +44,4 @@ default boolean canTalk(@Nonnull Member member) return member.hasPermission(this, Permission.VIEW_CHANNEL, Permission.MESSAGE_SEND); } - - // ---- State Accessors ---- - T setTopic(String topic); - - T setNSFW(boolean nsfw); } diff --git a/src/main/java/net/dv8tion/jda/internal/handle/ChannelUpdateHandler.java b/src/main/java/net/dv8tion/jda/internal/handle/ChannelUpdateHandler.java index 3e9d4ee0f1..7b1e2a283d 100644 --- a/src/main/java/net/dv8tion/jda/internal/handle/ChannelUpdateHandler.java +++ b/src/main/java/net/dv8tion/jda/internal/handle/ChannelUpdateHandler.java @@ -33,7 +33,6 @@ import net.dv8tion.jda.api.entities.channel.concrete.TextChannel; import net.dv8tion.jda.api.entities.channel.concrete.ThreadChannel; import net.dv8tion.jda.api.entities.channel.forums.ForumTag; -import net.dv8tion.jda.api.entities.channel.middleman.GuildChannel; import net.dv8tion.jda.api.entities.emoji.EmojiUnion; import net.dv8tion.jda.api.events.channel.forum.ForumTagAddEvent; import net.dv8tion.jda.api.events.channel.forum.ForumTagRemoveEvent; @@ -50,8 +49,12 @@ import net.dv8tion.jda.api.utils.data.DataObject; import net.dv8tion.jda.internal.JDAImpl; import net.dv8tion.jda.internal.entities.*; -import net.dv8tion.jda.internal.entities.channel.concrete.*; -import net.dv8tion.jda.internal.entities.channel.mixin.attribute.IPermissionContainerMixin; +import net.dv8tion.jda.internal.entities.channel.concrete.NewsChannelImpl; +import net.dv8tion.jda.internal.entities.channel.concrete.TextChannelImpl; +import net.dv8tion.jda.internal.entities.channel.concrete.VoiceChannelImpl; +import net.dv8tion.jda.internal.entities.channel.middleman.AbstractGuildChannelImpl; +import net.dv8tion.jda.internal.entities.channel.mixin.attribute.*; +import net.dv8tion.jda.internal.entities.channel.mixin.middleman.AudioChannelMixin; import net.dv8tion.jda.internal.requests.WebSocketClient; import net.dv8tion.jda.internal.utils.UnlockHook; import net.dv8tion.jda.internal.utils.cache.SnowflakeCacheViewImpl; @@ -61,6 +64,7 @@ import java.util.List; import java.util.Objects; +@SuppressWarnings("ConstantConditions") public class ChannelUpdateHandler extends SocketHandler { public ChannelUpdateHandler(JDAImpl api) @@ -71,7 +75,7 @@ public ChannelUpdateHandler(JDAImpl api) @Override protected Long handleInternally(DataObject content) { - final ChannelType type = ChannelType.fromId(content.getInt("type")); + ChannelType type = ChannelType.fromId(content.getInt("type")); if (type == ChannelType.GROUP) { WebSocketClient.LOG.warn("Ignoring CHANNEL_UPDATE for a group which we don't support"); @@ -84,18 +88,10 @@ protected Long handleInternally(DataObject content) return guildId; } - final long channelId = content.getLong("id"); - final long parentId = content.isNull("parent_id") ? 0 : content.getLong("parent_id"); - final int position = content.getInt("position"); - final int flags = content.getInt("flags", 0); - final String name = content.getString("name"); - final boolean nsfw = content.getBoolean("nsfw"); - final int defaultThreadSlowmode = content.getInt("default_thread_rate_limit_per_user", 0); - final int slowmode = content.getInt("rate_limit_per_user", 0); - final DataArray permOverwrites = content.getArray("permission_overwrites"); + long channelId = content.getUnsignedLong("id"); //We assume the CHANNEL_UPDATE was for a GuildChannel because PrivateChannels don't emit CHANNEL_UPDATE for 1:1 DMs, only Groups. - GuildChannel channel = getJDA().getGuildChannelById(channelId); + AbstractGuildChannelImpl channel = (AbstractGuildChannelImpl) getJDA().getGuildChannelById(channelId); if (channel == null) { getJDA().getEventCache().cache(EventCache.Type.CHANNEL, channelId, responseNumber, allContent, this::handle); @@ -106,161 +102,61 @@ protected Long handleInternally(DataObject content) //Detect if we changed the channel type at all and reconstruct the channel entity if needed channel = handleChannelTypeChange(channel, content, type); + //Handle shared properties + + String oldName = channel.getName(); + String name = content.getString("name", oldName); + if (!Objects.equals(oldName, name)) + { + channel.setName(name); + getJDA().handleEvent( + new ChannelUpdateNameEvent( + getJDA(), responseNumber, + channel, oldName, name)); + } + + if (channel instanceof ITopicChannelMixin) + handleTopic((ITopicChannelMixin) channel, content.getString("topic", null)); + + if (channel instanceof ISlowmodeChannelMixin) + handleSlowmode((ISlowmodeChannelMixin) channel, content.getInt("rate_limit_per_user", 0)); + + if (channel instanceof IAgeRestrictedChannelMixin) + handleNsfw((IAgeRestrictedChannelMixin) channel, content.getBoolean("nsfw")); + + if (channel instanceof ICategorizableChannelMixin) + handleParentCategory((ICategorizableChannelMixin) channel, content.getUnsignedLong("parent_id", 0)); + + if (channel instanceof IPositionableChannelMixin) + handlePosition((IPositionableChannelMixin) channel, content.getInt("position", 0)); + + if (channel instanceof IThreadContainerMixin) + handleThreadContainer((IThreadContainerMixin) channel, content); + + if (channel instanceof AudioChannelMixin) + handleAudioChannel((AudioChannelMixin) channel, content); + + //Handle concrete type specific properties + switch (type) { - case TEXT: - { - final String topic = content.getString("topic", null); - - TextChannelImpl textChannel = (TextChannelImpl) channel; - - //If any properties changed, update the values and fire the proper events. - final long oldParentId = textChannel.getParentCategoryIdLong(); - final String oldName = textChannel.getName(); - final String oldTopic = textChannel.getTopic(); - final int oldPosition = textChannel.getPositionRaw(); - final boolean oldNsfw = textChannel.isNSFW(); - final int oldSlowmode = textChannel.getSlowmode(); - final int oldDefaultThreadSlowmode = textChannel.getDefaultThreadSlowmode(); - if (!Objects.equals(oldName, name)) - { - textChannel.setName(name); - getJDA().handleEvent( - new ChannelUpdateNameEvent( - getJDA(), responseNumber, - textChannel, oldName, name)); - } - if (oldParentId != parentId) - { - final Category oldParent = textChannel.getParentCategory(); - textChannel.setParentCategory(parentId); - getJDA().handleEvent( - new ChannelUpdateParentEvent( - getJDA(), responseNumber, - textChannel, oldParent, textChannel.getParentCategory())); - } - if (!Objects.equals(oldTopic, topic)) - { - textChannel.setTopic(topic); - getJDA().handleEvent( - new ChannelUpdateTopicEvent( - getJDA(), responseNumber, - textChannel, oldTopic, topic)); - } - if (oldPosition != position) - { - textChannel.setPosition(position); - getJDA().handleEvent( - new ChannelUpdatePositionEvent( - getJDA(), responseNumber, - textChannel, oldPosition, position)); - } - if (oldNsfw != nsfw) - { - textChannel.setNSFW(nsfw); - getJDA().handleEvent( - new ChannelUpdateNSFWEvent( - getJDA(), responseNumber, - textChannel, oldNsfw, nsfw)); - } - if (oldSlowmode != slowmode) - { - textChannel.setSlowmode(slowmode); - getJDA().handleEvent( - new ChannelUpdateSlowmodeEvent( - getJDA(), responseNumber, - textChannel, oldSlowmode, slowmode)); - } - if (oldDefaultThreadSlowmode != defaultThreadSlowmode) - { - textChannel.setDefaultThreadSlowmode(defaultThreadSlowmode); - getJDA().handleEvent( - new ChannelUpdateDefaultThreadSlowmodeEvent( - getJDA(), responseNumber, - textChannel, oldDefaultThreadSlowmode, defaultThreadSlowmode)); - } - break; - } case FORUM: - { - final String topic = content.getString("topic", null); - final EmojiUnion defaultReaction = content.optObject("default_reaction_emoji") + ForumChannelImpl forumChannel = (ForumChannelImpl) channel; + + int flags = content.getInt("flags", 0); +// int sortOrder = content.getInt("default_sort_order", ((ForumChannelImpl) channel).getRawSortOrder()); + EmojiUnion defaultReaction = content.optObject("default_reaction_emoji") .map(json -> EntityBuilder.createEmoji(json, "emoji_name", "emoji_id")) .orElse(null); - ForumChannelImpl forumChannel = (ForumChannelImpl) channel; - content.optArray("available_tags").ifPresent(array -> handleTagsUpdate(forumChannel, array)); -// int sortOrder = content.getInt("default_sort_order", ((ForumChannelImpl) channel).getRawSortOrder()); + int oldFlags = forumChannel.getRawFlags(); +// int oldSortOrder = forumChannel.getRawSortOrder(); + EmojiUnion oldDefaultReaction = forumChannel.getDefaultReaction(); + + content.optArray("available_tags").ifPresent( + array -> handleTagsUpdate(forumChannel, array) + ); - //If any properties changed, update the values and fire the proper events. - final long oldParentId = forumChannel.getParentCategoryIdLong(); - final String oldName = forumChannel.getName(); - final String oldTopic = forumChannel.getTopic(); - final int oldPosition = forumChannel.getPositionRaw(); - final boolean oldNsfw = forumChannel.isNSFW(); - final int oldSlowmode = forumChannel.getSlowmode(); - final int oldDefaultThreadSlowmode = forumChannel.getDefaultThreadSlowmode(); - final int oldFlags = forumChannel.getRawFlags(); -// final int oldSortOrder = forumChannel.getRawSortOrder(); - final EmojiUnion oldDefaultReaction = forumChannel.getDefaultReaction(); - - if (!Objects.equals(oldName, name)) - { - forumChannel.setName(name); - getJDA().handleEvent( - new ChannelUpdateNameEvent( - getJDA(), responseNumber, - forumChannel, oldName, name)); - } - if (oldParentId != parentId) - { - final Category oldParent = forumChannel.getParentCategory(); - forumChannel.setParentCategory(parentId); - getJDA().handleEvent( - new ChannelUpdateParentEvent( - getJDA(), responseNumber, - forumChannel, oldParent, forumChannel.getParentCategory())); - } - if (!Objects.equals(oldTopic, topic)) - { - forumChannel.setTopic(topic); - getJDA().handleEvent( - new ChannelUpdateTopicEvent( - getJDA(), responseNumber, - forumChannel, oldTopic, topic)); - } - if (oldPosition != position) - { - forumChannel.setPosition(position); - getJDA().handleEvent( - new ChannelUpdatePositionEvent( - getJDA(), responseNumber, - forumChannel, oldPosition, position)); - } - if (oldNsfw != nsfw) - { - forumChannel.setNSFW(nsfw); - getJDA().handleEvent( - new ChannelUpdateNSFWEvent( - getJDA(), responseNumber, - forumChannel, oldNsfw, nsfw)); - } - if (oldSlowmode != slowmode) - { - forumChannel.setSlowmode(slowmode); - getJDA().handleEvent( - new ChannelUpdateSlowmodeEvent( - getJDA(), responseNumber, - forumChannel, oldSlowmode, slowmode)); - } - if (oldDefaultThreadSlowmode != defaultThreadSlowmode) - { - forumChannel.setDefaultThreadSlowmode(defaultThreadSlowmode); - getJDA().handleEvent( - new ChannelUpdateDefaultThreadSlowmodeEvent( - getJDA(), responseNumber, - forumChannel, oldDefaultThreadSlowmode, defaultThreadSlowmode)); - } if (oldFlags != flags) { forumChannel.setFlags(flags); @@ -269,14 +165,6 @@ protected Long handleInternally(DataObject content) getJDA(), responseNumber, forumChannel, ChannelFlag.fromRaw(oldFlags), ChannelFlag.fromRaw(flags))); } - if (!Objects.equals(oldDefaultReaction, defaultReaction)) - { - forumChannel.setDefaultReaction(content.optObject("default_reaction_emoji").orElse(null)); - getJDA().handleEvent( - new ChannelUpdateDefaultReactionEvent( - getJDA(), responseNumber, - forumChannel, oldDefaultReaction, defaultReaction)); - } // if (oldSortOrder != sortOrder) // { // forumChannel.setDefaultSortOrder(sortOrder); @@ -285,114 +173,20 @@ protected Long handleInternally(DataObject content) // getJDA(), responseNumber, // forumChannel, ForumChannel.SortOrder.fromKey(oldSortOrder), ForumChannel.SortOrder.fromKey(sortOrder))); // } - break; - } - case NEWS: - { - final String topic = content.getString("topic", null); - - NewsChannelImpl newsChannel = (NewsChannelImpl) channel; - - //If any properties changed, update the values and fire the proper events. - final long oldParentId = newsChannel.getParentCategoryIdLong(); - final String oldName = newsChannel.getName(); - final String oldTopic = newsChannel.getTopic(); - final int oldPosition = newsChannel.getPositionRaw(); - final boolean oldNsfw = newsChannel.isNSFW(); - if (!Objects.equals(oldName, name)) - { - newsChannel.setName(name); - getJDA().handleEvent( - new ChannelUpdateNameEvent( - getJDA(), responseNumber, - newsChannel, oldName, name)); - } - if (oldParentId != parentId) - { - final Category oldParent = newsChannel.getParentCategory(); - newsChannel.setParentCategory(parentId); - getJDA().handleEvent( - new ChannelUpdateParentEvent( - getJDA(), responseNumber, - newsChannel, oldParent, newsChannel.getParentCategory())); - } - if (!Objects.equals(oldTopic, topic)) - { - newsChannel.setTopic(topic); - getJDA().handleEvent( - new ChannelUpdateTopicEvent( - getJDA(), responseNumber, - newsChannel, oldTopic, topic)); - } - if (oldPosition != position) - { - newsChannel.setPosition(position); - getJDA().handleEvent( - new ChannelUpdatePositionEvent( - getJDA(), responseNumber, - newsChannel, oldPosition, position)); - } - - if (oldNsfw != nsfw) + if (!Objects.equals(oldDefaultReaction, defaultReaction)) { - newsChannel.setNSFW(nsfw); + forumChannel.setDefaultReaction(content.optObject("default_reaction_emoji").orElse(null)); getJDA().handleEvent( - new ChannelUpdateNSFWEvent( + new ChannelUpdateDefaultReactionEvent( getJDA(), responseNumber, - newsChannel, oldNsfw, nsfw)); + forumChannel, oldDefaultReaction, defaultReaction)); } break; - } case VOICE: - { - final int userLimit = content.getInt("user_limit"); - final int bitrate = content.getInt("bitrate"); - final String regionRaw = content.getString("rtc_region", null); - VoiceChannelImpl voiceChannel = (VoiceChannelImpl) channel; - //If any properties changed, update the values and fire the proper events. - final long oldParentId = voiceChannel.getParentCategoryIdLong(); - final String oldName = voiceChannel.getName(); - final String oldRegionRaw = voiceChannel.getRegionRaw(); - final int oldPosition = voiceChannel.getPositionRaw(); - final int oldLimit = voiceChannel.getUserLimit(); - final int oldBitrate = voiceChannel.getBitrate(); - final boolean oldNsfw = voiceChannel.isNSFW(); - if (!Objects.equals(oldName, name)) - { - voiceChannel.setName(name); - getJDA().handleEvent( - new ChannelUpdateNameEvent( - getJDA(), responseNumber, - voiceChannel, oldName, name)); - } - if (!Objects.equals(oldRegionRaw, regionRaw)) - { - final Region oldRegion = Region.fromKey(oldRegionRaw); - voiceChannel.setRegion(regionRaw); - getJDA().handleEvent( - new ChannelUpdateRegionEvent( - getJDA(), responseNumber, - voiceChannel, oldRegion, voiceChannel.getRegion())); - } - if (oldParentId != parentId) - { - final Category oldParent = voiceChannel.getParentCategory(); - voiceChannel.setParentCategory(parentId); - getJDA().handleEvent( - new ChannelUpdateParentEvent( - getJDA(), responseNumber, - voiceChannel, oldParent, voiceChannel.getParentCategory())); - } - if (oldPosition != position) - { - voiceChannel.setPosition(position); - getJDA().handleEvent( - new ChannelUpdatePositionEvent( - getJDA(), responseNumber, - voiceChannel, oldPosition, position)); - } + int userLimit = content.getInt("user_limit"); + int oldLimit = voiceChannel.getUserLimit(); if (oldLimit != userLimit) { voiceChannel.setUserLimit(userLimit); @@ -401,113 +195,17 @@ protected Long handleInternally(DataObject content) getJDA(), responseNumber, voiceChannel, oldLimit, userLimit)); } - if (oldBitrate != bitrate) - { - voiceChannel.setBitrate(bitrate); - getJDA().handleEvent( - new ChannelUpdateBitrateEvent( - getJDA(), responseNumber, - voiceChannel, oldBitrate, bitrate)); - } - if (oldNsfw != nsfw) - { - voiceChannel.setNSFW(nsfw); - getJDA().handleEvent( - new ChannelUpdateNSFWEvent( - getJDA(), responseNumber, - voiceChannel, oldNsfw, nsfw)); - } - break; - } + case TEXT: + case NEWS: case STAGE: - { - final int bitrate = content.getInt("bitrate"); - final String regionRaw = content.getString("rtc_region", null); - - StageChannelImpl stageChannel = (StageChannelImpl) channel; - - //If any properties changed, update the values and fire the proper events. - final long oldParentId = stageChannel.getParentCategoryIdLong(); - final String oldName = stageChannel.getName(); - final String oldRegionRaw = stageChannel.getRegionRaw(); - final int oldPosition = stageChannel.getPositionRaw(); - final int oldBitrate = stageChannel.getBitrate(); - if (!Objects.equals(oldName, name)) - { - stageChannel.setName(name); - getJDA().handleEvent( - new ChannelUpdateNameEvent( - getJDA(), responseNumber, - stageChannel, oldName, name)); - } - if (!Objects.equals(oldRegionRaw, regionRaw)) - { - final Region oldRegion = Region.fromKey(oldRegionRaw); - stageChannel.setRegion(regionRaw); - getJDA().handleEvent( - new ChannelUpdateRegionEvent( - getJDA(), responseNumber, - stageChannel, oldRegion, stageChannel.getRegion())); - } - if (oldParentId != parentId) - { - final Category oldParent = stageChannel.getParentCategory(); - stageChannel.setParentCategory(parentId); - getJDA().handleEvent( - new ChannelUpdateParentEvent( - getJDA(), responseNumber, - stageChannel, oldParent, stageChannel.getParentCategory())); - } - if (oldPosition != position) - { - stageChannel.setPosition(position); - getJDA().handleEvent( - new ChannelUpdatePositionEvent( - getJDA(), responseNumber, - stageChannel, oldPosition, position)); - } - if (oldBitrate != bitrate) - { - stageChannel.setBitrate(bitrate); - getJDA().handleEvent( - new ChannelUpdateBitrateEvent( - getJDA(), responseNumber, - stageChannel, oldBitrate, bitrate)); - } - - break; - } case CATEGORY: - { - CategoryImpl category = (CategoryImpl) channel; - - final String oldName = category.getName(); - final int oldPosition = category.getPositionRaw(); - - if (!Objects.equals(oldName, name)) - { - category.setName(name); - getJDA().handleEvent( - new ChannelUpdateNameEvent( - getJDA(), responseNumber, - category, oldName, name)); - } - if (!Objects.equals(oldPosition, position)) - { - category.setPosition(position); - getJDA().handleEvent( - new ChannelUpdatePositionEvent( - getJDA(), responseNumber, - category, oldPosition, position)); - } - break; - } default: WebSocketClient.LOG.debug("CHANNEL_UPDATE provided an unrecognized channel type JSON: {}", content); } + DataArray permOverwrites = content.getArray("permission_overwrites"); applyPermissions((IPermissionContainerMixin) channel, permOverwrites); boolean hasAccessToChannel = channel.getGuild().getSelfMember().hasPermission(channel, Permission.VIEW_CHANNEL); @@ -517,14 +215,13 @@ protected Long handleInternally(DataObject content) return null; } - private GuildChannel handleChannelTypeChange(GuildChannel channel, DataObject content, ChannelType newChannelType) + private AbstractGuildChannelImpl handleChannelTypeChange(AbstractGuildChannelImpl channel, DataObject content, ChannelType newChannelType) { - if (channel.getType() == newChannelType) { + if (channel.getType() == newChannelType) return channel; - } EntityBuilder builder = getJDA().getEntityBuilder(); - GuildImpl guild = (GuildImpl) channel.getGuild(); + GuildImpl guild = channel.getGuild(); if (newChannelType == ChannelType.TEXT) { @@ -761,4 +458,113 @@ private void handleTagsUpdate(ForumChannelImpl channel, DataArray tags) }); } } + + private void handleTopic(ITopicChannelMixin channel, String topic) + { + String oldTopic = channel.getTopic(); + if (Objects.equals(oldTopic, topic)) + return; + + channel.setTopic(topic); + api.handleEvent( + new ChannelUpdateTopicEvent( + api, responseNumber, + channel, oldTopic, topic)); + } + + private void handleSlowmode(ISlowmodeChannelMixin channel, int slowmode) + { + int oldSlowmode = channel.getSlowmode(); + if (oldSlowmode == slowmode) + return; + + channel.setSlowmode(slowmode); + api.handleEvent( + new ChannelUpdateSlowmodeEvent( + api, responseNumber, + channel, oldSlowmode, slowmode)); + } + + private void handleNsfw(IAgeRestrictedChannelMixin channel, boolean nsfw) + { + boolean oldNsfw = channel.isNSFW(); + if (oldNsfw == nsfw) + return; + + channel.setNSFW(nsfw); + api.handleEvent( + new ChannelUpdateNSFWEvent( + api, responseNumber, + channel, oldNsfw, nsfw)); + } + + private void handleParentCategory(ICategorizableChannelMixin channel, long parentId) + { + long oldParentId = channel.getParentCategoryIdLong(); + if (oldParentId == parentId) + return; + + Category oldParent = channel.getParentCategory(); + channel.setParentCategory(parentId); + Category newParent = channel.getParentCategory(); + + api.handleEvent( + new ChannelUpdateParentEvent( + api, responseNumber, + channel, oldParent, newParent)); + } + + private void handlePosition(IPositionableChannelMixin channel, int position) + { + int oldPosition = channel.getPositionRaw(); + if (oldPosition == position) + return; + + channel.setPosition(position); + api.handleEvent( + new ChannelUpdatePositionEvent( + api, responseNumber, + channel, oldPosition, position)); + } + + private void handleThreadContainer(IThreadContainerMixin channel, DataObject content) + { + int oldDefaultThreadSlowmode = channel.getDefaultThreadSlowmode(); + int defaultThreadSlowmode = content.getInt("default_thread_rate_limit_per_user", 0); + if (oldDefaultThreadSlowmode != defaultThreadSlowmode) + { + channel.setDefaultThreadSlowmode(defaultThreadSlowmode); + api.handleEvent( + new ChannelUpdateDefaultThreadSlowmodeEvent( + api, responseNumber, + channel, oldDefaultThreadSlowmode, defaultThreadSlowmode)); + } + } + + private void handleAudioChannel(AudioChannelMixin channel, DataObject content) + { + int oldBitrate = channel.getBitrate(); + int bitrate = content.getInt("bitrate"); + + if (oldBitrate != bitrate) + { + channel.setBitrate(bitrate); + api.handleEvent( + new ChannelUpdateBitrateEvent( + api, responseNumber, + channel, oldBitrate, bitrate)); + } + + String oldRegion = channel.getRegionRaw(); + String regionRaw = content.getString("rtc_region", null); + + if (!Objects.equals(oldRegion, regionRaw)) + { + channel.setRegion(regionRaw); + api.handleEvent( + new ChannelUpdateRegionEvent( + api, responseNumber, + channel, Region.fromKey(oldRegion), Region.fromKey(regionRaw))); + } + } }