How can I get an array of all the posts in a forum?

Hey there, I looked at the documentation but couldn't find anything regarding forum channels. I want to create a Slash Command that accepts a forum channel as input and then returns an array of all the posts that are in that forum. Any help would be much appreciated
17 Replies
d.js toolkit
d.js toolkit4d ago
- What's your exact discord.js npm list discord.js and node node -v version? - Not a discord.js issue? Check out #other-js-ts. - Consider reading #how-to-get-help to improve your question! - Explain what exactly your issue is. - Post the full error stack trace, not just the top part! - Show your code! - Issue solved? Press the button!
d.js docs
d.js docs4d ago
:property: ForumChannel#threads @14.16.3 A manager of the threads belonging to this channel
fedpep
fedpep4d ago
@Qjuh thanks for your answer but I still can't get this to work. I receive an error: TypeError: Cannot read properties of undefined (reading 'fetch') This is my code:
module.exports = {
name: Events.InteractionCreate,
data: new SlashCommandBuilder()
.setName('forum-export')
.setDescription('Export messages in a forum')
.addChannelOption(option =>
option.setName('channel')
.setDescription('The channel to echo into')
.addChannelTypes(ChannelType.GuildForum)
)
.setDefaultMemberPermissions(PermissionFlagsBits.Administrator),

async execute(interaction) {
await interaction.deferReply({ ephemeral: true });

try {
const guild = interaction.guild;
const channelLog = await guild.channels.fetch(process.env.BOT_LOG_CHANNEL_ID);
const channel = await interaction.options.getChannel('channel');
console.log(channel.thread.fetch(channel.id));

await interaction.editReply({content: `Run`});

}
module.exports = {
name: Events.InteractionCreate,
data: new SlashCommandBuilder()
.setName('forum-export')
.setDescription('Export messages in a forum')
.addChannelOption(option =>
option.setName('channel')
.setDescription('The channel to echo into')
.addChannelTypes(ChannelType.GuildForum)
)
.setDefaultMemberPermissions(PermissionFlagsBits.Administrator),

async execute(interaction) {
await interaction.deferReply({ ephemeral: true });

try {
const guild = interaction.guild;
const channelLog = await guild.channels.fetch(process.env.BOT_LOG_CHANNEL_ID);
const channel = await interaction.options.getChannel('channel');
console.log(channel.thread.fetch(channel.id));

await interaction.editReply({content: `Run`});

}
Ok, so I changed the code to this:
const channel = await interaction.options.getChannel('channel');
console.log(channel.threads.fetch());
const channel = await interaction.options.getChannel('channel');
console.log(channel.threads.fetch());
And now I get this: Promise { <pending> }
d.js docs
d.js docs4d ago
Resources to understand Promise: - MDN: learn more - Guide: learn more - JavaScript info: learn more
fedpep
fedpep4d ago
Now I get this
{
threads: Collection(1) [Map] {
'***' => ThreadChannel {
type: 11,
guild: [Guild],
guildId: '****',
messages: [GuildMessageManager],
members: [ThreadMemberManager],
flags: [ChannelFlagsBitField],
id: '***',
name: '***',
parentId: '***',
locked: false,
invitable: null,
archived: false,
autoArchiveDuration: 4320,
archiveTimestamp: 1728659798143,
_createdTimestamp: 1728659798143,
ownerId: '***',
lastMessageId: '***',
lastPinTimestamp: null,
rateLimitPerUser: 0,
messageCount: 21,
memberCount: 4,
totalMessageSent: 21,
appliedTags: []
}
},
members: Collection(0) [Map] {},
hasMore: false
}
{
threads: Collection(1) [Map] {
'***' => ThreadChannel {
type: 11,
guild: [Guild],
guildId: '****',
messages: [GuildMessageManager],
members: [ThreadMemberManager],
flags: [ChannelFlagsBitField],
id: '***',
name: '***',
parentId: '***',
locked: false,
invitable: null,
archived: false,
autoArchiveDuration: 4320,
archiveTimestamp: 1728659798143,
_createdTimestamp: 1728659798143,
ownerId: '***',
lastMessageId: '***',
lastPinTimestamp: null,
rateLimitPerUser: 0,
messageCount: 21,
memberCount: 4,
totalMessageSent: 21,
appliedTags: []
}
},
members: Collection(0) [Map] {},
hasMore: false
}
I see the last message in the forum but not a list of all the messages
Unknown User
Unknown User4d ago
Message Not Public
Sign In & Join Server To View
fedpep
fedpep4d ago
Any suggestions on how to do that? It’s a new forum (so there are no many messages) and I want to extract them all The why is that I used a forum channel on Discord to collect feature requests on a product and now I have to extract everything to a Google Sheet I was hoping to automate the process as much as possibile via the discord API In my head I could get the forum ID, get all the posts in it, and then extract the information that I need from each message But the collection that I have (see above) s only 1 item and not all the messages I’m using a test server and there are 2 posts at the moment Oh, I think you might be right. One post is showed as “older” so I guess it’s archived. Am I right? Is there a way to fetch all the messages (including older one)? I see there is a fetchedActive and a fetchedArchive
d.js docs
d.js docs4d ago
:method: GuildForumThreadManager#fetchArchived() @14.16.3 Obtains a set of archived threads from Discord. This method requires the PermissionFlagsBits.ReadMessageHistory permission in the parent channel.
fedpep
fedpep3d ago
Hey, so this is my new code:
const guild = interaction.guild;
const channelLog = await guild.channels.fetch(process.env.BOT_LOG_CHANNEL_ID);
const inputChannel = await interaction.options.getChannel('channel');
const channel = await inputChannel.threads.fetch();
channel.threads.forEach(async post => {
console.log(post);
});
const guild = interaction.guild;
const channelLog = await guild.channels.fetch(process.env.BOT_LOG_CHANNEL_ID);
const inputChannel = await interaction.options.getChannel('channel');
const channel = await inputChannel.threads.fetch();
channel.threads.forEach(async post => {
console.log(post);
});
and it's working because I can fetch all the threads in the specific forum (this is an excract of the output).
guildId: '***',
messages: GuildMessageManager { channel: [Circular *2] },
members: ThreadMemberManager { thread: [Circular *2] },
flags: ChannelFlagsBitField { bitfield: 0 },
id: '***',
name: '***',
parentId: '***',
locked: false,
invitable: null,
archived: false,
autoArchiveDuration: 4320,
archiveTimestamp: 1728659798143,
_createdTimestamp: 1728659798143,
ownerId: '***',
lastMessageId: '***',
lastPinTimestamp: null,
rateLimitPerUser: 0,
messageCount: 21,
memberCount: 4,
totalMessageSent: 21,
appliedTags: []
}
guildId: '***',
messages: GuildMessageManager { channel: [Circular *2] },
members: ThreadMemberManager { thread: [Circular *2] },
flags: ChannelFlagsBitField { bitfield: 0 },
id: '***',
name: '***',
parentId: '***',
locked: false,
invitable: null,
archived: false,
autoArchiveDuration: 4320,
archiveTimestamp: 1728659798143,
_createdTimestamp: 1728659798143,
ownerId: '***',
lastMessageId: '***',
lastPinTimestamp: null,
rateLimitPerUser: 0,
messageCount: 21,
memberCount: 4,
totalMessageSent: 21,
appliedTags: []
}
Now I can't get the messages. I tried to use the id and it didn't work
Unknown User
Unknown User3d ago
Message Not Public
Sign In & Join Server To View
fedpep
fedpep3d ago
Hey @gwapes really sorry about it. Let me explain myself better. With the above code now I am able to fetch all the posts that are in a specific forum. Now what I need is: 1. the title of every post 2. the number of reactions every post received (with the default tag, which is 👍 ) 3. the number of messages that are in that post From the discussion happened yesterday I understood that now that I have the collection of all the thread, I just need to loop through it and use the message.fetch(id) The problem is that since these are threads and not messages in a text channel, I can't understand what is the channel id and the message id I should use
d.js docs
d.js docs3d ago
:property: ThreadChannel#name @14.16.3 The name of the thread :method: ThreadChannel#fetchStarterMessage() @14.16.3 Fetches the message that started this thread, if any. The Promise will reject if the original message in a forum post is deleted or when the original message in the parent channel is deleted. If you just need the id of that message, use id instead.
fedpep
fedpep3d ago
Thank you very much for your help! Definitely not the cleanest code but it does work
const inputChannel = await interaction.options.getChannel('channel');
const channel = await inputChannel.threads.fetch();

channel.threads.forEach(async post => {
let output;
let r = "";
// const mess = await post.messages.fetch(post.id);
const mess = await post.fetchStarterMessage();
const react = mess.reactions.cache.forEach(async (reaction) => {
const emojiName = reaction._emoji.name
const emojiCount = reaction.count
r = emojiName + emojiCount

});
output = `${post.name}, https://discord.com/channels/${post.guildId}/${post.parentId}/threads/${post.id}/, ${post.messageCount}, ${r}`;
// THIS WORKS
console.log(output);
});
const inputChannel = await interaction.options.getChannel('channel');
const channel = await inputChannel.threads.fetch();

channel.threads.forEach(async post => {
let output;
let r = "";
// const mess = await post.messages.fetch(post.id);
const mess = await post.fetchStarterMessage();
const react = mess.reactions.cache.forEach(async (reaction) => {
const emojiName = reaction._emoji.name
const emojiCount = reaction.count
r = emojiName + emojiCount

});
output = `${post.name}, https://discord.com/channels/${post.guildId}/${post.parentId}/threads/${post.id}/, ${post.messageCount}, ${r}`;
// THIS WORKS
console.log(output);
});
Unknown User
Unknown User3d ago
Message Not Public
Sign In & Join Server To View
fedpep
fedpep3d ago
As I said, I need to export in a csv file title, number of reactions and number of comments of all the messages in a forum on Discord
Unknown User
Unknown User3d ago
Message Not Public
Sign In & Join Server To View
fedpep
fedpep3d ago
🙌 thanks
Want results from more Discord servers?
Add your server