diff --git a/src/main/java/com/seailz/discordjar/DiscordJar.java b/src/main/java/com/seailz/discordjar/DiscordJar.java index 1223156e..46e990e5 100644 --- a/src/main/java/com/seailz/discordjar/DiscordJar.java +++ b/src/main/java/com/seailz/discordjar/DiscordJar.java @@ -590,6 +590,25 @@ public ForumChannel getForumChannelById(String id) { return ForumChannel.decompile(raw, this); } + /** + * Returns info about a {@link MediaChannel} + * + * @param id The id of the channel + * @return A {@link MediaChannel} object + */ + @Nullable + public MediaChannel getMediaChannelById(String id) { + Checker.isSnowflake(id, "Given id is not a snowflake"); + JSONObject raw = null; + try { + raw = getChannelCache().getById(id).raw(); + } catch (DiscordRequest.UnhandledDiscordAPIErrorException e) { + if (e.getHttpCode() == 404) return null; + throw new DiscordRequest.DiscordAPIErrorException(e); + } + return MediaChannel.decompile(raw, this); + } + /** * Returns info about a {@link Category} * @@ -609,6 +628,26 @@ public Category getCategoryById(String id) { return Category.decompile(raw, this); } + /** + * Returns info about a {@link VoiceChannel} + * + * @param id The id of the channel + * @return A {@link VoiceChannel} object + */ + @Nullable + public VoiceChannel getVoiceChannelById(String id) { + Checker.isSnowflake(id, "Given id is not a snowflake"); + JSONObject raw = null; + try { + raw = getChannelCache().getById(id).raw(); + } catch (DiscordRequest.UnhandledDiscordAPIErrorException e) { + if (e.getHttpCode() == 404) return null; + throw new DiscordRequest.DiscordAPIErrorException(e); + } + return VoiceChannel.decompile(raw, this); + } + + /** * Returns info about a {@link Guild} * diff --git a/src/main/java/com/seailz/discordjar/model/channel/MediaChannel.java b/src/main/java/com/seailz/discordjar/model/channel/MediaChannel.java new file mode 100644 index 00000000..0347553c --- /dev/null +++ b/src/main/java/com/seailz/discordjar/model/channel/MediaChannel.java @@ -0,0 +1,55 @@ +package com.seailz.discordjar.model.channel; + +import com.seailz.discordjar.DiscordJar; +import com.seailz.discordjar.model.channel.forum.DefaultSortOrder; +import com.seailz.discordjar.model.channel.forum.ForumTag; +import com.seailz.discordjar.model.channel.internal.ForumChannelImpl; +import com.seailz.discordjar.model.channel.internal.MediaChannelImpl; +import com.seailz.discordjar.model.channel.utils.ChannelType; +import com.seailz.discordjar.model.guild.Guild; +import com.seailz.discordjar.model.permission.PermissionOverwrite; +import org.jetbrains.annotations.NotNull; +import org.json.JSONObject; + +import java.util.ArrayList; +import java.util.List; + +/** + * Represents a media channel. + * These are very similar to {@link ForumChannel}s, with very few differences. + * + * @see ForumChannel + */ +public interface MediaChannel extends ForumChannel { + static MediaChannel decompile(JSONObject obj, DiscordJar discordJar) { + String id = obj.getString("id"); + String name = obj.getString("name"); + int position = obj.getInt("position"); + + List permissionOverwrites = new ArrayList<>(); + for (Object overwrite : obj.getJSONArray("permission_overwrites")) { + permissionOverwrites.add(PermissionOverwrite.decompile((JSONObject) overwrite)); + } + + boolean nsfw = obj.getBoolean("nsfw"); + String postGuidelines = obj.has("topic") && !obj.isNull("topic") ? obj.getString("topic") : null; + String lastThreadId = obj.has("last_thread_id") && !obj.isNull("last_thread_id") ? obj.getString("last_thread_id") : null; + DefaultSortOrder defaultSortOrder = obj.has("default_sort_order") && !obj.isNull("default_sort_order") ? DefaultSortOrder.fromCode(obj.getInt("default_sort_order")) : DefaultSortOrder.UNKNOWN; + + List tags = new ArrayList<>(); + if (obj.has("available_tags") && !obj.isNull("available_tags")) { + for (Object tag : obj.getJSONArray("available_tags")) { + tags.add(ForumTag.decompile((JSONObject) tag)); + } + } + + Guild guild = obj.has("guild_id") && !obj.isNull("guild_id") ? discordJar.getGuildById(obj.getString("guild_id")) : null; + DefaultForumLayout dfl = obj.has("default_forum_layout") && !obj.isNull("default_forum_layout") ? DefaultForumLayout.fromCode(obj.getInt("default_forum_layout")) : DefaultForumLayout.UNKNOWN; + return new MediaChannelImpl(id, ChannelType.GUILD_FORUM, name, guild, position, permissionOverwrites, nsfw, postGuidelines, tags, defaultSortOrder, lastThreadId, obj, discordJar, dfl); + } + + @Override + default @NotNull ChannelType type() { + return ChannelType.GUILD_MEDIA; + } +} diff --git a/src/main/java/com/seailz/discordjar/model/channel/internal/MediaChannelImpl.java b/src/main/java/com/seailz/discordjar/model/channel/internal/MediaChannelImpl.java new file mode 100644 index 00000000..76cfae4a --- /dev/null +++ b/src/main/java/com/seailz/discordjar/model/channel/internal/MediaChannelImpl.java @@ -0,0 +1,18 @@ +package com.seailz.discordjar.model.channel.internal; + +import com.seailz.discordjar.DiscordJar; +import com.seailz.discordjar.model.channel.MediaChannel; +import com.seailz.discordjar.model.channel.forum.DefaultSortOrder; +import com.seailz.discordjar.model.channel.forum.ForumTag; +import com.seailz.discordjar.model.channel.utils.ChannelType; +import com.seailz.discordjar.model.guild.Guild; +import com.seailz.discordjar.model.permission.PermissionOverwrite; +import org.json.JSONObject; + +import java.util.List; + +public class MediaChannelImpl extends ForumChannelImpl implements MediaChannel { + public MediaChannelImpl(String id, ChannelType type, String name, Guild guild, int position, List permissionOverwrites, boolean nsfw, String postGuidelines, List tags, DefaultSortOrder defaultSortOrder, String lastThreadId, JSONObject raw, DiscordJar discordJar, DefaultForumLayout defaultForumLayout) { + super(id, type, name, guild, position, permissionOverwrites, nsfw, postGuidelines, tags, defaultSortOrder, lastThreadId, raw, discordJar, defaultForumLayout); + } +} diff --git a/src/main/java/com/seailz/discordjar/model/channel/utils/ChannelType.java b/src/main/java/com/seailz/discordjar/model/channel/utils/ChannelType.java index f48b814a..180e1819 100644 --- a/src/main/java/com/seailz/discordjar/model/channel/utils/ChannelType.java +++ b/src/main/java/com/seailz/discordjar/model/channel/utils/ChannelType.java @@ -18,7 +18,8 @@ public enum ChannelType { PRIVATE_THREAD(12, "Private Thread", true, true), GUILD_STAGE_VOICE(13, "Stage Channel", false, true), GUILD_DIRECTORY(14, "Student Hub Directory", false, true), - GUILD_FORUM(15, " Forum", false, true), + GUILD_FORUM(15, "Forum", false, true), + GUILD_MEDIA(16, "Media Channel", false, true), ; private final int code; private final String name;