Skip to content

Commit

Permalink
Add default_forum_layout for Forum Channel (#2407)
Browse files Browse the repository at this point in the history
  • Loading branch information
Mysterious-Dev committed Mar 11, 2023
1 parent a959f29 commit 83d370d
Show file tree
Hide file tree
Showing 13 changed files with 238 additions and 5 deletions.
8 changes: 8 additions & 0 deletions src/main/java/net/dv8tion/jda/api/audit/AuditLogKey.java
Expand Up @@ -320,6 +320,14 @@ public enum AuditLogKey
// */
// CHANNEL_DEFAULT_SORT_ORDER("default_sort_order"),

/**
* The {@link ForumChannel#getDefaultLayout()} value.
* <br>Only for {@link ChannelType#FORUM}.
*
* <p>Expected type: <b>Integer</b>
*/
DEFAULT_FORUM_LAYOUT("default_forum_layout"),

// THREADS

/**
Expand Down
Expand Up @@ -246,6 +246,15 @@ public enum ChannelField
*/
APPLIED_TAGS("applied_tags", AuditLogKey.THREAD_APPLIED_TAGS),

/**
* The default layout of a forum channel.
*
* <p>Limited to {@link ForumChannel Forum Channels}.
*
* @see ForumChannel#getDefaultLayout()
*/
DEFAULT_FORUM_LAYOUT("default_forum_layout", AuditLogKey.DEFAULT_FORUM_LAYOUT),

// /**
// * The default sort order of a forum channel.
// *
Expand Down
Expand Up @@ -212,6 +212,14 @@ default boolean isTagRequired()
// @Nonnull
// SortOrder getDefaultSortOrder();

/**
* The default layout used to show threads.
*
* @return The default layout used to show threads.
*/
@Nonnull
Layout getDefaultLayout();

/**
* Creates a new forum post (thread) in this forum.
*
Expand Down Expand Up @@ -243,6 +251,67 @@ default boolean isTagRequired()
@CheckReturnValue
ForumPostAction createForumPost(@Nonnull String name, @Nonnull MessageCreateData message);

/**
* The layout used to sort forum posts.
*/
enum Layout
{
/**
* Displayed as default (not set).
*/
DEFAULT_VIEW(0),
/**
* Displayed as a chronological list.
*/
LIST_VIEW(1),
/**
* Displayed as a collection of tiles.
*/
GALLERY_VIEW(2),

/**
* Placeholder for future layout types.
*/
UNKNOWN(-1);

private final int key;

Layout(int key)
{
this.key = key;
}

/**
* The underlying value as used by Discord.
*
* @return The raw order key
*/
public int getKey()
{
return key;
}

/**
* The {@link Layout} for the provided key.
*
* @param key
* The key to get the {@link Layout} for
*
* @return The {@link Layout} for the provided key, or {@link #UNKNOWN} if the key is not known
*/
@Nonnull
public static Layout fromKey(int key)
{
for (Layout layout : values())
{
if (layout.key == key)
return layout;
}

return UNKNOWN;
}
}

// /**
// * The order used to sort forum posts.
// */
Expand Down
@@ -0,0 +1,54 @@
/*
* 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.api.events.channel.update;

import net.dv8tion.jda.api.JDA;
import net.dv8tion.jda.api.entities.channel.Channel;
import net.dv8tion.jda.api.entities.channel.ChannelField;
import net.dv8tion.jda.api.entities.channel.concrete.ForumChannel;

import javax.annotation.Nonnull;

/**
* Indicates that the {@link ForumChannel#getDefaultLayout() default layout} of a {@link ForumChannel} changed.
*
* <p>Can be used to retrieve the old default layout and the new one.
*
* @see ChannelField#DEFAULT_FORUM_LAYOUT
*/
@SuppressWarnings("ConstantConditions")
public class ChannelUpdateDefaultLayoutEvent extends GenericChannelUpdateEvent<ForumChannel.Layout>
{
public ChannelUpdateDefaultLayoutEvent(@Nonnull JDA api, long responseNumber, @Nonnull Channel channel, @Nonnull ForumChannel.Layout oldValue, @Nonnull ForumChannel.Layout newValue)
{
super(api, responseNumber, channel, ChannelField.DEFAULT_FORUM_LAYOUT, oldValue, newValue);
}

@Nonnull
@Override
public ForumChannel.Layout getOldValue()
{
return super.getOldValue();
}

@Nonnull
@Override
public ForumChannel.Layout getNewValue()
{
return super.getNewValue();
}
}
Expand Up @@ -206,6 +206,7 @@ public void onChannelUpdateSlowmode(@Nonnull ChannelUpdateSlowmodeEvent event) {
public void onChannelUpdateDefaultThreadSlowmode(@Nonnull ChannelUpdateDefaultThreadSlowmodeEvent event) {}
public void onChannelUpdateDefaultReaction(@Nonnull ChannelUpdateDefaultReactionEvent event) {}
// public void onChannelUpdateDefaultSortOrder(@Nonnull ChannelUpdateDefaultSortOrderEvent event) {}
public void onChannelUpdateDefaultLayout(@Nonnull ChannelUpdateDefaultLayoutEvent event) {}
public void onChannelUpdateTopic(@Nonnull ChannelUpdateTopicEvent event) {}
public void onChannelUpdateType(@Nonnull ChannelUpdateTypeEvent event) {}
public void onChannelUpdateUserLimit(@Nonnull ChannelUpdateUserLimitEvent event) {}
Expand Down
Expand Up @@ -89,6 +89,8 @@ public interface ChannelManager<T extends GuildChannel, M extends ChannelManager
long REQUIRE_TAG = 1 << 18;
/** Used to reset the default reaction emoji field */
long DEFAULT_REACTION = 1 << 19;
/** Used to reset the default layout field */
long DEFAULT_LAYOUT = 1 << 20;

/**
* Resets the fields specified by the provided bit-flag pattern.
Expand Down Expand Up @@ -117,6 +119,7 @@ public interface ChannelManager<T extends GuildChannel, M extends ChannelManager
* <li>{@link #PINNED}</li>
* <li>{@link #REQUIRE_TAG}</li>
* <li>{@link #DEFAULT_REACTION}</li>
* <li>{@link #DEFAULT_LAYOUT}</li>
* </ul>
*
* @param fields
Expand Down Expand Up @@ -153,6 +156,7 @@ public interface ChannelManager<T extends GuildChannel, M extends ChannelManager
* <li>{@link #PINNED}</li>
* <li>{@link #REQUIRE_TAG}</li>
* <li>{@link #DEFAULT_REACTION}</li>
* <li>{@link #DEFAULT_LAYOUT}</li>
* </ul>
*
* @param fields
Expand Down
Expand Up @@ -108,4 +108,18 @@ public interface ForumChannelManager extends
@Nonnull
@CheckReturnValue
ForumChannelManager setDefaultReaction(@Nullable Emoji emoji);

/**
* Sets the <b><u>default layout</u></b> of the selected {@link ForumChannel}.
*
* @param layout
* The new default layout.
*
* @return ChannelManager for chaining convenience
*
* @see ForumChannel#getDefaultLayout()
*/
@Nonnull
@CheckReturnValue
ForumChannelManager setDefaultLayout(@Nonnull ForumChannel.Layout layout);
}
Expand Up @@ -210,6 +210,20 @@ public interface ChannelAction<T extends GuildChannel> extends FluentAuditableRe
@CheckReturnValue
ChannelAction<T> setDefaultReaction(@Nullable Emoji emoji);

/**
* Sets the <b><u>default layout</u></b> of the new {@link ForumChannel}.
*
* @param layout
* The new default layout.
*
* @return The current ChannelAction, for chaining convenience
*
* @see ForumChannel#getDefaultLayout()
*/
@Nonnull
@CheckReturnValue
ChannelAction<T> setDefaultLayout(@Nonnull ForumChannel.Layout layout);

/**
* Sets the <b><u>available tags</u></b> of the new {@link ForumChannel}.
* <br>Tags will be ordered based on the provided list order.
Expand Down
Expand Up @@ -1380,6 +1380,7 @@ public ForumChannel createForumChannel(GuildImpl guild, DataObject json, long gu
.setFlags(json.getInt("flags", 0))
.setDefaultReaction(json.optObject("default_reaction_emoji").orElse(null))
// .setDefaultSortOrder(json.getInt("default_sort_order", -1))
.setDefaultLayout(json.getInt("default_forum_layout", -1))
.setName(json.getString("name"))
.setTopic(json.getString("topic", null))
.setPosition(json.getInt("position"))
Expand Down
Expand Up @@ -78,6 +78,7 @@ public class ForumChannelImpl extends AbstractGuildChannelImpl<ForumChannelImpl>
private int flags;
private int slowmode;
// private int defaultSortOrder;
private int defaultLayout;
protected int defaultThreadSlowmode;

public ForumChannelImpl(long id, GuildImpl guild)
Expand Down Expand Up @@ -111,7 +112,8 @@ public ChannelAction<ForumChannel> createCopy(@Nonnull Guild guild)
.setNSFW(nsfw)
.setTopic(topic)
.setSlowmode(slowmode)
.setAvailableTags(getAvailableTags());
.setAvailableTags(getAvailableTags())
.setDefaultLayout(Layout.fromKey(defaultLayout));
if (defaultReaction instanceof UnicodeEmoji)
action.setDefaultReaction(defaultReaction);
if (guild.equals(getGuild()))
Expand Down Expand Up @@ -200,6 +202,13 @@ public int getDefaultThreadSlowmode()
// return SortOrder.fromKey(defaultSortOrder);
// }

@Nonnull
@Override
public Layout getDefaultLayout()
{
return Layout.fromKey(defaultLayout);
}

@Nonnull
@Override
public ForumPostAction createForumPost(@Nonnull String name, @Nonnull MessageCreateData message)
Expand Down Expand Up @@ -232,6 +241,11 @@ public int getRawFlags()
// return defaultSortOrder;
// }

public int getRawLayout()
{
return defaultLayout;
}

// Setters

@Override
Expand Down Expand Up @@ -295,4 +309,10 @@ else if (emoji != null && !emoji.isNull("emoji_name"))
// this.defaultSortOrder = defaultSortOrder;
// return this;
// }

public ForumChannelImpl setDefaultLayout(int layout)
{
this.defaultLayout = layout;
return this;
}
}
Expand Up @@ -28,10 +28,7 @@
import net.dv8tion.jda.api.entities.channel.ChannelFlag;
import net.dv8tion.jda.api.entities.channel.ChannelType;
import net.dv8tion.jda.api.entities.channel.attribute.IThreadContainer;
import net.dv8tion.jda.api.entities.channel.concrete.Category;
import net.dv8tion.jda.api.entities.channel.concrete.NewsChannel;
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.concrete.*;
import net.dv8tion.jda.api.entities.channel.forums.ForumTag;
import net.dv8tion.jda.api.entities.emoji.EmojiUnion;
import net.dv8tion.jda.api.events.channel.forum.ForumTagAddEvent;
Expand Down Expand Up @@ -145,12 +142,14 @@ protected Long handleInternally(DataObject content)

int flags = content.getInt("flags", 0);
// int sortOrder = content.getInt("default_sort_order", ((ForumChannelImpl) channel).getRawSortOrder());
int layout = content.getInt("default_forum_layout", ((ForumChannelImpl) channel).getRawLayout());
EmojiUnion defaultReaction = content.optObject("default_reaction_emoji")
.map(json -> EntityBuilder.createEmoji(json, "emoji_name", "emoji_id"))
.orElse(null);

int oldFlags = forumChannel.getRawFlags();
// int oldSortOrder = forumChannel.getRawSortOrder();
int oldLayout = forumChannel.getRawLayout();
EmojiUnion oldDefaultReaction = forumChannel.getDefaultReaction();

content.optArray("available_tags").ifPresent(
Expand All @@ -173,6 +172,14 @@ protected Long handleInternally(DataObject content)
// getJDA(), responseNumber,
// forumChannel, ForumChannel.SortOrder.fromKey(oldSortOrder), ForumChannel.SortOrder.fromKey(sortOrder)));
// }
if (oldLayout != layout)
{
forumChannel.setDefaultLayout(layout);
getJDA().handleEvent(
new ChannelUpdateDefaultLayoutEvent(
getJDA(), responseNumber,
forumChannel, ForumChannel.Layout.fromKey(oldLayout), ForumChannel.Layout.fromKey(layout)));
}
if (!Objects.equals(oldDefaultReaction, defaultReaction))
{
forumChannel.setDefaultReaction(content.optObject("default_reaction_emoji").orElse(null));
Expand Down
Expand Up @@ -74,6 +74,7 @@ public class ChannelManagerImpl<T extends GuildChannel, M extends ChannelManager
protected List<BaseForumTag> availableTags;
protected List<String> appliedTags;
protected Emoji defaultReactionEmoji;
protected int defaultLayout;
protected ChannelType type;
protected String name;
protected String parent;
Expand Down Expand Up @@ -630,6 +631,18 @@ public M setDefaultReaction(Emoji emoji)
return (M) this;
}

public M setDefaultLayout(ForumChannel.Layout layout)
{
if (type != ChannelType.FORUM)
throw new IllegalStateException("Can only set default layout on forum channels.");
Checks.notNull(layout, "layout");
if (layout == ForumChannel.Layout.UNKNOWN)
throw new IllegalStateException("Layout type cannot be UNKNOWN.");
this.defaultLayout = layout.getKey();
set |= DEFAULT_LAYOUT;
return (M) this;
}

@Override
protected RequestBody finalizeData()
{
Expand Down Expand Up @@ -677,6 +690,8 @@ else if (defaultReactionEmoji instanceof UnicodeEmoji)
else
frame.put("default_reaction_emoji", null);
}
if (shouldUpdate(DEFAULT_LAYOUT))
frame.put("default_forum_layout", defaultLayout);

withLock(lock, (lock) ->
{
Expand Down

0 comments on commit 83d370d

Please sign in to comment.