C++ Discord API Bot Library - D++ is Lightweight and scalable for small and huge bots!
APACHE-2.0 License
Bot releases are visible (Hide)
We are pleased to announce the release of D++ v10.0.29! This release contains many fixes, and also introduces coroutines to the windows bot template, so you can use templates out of the box on windows bots. We also now have full support on Brew on MacOS plus a MacOS bot template ready to use in XCode.
The changelog is listed below:
iteration_interval
changeable. (#1040)ready_t
(#1038)/await:strict
from clang-cl flagsDPP_EXPORT
on json_interface.h
dpp::thread
from channel.h
into thread.h
setting_status
page use the latest ready_t
feature (#1039)clearing_slashcommands.cpp
(#1012)Thank you for using D++!
Published by braindigitalis 12 months ago
We are happy to announce the release of D++ 10.0.28! This release fixes a few long standing issues, the main one being the way the library handles a mismatch between release and debug builds on windows with the project that links to D++. Instead of an exception which points to some obscure code called _Scary->_MyHead
you will get a dialog box popup instead before the library throws. This makes troubleshooting while developing a lot more straightforward.
Autocompletes where the options are numeric will also no longer throw an exception in on_autocomplete
.
The changelog is listed below:
maybe_unused
to build_type
constexpr to squash warning (#993)inner_emoji
to component_emoji
, changed select_menu
and component to use it. (#974)Thank you for using D++!
Published by braindigitalis 12 months ago
We are pleased to announce the Spooky release of D++ 10.0.27 π» just before Halloween! This release is filled with non-ghostly enhancements and ghoulish fixes, notably, the way we store guild members has changed slightly, so you might find that where you were directly accessing values such as the roles
vector, instead you need to use get_roles()
. This is so we can correctly track which parts of the structure you changed if you send it to Discord in an API request.
We have also changed the way we hold icon data, to allow for uploading of guild banners etc.
Support for Discord's Premium App Subscriptions feature is now added. For more details please see the New Features section of this release announcement.
The changelog is listed below:
guild_member
state tracking (#909)dpp::role
's icon
field to utility::image_data
utility::image_data
for storing... image datadpp::application
is now updated, added set_iconhash_not_null
(#953)thread_get
for threads (#930)command_option
. (#918)interaction_modal_response
's ambiguous to_json
(#956)to_json_impl
and fill_from_json
virtual (#950)guild_member_remove
message_delete
thread_get
dpp::job
handler & push dpp::task
instead, and remove static_assert
in dpp::job
(#958)json_interface
(#937)setting_status
for guild cache (#955)making_threads.md
to include more info (#932)windows_vs.md
(#916)make_a_bot
from #820 (#915)FreeBSD.md
and openbsd.md
(#914)README.MD
(#891)dpp::event
(#925)on_message_delete
, on_role_delete
Improvement: improved detail for many other delete events, where we can give partial information instead of none for a delete event or give ids Refactor: Remove using namespace dpp
and using json =
nlohmann::json` in event handler source filesdpp::snowflake
and dpp::managed
(#912)version_checker
for UE. (#970)json.h
out of include from discordevents.h
(#926)Thank you for using D++!
Published by braindigitalis about 1 year ago
We are pleased to announce the release of D++ version 10.0.26! This new version fixes a long standing bug with voice connections where some voice endpoints would reject the connection. If you make use of audio in D++ you are strongly encouraged to upgrade.
We have also added support for disabling the guild and channel caches. At scale, this can save anything up to gigabytes of RAM (if you have for example 200,000+ guilds and several tens of millions of channels on your bot). If you use D++ on a very large bot you should investigate using this new feature. This version also adds support for avatar decorations in the dpp::user
class.
The changelog is listed below:
dpp::user
class (#732)[[maybe_unused]]
in some places where it was needed (#856)get_url
methods for message, channel and user. (#855)dispatcher.h
/.cpp (#899)_XOPEN_SOURCE
from defining on OpenBSD (#880)include_directories
for installed target (#863)presence.cpp
to allow custom statuses. (#848)discord_voice_client::send_audio_raw
blocking thread when provided with invalid size (#845)read_file
. (#896)clion.md
page. (#873)cmake.md
with #820. (#872)discordvoiceclient.h
(#871)coding_style_standards.md
with #820 (#852)windows_wsl.md
(#851)install-vcpkg.md
(#849)unicode_emoji
and fixed callback page. (#842)attachments.md
(#840)embeds.md
(#838)sslclient.cpp
to wsclient.cpp
where they belong, so they dont cause excessive data copies or false alarmsavx.h
(#879)T_fallback
Thank you for using D++!
Published by braindigitalis about 1 year ago
π This release comes with the active support of the coroutine features! New with C++20, coroutines are a great way to simplify asynchronous programs, removing the need for callbacks: check out the docs for more information. With them you can also easily do things that were previously very complex, for example assigning an action to a button on the spot!
You will need to build D++ from source and use the option -DDPP_CORO=on
in your CMake command.
Your application also needs to enable C++20 and define DPP_CORO
, by using:
-std=c++20 -DDPP_CORO
in your build command if building manually, ortarget_compile_definitions(my_program PUBLIC DPP_CORO)
and target_compile_features(my_program PUBLIC cxx_std_20)
.β Currently, coroutines are supported on g++11 and above, clang14 and above, and MSVC 19.37 and above. Note that g++11 and g++12 have a compiler bug with lambdas, which is fixed in g++13 (workaround described in one of the examples).
Note that this feature is still new and may have bugs and crashes, please report any to our GitHub or to our Discord server. Feel free to ask for support in the latter as well!
We hope you enjoy, and we will be co_awaiting your feedback!
We have also added support for AVX, AVX2 and AVX512 for mixing audio streams, when you receive audio from many discord users into one stream. This will improve the performance of mixing by many factors if you have a processor that can support it; as of right now, this is 64 bit Intel/AMD machines with plans to support ARM NEON.
We will also be joining the google os-fuzz and are to be considered as a critical infrastructure project - this means that you can expect even more stable releases from us, as well tested as ever and then some!
co_attach
& enforce event handler call semantics (return void/dpp::job
, take const event) (#807)dpp::task::cancel()
, lock-free dpp::task
dpp::job
, a lightweight async coroutinedpp::utility
::guild_navigation
helper (#810)DPP_USE_PCH
option in CMake (#793)can_any
methods to dpp::permission
class (#776)dpp::snowflake::str()
that returns string form of snowflake valuebool
is_coro_enabled()function to
dpp::utility` namespace (#737)is_remix()
to dpp::attachment
(#727)IN_PROMPT
(#728)message_author_id
field to message_reaction_add_t
event (#730)CREATOR_MONETIZATION_REQUEST_CREATED
, CREATOR_MONETIZATION_TERMS_ACCEPTED
cluster::interaction_followup_get_original
(#723)embed::set_colour()
, alias of set_color
with correct spellingdpp::invite
class (#708)global_name
to dpp::user
(#712)dpp::invite
(#698)USE_EXTERNAL_SOUNDS
permission (#701)-1
, +1
and new
, use unicode_emoji
namespace in unit tests instead of hard coded emoji contentunicode_emoji.h
now compiles properly (#806)DetectArchitecture.cmake
to only search for required CPU-flags. (#816)x86_64
/x86 arch) (#815)cluster::guild_create
, cluster::stage_instance_create
and cluster::sticker_packs_get
returning 404 Not Found (#809)discordevents.cpp
exports on Windows (#781)dpp::emoji
(#775)default
empty destructorsovershoot_accumulator
in voice timersCMakeSettings.json
(#740)user::format_username
now returns the global_name
if it's set (#733)dpp::to_hex
to use std::locale
::classic for formatting (#725)cluster::thread_edit
, fix cluster::thread_members_get
, refactor cluster::threads_get_active
, add a bunch of tests for threads (#700)interaction_modal_response::fill_from_json
(#703)dpp::async
dpp::awaitable
to dpp::async
interaction_response.msg
from message* to message, fixing double free on copy (#762)std::for_each
to ranged for loopschannel::add_permission_overwrite
(#702)channel::add_permission_overwrite
& added set_permission_overwrite
and remove_permission_overwrite
methodsREADME.md
to include nightly builds. (#821)on_message_create
and changed warnings about message content privilege. (#799)collect_reactions
page more explicit. (#780)unicode_emoji
namespace (#739)README.md
(#707)coro.h
into its own folderdpp::slashcommand
constructor for context menu commands (#801)disdppgloss.md
pull_request_template.md
scorecard.yml
dependabot.yml
README.md
CONTRIBUTING.md
CONTRIBUTING.md
- add rules about not just using automated tools to generate bad prscspell.json
INDEX.md
dpp::user::get_default_avatar()
to new username system (#711)Thank you for using D++!
Published by braindigitalis over 1 year ago
We are pleased to announce the release of D++ 10.0.24! This new release has four months of fixes and feature enhancements, including:
New guild member flags, on_guild_audit_log_entry_create
gateway event, join raid and mention raid protection feature, support for voice messages, slashcommand_t::get_parameter
supports subcommands, APPLICATION_AUTO_MODERATION_RULE_CREATE_BADGE
, VIEW_CREATOR_MONETIZATION_ANALYTICS
and USE_SOUNDBOARD
permissions, added MIME type to HTTP file transfer API, and also added the ps_invisible
presence status.
There is unfortunately no news yet on the structure the API will take for the new discord usernames and replacement of discriminators. When we have more details on this, a new release supporting it officially will follow ASAP.
The changelog is listed below:
on_message_receive
on_ready
event handler to main threadGcc13.1
(#664)threads_get_active
and add an error check to the sync generator so we know sooner if its brokencluster::guild_get_bans
(#655)cluster::guild_get_bans
which stored all bans in the ban_map
with key 0, causing the method to return only one ban from the listget_parameter
(#648)command_option
parsing which didn't parse commands with too many subcommands and subcommand groups (#647)get_parameter
include/
in its install directory when added as a subdirectory (#637)include/
in its install directory as subdirectorycluster::threads_get_active
(#633)cluster::threads_get_active
method and added a new return type dpp::active_thread_map
for itcluster::thread_members_get
and cluster::thread_member_get
which accidentally had the wrong endpointuser.h
'?is_premium_subscription
to is_premium_subscriber
dpp::permission
(#651)guild_audit_log_entry_create.cpp
get_parameter
to interaction_create_t
from #641 (#646)add_localization
& get_parameter
in context_menu_t
and message_context_menu_t
(#641)get_parameter
from context_menu_t
and message_context_menu_t
to_json
and the description parameter of add_localization
is now optionaldeep_sea
to blue_chill
send_silence
(#627)i_guild_subscription
integration type (#692)on_guild_audit_log_entry_create
gateway event (#678)flags_extra
field from 1 byte to 2 bytes!slashcommand_t::get_parameter
supporting subcommandsAPPLICATION_AUTO_MODERATION_RULE_CREATE_BADGE
application flag (#644)VIEW_CREATOR_MONETIZATION_ANALYTICS
and USE_SOUNDBOARD
permissionDPP_ROOT_PATH
CMake variable, replace CMAKE_SOURCE_DIR
with DPP_ROOT_PATH
ps_invisible
presence statusmanaged::get_creation_date
unittest (#690)dpp::message
-related tests (#686)dpp::message
unit teststestdata/DPP-Logo.png
case in unit testsget_parameter
interaction_create_t::get_parameter
min_length
and max_length
parsing (#672)get_parameter
cspell.json
active_thread_map
to active_threads
active_thread_map
to active_thread_map
has_send_voice_messages
get_parameter
cluster::threads_get_active
get_user
methodThank you for using D++!
Published by braindigitalis over 1 year ago
We are happy to announce the release of D++ 10.0.23! This new version adds support for custom automod messages, the new user_get_cached
function (retrieve a user from the cache if possible otherwise issue an asynchronous user_get call), new message types, plus the ability to suppress notifications for a message, flags for role subscriptions, and a whole boatload of fixes.
The changelog is listed below:
channel::build_json
which caused an invalid form body error when creating a voice channel without a bitrate setstd::bad_alloc
in constructors by cleanup and rethrow (fixes #598)g_unavailable
flagdpp::g_monetization_enabled
because Discord changed the name from MONETIZATION_ENABLED
to CREATOR_MONETIZABLE_PROVISIONAL
-
DDPP_USE_EXTERNAL_JSON=ON
fix: remove unneccessary patch for making pkgconfig mandatory on vcpkg - this is no longer required.dpp::g_seven_day_thread_archive
, dpp::g_three_day_thread_archive
and dpp::g_channel_banners
get_parameter
and make it private instead of overwriting it (#602)dpp::guild_member
(#616)dpp::user
user_get_cached
and user_get_cached_sync
STAGE_START
, STAGE_END
, STAGE_SPEAKER
and STAGE_TOPIC
SUPPRESS_NOTIFICATIONS
message flag (#609)error_info
and passed to the callback for post_rest()
, so they can be handled by the userINTERACTION_PREMIUM_UPSELL
& GUILD_APPLICATION_PREMIUM_SUBSCRIPTION
(#607)dpp::g_role_subscription_enabled
, dpp::g_creator_store_page_enabled
, dpp::g_no_role_subscription_notifications
, dpp::g_no_role_subscription_notification_replies
and dpp::g_role_subscriptions_available_for_purchase
channel::default_sort_order
(#592)mt_role_subscription_purchase
(#593)channel::default_sort_order
get_option
-> get_value
in subcommand examplecluster::guild_auditlog_get
(#615)dpp::application_role_connection_metadata
get_default_avatar_url
load_image
methods to work with i_webp
dpp::g_commerce
and dpp::g_private_threads
after
-parameter to cluster::guild_auditlog_get
(#594)CXX_FLAGS_
{DEBUG,RELEASE} to get rid of if-else blocksThank you for using D++!
Published by braindigitalis almost 2 years ago
We are pleased to bring you the first D++ release of 2023! This new release brings with it a whole load of fixes, tweaks, and some new features such as Discord's new application role connection feature, and new auto moderation features.
We recommend updating to the latest version to stay on top of Discord's API changes.
The changelog is listed below:
on_voice_state_update
event hasn't updated the guild member in the cache (#580)dpp::cluster::thread_create_in_forum()
crashes the bot without a clear error when the bot has insufficient permissions (#577) (#578)application_role_connection_metadata
guild_member::set_pending
(#579)dpp::u_active_developer
user flag (#548)rest_request_vector
for rest requests returning real listsdiscordvoiceclient.cpp
USER_GET_FLAGS
user.cpp
scheduled_event::set_status
dpp::voicestate_flags
(#575)guild::set_pending
again (#585)dpp::g_private_threads
guild flag and mark as removed (#563)channel_mention
, user_mention
, role_mention
and emoji_mention
in utility the namespace (#576)cluster::guild_get_member
and user flags parsing (#565)Thank you for using D++!
Published by braindigitalis almost 2 years ago
We are proud to release the latest version of D++, version 10.0.21! This new version implements the latest Discord features from the API such as the new nitro basic flag, new select component types, and the developer support server flag. Alongside this are a raft of small bug fixes. This is a recommended update for all those wishing to stay at the cutting edge of the Discord API in their bot or application.
dpp::c_require_tag
for forum channels. dpp::channel
::flags has increased to uint16_t
! (#538)dpp::g_developer_support_server
guild flag (#533)component::channel_types
(#529)channel::get_type
& forum_tag
constructor (#517)thread_create_in_forum
(#532)guild_role_delete_t
when role isn't cached (#524)shared_lock
, and move event_router
to its own headerinteraction_create_t
event wasn't parsed (#519)v2.1
(#531)CODE_OF_CONDUCT.md
construct-vcpkg-info.yml
component::min_length
and component::max_length
dpp::component_type_t
. dpp::component_type
should be used instead!command_data_option
to check if it is empty (#527)event_router_t
role_id
to guild_role_delete_t
timed_listener
headerThank you for using D++!
Published by braindigitalis about 2 years ago
We are happy to announce the 10.0.20 release of D++, after a short delay due to some hardware issues. This new version of D++ features support for Discord's new Forum channels, a raft of fixes and some optimisations. If you want to keep up to date with the latest Discord features we encourage you to upgrade.
The changelog is listed below:
message_flags::m_thread_mention_failed
message_flags::m_failed_to_mention_some_roles_in_thread
dpp::g_invites_disabled
connection::two_way_link
fieldaudit_extra::automod_rule_name
and audit_extra::automod_rule_trigger_type
fields & two missing audit typeschannel::banner
fielduint16_t
instead of uint8_t
guild::afk_timeout
to enum dpp::guild_afk_timeout_t
and guild::max_video_channel_users
down to uint8_t
guild::afk_timeout
up to uint16_t
and guild::max_video_channel_users
down to uint8_t
dpp::g_featureable
wasn't parsed correctlyattach()
overload to co_attach()
dummy_container
to event_router_t
to retain struct sizedpp::interaction_response_type
dpp::command_value
event_router_t
constructorREADME.md
Thank you for using D++!
Published by braindigitalis about 2 years ago
Due to discord changing the format of the websocket URLs for resuming connections, we released version 10.0.19 to fix the issue. This fix is critical for operation, you should update to it as soon as possible if you are on version later than 10.0.16.
The changelog is listed below:
dpp.h
(#498)guild::permission_overwrites
and channel::get_user_permissions
(#499)soak.cpp
Thank you for using D++!
Published by braindigitalis about 2 years ago
This 10.0.18 release is a critical fix for a reconnect and resume issue in 10.0.17. If you are using 10.0.17 and have been having issues with sessions not resuming correctly, you are urged to upgrade to this version ASAP.
Also in this version are fixes to ensure that the deb and rpm files are correctly built with libssl 3.x on x64 and x86.
The changelog is listed below:
ci.yml
ARM64ToolChain.cmake
LINUXx86ToolChain.cmake
Thank you for using D++!
Published by braindigitalis about 2 years ago
We are happy to announce the release of D++ 10.0.17!
This new release adds support for Discord's most recent changes, such as message deletion when banning a user now being in seconds instead of days. From a technical perspective this release changes dpp::snowflake
from a simple typedef
to a class with methods. This lets you for example call get_creation_time()
on a snowflake, and prevents dumb mistakes like trying to store snowflakes into int
or into signed values. It comes fully equipped with operators to make it behave like a uint64_t
when being used correctly, so this should not break well written code.
Our binary packages are now built on g++ 10
under the Ubuntu 22.04 LTS for 64 bit builds, which means they are linked against the SSL 3.x libraries instead of 1.1.
Yet again, there are performance improvements, mainly in the ETF parser, and also in our socket multiplexing code which means those of you with truly huge bots will notice the most performance improvement.
The changelog is listed below:
cluster::guild_ban_add
is now scaled in seconds instead of days (#489)dpp::automod_metadata
apf_application_command_badge
to application flagsattachment::description
attribute (#482)attachment::description
attributedpp::interaction
to make for easier useDPP_CORO
uint64_t
)cluster::request()
now supports coroutines (#491)cluster::request()
now supports coroutinesssl_client
- Needs Windows testingdpp::snowflake
in subcommands docs to uint64_t
and removed extra bracketspoll()
work on Windowsrole::get_mention
not workinginteraction_create
in many compilersguild::build_json()
(#475)build_json
afk_timeout
field addition depends on another field's validityfind/.at
to .contains in some placescluster.cpp
construct-vcpkg-info.yml
coro.h
(#471)coro.h
Thank you for using D++!
Published by braindigitalis about 2 years ago
We are happy to announce the release of D++ 10.0.16! This new version adds support for Discord's new session specific gateway resume feature, so it is strongly recommended to update to this version so you don't have issues with reconnection/resuming sessions.
There is also a performance improvement making ETF 60% faster. Enjoy! π
We have also added experimental support for coroutines, to enable this add the DPP_CORO
cmake flag during the compilation and cmake process.
The changelog is listed below:
dpp::confirmation_callback_t::get<T>()
cluster.h
json_fwd
->json in cpp implementation filesget_user()
attribute for dpp::guild_member
for easier access to the user object.dpp::user
and dpp::utility
sync.h
pthread_setname_np
on osxpthread_setname_np
, seems to be used mainly by pthreads on Windows mingw64guild.h
pthread_setname_np
variantsThank you for using D++!
Published by braindigitalis about 2 years ago
We are happy to announce the release of D++ 10.0.15 which is mainly a hotfix release, plus the first release which should soon be available on vcpkg. We are currently awaiting approval of our PR which will list D++ on the vcpkg platform. Stay tuned on our discord server for when this is approved!
The changelog is listed below:
guild_auditlog_get
channel_id
in the guild_member_move
method is 0 to disconnect the userformat_username()
when removing fmt::format
CMakeLists.txt
README.md
workflow_dispatch
Thank you for using D++!
Published by braindigitalis over 2 years ago
We are happy to announce the release of D++ 10.0.14! This release has a small number of changes, however one is significant. We no longer require fmtlib as a vendored dependency of D++. As we are aware that a lot of people are using this vendored dependency directly via #include <dpp/fmt/format.h>
we have preserved the include/dpp/fmt
folder for the time being, however this copy of fmtlib will emit a warning when included. At some point in the future (maybe the next major version or API release) we will remove fmtlib entirely from D++'s include directory. You should use this time to update your bots to use your own copy of fmtlib instead.
Alongside this change we have also added a new cluster::shutdown()
method which can be used to terminate a cluster without destructing the object, after which you can potentially call cluster::start()
once more.
We have also now added a new enum called dpp::start_type
which wraps the true and false values passed to the cluster::start()
method. This allows for the code to be more obvious, e.g. bot.start(dpp::st_wait)
instead of bot.start(false)
. Of course, true
and false
still work just fine too, so this is not a breaking change.
The changelog is listed below:
cluster::shutdown()
which allows shutdown of cluster without calling destructor, can later call start()
again to bring it back up if needed. Ties together with fix #431Thank you for using D++!
Published by braindigitalis over 2 years ago
We are pleased to announce the release of D++ 10.0.13, which comes with some windows fixes for connectivity on this OS (windows did not seem to like our new connect implementation).
This version also adds fully tested large bot sharding for bots on over 150,000 guilds, supporting full concurrent connection to shards where needed.
If you are using windows for your bot, or require large bot sharding, it is recommended you upgrade.
The changelog is listed below:
attachment::download()
delete_webhook_with_token
component::download()
methodThank you for using D++!
Published by braindigitalis over 2 years ago
We are happy to announce the release of D++ 10.0.12! This version has a fix for delivery of API requests stopping at random on very large bots with very busy queues of requests. As part of this we have added a new feature, DNS caching, and some improvements to how we handle SSL_connect()
.
We have also added support for the new Discord feature app_permissions
on the interaction event, which provides a ready made bitmap of the bot's own permissions on the channel and guild where any slash command has been issued.
The changelog is listed below:
interaction::app_permissions
- https://github.com/Discord/Discord-api-docs/pull/5131
ssl_connect
dying and connect()
hanging gracefullyedotor.net
to build them interactivelyThank you for using D++!
Published by braindigitalis over 2 years ago
We are happy to announce the release of D++ 10.0.11! The 10.0.11 is amongst the first libraries to support Discord's new Auto Moderation feature in full, with events and endpoints to manage the auto moderation from a D++ bot.
Alongside this are quality of life improvements for sending audio, and some changes to the kick command.
The changelog is listed below:
cluster::automod_rules_get()
, cluster::automod_rule_get()
, cluster::automod_rule_create()
, cluster::automod_rule_edit()
, cluster::automod_rule_delete()
, cluster::automod_rules_get_sync()
, cluster::automod_rule_get_sync()
, cluster::automod_rule_create_sync()
, cluster::automod_rule_edit_sync()
, cluster::automod_rule_delete_sync()
automod_rule_execute
guild_member
fixed #417execute_webhook
cluster::guild_ban_add
methodthread_name
parameter to dpp::cluster::execute_webhook
cluster::guild_begin_prune
__next_handle
)message::set_file_content
and message::set_filename
cluster::guild_ban_add
with reason param. Added a similar method without this reason param.guild_member.cpp
Thank you for using D++!
Published by braindigitalis over 2 years ago
We are happy to announce the release of D++ 10.0.10! This release further improves voice receiving, adds a new intuitive class around the permissions system so that you can for example call a .has()
method on it, and separates out the unit tests so that various tests can be run without the need for a token. There is also now functionality for sending webhooks with files.
This update is recommended if you make heavy use of the voice receive functionality, or just like the run the latest and greatest!
The changelog is listed below:
API_PATH
and weirdness of operatorsdiscord_voice_client
voice_payload
priority when two payloads have the same timestamp.dpp::permission
unit testGUILD_APPLICATION_COMMAND_INDEX_UPDATE
permission::add()
, remove()
, set()
guild_bulk_command_edit_permissions
cluster::get_webhook_message
dpp::permission
::haschannel_edit_permissions
application_install_params
permissions.h
dpp::permission
guild_member_remove_role
and deprecated guild_member_delete_role
because it's just a confusing namedpp::permission
install_params
and custom_install_url
) to application.h
lock_permissions
and parent_id
to cluster::channel_edit_positions
Thank you for using D++!