Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -8,18 +8,23 @@
import com.denizenscript.denizencore.objects.*;
import com.denizenscript.denizencore.objects.core.ElementTag;
import com.denizenscript.denizencore.objects.core.ListTag;
import com.denizenscript.denizencore.tags.ObjectTagProcessor;
import com.denizenscript.denizencore.tags.Attribute;
import com.denizenscript.denizencore.tags.ObjectTagProcessor;
import com.denizenscript.denizencore.tags.TagContext;
import com.denizenscript.denizencore.utilities.CoreUtilities;
import com.denizenscript.denizencore.utilities.debugging.Debug;
import net.dv8tion.jda.api.entities.*;
import net.dv8tion.jda.api.entities.channel.Channel;
import net.dv8tion.jda.api.entities.channel.attribute.IThreadContainer;
import net.dv8tion.jda.api.entities.channel.concrete.ForumChannel;
import net.dv8tion.jda.api.entities.channel.concrete.ThreadChannel;
import net.dv8tion.jda.api.entities.channel.forums.ForumTagSnowflake;
import net.dv8tion.jda.api.entities.channel.middleman.*;
import net.dv8tion.jda.api.entities.channel.unions.IThreadContainerUnion;

import java.util.ArrayList;
import java.util.Collection;

public class DiscordChannelTag implements ObjectTag, FlaggableObject, Adjustable {

// <--[ObjectType]
Expand Down Expand Up @@ -434,6 +439,90 @@ public static void register() {
return new ElementTag(((StandardGuildMessageChannel) object.getChannel()).getTopic());
});

// <--[tag]
// @attribute <DiscordChannelTag.forum_channel_tags>
// @returns ListTag
// @plugin dDiscordBot
// @description
// Returns the ids of possible tags for a forum post.
// Only applicable to forum channels.
// See also <@link tag DiscordChannelTag.forum_post_tags> and <@link mechanism DiscordChannelTag.forum_post_tags>.
// -->
tagProcessor.registerTag(ListTag.class, "forum_channel_tags", (attribute, object) -> {
if (!(object.getChannel() instanceof ForumChannel forumChannel)) {
attribute.echoError("This is not a forum channel.");
return null;
}
return new ListTag(forumChannel.getAvailableTags(), tag -> new ElementTag(tag.getIdLong()));
});

// <--[tag]
// @attribute <DiscordChannelTag.forum_post_tags>
// @returns ListTag
// @plugin dDiscordBot
// @mechanism DiscordChannelTag.forum_post_tags
// @description
// Returns the ids of tags on a post in a forum channel.
// See also <@link tag DiscordChannelTag.forum_channel_tags>.
// -->
tagProcessor.registerTag(ListTag.class, "forum_post_tags", (attribute, object) -> {
if (!(object.getChannel() instanceof ThreadChannel threadChannel)) {
attribute.echoError("This channel is not a forum post.");
return null;
}
if (!(threadChannel.getParentChannel() instanceof ForumChannel)) {
attribute.echoError("This thread is not in a forum channel.");
return null;
}
return new ListTag(threadChannel.getAppliedTags(), tag -> new ElementTag(tag.getIdLong()));
});

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i tested this with a normal public thread under a text channel: https://paste.denizenscript.com/View/141576

since it's still a ThreadChannel, this check passes and forum_post_tags just returns an empty list instead of saying it isn't a forum post.

I think this also needs to check what the thread's parent channel is, instead of only checking ThreadChannel.


// <--[mechanism]
// @object DiscordChannelTag
// @name forum_post_tags
// @input ListTag
Comment thread
mcmonkey4eva marked this conversation as resolved.
// @plugin dDiscordBot
// @description
// Sets the tags on a post in a forum channel. A post can have a maximum of 5 tags.
// Entries are the ids of the tags. Provide no input to remove all tags.
// @tags
// <DiscordChannelTag.forum_channel_tags>
// <DiscordChannelTag.forum_post_tags>
// -->
tagProcessor.registerMechanism("forum_post_tags", false, (object, mechanism) -> {
if (!(object.getChannel() instanceof ThreadChannel threadChannel)) {
mechanism.echoError("This channel is not a forum post.");
return;
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same thing happens here with a normal text-channel thread; it passes this check, then gets as far as JDA and throws: IllegalStateException: Cannot apply tags to threads outside of forum/media channels. - this should validate the thread's parent before trying to set the tags too

if (!(threadChannel.getParentChannel() instanceof ForumChannel)) {
mechanism.echoError("This thread is not in a forum channel.");
return;
}
if (!mechanism.hasValue()) {
threadChannel.getManager().setAppliedTags().submit();
return;
}
ListTag input = mechanism.valueAsType(ListTag.class);
int size;
if (input.size() > 5) {
mechanism.echoError("Mechanism has a maximum input of 5 tag ids.");
size = 5;
}
else {
size = input.size();
}
Collection<ForumTagSnowflake> forumTags = new ArrayList<>(size);
for (int i = 0; i < size; i++) {
try {
forumTags.add(ForumTagSnowflake.fromId(Long.parseLong(input.get(i))));
}
catch (NumberFormatException e) {
mechanism.echoError("Invalid forum tag id '" + input.get(i) + "'.");
}
}
threadChannel.getManager().setAppliedTags(forumTags).submit();
});

// <--[mechanism]
// @object DiscordChannelTag
// @name add_thread_member
Expand Down