Skip to content

Commit 4de61e0

Browse files
committed
feat: make discord activity only moveable and add finmal build method for build pipeline
- fix settings the activity, before the connect call succeeds, store the last activity and use that to set it, when the connection was established
1 parent 4b845b6 commit 4de61e0

File tree

5 files changed

+78
-13
lines changed

5 files changed

+78
-13
lines changed

src/discord/core.cpp

Lines changed: 57 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
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>
@@ -18,7 +18,8 @@
1818

1919
DiscordInstance::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

171215
DiscordActivityWrapper::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
}

src/discord/core.hpp

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -74,16 +74,26 @@ struct DiscordActivityWrapper {
7474
public:
7575
//TODO(Totto): Add support for party and invites / join / invitations / spectate
7676

77-
OOPETRIS_GRAPHICS_EXPORTED DiscordActivityWrapper(const std::string& details, discordpp::ActivityTypes type);
77+
[[nodiscard]] OOPETRIS_GRAPHICS_EXPORTED
78+
DiscordActivityWrapper(const std::string& details, discordpp::ActivityTypes type);
7879

79-
OOPETRIS_GRAPHICS_EXPORTED DiscordActivityWrapper&
80+
OOPETRIS_GRAPHICS_EXPORTED DiscordActivityWrapper(DiscordActivityWrapper&& old) noexcept;
81+
82+
OOPETRIS_GRAPHICS_EXPORTED DiscordActivityWrapper& operator=(DiscordActivityWrapper&& other) noexcept;
83+
84+
DiscordActivityWrapper(DiscordActivityWrapper& old) noexcept = delete;
85+
86+
DiscordActivityWrapper& operator=(const DiscordActivityWrapper& other) noexcept = delete;
87+
88+
[[nodiscard]] OOPETRIS_GRAPHICS_EXPORTED DiscordActivityWrapper&
8089
set_large_image(const std::string& text, constants::discord::ArtAsset asset);
8190

82-
OOPETRIS_GRAPHICS_EXPORTED DiscordActivityWrapper&
91+
[[nodiscard]] OOPETRIS_GRAPHICS_EXPORTED DiscordActivityWrapper&
8392
set_small_image(const std::string& text, constants::discord::ArtAsset asset);
8493

85-
OOPETRIS_GRAPHICS_EXPORTED DiscordActivityWrapper& set_details(const std::string& text);
94+
[[nodiscard]] OOPETRIS_GRAPHICS_EXPORTED DiscordActivityWrapper& set_details(const std::string& text);
8695

96+
[[nodiscard]] OOPETRIS_GRAPHICS_EXPORTED DiscordActivityWrapper build();
8797

8898
template<typename T>
8999
DiscordActivityWrapper& set_start_timestamp(const std::chrono::time_point<T>& point) {
@@ -126,6 +136,7 @@ struct DiscordInstance {
126136
discordpp::Client m_client;
127137
discordpp::UserHandle m_current_user;
128138
DiscordStatus m_status;
139+
std::optional<DiscordActivityWrapper> m_current_activity;
129140

130141

131142
public:
@@ -145,9 +156,11 @@ struct DiscordInstance {
145156

146157
OOPETRIS_GRAPHICS_EXPORTED static void update();
147158

148-
OOPETRIS_GRAPHICS_EXPORTED void set_activity(const DiscordActivityWrapper& activity);
159+
OOPETRIS_GRAPHICS_EXPORTED void set_activity(DiscordActivityWrapper activity);
149160

150161
private:
162+
void set_activity_internal();
163+
151164
void after_ready();
152165
void clear_activity();
153166
};

src/scenes/main_menu/main_menu.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ namespace scenes {
9292
DiscordActivityWrapper("Selecting playmode", discordpp::ActivityTypes::Playing)
9393
.set_large_image("Playing OOPetris", constants::discord::ArtAsset::Logo)
9494
.set_start_timestamp(std::chrono::system_clock::now())
95+
.build()
9596
);
9697
}
9798

src/scenes/replay_game/replay_game.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ namespace scenes {
6060
DiscordActivityWrapper("Replaying a game", discordpp::ActivityTypes::Playing)
6161
.set_large_image("Playing OOPetris", constants::discord::ArtAsset::Logo)
6262
.set_start_timestamp(std::chrono::system_clock::now())
63+
.build()
6364
);
6465
}
6566

src/scenes/single_player_game/single_player_game.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ namespace scenes {
5555
DiscordActivityWrapper("Playing a single-player game", discordpp::ActivityTypes::Playing)
5656
.set_large_image("Playing OOPetris", constants::discord::ArtAsset::Logo)
5757
.set_start_timestamp(std::chrono::system_clock::now())
58+
.build()
5859
);
5960
}
6061

0 commit comments

Comments
 (0)