Releases: brainboxdotcc/DPP
v10.1.3 release
D++ 10.1.3 is here!
This update mainly smooths out edge cases for Windows bot, especially fixing a reconnect loop that could leave your bot stuck retrying forever after certain websocket disconnects. If you’ve ever seen that on Windows, this one’s for you.
One important note: GitHub no longer provides VS2019, so we can’t ship VS2019 prebuilt zips anymore. Only VS2022 builds are provided now. If you want to use D++ in VS2019, you need to build it yourself from source.
You’ll also find a new way to declare complex component groups, allowing you to design them on sites like discord.builders, and the usual round of small fixes to keep things running smooth.
The changelog is listed below:
Release Changelog
✨ New Features
- Support for pre-generated component json, in the same way we support pre-generated embed json (#1427)
- Implement event webhook fields in
dpp::application
class (#1425) - Add
avatar_url
override for webhook struct, resolves #1416 (#1419)
🐞 Bug Fixes
- Socket readiness fixes for Windows, doesnt get stuck in reconnect loops any more (#1461)
- Add thread safety primitives to internal shard list (#1436)
- Breaking: voice connect doesnt break after a shard reconnect (#1435)
- Json parsing issues with string arrays in
dpp::application
(#1426) - Fix tests build on Windows (#1414)
- Coro: fix
when_any
when an awaitable is already finished beforeco_await
(#1415)
♻️ Refactoring
- Improve socket error messages on Windows
- Make method and path in
http_server_request
protected instead of private (#1423)
📚 Documentation
SORT_BRIEF_DOCS
=YES (#1421)
📜 Miscellaneous Changes
- Persist and move the voice connections on shard reconnection. (#1449)
- In case of failure to initialise
discord_client
, null the ptr - Execute
on_stop
callback of all timers on bot shutdown (#1424) - Require c++17 (#1404)
👷 Build/CI
- Remove vs2019 from release and actions (#1459)
- Only check changed files with npx cspell lint (#1437)
- Update armv6 build to ubuntu 24.04, remove clang-10 (#1420)
- Fix
DPP_NO_CORO
fromDPP_CORO
and explicitly set where we know it isn't supported (#1406)
Thank you for using D++!
v10.1.2 release
We are happy to announce the release of D++ 10.1.2! This release is primarily a bugfix release. For very small bots with little activity, you may find that reconnections stop working in 10.1.1. If this bug effects you, you should upgrade to 10.1.2. This version also has improvements to performance of SSL handshakes which you will notice at scale.
The changelog is listed below:
Release Changelog
✨ New Features
• Add TCP_NODELAY
to connections to speed up SSL handshakes (#1403)
🐞 Bug Fixes
• Timers stop firing if the reactor has no sockets, only happens on bots that have little activity (#1401)
♻️ Refactoring
• Better error reporting for failed ssl contexts (#1402)
Thank you for using D++!
v10.1.1 release
Components V2 and Shardless Cluster Webhooks
Big things are coming to D++! With this update, Components v2 is here—just in time for Discord’s official launch soon. This upgrade makes interactive message components more powerful and flexible, giving you even more ways to engage users. But that’s not all—shardless clusters now have built-in webhook server support, letting D++ act as a lightweight web server. Instead of relying on WebSockets for interactions, you can now route them through outgoing webhooks, reducing gateway overhead and making your bot more efficient at scale. Whether you're building for speed, scalability, or just a smoother user experience, this update has you covered!
The changelog is listed below:
Release Changelog
✨ New Features
• Ssl context management (#1398)
• Shardless clusters: Webhook server support 🪝 (#1391)
• Components v2 (#1381)
🐞 Bug Fixes
• Fix build process to enable coro in vcpkg (#1399)
• Fix include dir. (#1389)
• Deny user ability to set certain headers (#1385)
• Fix redefinition of DPP_NO_CORO
(#1386)
• We never remove fds that want deletion (#1383)
• Dont allow bot.start
on a started cluster (#1384)
• oauth2_install_params
in current_application_get()
could not be parsed (#1380)
📜 Miscellaneous Changes
• Change c++ version in cmake example from 17 to 20 (#1390)
👷 Build/CI
• Update actions to remove some use of 20.04 (#1387)
Thank you for using D++!
v10.1.0 release
D++ 10.1: Faster, Smarter, and Coroutine-Powered 🚀
D++ 10.1 is here, and it's bringing some serious upgrades to your Discord bot development experience. Coroutines are now the default, making asynchronous programming smoother and more modern. If you're not ready to dive into coroutines just yet, you can still disable them with -DDPP_NO_CORO=ON
. The threading model has been completely overhauled with a reactor pattern and central thread pool, boosting performance across the board. There’s also a brand-new socket engine that intelligently picks the best available method (epoll
, kqueue
, or poll
) based on your OS, improving efficiency for high-throughput bots.
Beyond the under-the-hood improvements, you’ll find new coroutine-powered helper functions for message handling (co_send
, co_reply
), expanded event data like user_id
on reactions, and a new constructor for dpp::cluster
for lightweight webhook-based applications. Tons of bugs have been squashed, from lingering memory leaks to connection retries, ensuring a more stable experience. If you're still using the old _sync
functions, now’s the time to migrate—those are officially gone. Whether you’re running a small community bot or a high-scale application, this release makes D++ more powerful, efficient, and developer-friendly. Upgrade today and enjoy a faster, cleaner codebase! 🚀
The changelog is listed below:
Release Changelog
💣 Breaking Changes
- Coroutines are now default enabled. To disable them and only use C++17 features, use
-DDPP_NO_CORO=ON
cmake flag (#1368) - Updated
dpp::role
comparison operators to now consider role IDs (#1333) - Change
event_dispatch_t::from
member variable toevent_dispatch_t::from()
method - New threading model, using the reactor pattern and a central thread pool.
- Support for "socket engines", which are reactors containing support for
epoll
,kqueue
orpoll
depending on what your OS supports. dpp::timer
now internally uses astd::priority_queue
and is much more efficient especially with large (hundreds, thousands) numbers of active timersdpp::sync
and_sync
function are removed. They have been marked deprecated for two years now. You should migrate to coroutines instead.
✨ New Features
- Added
user_id
tomessage_reaction_add_t
(#1376) - Add coroutine support functions to
message_create_t
(co_send
,co_reply
) (#1357) - Socket engine stats functions (#1353)
dpp::cluster
now has a constructor with no parameters, which can be used when using the cluster purely for its reactor, e.g. for a purely webhook based application
🐞 Bug Fixes
- Detect c++17 to define DPP_NO_CORO at the point of usage (#1378)
- Fix C4245 warning on MSVC (#1367)
- Make sure write events go out as soon as they can (#1354)
- Large https request body could not be sent (#1352)
- Thread safety for event objects (10.1 only) (#1350)
- Coro timers ez pz lemon squeezy (#1351)
- Make new constructor for cluster explicit
- Docs: update documentation examples to use
event.from()
andevent.owner
unique_ptr
on g++-8 needs to knowsizeof()
z_stream
up front, so we must use a raw ptr 😦- Immediately delete fds that want deletion after we are done firing their events rather than
prune()
loop fix: replace fds that already exist in the set. emplace would fail. - Don't store the event ptrs in the kevent/epoll udata, this can end up with dangling ptrs in events
- Ensure heirarchy correctly calls the various inherited functions. todo: refactor this mess
- Fix for runaway cpu usage due to
connect()
retry - Fix fd and memory leak in httpsclient
- Fix reconnection of shards by creating new shards on reconnect, with a management timer to handle reconnections to stop reconnect storms
- Https request queues still need a removals queue, it can be simplified but needs to still exist, there is a chicken-and-egg situation with the pointer for the request
- Segfault when calling read on an invalid fd
- Prevent concurrent
on_disconnect()
- Fix
BUILD_VOICE_SUPPORT=OFF
static build (#1338) - Fixes for poll on Windows
- Fixes for cluster destructor on FreeBSD
- Fix kqueue to actually work on FreeBSD
- Add auto retry to failed connect, fixes failed unit tests
- Fix http(s) requests with 0 content length timing out
- Fix role edit/role delete unit tests
- dl.dpp.dev was not downloading rpms any more (#1335)
- Fix some httpsclient stuff
- Fix namespace include in cmakelists for mlspp, backport of mls++ fix (#1331)
- Two segmentation faults in
cluster::guild_edit_member
andcluster::tick_timers
/cluster::shutdown
(#1326) - FreeBSD port build issues (#1325)
- Fix/sslclient-spinlock (#1339)
- Fix/voice socketengine (#1337)
♻ Refactoring
- Remove some deprecated and unused fields
- Remove
sync.h
- Remove
dpp::sync
- Remove raw pointers from dns code
- Make overridden sslclient stuff have override keyword, tidy up zlib stuff
- Eliminate raw pointers from timer code
- Magic numbers in discordclient
- Remove thread pool from request queue, run it off
dpp::timer
instances instead - Remove nonblocking bool, as all sockets are always now nonblocking
- Remove
dpp::sync
from unit tests, we no longer test it - Remove jthread, C++20 only
📚 Documentation
- Fix codacy badge (#1375)
- Missing comment blocks
- New webhook example
- Document various new functions
- Redo thread model dot
- Updated checking-permissions page and a view functions (#1336)
- Document
socket_engine_base
📜 Miscellaneous Changes
- Tweaks and fixes to scripts and docs to support 10.1 (#1365)
- Don't always run php for
DPP_CORO
(#1363) - Make
event.from
safe in threads - Fix; when putting events into the thread pool work queue, we must take a copy of the cluster ptr, as the client ptr may be invalid by the time the event is triggered (shards now get reallocated)
- Split out zlib stuff to its own file
- Move some things into constexpr constants
- Tidy up casting in decompression code
- Call
on_disconnect
in more situations so we can properly handle dead sockets - adjust version to 10.1
- Catch exceptions on reconnect
- Voice session reconnect
- Tidy up shard startup
- Audio works if user joins 2nd
- Audio isn't being heard, dont know why yet
- warning fixes
- Improve threading
- Properly mutex everything
- we dont need to check for epoll removal failure, if it fails its already not in the set
- Destroy thread for socket loop before trying to destroy anything that may be within it
- Dont resize the
ke_list
- Mutexing of timer list
- Safety check handlers
- Sanity checks
- Errors were missing part of the url
- Some unit tests improvements
- Always populate even on timeout
- Dont let
request_verb
go out of scope sleep()
shouldnt be used, instead usestd::this_thread::sleep_for(std::chrono::seconds(6))
terminating.notify_all
is C++20- Unit test no longer runs forever
- Make poll ctor not protected
- Put websocket events into the work queue
- no longer any need for
out_queue
-> goes into the main thread pool - https client/queues migration to socketengine
- Socket engine basics
👷 Build/CI
- OSX now only tests on clang15 (#1345)
- Macos version will now always be 15
- Removed pkg-config from brew as no longer needed
- Force pkgconf unlink for brew
v10.0.35 release
We are happy to announce the release of D++ 10.0.35, which is mainly a bugfix release. It will fix a crash that may sometimes happen after registering a slash command. There are also a couple of fixes for compilation on void linux, and ARM NEON support for voice receive is now fixed.
Release Changelog
🐞 Bug Fixes
- Missing ctime in
sslclient.h
breaks on void Linux (#1314) - Neon now compiles (#1313)
- Commands should no longer crash when no context is defined (#1312)
📚 Documentation
📜 Miscellaneous Changes
- Sync with version from conan-center. this here for reference only. do not install via this
conanfile.py
Thank you for using D++!
v10.0.34 release
We are proud to announce the release of D++ 10.0.34! This new release of D++ adds support for user apps, which is a new Discord feature which allows you to add a bot to a user's profile (rather than a guild) so that commands listed by the bot can be ran anywhere (including in DMs and group DMs).
We have also added some supporting infrastructure to allow us to add to Conan Centre, so you will hopefully see D++ on Conan very soon!
The changelog is listed below:
Release Changelog
✨ New Features
- Conan 2.x recipe (#1308)
- Add support for user apps (#1304)
- User app commands and test program
- Add
interaction_metadata
for messages - Add
authorizing_integration_owners
- Add support for
application_integration_types
- Add
interaction_context_type
support
🐞 Bug Fixes
- Fix weird comments
- Deprecate old fields
♻️ Refactoring
- Dont use strings and
uint64_t
in dave, use snowflake type (#1307) - Change to
register_command
📚 Documentation
- Add documentation page for creating user app commands! (#1305)
📜 Miscellaneous Changes
- Fix/dave segfault (#1306)
- User-installed commands (#1223)
- Change docker schedule to monthly, not daily
Thank you for using D++!
v10.0.33 release
We are proud to announce the release of D++ 10.0.33! Barely a week after our last release, we have many more features to bring to you, and some fixes relating to DAVE E2EE. When users join a DAVE voice channel, the encryption will now remain as end-to-end and not downgrade to standard. The on_voice_ready event will also now always fire after a timeout when DAVE is enabled, even if there are no other users in the VC to build an MLS group with.
We have also added the approximate_user_install_count
field to dpp::application
and added cluster functions to fetch a users voice state via API calls (regardless of gateway, or cache).
Please note that this release officially deprecates _sync
functions. They will still operate, but will emit a warning at compile time if used. Instead of sync functions, if you are still using them, you should consider migrating to coroutines instead. CircleCI is now also officially removed from our build process, as this had been in place before we had GitHub actions and is no longer relevant.
The changelog is listed below:
Release Changelog
✨ New Features
- Added endpoints to fetch a user's voice state (#1294)
- Added
approximate_user_install_count
field to application (#1293) - Added NOMINMAX to
CMakeLists.txt
(#1292) - Voice ready now fires even if there are no other users in the VC (#1289)
🐞 Bug Fixes
- Fix broken static builds (#1290)
- Fix broken vcpkg builds which were failing because they were trying to compile as static (#1287)
- DAVE! client join/part re-derive client ratchets and privacy code (#1264)
- Vcpkg is always built with voice (#1272)
♻️ Refactoring
- Cleanup namespaces and unneeded includes (#1295)
- Libdave camel massacre 🐪🔪 (#1285)
- Low level socket tidyups and removal of punning (#1282)
- Breaking: Deprecate sync calls (#1280)
📚 Documentation
- Add docblock comments to all libdave class variables (#1286)
- Update roadmap (#1279)
- Extend Coroutine Documentation (#1288)
💎 Style Changes
- Clang-format file, for discussion (#1277)
📜 Miscellaneous Changes
- Delete .circleci directory
Thank you for using D++!
v10.0.32 release
We are extremely happy to announce the release of D++ 10.0.32! This new release is (to our knowledge) the first released Discord library to feature Discord's new DAVE end-to-end encryption for voice channels.
Please note that DAVE is experimental at present, and can be enabled by passing true to a boolean parameter when connecting to a voice channel. Please report any bugs, and we strongly welcome PRs. Now is your time to get involved with D++ development!
We have also removed the dependency upon libsodium
for voice support. Instead, we use OpenSSL primitives for the same features, allowing us to remove a huge dependency from the library.
This new release officially bumps the audio protocol to version 8, so this is required if you wish to continue using voice with D++ past November, as Discord are enforcing Voice protocol version 8 from this date onwards.
We also have added support for named slashcommand handlers, so routing of commands to different functions based on the name of the command can be done automatically for you by the library. Check out documentation on register_command and unregister_command for more information!
The changelog is listed below:
Release Changelog
✨ New Features
🐞 Bug Fixes
- Crash in
threads_get_public_archived
(#1268)
♻ Refactoring
- Remove unused debug variable (#1266)
- Why you so salty? Entirely remove libsodium from D++ (#1265)
- Deprecation: officially deprecate commandhandler (#1263)
- Better registration with
try_emplace
📚 Documentation
📜 Miscellaneous Changes
- Implementing named commands handlers for the cluster (#1262)
- This cant be fatal while we are offering documents on deprecated stuff for SEO
- Officially deprecate commandhandler
- Fix
embeds.cpp
not required intent + add cout logger (#1250)
👷 Build/CI
- More secure llvm19 install process (#1246)
Thank you for using D++!
v10.0.31 release
We are happy to announce the release of D++ 10.0.31! This new version is a required upgrade if you use Discord Monetization, or voice/audio. Discord have changed the requirements for encryption of voice, so this new version adds support for XChaCha20 voice encryption via sodium, and also adds the new monetization API calls. These have been tested for quite some time in production bots and can be considered as stable and ready for general availability.
This fix also contains several new features such as support for application emojis, customisable HTTP timeout durations, and a new coroutines implementation which fixes some long standing UB and minor memory leaks if you were using coroutines. If your bot does use coroutines, this is a strongly recommended upgrade which will increase performance and stability for your bots.
The changelog is listed below:
Release Changelog
✨ New Features
- Change encryption to AEAD XChaCha20 Poly1305 (#1239)
- XChaCha20 voice encryption (#1242)
std::format
support fordpp::snowflake
(#1203)- Added support for application emojis (#1207)
- Timeout is now 20 seconds. Users can now change the timeout length (#1208)
- Added file size limit to avatars and banners (#1209)
- Coro: coro 2.0 (#1196)
- Banners can now be uploaded to bots (#1197)
- Add XBPS docs (#1192)
- Add
request_timeout
, a parameter as optional tocluster::request()
which allows user to sethttp_client::timeout
and add error message for request timeouts (#1186) - Added warnings for certain events that require an intent (#1169)
- New premium upsell button style (#1175)
- Add missing entitlement type enum values (#1171)
- Added consuming an entitlement (#1170)
- Add
result_type
member type todpp::task
(#1165)
🐞 Bug Fixes
- Added missing include to
awaitable.h
(#1243) - Improve compatiblity with socket (#1229)
- Fix requests fizzling if the response doesn't contain Content-Length (#1232)
- Fix
guild_member::get_avatar_url()
(#1230) (#1231) - Incorrect comment (#1228)
- Coro: fix awaitable/task move assignment, again
- Coro: fix
dpp::task
's move assignment - Coro: fix unused alias warning
- Coro: fix read-after-free in
dpp::async
- Coro: fix includes, improve NOMINMAX define
- Qol: shut up soundboard events (#1202)
- Fixed padding in tests
- Add and to
misc-enum.h
- Test: fix ban unit tests to be dependent upon each other (#1200)
- Removed max limit for avatars and banners
- Banner blob now correctly throws for banner blob size. coro and sync calls updated
- Unit tests are now built statically when
BUILD_SHARED_LIBS
is off (#1193) - Compilation on clang-19 (#1195)
- Add
packets_left
count (#1194) - Fix leak of
in_thread
, fix read-after-free, fix race condition UB after cluster shutdown (#1187) - Add error message for request timeouts and add
timed_out
member variable tohttps_client
to check for request timeouts
♻️ Refactoring
- Readability changes to sslclient and wsclient (#1210)
- Changed
DPP_BUFSIZE
to beuint16_t
instead ofuint32_t
- Removed un-needed includes, more indentation corrections
- Removed constexpr for
http_version
, moved send tostd::string_view
, removed spaces - Change
get_gateway_bot
to use coro when available - Remove Cmake special options to compile on clang-19
- Coro: coro tidy up, add
sync_wait
🚨 Testing
- Test
to_binary()
📚 Documentation
- Change init to create (#1220)
- Fix unnecessary include of fmt in mp3 example (#1218)
- Create Gentoo installation tutorial (#1211)
- Remove XBPS coroutine section (#1205)
- Added a page for editing messages from a button click (#1163)
- Altered minimum gcc version for Coro, fixed docs issues (#1173)
- Added a missing ref (#1179)
- Changed wording of token page (#1161)
set_allow_multiselect
is now correctly documented- Added an example on how to edit an embed (#1128)
💎 Style Changes
- Static and reinterpret casts
📜 Miscellaneous Changes
- Adding fix to arm-neon bug. (#1226)
- Adding Arm-Neon implementation. (#1225)
- Introduced
DPP_HAS_FORMAT
definition std::format
support fordpp::snowflake
- Add requires clause to
await_transform
to improve error messages when trying toco_await
something that can't be - Coro test case to detect leaks
- Coro: allow move-only types in
dpp::async
, de-duplicate void specializations where possible, document some more - Coro: add concept
awaitable_type
, movedpp::detail
::promise::promise
todpp::basic_promise
, document some more - Coro: remove long-deprecated
dpp::job
event handlers - Coro: add [[nodiscard]] to
dpp::task
,dpp::coroutine
- Coro: use
std::memory_order
- Updated libsodium version for rpm packages to latest (#1190)
- Use
string_view
for message object ctors + setters (#1178) - Big number implementation, for future use in permissions bitfields (#1176)
- Mark interaction type 10 as depreciated
- Add Missing SKU types
- Update Docker image to Ubuntu 24.04 LTS (#1168)
- QoL fix: Enhance the entitlement stuff with data from the actual api docs now there are some (#1166)
- Poll conflicting with
dpp::poll
(#1152) - Updated autocomplete tutorial (#1151)
👷 Build/CI
- Add clang-19-libc++ as manual install (#1245)
- Fix mac xcode version (#1244)
- Added clang16-18 jobs for Linux, added clang16 for OSX (#1206)
- Fixed clang16 for OSX
- Added clang16-18 runners for Linux, added clang16 for OSX
- Added a clang++15 osx job, fixed clang++14 job. (#1204)
- Adds support for g++13 and g++14 CI on Ubuntu 24.04 (#1201)
- Allow runners to use mold, increased concurrency to 4 (#1198)
- Codeql now uses -j4
- Updated cmake commands for Linux to be more modern
- Arm7hf no longer uses mold
- Allow runners to use mold, increased concurrency to 3
Thank you for using D++!
v10.0.30 release
After several months of development, we are happy to announce the release of D++ 10.0.30, with support for polls, voice channel statuses, improved error logging, better UTF-8 functionality, and the ability to supress embeds on other users messages.
We recommend you update to this version for the fixes here, and for the new features to keep current with Discord's feature set.
The changelog is listed below:
Release Changelog
✨ New Features
- Poll support (#1136)
- Added
is_guild_owner
fordpp::guild_member
(#1109) - Add embed-only message ctor (#1100)
- Added
change_voice_channel
to discordclient (#1083) - Alter
set_allowed_mentions
(#1081) - Added expire and issued timestamps in attachment (#1065)
- Added
newly_created
bool to threads (#1069) - Added
dpp::cluster
::guild_member_timeout_remove
and its sync/coro versions (#1067) - Added the ability to set voice channel statuses (#1064)
🐞 Bug Fixes
- Error in logging with malformed json that doesnt fit the structure for an error (#1126)
- Signal Handlers on Non-Windows Platforms in sslclient (#1123)
- Fix uncleared track meta on stop audio (#1127)
- Fix
human_readable
for good (#1135) - Empty presences will now warn (#1121)
- Fix memory leak on libstdc++ (#1112)
- Out-of-bounds read of MIME types (#1104)
- Get size of object instead of pointer
- Correct wrong linking order to fix static build (#1102)
- Add version parameter as optional parameter to
co_request
, has been part of request for some time - Add version parameter to
co_request
ts_not_null
now works for all timezones (#1089)- Fixed getting archived threads
- Fix bug in human readable errors (#1077)
- Default callback parameters (#1079)
- It's going to be OK (#1078)
- Send stickers in message if present
- Cmyk calculations - blue value calculations (#1053)
- Remove unnecessary
SSL_free
(#1050) - Properly free ssl session and ssl context (#1049)
- Avoid memory leaks in
event_map
(#1043) - Use of uninitialized value in
command_option
copy ctor (#1044)
♻️ Refactoring
- Fix and improve utf8 utilities (#1046)
📚 Documentation
- Added a timers page, added a note in
setting_status
for timers (#1120) - Rewrote the CLion VCPKG page to use VS toolchain (#1111)
- Fixed missing/incorrect params for many functions (#1110)
- Added a thinking page (#1092)
- Update Xcode page. (#1061)
- Improve Windows VS tutorials (#1058)
- Added the homebrew version to readme (#1041)
📜 Miscellaneous Changes
- Silence
GUILD_SOUNDBOARD_
* websocket events, currently undocumented (#1148) - QOL: non fatal utf8 handling. (#1147)
- Capturing "bot" is not needed. Removing it resolves an unused variabl… (#1132)
- Ability to suppress embeds (#1107)
- Dont attempt to reschedule timers that are deleted (FIXES: #1048) (#1088)
- Potential uninitialised value returned if empty string passed to
from_string<T>()
(#1087) - Unit-test and non unit-test jobs are now merged into one (#1051)
👷 Build/CI
Thank you for using D++!