Skip to content

Commit 023a00c

Browse files
committed
Discord Social SDK Lazy implementation
1 parent 515ac98 commit 023a00c

File tree

8 files changed

+12558
-2
lines changed

8 files changed

+12558
-2
lines changed

include/Discord/cdiscord.h

Lines changed: 1625 additions & 0 deletions
Large diffs are not rendered by default.

include/Discord/discordpp.h

Lines changed: 10808 additions & 0 deletions
Large diffs are not rendered by default.

lib/discord_partner_sdk.lib

498 KB
Binary file not shown.

src/CMakeLists.txt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@ add_executable (Exeon "main.cpp" "icon.rc" "public/Core/Core.h" "private/Core/
99
public/Runtime/ConsoleImpl.h
1010
private/Runtime/ConsoleImpl.cpp
1111
public/Runtime/GameObjectImpl.h
12-
private/Runtime/GameObjectImpl.cpp)
12+
private/Runtime/GameObjectImpl.cpp
13+
public/Subsystem/Discord.h
14+
private/Subsystem/Discord.cpp)
1315

1416
if (CMAKE_VERSION VERSION_GREATER 3.12)
1517
set_property(TARGET Exeon PROPERTY CXX_STANDARD 20)
@@ -47,7 +49,7 @@ add_library("ImGUI" STATIC ${IMGUI_SRC})
4749
add_library("ImGuizmo" STATIC ${IMGUIZMO_SRC})
4850

4951
target_link_libraries(Exeon "d3d12.lib;dxgi.lib;d3dcompiler.lib")
50-
target_link_libraries(Exeon "${LIB}/assimp-vc143-mt.lib;${LIB}/DirectXTK12.lib;${LIB}/spdlogd.lib;${LIB}/mono-2.0-sgen.lib")
52+
target_link_libraries(Exeon "${LIB}/assimp-vc143-mt.lib;${LIB}/DirectXTK12.lib;${LIB}/spdlogd.lib;${LIB}/mono-2.0-sgen.lib;${LIB}/discord_partner_sdk.lib")
5153
target_link_libraries(Exeon ImGUI)
5254
target_link_libraries(Exeon ImGuizmo)
5355

src/private/Core/Core.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#include "Core/Core.h"
2+
#include "Subsystem/Discord.h"
23

34
Core* Core::m_instance;
45

@@ -9,6 +10,7 @@ Core::Core() {
910
this->m_resMgr = nullptr;
1011
this->m_mono = nullptr;
1112
this->m_status = GAME_STATUS::STOPPED;
13+
this->m_discord = Discord::GetInstance();
1214
}
1315

