Skip to content
This repository was archived by the owner on May 25, 2025. It is now read-only.

Commit 4123bef

Browse files
committed
Add SDK files for version 2.4.0
1 parent 3bd5bf6 commit 4123bef

16 files changed

+457
-0
lines changed

c/discord_game_sdk.h

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ extern "C" {
2323
#define DISCORD_STORAGE_MANAGER_VERSION 1
2424
#define DISCORD_STORE_MANAGER_VERSION 1
2525
#define DISCORD_VOICE_MANAGER_VERSION 1
26+
#define DISCORD_ACHIEVEMENT_MANAGER_VERSION 1
2627

2728
enum EDiscordResult {
2829
DiscordResult_Ok,
@@ -183,6 +184,7 @@ typedef char DiscordMetadataValue[4096];
183184
typedef uint64_t DiscordNetworkPeerId;
184185
typedef uint8_t DiscordNetworkChannelId;
185186
typedef char DiscordPath[4096];
187+
typedef char DiscordDateTime[64];
186188

187189
struct DiscordUser {
188190
DiscordUserId id;
@@ -299,6 +301,13 @@ struct DiscordInputMode {
299301
char shortcut[256];
300302
};
301303

304+
struct DiscordUserAchievement {
305+
DiscordSnowflake user_id;
306+
DiscordSnowflake achievement_id;
307+
uint8_t percent_complete;
308+
DiscordDateTime unlocked_at;
309+
};
310+
302311
struct IDiscordLobbyTransaction {
303312
enum EDiscordResult (*set_type)(struct IDiscordLobbyTransaction* lobby_transaction, enum EDiscordLobbyType type);
304313
enum EDiscordResult (*set_owner)(struct IDiscordLobbyTransaction* lobby_transaction, DiscordUserId owner_id);
@@ -505,6 +514,18 @@ struct IDiscordVoiceManager {
505514
enum EDiscordResult (*set_local_volume)(struct IDiscordVoiceManager* manager, DiscordSnowflake user_id, uint8_t volume);
506515
};
507516

517+
struct IDiscordAchievementEvents {
518+
void (*on_user_achievement_update)(void* event_data, struct DiscordUserAchievement* user_achievement);
519+
};
520+
521+
struct IDiscordAchievementManager {
522+
void (*set_user_achievement)(struct IDiscordAchievementManager* manager, DiscordSnowflake achievement_id, int64_t percent_complete, void* callback_data, void (*callback)(void* callback_data, enum EDiscordResult result));
523+
void (*fetch_user_achievements)(struct IDiscordAchievementManager* manager, void* callback_data, void (*callback)(void* callback_data, enum EDiscordResult result));
524+
void (*count_user_achievements)(struct IDiscordAchievementManager* manager, int32_t* count);
525+
enum EDiscordResult (*get_user_achievement)(struct IDiscordAchievementManager* manager, DiscordSnowflake user_achievement_id, struct DiscordUserAchievement* user_achievement);
526+
enum EDiscordResult (*get_user_achievement_at)(struct IDiscordAchievementManager* manager, int32_t index, struct DiscordUserAchievement* user_achievement);
527+
};
528+
508529
typedef void* IDiscordCoreEvents;
509530

510531
struct IDiscordCore {
@@ -522,6 +543,7 @@ struct IDiscordCore {
522543
struct IDiscordStorageManager* (*get_storage_manager)(struct IDiscordCore* core);
523544
struct IDiscordStoreManager* (*get_store_manager)(struct IDiscordCore* core);
524545
struct IDiscordVoiceManager* (*get_voice_manager)(struct IDiscordCore* core);
546+
struct IDiscordAchievementManager* (*get_achievement_manager)(struct IDiscordCore* core);
525547
};
526548

527549
struct DiscordCreateParams {
@@ -551,6 +573,8 @@ struct DiscordCreateParams {
551573
DiscordVersion store_version;
552574
struct IDiscordVoiceEvents* voice_events;
553575
DiscordVersion voice_version;
576+
struct IDiscordAchievementEvents* achievement_events;
577+
DiscordVersion achievement_version;
554578
};
555579

556580
#ifdef __cplusplus
@@ -572,6 +596,7 @@ void DiscordCreateParamsSetDefault(struct DiscordCreateParams* params)
572596
params->storage_version = DISCORD_STORAGE_MANAGER_VERSION;
573597
params->store_version = DISCORD_STORE_MANAGER_VERSION;
574598
params->voice_version = DISCORD_VOICE_MANAGER_VERSION;
599+
params->achievement_version = DISCORD_ACHIEVEMENT_MANAGER_VERSION;
575600
}
576601

577602
enum EDiscordResult DiscordCreate(DiscordVersion version, struct DiscordCreateParams* params, struct IDiscordCore** result);

cpp/achievement_manager.cpp

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
#if !defined(_CRT_SECURE_NO_WARNINGS)
2+
#define _CRT_SECURE_NO_WARNINGS
3+
#endif
4+
5+
#include "achievement_manager.h"
6+
7+
#include "core.h"
8+
9+
#include <cstring>
10+
#include <memory>
11+
12+
namespace discord {
13+
14+
class AchievementEvents final {
15+
public:
16+
static void OnUserAchievementUpdate(void* callbackData, DiscordUserAchievement* userAchievement)
17+
{
18+
auto* core = reinterpret_cast<Core*>(callbackData);
19+
if (!core) {
20+
return;
21+
}
22+
23+
auto& module = core->AchievementManager();
24+
module.OnUserAchievementUpdate(*reinterpret_cast<UserAchievement const*>(userAchievement));
25+
}
26+
};
27+
28+
IDiscordAchievementEvents AchievementManager::events_{
29+
&AchievementEvents::OnUserAchievementUpdate,
30+
};
31+
32+
void AchievementManager::SetUserAchievement(Snowflake achievementId,
33+
std::int64_t percentComplete,
34+
std::function<void(Result)> callback)
35+
{
36+
static auto wrapper = [](void* callbackData, EDiscordResult result) -> void {
37+
std::unique_ptr<std::function<void(Result)>> cb(
38+
reinterpret_cast<std::function<void(Result)>*>(callbackData));
39+
if (!cb || !(*cb)) {
40+
return;
41+
}
42+
(*cb)(static_cast<Result>(result));
43+
};
44+
std::unique_ptr<std::function<void(Result)>> cb{};
45+
cb.reset(new std::function<void(Result)>(std::move(callback)));
46+
internal_->set_user_achievement(
47+
internal_, achievementId, percentComplete, cb.release(), wrapper);
48+
}
49+
50+
void AchievementManager::FetchUserAchievements(std::function<void(Result)> callback)
51+
{
52+
static auto wrapper = [](void* callbackData, EDiscordResult result) -> void {
53+
std::unique_ptr<std::function<void(Result)>> cb(
54+
reinterpret_cast<std::function<void(Result)>*>(callbackData));
55+
if (!cb || !(*cb)) {
56+
return;
57+
}
58+
(*cb)(static_cast<Result>(result));
59+
};
60+
std::unique_ptr<std::function<void(Result)>> cb{};
61+
cb.reset(new std::function<void(Result)>(std::move(callback)));
62+
internal_->fetch_user_achievements(internal_, cb.release(), wrapper);
63+
}
64+
65+
void AchievementManager::CountUserAchievements(std::int32_t* count)
66+
{
67+
if (!count) {
68+
return;
69+
}
70+
71+
internal_->count_user_achievements(internal_, reinterpret_cast<int32_t*>(count));
72+
}
73+
74+
Result AchievementManager::GetUserAchievement(Snowflake userAchievementId,
75+
UserAchievement* userAchievement)
76+
{
77+
if (!userAchievement) {
78+
return Result::InternalError;
79+
}
80+
81+
auto result = internal_->get_user_achievement(
82+
internal_, userAchievementId, reinterpret_cast<DiscordUserAchievement*>(userAchievement));
83+
return static_cast<Result>(result);
84+
}
85+
86+
Result AchievementManager::GetUserAchievementAt(std::int32_t index,
87+
UserAchievement* userAchievement)
88+
{
89+
if (!userAchievement) {
90+
return Result::InternalError;
91+
}
92+
93+
auto result = internal_->get_user_achievement_at(
94+
internal_, index, reinterpret_cast<DiscordUserAchievement*>(userAchievement));
95+
return static_cast<Result>(result);
96+
}
97+
98+
} // namespace discord

cpp/achievement_manager.h

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
#pragma once
2+
3+
#include "types.h"
4+
5+
namespace discord {
6+
7+
class AchievementManager final {
8+
public:
9+
~AchievementManager() = default;
10+
11+
void SetUserAchievement(Snowflake achievementId,
12+
std::int64_t percentComplete,
13+
std::function<void(Result)> callback);
14+
void FetchUserAchievements(std::function<void(Result)> callback);
15+
void CountUserAchievements(std::int32_t* count);
16+
Result GetUserAchievement(Snowflake userAchievementId, UserAchievement* userAchievement);
17+
Result GetUserAchievementAt(std::int32_t index, UserAchievement* userAchievement);
18+
19+
Event<UserAchievement const&> OnUserAchievementUpdate;
20+
21+
private:
22+
friend class Core;
23+
24+
AchievementManager() = default;
25+
AchievementManager(AchievementManager const& rhs) = delete;
26+
AchievementManager& operator=(AchievementManager const& rhs) = delete;
27+
AchievementManager(AchievementManager&& rhs) = delete;
28+
AchievementManager& operator=(AchievementManager&& rhs) = delete;
29+
30+
IDiscordAchievementManager* internal_;
31+
static IDiscordAchievementEvents events_;
32+
};
33+
34+
} // namespace discord

cpp/core.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ Result Core::Create(ClientId clientId, std::uint64_t flags, Core** instance)
3030
params.overlay_events = &OverlayManager::events_;
3131
params.store_events = &StoreManager::events_;
3232
params.voice_events = &VoiceManager::events_;
33+
params.achievement_events = &AchievementManager::events_;
3334
auto result = DiscordCreate(DISCORD_VERSION, &params, &((*instance)->internal_));
3435
if (result != DiscordResult_Ok || !(*instance)->internal_) {
3536
delete (*instance);
@@ -169,4 +170,13 @@ discord::VoiceManager& Core::VoiceManager()
169170
return voiceManager_;
170171
}
171172

173+
discord::AchievementManager& Core::AchievementManager()
174+
{
175+
if (!achievementManager_.internal_) {
176+
achievementManager_.internal_ = internal_->get_achievement_manager(internal_);
177+
}
178+
179+
return achievementManager_;
180+
}
181+
172182
} // namespace discord

cpp/core.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#include "storage_manager.h"
1313
#include "store_manager.h"
1414
#include "voice_manager.h"
15+
#include "achievement_manager.h"
1516

1617
namespace discord {
1718

@@ -35,6 +36,7 @@ class Core final {
3536
discord::StorageManager& StorageManager();
3637
discord::StoreManager& StoreManager();
3738
discord::VoiceManager& VoiceManager();
39+
discord::AchievementManager& AchievementManager();
3840

3941
private:
4042
Core() = default;
@@ -56,6 +58,7 @@ class Core final {
5658
discord::StorageManager storageManager_;
5759
discord::StoreManager storeManager_;
5860
discord::VoiceManager voiceManager_;
61+
discord::AchievementManager achievementManager_;
5962
};
6063

6164
} // namespace discord

cpp/discord.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,4 @@
1313
#include "storage_manager.h"
1414
#include "store_manager.h"
1515
#include "voice_manager.h"
16+
#include "achievement_manager.h"

cpp/ffi.h

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ extern "C" {
2323
#define DISCORD_STORAGE_MANAGER_VERSION 1
2424
#define DISCORD_STORE_MANAGER_VERSION 1
2525
#define DISCORD_VOICE_MANAGER_VERSION 1
26+
#define DISCORD_ACHIEVEMENT_MANAGER_VERSION 1
2627

2728
enum EDiscordResult {
2829
DiscordResult_Ok,
@@ -183,6 +184,7 @@ typedef char DiscordMetadataValue[4096];
183184
typedef uint64_t DiscordNetworkPeerId;
184185
typedef uint8_t DiscordNetworkChannelId;
185186
typedef char DiscordPath[4096];
187+
typedef char DiscordDateTime[64];
186188

187189
struct DiscordUser {
188190
DiscordUserId id;
@@ -299,6 +301,13 @@ struct DiscordInputMode {
299301
char shortcut[256];
300302
};
301303

304+
struct DiscordUserAchievement {
305+
DiscordSnowflake user_id;
306+
DiscordSnowflake achievement_id;
307+
uint8_t percent_complete;
308+
DiscordDateTime unlocked_at;
309+
};
310+
302311
struct IDiscordLobbyTransaction {
303312
enum EDiscordResult (*set_type)(struct IDiscordLobbyTransaction* lobby_transaction,
304313
enum EDiscordLobbyType type);
@@ -781,6 +790,30 @@ struct IDiscordVoiceManager {
781790
uint8_t volume);
782791
};
783792

793+
struct IDiscordAchievementEvents {
794+
void (*on_user_achievement_update)(void* event_data,
795+
struct DiscordUserAchievement* user_achievement);
796+
};
797+
798+
struct IDiscordAchievementManager {
799+
void (*set_user_achievement)(struct IDiscordAchievementManager* manager,
800+
DiscordSnowflake achievement_id,
801+
int64_t percent_complete,
802+
void* callback_data,
803+
void (*callback)(void* callback_data, enum EDiscordResult result));
804+
void (*fetch_user_achievements)(struct IDiscordAchievementManager* manager,
805+
void* callback_data,
806+
void (*callback)(void* callback_data,
807+
enum EDiscordResult result));
808+
void (*count_user_achievements)(struct IDiscordAchievementManager* manager, int32_t* count);
809+
enum EDiscordResult (*get_user_achievement)(struct IDiscordAchievementManager* manager,
810+
DiscordSnowflake user_achievement_id,
811+
struct DiscordUserAchievement* user_achievement);
812+
enum EDiscordResult (*get_user_achievement_at)(struct IDiscordAchievementManager* manager,
813+
int32_t index,
814+
struct DiscordUserAchievement* user_achievement);
815+
};
816+
784817
typedef void* IDiscordCoreEvents;
785818

786819
struct IDiscordCore {
@@ -803,6 +836,7 @@ struct IDiscordCore {
803836
struct IDiscordStorageManager* (*get_storage_manager)(struct IDiscordCore* core);
804837
struct IDiscordStoreManager* (*get_store_manager)(struct IDiscordCore* core);
805838
struct IDiscordVoiceManager* (*get_voice_manager)(struct IDiscordCore* core);
839+
struct IDiscordAchievementManager* (*get_achievement_manager)(struct IDiscordCore* core);
806840
};
807841

808842
struct DiscordCreateParams {
@@ -832,6 +866,8 @@ struct DiscordCreateParams {
832866
DiscordVersion store_version;
833867
struct IDiscordVoiceEvents* voice_events;
834868
DiscordVersion voice_version;
869+
struct IDiscordAchievementEvents* achievement_events;
870+
DiscordVersion achievement_version;
835871
};
836872

837873
#ifdef __cplusplus
@@ -854,6 +890,7 @@ static
854890
params->storage_version = DISCORD_STORAGE_MANAGER_VERSION;
855891
params->store_version = DISCORD_STORE_MANAGER_VERSION;
856892
params->voice_version = DISCORD_VOICE_MANAGER_VERSION;
893+
params->achievement_version = DISCORD_ACHIEVEMENT_MANAGER_VERSION;
857894
}
858895

859896
enum EDiscordResult DiscordCreate(DiscordVersion version,

cpp/types.cpp

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -640,6 +640,47 @@ char const* InputMode::GetShortcut() const
640640
return internal_.shortcut;
641641
}
642642

643+
void UserAchievement::SetUserId(Snowflake userId)
644+
{
645+
internal_.user_id = userId;
646+
}
647+
648+
Snowflake UserAchievement::GetUserId() const
649+
{
650+
return internal_.user_id;
651+
}
652+
653+
void UserAchievement::SetAchievementId(Snowflake achievementId)
654+
{
655+
internal_.achievement_id = achievementId;
656+
}
657+
658+
Snowflake UserAchievement::GetAchievementId() const
659+
{
660+
return internal_.achievement_id;
661+
}
662+
663+
void UserAchievement::SetPercentComplete(std::uint8_t percentComplete)
664+
{
665+
internal_.percent_complete = percentComplete;
666+
}
667+
668+
std::uint8_t UserAchievement::GetPercentComplete() const
669+
{
670+
return internal_.percent_complete;
671+
}
672+
673+
void UserAchievement::SetUnlockedAt(DateTime unlockedAt)
674+
{
675+
strncpy(internal_.unlocked_at, unlockedAt, 64);
676+
internal_.unlocked_at[64 - 1] = '\0';
677+
}
678+
679+
DateTime UserAchievement::GetUnlockedAt() const
680+
{
681+
return internal_.unlocked_at;
682+
}
683+
643684
Result LobbyTransaction::SetType(LobbyType type)
644685
{
645686
auto result = internal_->set_type(internal_, static_cast<EDiscordLobbyType>(type));

0 commit comments

Comments
 (0)