| D++ (DPP) C++ Discord API Bot Library

Search
Loading...
Searching...
No Matches
Components V2

From March 2025 onwards Discord have released a new way to handle components in a Discord application/bot. The previous methods of working with components remain, and are accessible without any changes in D++. If you want to use the new style of components you may do so, which gives far greater control over how message containing images, buttons, sections etc are formatted.

Components are attached to any message or interaction reply, via the dpp::message::add_component() or dpp::message::add_component_v2() function. You must also be sure to set the flag dpp::m_using_components_v2 on the message to allow the new features.

When using components v2, the following limits apply which do not apply with components v1 or traditional embeds:

- Setting the message content or embeds will not be allowed (components v2 replaces the functionality)
- You can have a maximum of 10 top level components per message. The maximum number of nested components is 30.
- Audio files are not supported at present
- Text preview for text/plain files is not supported
- URLs will not have embeds generated for them
- The total length of the entire message, including all components within and the content of those components, is 4000 UTF-8 characters.

Here is a detailed example of how to create components v2 replies.

Warning
  Please note that where you would use add_component() previously, you should use add_component_v2() (on component or message objects). This is because the v2 version will not automatically add action rows, which is a limitation which has been removed in version 2 but is still required for version 1.

#include <dpp/dpp.h>
int main() {
dpp::cluster bot("token");
bot.on_log(dpp::utility::cout_logger());
bot.on_ready([&bot](const auto& event) {
if (dpp::run_once<struct boot_t>()) {
bot.global_bulk_command_create({ dpp::slashcommand("cats", "I love cats", bot.me.id) });
}
});
bot.on_button_click([](const dpp::button_click_t& event) {
event.reply("You declared your love for cats by clicking button id: " + event.custom_id);
});
/* This is a detailed example of using many different types of component. For a complete
* list of supported components, see the Discord developer documentation and the definition
* of dpp::component_type.
*/
bot.register_command("cats", [](const dpp::slashcommand_t& e) {
e.reply(dpp::message()
/* Remember to set the message flag for components v2 */
.set_flags(dpp::m_using_components_v2).add_component_v2(
/* Reply with a container... */
dpp::component()
.set_type(dpp::cot_container)
.set_accent(dpp::utility::rgb(255, 0, 0))
.set_spoiler(true)
.add_component_v2(
/* ...which contains a section... */
dpp::component()
.set_type(dpp::cot_section)
.add_component_v2(
/* ...with text... */
dpp::component()
.set_type(dpp::cot_text_display)
.set_content("Click if you love cats")
)
.set_accessory(
/* ...and an accessory button to the right */
dpp::component()
.set_type(dpp::cot_button)
.set_label("Click me")
.set_style(dpp::cos_danger)
.set_id("button")
)
)
).add_component_v2(
/* ... with a large visible divider between... */
dpp::component()
.set_type(dpp::cot_separator)
.set_spacing(dpp::sep_large)
.set_divider(true)
).add_component_v2(
/* ... followed by a media gallery... */
dpp::component()
.set_type(dpp::cot_media_gallery)
.add_media_gallery_item(
/* ...containing one cat pic (obviously) */
dpp::component()
.set_type(dpp::cot_thumbnail)
.set_description("A cat")
.set_thumbnail("https://www.catster.com/wp-content/uploads/2023/11/Beluga-Cat-e1714190563227.webp")
)
));
});
bot.start(dpp::st_wait);
}
dpp::cluster
The cluster class represents a group of shards and a command queue for sending and receiving commands...
Definition cluster.h:89
dpp::component
Represents the component object. A component is a clickable button or drop down list within a discord...
Definition message.h:497
dpp::slashcommand
Represents an application command, created by your bot either globally, or on a guild.
Definition appcommand.h:1449
dpp::utility::cout_logger
std::function< void(const dpp::log_t &)> DPP_EXPORT cout_logger()
Get a default logger that outputs to std::cout. e.g.
dpp::utility::rgb
uint32_t DPP_EXPORT rgb(double red, double green, double blue)
Convert doubles to RGB for sending in embeds.
dpp::sep_large
@ sep_large
Large separator.
Definition message.h:482
dpp::run_once
auto run_once()
Run some code within an if() statement only once.
Definition once.h:41
dpp::m_using_components_v2
@ m_using_components_v2
Message components vector contains v2 components.
Definition message.h:2013
dpp::cos_danger
@ cos_danger
Red; danger.
Definition message.h:243
dpp::st_wait
@ st_wait
Wait forever on a condition variable. The cluster will spawn threads for each shard and start() will ...
Definition cluster.h:72
dpp::cot_separator
@ cot_separator
Separator between sections or other components.
Definition message.h:114
dpp::cot_button
@ cot_button
Clickable button.
Definition message.h:48
dpp::cot_media_gallery
@ cot_media_gallery
Collection of media (images, videos).
Definition message.h:102
dpp::cot_text_display
@ cot_text_display
Simple text.
Definition message.h:90
dpp::cot_section
@ cot_section
Section.
Definition message.h:84
dpp::cot_container
@ cot_container
Container for other components.
Definition message.h:125
dpp::cot_thumbnail
@ cot_thumbnail
Image thumbnail, clickable to expand.
Definition message.h:96
dpp::button_click_t
Click on button.
Definition dispatcher.h:814
dpp::button_click_t::custom_id
std::string custom_id
button custom id
Definition dispatcher.h:824
dpp::interaction_create_t::reply
void reply(command_completion_event_t callback=utility::log_error()) const
Acknowledge interaction without displaying a message to the user, for use with button and select menu...
dpp::message
Represents messages sent and received on Discord.
Definition message.h:2363
dpp::slashcommand_t
User has issued a slash command.
Definition dispatcher.h:806

There are many new component types, for a complete list see the definition of dpp::component_type

If you run the example program above, you will be shown a message containing your components:

D++ Library version 9.0.13 D++ Library version 9.0.12 D++ Library version 9.0.11 D++ Library version 9.0.10 D++ Library version 9.0.9 D++ Library version 9.0.8 D++ Library version 9.0.7 D++ Library version 9.0.6 D++ Library version 9.0.5 D++ Library version 9.0.4 D++ Library version 9.0.3 D++ Library version 9.0.2 D++ Library version 9.0.1 D++ Library version 9.0.0 D++ Library version 1.0.2 D++ Library version 1.0.1 D++ Library version 1.0.0