11
2- #include " helper/spdlog_wrapper.hpp"
32#include < core/helper/utils.hpp>
43
4+ #include " ../helper/spdlog_wrapper.hpp"
55#include " ./core.hpp"
66
77#include < fmt/format.h>
1818
1919DiscordInstance::DiscordInstance ()
2020 : m_current_user{ discordpp::UserHandle::nullobj },
21- m_status{ DiscordStatus::Starting } {
21+ m_status{ DiscordStatus::Starting },
22+ m_current_activity{ std::nullopt } {
2223
2324 m_client.AddLogCallback (
2425 [](std::string message, discordpp::LoggingSeverity severity) -> void {
@@ -99,7 +100,11 @@ void DiscordInstance::after_ready() {
99100 );
100101 if (not result) {
101102 spdlog::warn (" Discord: Failed to Register Launch Command" );
102- };
103+ }
104+
105+ if (m_current_activity.has_value ()) {
106+ set_activity_internal ();
107+ }
103108}
104109
105110
@@ -143,22 +148,46 @@ void DiscordInstance::update() {
143148}
144149
145150
146- void DiscordInstance::set_activity (const DiscordActivityWrapper& activity) {
151+ void DiscordInstance::set_activity (DiscordActivityWrapper activity) {
152+
153+ if (m_status == DiscordStatus::Error) {
154+ // don't set activity
155+ return ;
156+ }
157+
158+ m_current_activity = std::move (activity);
159+
160+ if (m_status == DiscordStatus::Starting) {
161+ // return after we stored the current activity, the after_ready callback will set the activity
162+ return ;
163+ }
164+
165+ set_activity_internal ();
166+ }
167+
168+ void DiscordInstance::set_activity_internal () {
169+
170+ if (not m_current_activity.has_value ()) {
171+ return ;
172+ }
173+
147174
148- const auto & raw_activity = activity .get_raw ();
175+ const auto & raw_activity = m_current_activity. value () .get_raw ();
149176
150177 if (not raw_activity.operator bool ()) {
151178 spdlog::error (" Tried to set an invalid Discord Activity!" );
152179 return ;
153180 }
154181
155182 // Update rich presence
156- m_client.UpdateRichPresence (raw_activity, [](const discordpp::ClientResult& result) {
183+ m_client.UpdateRichPresence (raw_activity, [this ](const discordpp::ClientResult& result) {
157184 if (result.Successful ()) {
158185 spdlog::info (" Rich Presence updated successfully" );
159186 } else {
160187 spdlog::error (" Rich Presence update failed: {}" , result.ToString ());
161188 }
189+
190+ this ->m_current_activity = std::nullopt ;
162191 });
163192}
164193
@@ -167,12 +196,27 @@ void DiscordInstance::clear_activity() {
167196 m_client.ClearRichPresence ();
168197}
169198
199+ DiscordActivityWrapper::DiscordActivityWrapper (DiscordActivityWrapper&& old) noexcept
200+ : m_activity{ std::move (old.m_activity ) } {
201+ old.m_activity = discordpp::Activity::nullobj;
202+ }
203+
204+
205+ DiscordActivityWrapper& DiscordActivityWrapper::operator =(DiscordActivityWrapper&& other) noexcept {
206+ if (this != &other) {
207+
208+ m_activity = std::move (other.m_activity );
209+
210+ other.m_activity = discordpp::Activity::nullobj;
211+ }
212+ return *this ;
213+ };
170214
171215DiscordActivityWrapper::DiscordActivityWrapper (const std::string& details, discordpp::ActivityTypes type) {
172216 // NOTE: this are partial fields, that are set by the final call, do not set them manually
173217 // https://discord.com/developers/docs/rich-presence/using-with-the-game-sdk#partial-activity-struct
174- // m_activity.SetName(constants::program_name);
175- // m_activity.SetApplicationId(constants::application_id);
218+ // m_activity.SetName(constants::program_name.c_str() );
219+ // m_activity.SetApplicationId(constants::discord:: application_id);
176220
177221 m_activity.SetDetails (details);
178222 m_activity.SetType (type);
@@ -216,6 +260,11 @@ DiscordActivityWrapper& DiscordActivityWrapper::set_details(const std::string& t
216260}
217261
218262
263+ DiscordActivityWrapper DiscordActivityWrapper::build () {
264+
265+ return std::move (*this );
266+ }
267+
219268[[nodiscard]] const discordpp::Activity& DiscordActivityWrapper::get_raw () const {
220269 return m_activity;
221270}
0 commit comments