D++ (DPP)
C++ Discord API Bot Library
Creating Your First Bot

In this example we will create a C++ version of the discord.js example program.

The two programs can be seen side by side below:

D++ Discord.js

#include <dpp/dpp.h>
const std::string BOT_TOKEN = "add your token here";
const dpp::snowflake MY_GUILD_ID = 825407338755653642;
int main() {
dpp::cluster bot(BOT_TOKEN);
bot.on_interaction_create([](const dpp::interaction_create_t& event) {
if (event.command.get_command_name() == "ping") {
event.reply("Pong!");
}
});
bot.on_ready([&bot](const dpp::ready_t& event) {
if (dpp::run_once<struct register_bot_commands>()) {
bot.guild_command_create(
dpp::slashcommand("ping", "Ping pong!", bot.me.id),
MY_GUILD_ID
);
}
});
bot.start(false);
}
The cluster class represents a group of shards and a command queue for sending and receiving commands...
Definition: cluster.h:418
std::string get_command_name() const
Get the command name for a command interaction.
Represents an application command, created by your bot either globally, or on a guild.
Definition: appcommand.h:768
std::function< void(const dpp::log_t &)> DPP_EXPORT cout_logger()
Get a default logger that outputs to std::cout. e.g.
uint64_t snowflake
A 64 bit unsigned value representing many things on discord. Discord calls the value a 'snowflake' va...
Definition: snowflake.h:32
Create interaction.
Definition: dispatcher.h:283
interaction command
command interaction
Definition: dispatcher.h:395
Session ready.
Definition: dispatcher.h:601

let Discord = require('discord.js');
let BOT_TOKEN = 'add your token here';
let MY_GUILD_ID = '825407338755653642';
let bot = new Discord.Client({ intents: [] });
bot.on('interactionCreate', (interaction) => {
if (interaction.isCommand() && interaction.commandName === 'ping') {
interaction.reply({content: 'Pong!'});
}
});
bot.once('ready', async () => {
let guild = await bot.guilds.fetch(MY_GUILD_ID);
await guild.commands.create({
name: 'ping',
description: "Ping pong!"
});
});
bot.login(BOT_TOKEN);‍
intents
intents are a bitmask of allowed events on your websocket.
Definition: intents.h:32

Let's break this program down step by step:

1. Start with an empty C++ program

Make sure to include the header file for the D++ library with the instruction #include <dpp/dpp.h>!

#include <dpp/dpp.h>
int main() {
}

2. Create an instance of dpp::cluster

To make use of the library you must create a dpp::cluster object. This object is the main object in your program like the Discord.Client object in Discord.js.

You can instantiate this class as shown below. Remember to put your bot token in the constant!

#include <dpp/dpp.h>
const std::string BOT_TOKEN = "add your token here";
int main() {
dpp::cluster bot(BOT_TOKEN);
}

3. Attach to an event

To have a bot that does something, you should attach to some events. Let's start by attaching to the on_ready event (dpp::cluster::on_ready) which will notify your program when the bot is connected. In this event, we will register a slash command called 'ping'. We register this slash command against a guild, as it takes an hour for global commands to appear. Note that we must wrap our registration of the command in a template called dpp::run_once which prevents it from being re-run every time your bot does a full reconnection (e.g. if the connection fails).

#include <dpp/dpp.h>
const std::string BOT_TOKEN = "add your token here";
const dpp::snowflake MY_GUILD_ID = 825407338755653642;
int main() {
dpp::cluster bot(BOT_TOKEN);
bot.on_ready([&bot](const dpp::ready_t& event) {
if (dpp::run_once<struct register_bot_commands>()) {
bot.guild_command_create(dpp::slashcommand("ping", "Ping pong!", bot.me.id), MY_GUILD_ID);
}
});
}

4. Attach to another event to receive slash commands

If you want to handle a slash command, you should also attach your program to the on_interaction_create event (dpp::cluster::on_interaction_create) which is the same as the Discord.js interactionCreate event. Lets add this to the program before the on_ready event:

#include <dpp/dpp.h>
const std::string BOT_TOKEN = "add your token here";
const dpp::snowflake MY_GUILD_ID = 825407338755653642;
int main() {
dpp::cluster bot(BOT_TOKEN);
bot.on_interaction_create([](const dpp::interaction_create_t& event) {
});
bot.on_ready([&bot](const dpp::ready_t& event) {
if (dpp::run_once<struct register_bot_commands>()) {
bot.guild_command_create(dpp::slashcommand("ping", "Ping pong!", bot.me.id), MY_GUILD_ID);
}
});
}

5 . Add some content to the events

Attaching to an event is a good start, but to make a bot you should actually put some program code into the interaction event. We will add some code to the on_interaction_create to look for our slash command '/ping' and reply with Pong!:

