Skip to content

Commit 7c06cf0

Browse files
committed
- set activity on core scenes, alias on scenes, where we do something that needs updating of the RP
- add support for setting start and end timestamps on discord activities
1 parent fc035df commit 7c06cf0

File tree

7 files changed

+85
-25
lines changed

7 files changed

+85
-25
lines changed

src/application.cpp

Lines changed: 13 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
#include "helper/sleep.hpp"
44
#include "platform/capabilities.hpp"
55
#include "scenes/scene.hpp"
6-
#include "types.h"
76

7+
#include <chrono>
88
#include <ranges>
99

1010
#if defined(__SWITCH__)
@@ -50,25 +50,6 @@ void Application::run() {
5050
const double count_per_s = static_cast<double>(SDL_GetPerformanceFrequency());
5151
u64 frame_counter = 0;
5252
#endif
53-
54-
55-
#if defined(_HAVE_DISCORD_SDK)
56-
auto discord_instance = DiscordInstance::initialize();
57-
if (not discord_instance.has_value()) {
58-
spdlog::warn("Error initializing the discord instance, it might not be running: {}", discord_instance.error());
59-
} else {
60-
m_discord_instance = std::move(discord_instance.value());
61-
m_discord_instance->after_setup();
62-
63-
m_discord_instance->set_activity(
64-
DiscordActivityWrapper("Selecting playmode", discord::ActivityType::Playing)
65-
.add_large_image("Playing OOPetris", constants::discord::ArtAsset::logo)
66-
);
67-
}
68-
69-
#endif
70-
71-
7253
using namespace std::chrono_literals;
7354

7455
const auto sleep_time = m_target_framerate.has_value() ? std::chrono::duration_cast<std::chrono::nanoseconds>(1s)
@@ -240,6 +221,18 @@ void Application::render() const {
240221
}
241222

242223
void Application::initialize() {
224+
225+
#if defined(_HAVE_DISCORD_SDK)
226+
auto discord_instance = DiscordInstance::initialize();
227+
if (not discord_instance.has_value()) {
228+
spdlog::warn("Error initializing the discord instance, it might not be running: {}", discord_instance.error());
229+
} else {
230+
m_discord_instance = std::move(discord_instance.value());
231+
m_discord_instance->after_setup();
232+
}
233+
234+
#endif
235+
243236
try_load_settings();
244237
load_resources();
245238
push_scene(scenes::create_scene(*this, SceneId::MainMenu, ui::FullScreenLayout{ m_window }));

src/discord/core.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ DiscordActivityWrapper::DiscordActivityWrapper(const std::string& details, disco
153153

154154

155155
DiscordActivityWrapper&
156-
DiscordActivityWrapper::add_large_image(const std::string& text, constants::discord::ArtAsset asset) {
156+
DiscordActivityWrapper::set_large_image(const std::string& text, constants::discord::ArtAsset asset) {
157157
m_activity.GetAssets().SetLargeText(text.c_str());
158158

159159
const auto asset_key = constants::discord::get_asset_key(asset);
@@ -164,7 +164,7 @@ DiscordActivityWrapper::add_large_image(const std::string& text, constants::disc
164164

165165

166166
DiscordActivityWrapper&
167-
DiscordActivityWrapper::add_small_image(const std::string& text, constants::discord::ArtAsset asset) {
167+
DiscordActivityWrapper::set_small_image(const std::string& text, constants::discord::ArtAsset asset) {
168168
m_activity.GetAssets().SetSmallText(text.c_str());
169169

170170
const auto asset_key = constants::discord::get_asset_key(asset);

src/discord/core.hpp

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
#include "helper/expected.hpp"
66

7+
#include <chrono>
78
#include <discord.h>
89
#include <memory>
910
#include <string>
@@ -46,10 +47,35 @@ struct DiscordActivityWrapper {
4647

4748
DiscordActivityWrapper(const std::string& details, discord::ActivityType type);
4849

49-
DiscordActivityWrapper& add_large_image(const std::string& text, constants::discord::ArtAsset asset);
50-
DiscordActivityWrapper& add_small_image(const std::string& text, constants::discord::ArtAsset asset);
50+
DiscordActivityWrapper& set_large_image(const std::string& text, constants::discord::ArtAsset asset);
51+
DiscordActivityWrapper& set_small_image(const std::string& text, constants::discord::ArtAsset asset);
5152
DiscordActivityWrapper& set_details(const std::string& text);
5253

54+
template<typename T>
55+
DiscordActivityWrapper& set_start_timestamp(const std::chrono::time_point<T>& point) {
56+
57+
const auto seconds_since_epoch = static_cast<discord::Timestamp>(
58+
std::chrono::duration_cast<std::chrono::seconds>(point.time_since_epoch()).count()
59+
);
60+
61+
m_activity.GetTimestamps().SetStart(seconds_since_epoch);
62+
63+
return *this;
64+
}
65+
66+
template<typename T>
67+
DiscordActivityWrapper& set_end_timestamp(const std::chrono::time_point<T>& point) {
68+
69+
const auto seconds_since_epoch = static_cast<discord::Timestamp>(
70+
std::chrono::duration_cast<std::chrono::seconds>(point.time_since_epoch()).count()
71+
);
72+
73+
m_activity.GetTimestamps().SetEnd(seconds_since_epoch);
74+
75+
return *this;
76+
}
77+
78+
5379
[[nodiscard]] const discord::Activity& get_raw() const;
5480
};
5581

src/manager/service_provider.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#pragma once
22

3-
#if defined(_HAVE_DISCORD_SDK) && ! defined(_OOPETRIS_RECORDING_UTILITY)
3+
#if defined(_HAVE_DISCORD_SDK) && !defined(_OOPETRIS_RECORDING_UTILITY)
44

55
#include "discord/core.hpp"
66
#include "helper/optional.hpp"

src/scenes/main_menu/main_menu.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,20 @@ namespace scenes {
8181
button_size, button_alignment, button_margins
8282
);
8383

84+
85+
#if defined(_HAVE_DISCORD_SDK)
86+
if (auto& discord_instance = service_provider->discord_instance(); discord_instance.has_value()) {
87+
88+
discord_instance->set_activity(
89+
DiscordActivityWrapper("Selecting playmode", discord::ActivityType::Playing)
90+
.set_large_image("Playing OOPetris", constants::discord::ArtAsset::logo)
91+
.set_start_timestamp(std::chrono::system_clock::now())
92+
);
93+
}
94+
95+
#endif
96+
97+
8498
service_provider->music_manager()
8599
.load_and_play_music(
86100
utils::get_assets_folder() / "music" / utils::get_supported_music_extension("01. Main Menu")

src/scenes/replay_game/replay_game.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,19 @@ namespace scenes {
4242
}
4343

4444

45+
#if defined(_HAVE_DISCORD_SDK)
46+
if (auto& discord_instance = service_provider->discord_instance(); discord_instance.has_value()) {
47+
48+
discord_instance->set_activity(
49+
DiscordActivityWrapper("Replaying a game", discord::ActivityType::Playing)
50+
.set_large_image("Playing OOPetris", constants::discord::ArtAsset::logo)
51+
.set_start_timestamp(std::chrono::system_clock::now())
52+
);
53+
}
54+
55+
#endif
56+
57+
4558
m_service_provider->music_manager()
4659
.load_and_play_music(
4760
utils::get_assets_folder() / "music" / utils::get_supported_music_extension("02. Game Theme")

src/scenes/single_player_game/single_player_game.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,20 @@ namespace scenes {
2222

2323
m_game = std::make_unique<Game>(service_provider, std::move(input), starting_parameters, layout, true);
2424

25+
26+
#if defined(_HAVE_DISCORD_SDK)
27+
if (auto& discord_instance = service_provider->discord_instance(); discord_instance.has_value()) {
28+
29+
discord_instance->set_activity(
30+
DiscordActivityWrapper("Playing a single-player game", discord::ActivityType::Playing)
31+
.set_large_image("Playing OOPetris", constants::discord::ArtAsset::logo)
32+
.set_start_timestamp(std::chrono::system_clock::now())
33+
);
34+
}
35+
36+
#endif
37+
38+
2539
m_service_provider->music_manager()
2640
.load_and_play_music(
2741
utils::get_assets_folder() / "music" / utils::get_supported_music_extension("02. Game Theme")

0 commit comments

Comments
 (0)