1416
void Core::Init() {
@@ -25,10 +27,12 @@ void Core::Init() {
2527

2628
this->m_mono = MonoScript::GetInstance();
2729
this->m_mono->Init();
30+
this->m_discord->Init();
2831
}
2932

3033
void Core::SetHWND(HWND& hwnd) {
3134
this->m_hwnd = hwnd;
35+
3236
}
3337

3438
void Core::MainLoop() {

src/private/Subsystem/Discord.cpp

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
#include "Subsystem/Discord.h"
2+
#define DISCORDPP_IMPLEMENTATION
3+
#include <Discord/discordpp.h>
4+
5+
Discord* Discord::m_instance;
6+
std::atomic<bool> running = true;
7+
8+
Discord::Discord() {
9+
this->m_appId = 0;
10+
}
11+
12+
void Discord::ClientThread() {
13+
auto client = std::make_shared<discordpp::Client>();
14+
spdlog::info("Discord Social SDK: Running on a detached thread");
15+
16+
client->AddLogCallback([](std::string message, auto severity) {
17+
std::string cleanMessage = message;
18+
cleanMessage.erase(std::remove(cleanMessage.begin(), cleanMessage.end(), '\n'), cleanMessage.end());
19+
spdlog::debug("Discord Social SDK: {0}", cleanMessage);
20+
}, discordpp::LoggingSeverity::Info);
21+
22+
client->SetStatusChangedCallback([&client](discordpp::Client::Status status, discordpp::Client::Error error, int32_t errorDetail) {
23+
spdlog::debug("Discord Social SDK: Status changed to {0}", discordpp::Client::StatusToString(status));
24+
25+
if (status == discordpp::Client::Status::Ready) {
26+
spdlog::debug("Discord Social SDK: Client ready!");
27+
28+
discordpp::Activity activity;
29+
activity.SetType(discordpp::ActivityTypes::Playing);
30+
activity.SetState("Exeon Game Engine v0.1");
31+
activity.SetDetails("Editing Fiwa");
32+
33+
// Update rich presence
34+
client->UpdateRichPresence(activity, [](discordpp::ClientResult result) {
35+
if(result.Successful()) {
36+
spdlog::debug("Discord Social SDK: Rich Presence updated");
37+
} else {
38+
spdlog::error("Discord Social SDK: Error updating Rich Presence");
39+
}
40+
});
41+
} else if (error != discordpp::Client::Error::None) {
42+
spdlog::debug("Discord Social SDK: Client disconnected!");
43+
}
44+
});
45+
46+
auto codeVerifier = client->CreateAuthorizationCodeVerifier();
47+
48+
discordpp::AuthorizationArgs args{};
49+
args.SetClientId(this->m_appId);
50+
args.SetScopes(discordpp::Client::GetDefaultPresenceScopes());
51+
args.SetCodeChallenge(codeVerifier.Challenge());
52+
53+
client->Authorize(args, [client, codeVerifier, this](auto result, auto code, auto redirectUri) {
54+
if (!result.Successful()) {
55+
spdlog::error("Discord Social SDK: Authorization failed!");
56+
} else {
57+
spdlog::debug("Discord Social SDK: Authorization successful!");
58+
59+
// Exchange auth code for access token
60+
client->GetToken(this->m_appId, code, codeVerifier.Verifier(), redirectUri,
61+
[client](discordpp::ClientResult result,
62+
std::string accessToken,
63+
std::string refreshToken,
64+
discordpp::AuthorizationTokenType tokenType,
65+
int32_t expiresIn,
66+
std::string scope) {
67+
spdlog::debug("Discord Social SDK: Establishing connection");
68+
client->UpdateToken(discordpp::AuthorizationTokenType::Bearer, accessToken, [client](discordpp::ClientResult result) {
69+
if(result.Successful()) {
70+
spdlog::info("Discord Social SDK: Token updated");
71+
client->Connect();
72+
}
73+
});
74+
75+
});
76+
}
77+
});
78+
79+
while (running) {
80+
discordpp::RunCallbacks();
81+
std::this_thread::sleep_for(std::chrono::milliseconds(10));
82+
}
83+
}
84+
85+
86+
void Discord::Init() {
87+
this->m_appId = 1374036377322258544;
88+
std::thread discordThread(&Discord::ClientThread, this);
89+
discordThread.detach();
90+
}
91+
92+
Discord* Discord::GetInstance() {
93+
if (Discord::m_instance == nullptr)
94+
Discord::m_instance = new Discord();
95+
return Discord::m_instance;
96+
}

src/public/Core/Core.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ enum GAME_STATUS {
1313
PAUSED = 0x02
1414
};
1515

16+
class Discord;
17+
1618
class Core {
1719
private:
1820
static Core* m_instance;
@@ -30,6 +32,8 @@ class Core {
3032
MonoScript* m_mono;
3133

3234
GAME_STATUS m_status;
35+
36+
Discord* m_discord;
3337
public:
3438
Core();
3539
void Init();

src/public/Subsystem/Discord.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
#pragma once
2+
#include <iostream>
3+
#include "spdlog/spdlog.h"
4+
#include <thread>
5+
#include <atomic>
6+
7+
class Discord {
8+
private:
9+
static Discord* m_instance;
10+
uint64_t m_appId;
11+
public:
12+
Discord();
13+
void Init();
14+
void ClientThread();
15+
static Discord* GetInstance();
16+
17+
};

0 commit comments

Comments
 (0)