#include <dpp/dpp.h>
const std::string BOT_TOKEN = "add your token here";
const dpp::snowflake MY_GUILD_ID = 825407338755653642;
int main() {
dpp::cluster bot(BOT_TOKEN);
bot.on_interaction_create([](const dpp::interaction_create_t& event) {
if (event.command.get_command_name() == "ping") {
event.reply("Pong!");
}
});
bot.on_ready([&bot](const dpp::ready_t& event) {
if (dpp::run_once<struct register_bot_commands>()) {
bot.guild_command_create(dpp::slashcommand("ping", "Ping pong!", bot.me.id), MY_GUILD_ID);
}
});
}

Let's break down the code in the on_interaction_create event so that we can discuss what it is doing:

bot.on_interaction_create([](const dpp::interaction_create_t& event) {
if (event.command.get_command_name() == "ping") {
event.reply("Pong!");
}
});

This code is simply comparing the command name event.command.get_command_name() (dpp::interaction::get_command_name) against the value in a constant string value "ping". If they match, then the event.reply method is called.

The event.reply function (dpp::interaction_crete_t::reply) replies to a slash command with a message. There are many ways to call this function to send embed messages, upload files, and more, but for this simple demonstration we will just send some message text.

6. Add code to start the bot!

To make the bot start, we must call the cluster::start method, e.g. in our program by using bot.start(false).

We also add a line to tell the library to output all its log information to the console, bot.on_log(dpp::utility::cout_logger()); - if you wanted to do something more advanced, you can replace this parameter with a lambda just like all other events.

The parameter which we set to false indicates if the function should return once all shards are created. Passing false here tells the program you do not need to do anything once bot.start is called.

#include <dpp/dpp.h>
const std::string BOT_TOKEN = "add your token here";
const dpp::snowflake MY_GUILD_ID = 825407338755653642;
int main() {
dpp::cluster bot(BOT_TOKEN);
bot.on_interaction_create([](const dpp::interaction_create_t& event) {
if (event.command.get_command_name() == "ping") {
event.reply("Pong!");
}
});
bot.on_ready([&bot](const dpp::ready_t& event) {
if (dpp::run_once<struct register_bot_commands>()) {
bot.guild_command_create(dpp::slashcommand("ping", "Ping pong!", bot.me.id), MY_GUILD_ID);
}
});
bot.start(false);
}

7. Compile and run your bot

Compile your bot using g++ -std=c++17 -o test test.cpp -ldpp (if your .cpp file is called test.cpp) and run it with ./test.

8. Inviting your bot to your server

When you invite your bot, you must use the applications.commands and bots scopes to ensure your bot can create guild slash commands. For example:

https://discord.com/oauth2/authorize?client_id=YOUR-BOTS-ID-HERE&scope=bot+applications.commands&permissions=BOT-PERMISSIONS-HERE

Replace YOUR-BOTS-ID-HERE with your bot's user ID, and BOT-PERMISSIONS-HERE with the permissions your bot requires.

Congratulations - you now have a working bot written using the D++ library!

D++ Library version 10.0.29D++ Library version 10.0.28D++ Library version 10.0.27D++ Library version 10.0.26D++ Library version 10.0.25D++ Library version 10.0.24D++ Library version 10.0.23D++ Library version 10.0.22D++ Library version 10.0.21D++ Library version 10.0.20D++ Library version 10.0.19D++ Library version 10.0.18D++ Library version 10.0.17D++ Library version 10.0.16D++ Library version 10.0.15D++ Library version 10.0.14D++ Library version 10.0.13D++ Library version 10.0.12D++ Library version 10.0.11D++ Library version 10.0.10D++ Library version 10.0.9D++ Library version 10.0.8D++ Library version 10.0.7D++ Library version 10.0.6D++ Library version 10.0.5D++ Library version 10.0.4D++ Library version 10.0.3D++ Library version 10.0.2D++ Library version 10.0.1D++ Library version 10.0.0D++ Library version 9.0.19D++ Library version 9.0.18D++ Library version 9.0.17D++ Library version 9.0.16D++ Library version 9.0.15D++ Library version 9.0.14D++ Library version 9.0.13D++ Library version 9.0.12D++ Library version 9.0.11D++ Library version 9.0.10D++ Library version 9.0.9D++ Library version 9.0.8D++ Library version 9.0.7D++ Library version 9.0.6D++ Library version 9.0.5D++ Library version 9.0.4D++ Library version 9.0.3D++ Library version 9.0.2D++ Library version 9.0.1D++ Library version 9.0.0D++ Library version 1.0.2D++ Library version 1.0.1D++ Library version 1.0.0