rdiscord_sdk 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (69) hide show
  1. checksums.yaml +7 -0
  2. data/.rubocop.yml +13 -0
  3. data/.vscode/c_cpp_properties.json +24 -0
  4. data/.vscode/settings.json +102 -0
  5. data/Gemfile +11 -0
  6. data/Gemfile.lock +46 -0
  7. data/INTERNALS.md +0 -0
  8. data/LICENSE +674 -0
  9. data/README.md +187 -0
  10. data/Rakefile +17 -0
  11. data/bin/console +15 -0
  12. data/bin/setup +8 -0
  13. data/ext/rdiscord_sdk/activity.cpp +297 -0
  14. data/ext/rdiscord_sdk/activity.h +17 -0
  15. data/ext/rdiscord_sdk/common.cpp +65 -0
  16. data/ext/rdiscord_sdk/common.h +88 -0
  17. data/ext/rdiscord_sdk/extconf.rb +54 -0
  18. data/ext/rdiscord_sdk/gem_activity_manager.cpp +273 -0
  19. data/ext/rdiscord_sdk/gem_activity_manager.h +8 -0
  20. data/ext/rdiscord_sdk/gem_user_manager.cpp +114 -0
  21. data/ext/rdiscord_sdk/gem_user_manager.h +8 -0
  22. data/ext/rdiscord_sdk/rdiscord_sdk.cpp +77 -0
  23. data/ext/rdiscord_sdk/rdiscord_sdk.h +17 -0
  24. data/ext/rdiscord_sdk/user.cpp +98 -0
  25. data/ext/rdiscord_sdk/user.h +19 -0
  26. data/lib/rdiscord_sdk/enums.rb +162 -0
  27. data/lib/rdiscord_sdk/rdiscord_sdk.so +0 -0
  28. data/lib/rdiscord_sdk/version.rb +16 -0
  29. data/lib/rdiscord_sdk.rb +3 -0
  30. data/rdiscord_sdk.gemspec +34 -0
  31. data/third-party/include/achievement_manager.cpp +98 -0
  32. data/third-party/include/achievement_manager.h +34 -0
  33. data/third-party/include/activity_manager.cpp +177 -0
  34. data/third-party/include/activity_manager.h +42 -0
  35. data/third-party/include/application_manager.cpp +78 -0
  36. data/third-party/include/application_manager.h +30 -0
  37. data/third-party/include/core.cpp +182 -0
  38. data/third-party/include/core.h +64 -0
  39. data/third-party/include/discord.h +16 -0
  40. data/third-party/include/event.h +59 -0
  41. data/third-party/include/ffi.h +942 -0
  42. data/third-party/include/image_manager.cpp +57 -0
  43. data/third-party/include/image_manager.h +28 -0
  44. data/third-party/include/lobby_manager.cpp +547 -0
  45. data/third-party/include/lobby_manager.h +88 -0
  46. data/third-party/include/network_manager.cpp +103 -0
  47. data/third-party/include/network_manager.h +63 -0
  48. data/third-party/include/overlay_manager.cpp +112 -0
  49. data/third-party/include/overlay_manager.h +33 -0
  50. data/third-party/include/relationship_manager.cpp +90 -0
  51. data/third-party/include/relationship_manager.h +32 -0
  52. data/third-party/include/storage_manager.cpp +158 -0
  53. data/third-party/include/storage_manager.h +46 -0
  54. data/third-party/include/store_manager.cpp +160 -0
  55. data/third-party/include/store_manager.h +38 -0
  56. data/third-party/include/types.cpp +769 -0
  57. data/third-party/include/types.h +492 -0
  58. data/third-party/include/user_manager.cpp +80 -0
  59. data/third-party/include/user_manager.h +31 -0
  60. data/third-party/include/voice_manager.cpp +124 -0
  61. data/third-party/include/voice_manager.h +37 -0
  62. data/third-party/lib/x86/discord_game_sdk.dll +0 -0
  63. data/third-party/lib/x86/discord_game_sdk.dll.lib +0 -0
  64. data/third-party/lib/x86_64/discord_game_sdk.bundle +0 -0
  65. data/third-party/lib/x86_64/discord_game_sdk.dll +0 -0
  66. data/third-party/lib/x86_64/discord_game_sdk.dll.lib +0 -0
  67. data/third-party/lib/x86_64/discord_game_sdk.dylib +0 -0
  68. data/third-party/lib/x86_64/discord_game_sdk.so +0 -0
  69. metadata +114 -0
@@ -0,0 +1,88 @@
1
+ #pragma once
2
+
3
+ #include "types.h"
4
+
5
+ namespace discord {
6
+
7
+ class LobbyManager final {
8
+ public:
9
+ ~LobbyManager() = default;
10
+
11
+ Result GetLobbyCreateTransaction(LobbyTransaction* transaction);
12
+ Result GetLobbyUpdateTransaction(LobbyId lobbyId, LobbyTransaction* transaction);
13
+ Result GetMemberUpdateTransaction(LobbyId lobbyId,
14
+ UserId userId,
15
+ LobbyMemberTransaction* transaction);
16
+ void CreateLobby(LobbyTransaction const& transaction,
17
+ std::function<void(Result, Lobby const&)> callback);
18
+ void UpdateLobby(LobbyId lobbyId,
19
+ LobbyTransaction const& transaction,
20
+ std::function<void(Result)> callback);
21
+ void DeleteLobby(LobbyId lobbyId, std::function<void(Result)> callback);
22
+ void ConnectLobby(LobbyId lobbyId,
23
+ LobbySecret secret,
24
+ std::function<void(Result, Lobby const&)> callback);
25
+ void ConnectLobbyWithActivitySecret(LobbySecret activitySecret,
26
+ std::function<void(Result, Lobby const&)> callback);
27
+ void DisconnectLobby(LobbyId lobbyId, std::function<void(Result)> callback);
28
+ Result GetLobby(LobbyId lobbyId, Lobby* lobby);
29
+ Result GetLobbyActivitySecret(LobbyId lobbyId, char secret[128]);
30
+ Result GetLobbyMetadataValue(LobbyId lobbyId, MetadataKey key, char value[4096]);
31
+ Result GetLobbyMetadataKey(LobbyId lobbyId, std::int32_t index, char key[256]);
32
+ Result LobbyMetadataCount(LobbyId lobbyId, std::int32_t* count);
33
+ Result MemberCount(LobbyId lobbyId, std::int32_t* count);
34
+ Result GetMemberUserId(LobbyId lobbyId, std::int32_t index, UserId* userId);
35
+ Result GetMemberUser(LobbyId lobbyId, UserId userId, User* user);
36
+ Result GetMemberMetadataValue(LobbyId lobbyId,
37
+ UserId userId,
38
+ MetadataKey key,
39
+ char value[4096]);
40
+ Result GetMemberMetadataKey(LobbyId lobbyId, UserId userId, std::int32_t index, char key[256]);
41
+ Result MemberMetadataCount(LobbyId lobbyId, UserId userId, std::int32_t* count);
42
+ void UpdateMember(LobbyId lobbyId,
43
+ UserId userId,
44
+ LobbyMemberTransaction const& transaction,
45
+ std::function<void(Result)> callback);
46
+ void SendLobbyMessage(LobbyId lobbyId,
47
+ std::uint8_t* data,
48
+ std::uint32_t dataLength,
49
+ std::function<void(Result)> callback);
50
+ Result GetSearchQuery(LobbySearchQuery* query);
51
+ void Search(LobbySearchQuery const& query, std::function<void(Result)> callback);
52
+ void LobbyCount(std::int32_t* count);
53
+ Result GetLobbyId(std::int32_t index, LobbyId* lobbyId);
54
+ void ConnectVoice(LobbyId lobbyId, std::function<void(Result)> callback);
55
+ void DisconnectVoice(LobbyId lobbyId, std::function<void(Result)> callback);
56
+ Result ConnectNetwork(LobbyId lobbyId);
57
+ Result DisconnectNetwork(LobbyId lobbyId);
58
+ Result FlushNetwork();
59
+ Result OpenNetworkChannel(LobbyId lobbyId, std::uint8_t channelId, bool reliable);
60
+ Result SendNetworkMessage(LobbyId lobbyId,
61
+ UserId userId,
62
+ std::uint8_t channelId,
63
+ std::uint8_t* data,
64
+ std::uint32_t dataLength);
65
+
66
+ Event<std::int64_t> OnLobbyUpdate;
67
+ Event<std::int64_t, std::uint32_t> OnLobbyDelete;
68
+ Event<std::int64_t, std::int64_t> OnMemberConnect;
69
+ Event<std::int64_t, std::int64_t> OnMemberUpdate;
70
+ Event<std::int64_t, std::int64_t> OnMemberDisconnect;
71
+ Event<std::int64_t, std::int64_t, std::uint8_t*, std::uint32_t> OnLobbyMessage;
72
+ Event<std::int64_t, std::int64_t, bool> OnSpeaking;
73
+ Event<std::int64_t, std::int64_t, std::uint8_t, std::uint8_t*, std::uint32_t> OnNetworkMessage;
74
+
75
+ private:
76
+ friend class Core;
77
+
78
+ LobbyManager() = default;
79
+ LobbyManager(LobbyManager const& rhs) = delete;
80
+ LobbyManager& operator=(LobbyManager const& rhs) = delete;
81
+ LobbyManager(LobbyManager&& rhs) = delete;
82
+ LobbyManager& operator=(LobbyManager&& rhs) = delete;
83
+
84
+ IDiscordLobbyManager* internal_;
85
+ static IDiscordLobbyEvents events_;
86
+ };
87
+
88
+ } // namespace discord
@@ -0,0 +1,103 @@
1
+ #if !defined(_CRT_SECURE_NO_WARNINGS)
2
+ #define _CRT_SECURE_NO_WARNINGS
3
+ #endif
4
+
5
+ #include "network_manager.h"
6
+
7
+ #include "core.h"
8
+
9
+ #include <cstring>
10
+ #include <memory>
11
+
12
+ namespace discord {
13
+
14
+ class NetworkEvents final {
15
+ public:
16
+ static void OnMessage(void* callbackData,
17
+ DiscordNetworkPeerId peerId,
18
+ DiscordNetworkChannelId channelId,
19
+ uint8_t* data,
20
+ uint32_t dataLength)
21
+ {
22
+ auto* core = reinterpret_cast<Core*>(callbackData);
23
+ if (!core) {
24
+ return;
25
+ }
26
+
27
+ auto& module = core->NetworkManager();
28
+ module.OnMessage(peerId, channelId, data, dataLength);
29
+ }
30
+
31
+ static void OnRouteUpdate(void* callbackData, char const* routeData)
32
+ {
33
+ auto* core = reinterpret_cast<Core*>(callbackData);
34
+ if (!core) {
35
+ return;
36
+ }
37
+
38
+ auto& module = core->NetworkManager();
39
+ module.OnRouteUpdate(static_cast<const char*>(routeData));
40
+ }
41
+ };
42
+
43
+ IDiscordNetworkEvents NetworkManager::events_{
44
+ &NetworkEvents::OnMessage,
45
+ &NetworkEvents::OnRouteUpdate,
46
+ };
47
+
48
+ void NetworkManager::GetPeerId(NetworkPeerId* peerId)
49
+ {
50
+ if (!peerId) {
51
+ return;
52
+ }
53
+
54
+ internal_->get_peer_id(internal_, reinterpret_cast<uint64_t*>(peerId));
55
+ }
56
+
57
+ Result NetworkManager::Flush()
58
+ {
59
+ auto result = internal_->flush(internal_);
60
+ return static_cast<Result>(result);
61
+ }
62
+
63
+ Result NetworkManager::OpenPeer(NetworkPeerId peerId, char const* routeData)
64
+ {
65
+ auto result = internal_->open_peer(internal_, peerId, const_cast<char*>(routeData));
66
+ return static_cast<Result>(result);
67
+ }
68
+
69
+ Result NetworkManager::UpdatePeer(NetworkPeerId peerId, char const* routeData)
70
+ {
71
+ auto result = internal_->update_peer(internal_, peerId, const_cast<char*>(routeData));
72
+ return static_cast<Result>(result);
73
+ }
74
+
75
+ Result NetworkManager::ClosePeer(NetworkPeerId peerId)
76
+ {
77
+ auto result = internal_->close_peer(internal_, peerId);
78
+ return static_cast<Result>(result);
79
+ }
80
+
81
+ Result NetworkManager::OpenChannel(NetworkPeerId peerId, NetworkChannelId channelId, bool reliable)
82
+ {
83
+ auto result = internal_->open_channel(internal_, peerId, channelId, (reliable ? 1 : 0));
84
+ return static_cast<Result>(result);
85
+ }
86
+
87
+ Result NetworkManager::CloseChannel(NetworkPeerId peerId, NetworkChannelId channelId)
88
+ {
89
+ auto result = internal_->close_channel(internal_, peerId, channelId);
90
+ return static_cast<Result>(result);
91
+ }
92
+
93
+ Result NetworkManager::SendMessage(NetworkPeerId peerId,
94
+ NetworkChannelId channelId,
95
+ std::uint8_t* data,
96
+ std::uint32_t dataLength)
97
+ {
98
+ auto result = internal_->send_message(
99
+ internal_, peerId, channelId, reinterpret_cast<uint8_t*>(data), dataLength);
100
+ return static_cast<Result>(result);
101
+ }
102
+
103
+ } // namespace discord
@@ -0,0 +1,63 @@
1
+ #pragma once
2
+
3
+ #include "types.h"
4
+
5
+ namespace discord {
6
+
7
+ class NetworkManager final {
8
+ public:
9
+ ~NetworkManager() = default;
10
+
11
+ /**
12
+ * Get the local peer ID for this process.
13
+ */
14
+ void GetPeerId(NetworkPeerId* peerId);
15
+ /**
16
+ * Send pending network messages.
17
+ */
18
+ Result Flush();
19
+ /**
20
+ * Open a connection to a remote peer.
21
+ */
22
+ Result OpenPeer(NetworkPeerId peerId, char const* routeData);
23
+ /**
24
+ * Update the route data for a connected peer.
25
+ */
26
+ Result UpdatePeer(NetworkPeerId peerId, char const* routeData);
27
+ /**
28
+ * Close the connection to a remote peer.
29
+ */
30
+ Result ClosePeer(NetworkPeerId peerId);
31
+ /**
32
+ * Open a message channel to a connected peer.
33
+ */
34
+ Result OpenChannel(NetworkPeerId peerId, NetworkChannelId channelId, bool reliable);
35
+ /**
36
+ * Close a message channel to a connected peer.
37
+ */
38
+ Result CloseChannel(NetworkPeerId peerId, NetworkChannelId channelId);
39
+ /**
40
+ * Send a message to a connected peer over an opened message channel.
41
+ */
42
+ Result SendMessage(NetworkPeerId peerId,
43
+ NetworkChannelId channelId,
44
+ std::uint8_t* data,
45
+ std::uint32_t dataLength);
46
+
47
+ Event<NetworkPeerId, NetworkChannelId, std::uint8_t*, std::uint32_t> OnMessage;
48
+ Event<char const*> OnRouteUpdate;
49
+
50
+ private:
51
+ friend class Core;
52
+
53
+ NetworkManager() = default;
54
+ NetworkManager(NetworkManager const& rhs) = delete;
55
+ NetworkManager& operator=(NetworkManager const& rhs) = delete;
56
+ NetworkManager(NetworkManager&& rhs) = delete;
57
+ NetworkManager& operator=(NetworkManager&& rhs) = delete;
58
+
59
+ IDiscordNetworkManager* internal_;
60
+ static IDiscordNetworkEvents events_;
61
+ };
62
+
63
+ } // namespace discord
@@ -0,0 +1,112 @@
1
+ #if !defined(_CRT_SECURE_NO_WARNINGS)
2
+ #define _CRT_SECURE_NO_WARNINGS
3
+ #endif
4
+
5
+ #include "overlay_manager.h"
6
+
7
+ #include "core.h"
8
+
9
+ #include <cstring>
10
+ #include <memory>
11
+
12
+ namespace discord {
13
+
14
+ class OverlayEvents final {
15
+ public:
16
+ static void OnToggle(void* callbackData, bool locked)
17
+ {
18
+ auto* core = reinterpret_cast<Core*>(callbackData);
19
+ if (!core) {
20
+ return;
21
+ }
22
+
23
+ auto& module = core->OverlayManager();
24
+ module.OnToggle((locked != 0));
25
+ }
26
+ };
27
+
28
+ IDiscordOverlayEvents OverlayManager::events_{
29
+ &OverlayEvents::OnToggle,
30
+ };
31
+
32
+ void OverlayManager::IsEnabled(bool* enabled)
33
+ {
34
+ if (!enabled) {
35
+ return;
36
+ }
37
+
38
+ internal_->is_enabled(internal_, reinterpret_cast<bool*>(enabled));
39
+ }
40
+
41
+ void OverlayManager::IsLocked(bool* locked)
42
+ {
43
+ if (!locked) {
44
+ return;
45
+ }
46
+
47
+ internal_->is_locked(internal_, reinterpret_cast<bool*>(locked));
48
+ }
49
+
50
+ void OverlayManager::SetLocked(bool locked, 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_->set_locked(internal_, (locked ? 1 : 0), cb.release(), wrapper);
63
+ }
64
+
65
+ void OverlayManager::OpenActivityInvite(ActivityActionType type,
66
+ std::function<void(Result)> callback)
67
+ {
68
+ static auto wrapper = [](void* callbackData, EDiscordResult result) -> void {
69
+ std::unique_ptr<std::function<void(Result)>> cb(
70
+ reinterpret_cast<std::function<void(Result)>*>(callbackData));
71
+ if (!cb || !(*cb)) {
72
+ return;
73
+ }
74
+ (*cb)(static_cast<Result>(result));
75
+ };
76
+ std::unique_ptr<std::function<void(Result)>> cb{};
77
+ cb.reset(new std::function<void(Result)>(std::move(callback)));
78
+ internal_->open_activity_invite(
79
+ internal_, static_cast<EDiscordActivityActionType>(type), cb.release(), wrapper);
80
+ }
81
+
82
+ void OverlayManager::OpenGuildInvite(char const* code, std::function<void(Result)> callback)
83
+ {
84
+ static auto wrapper = [](void* callbackData, EDiscordResult result) -> void {
85
+ std::unique_ptr<std::function<void(Result)>> cb(
86
+ reinterpret_cast<std::function<void(Result)>*>(callbackData));
87
+ if (!cb || !(*cb)) {
88
+ return;
89
+ }
90
+ (*cb)(static_cast<Result>(result));
91
+ };
92
+ std::unique_ptr<std::function<void(Result)>> cb{};
93
+ cb.reset(new std::function<void(Result)>(std::move(callback)));
94
+ internal_->open_guild_invite(internal_, const_cast<char*>(code), cb.release(), wrapper);
95
+ }
96
+
97
+ void OverlayManager::OpenVoiceSettings(std::function<void(Result)> callback)
98
+ {
99
+ static auto wrapper = [](void* callbackData, EDiscordResult result) -> void {
100
+ std::unique_ptr<std::function<void(Result)>> cb(
101
+ reinterpret_cast<std::function<void(Result)>*>(callbackData));
102
+ if (!cb || !(*cb)) {
103
+ return;
104
+ }
105
+ (*cb)(static_cast<Result>(result));
106
+ };
107
+ std::unique_ptr<std::function<void(Result)>> cb{};
108
+ cb.reset(new std::function<void(Result)>(std::move(callback)));
109
+ internal_->open_voice_settings(internal_, cb.release(), wrapper);
110
+ }
111
+
112
+ } // namespace discord
@@ -0,0 +1,33 @@
1
+ #pragma once
2
+
3
+ #include "types.h"
4
+
5
+ namespace discord {
6
+
7
+ class OverlayManager final {
8
+ public:
9
+ ~OverlayManager() = default;
10
+
11
+ void IsEnabled(bool* enabled);
12
+ void IsLocked(bool* locked);
13
+ void SetLocked(bool locked, std::function<void(Result)> callback);
14
+ void OpenActivityInvite(ActivityActionType type, std::function<void(Result)> callback);
15
+ void OpenGuildInvite(char const* code, std::function<void(Result)> callback);
16
+ void OpenVoiceSettings(std::function<void(Result)> callback);
17
+
18
+ Event<bool> OnToggle;
19
+
20
+ private:
21
+ friend class Core;
22
+
23
+ OverlayManager() = default;
24
+ OverlayManager(OverlayManager const& rhs) = delete;
25
+ OverlayManager& operator=(OverlayManager const& rhs) = delete;
26
+ OverlayManager(OverlayManager&& rhs) = delete;
27
+ OverlayManager& operator=(OverlayManager&& rhs) = delete;
28
+
29
+ IDiscordOverlayManager* internal_;
30
+ static IDiscordOverlayEvents events_;
31
+ };
32
+
33
+ } // namespace discord
@@ -0,0 +1,90 @@
1
+ #if !defined(_CRT_SECURE_NO_WARNINGS)
2
+ #define _CRT_SECURE_NO_WARNINGS
3
+ #endif
4
+
5
+ #include "relationship_manager.h"
6
+
7
+ #include "core.h"
8
+
9
+ #include <cstring>
10
+ #include <memory>
11
+
12
+ namespace discord {
13
+
14
+ class RelationshipEvents final {
15
+ public:
16
+ static void OnRefresh(void* callbackData)
17
+ {
18
+ auto* core = reinterpret_cast<Core*>(callbackData);
19
+ if (!core) {
20
+ return;
21
+ }
22
+
23
+ auto& module = core->RelationshipManager();
24
+ module.OnRefresh();
25
+ }
26
+
27
+ static void OnRelationshipUpdate(void* callbackData, DiscordRelationship* relationship)
28
+ {
29
+ auto* core = reinterpret_cast<Core*>(callbackData);
30
+ if (!core) {
31
+ return;
32
+ }
33
+
34
+ auto& module = core->RelationshipManager();
35
+ module.OnRelationshipUpdate(*reinterpret_cast<Relationship const*>(relationship));
36
+ }
37
+ };
38
+
39
+ IDiscordRelationshipEvents RelationshipManager::events_{
40
+ &RelationshipEvents::OnRefresh,
41
+ &RelationshipEvents::OnRelationshipUpdate,
42
+ };
43
+
44
+ void RelationshipManager::Filter(std::function<bool(Relationship const&)> filter)
45
+ {
46
+ static auto wrapper = [](void* callbackData, DiscordRelationship* relationship) -> bool {
47
+ auto cb(reinterpret_cast<std::function<bool(Relationship const&)>*>(callbackData));
48
+ if (!cb || !(*cb)) {
49
+ return {};
50
+ }
51
+ return (*cb)(*reinterpret_cast<Relationship const*>(relationship));
52
+ };
53
+ std::unique_ptr<std::function<bool(Relationship const&)>> cb{};
54
+ cb.reset(new std::function<bool(Relationship const&)>(std::move(filter)));
55
+ internal_->filter(internal_, cb.get(), wrapper);
56
+ }
57
+
58
+ Result RelationshipManager::Count(std::int32_t* count)
59
+ {
60
+ if (!count) {
61
+ return Result::InternalError;
62
+ }
63
+
64
+ auto result = internal_->count(internal_, reinterpret_cast<int32_t*>(count));
65
+ return static_cast<Result>(result);
66
+ }
67
+
68
+ Result RelationshipManager::Get(UserId userId, Relationship* relationship)
69
+ {
70
+ if (!relationship) {
71
+ return Result::InternalError;
72
+ }
73
+
74
+ auto result =
75
+ internal_->get(internal_, userId, reinterpret_cast<DiscordRelationship*>(relationship));
76
+ return static_cast<Result>(result);
77
+ }
78
+
79
+ Result RelationshipManager::GetAt(std::uint32_t index, Relationship* relationship)
80
+ {
81
+ if (!relationship) {
82
+ return Result::InternalError;
83
+ }
84
+
85
+ auto result =
86
+ internal_->get_at(internal_, index, reinterpret_cast<DiscordRelationship*>(relationship));
87
+ return static_cast<Result>(result);
88
+ }
89
+
90
+ } // namespace discord
@@ -0,0 +1,32 @@
1
+ #pragma once
2
+
3
+ #include "types.h"
4
+
5
+ namespace discord {
6
+
7
+ class RelationshipManager final {
8
+ public:
9
+ ~RelationshipManager() = default;
10
+
11
+ void Filter(std::function<bool(Relationship const&)> filter);
12
+ Result Count(std::int32_t* count);
13
+ Result Get(UserId userId, Relationship* relationship);
14
+ Result GetAt(std::uint32_t index, Relationship* relationship);
15
+
16
+ Event<> OnRefresh;
17
+ Event<Relationship const&> OnRelationshipUpdate;
18
+
19
+ private:
20
+ friend class Core;
21
+
22
+ RelationshipManager() = default;
23
+ RelationshipManager(RelationshipManager const& rhs) = delete;
24
+ RelationshipManager& operator=(RelationshipManager const& rhs) = delete;
25
+ RelationshipManager(RelationshipManager&& rhs) = delete;
26
+ RelationshipManager& operator=(RelationshipManager&& rhs) = delete;
27
+
28
+ IDiscordRelationshipManager* internal_;
29
+ static IDiscordRelationshipEvents events_;
30
+ };
31
+
32
+ } // namespace discord
@@ -0,0 +1,158 @@
1
+ #if !defined(_CRT_SECURE_NO_WARNINGS)
2
+ #define _CRT_SECURE_NO_WARNINGS
3
+ #endif
4
+
5
+ #include "storage_manager.h"
6
+
7
+ #include "core.h"
8
+
9
+ #include <cstring>
10
+ #include <memory>
11
+
12
+ namespace discord {
13
+
14
+ Result StorageManager::Read(char const* name,
15
+ std::uint8_t* data,
16
+ std::uint32_t dataLength,
17
+ std::uint32_t* read)
18
+ {
19
+ if (!read) {
20
+ return Result::InternalError;
21
+ }
22
+
23
+ auto result = internal_->read(internal_,
24
+ const_cast<char*>(name),
25
+ reinterpret_cast<uint8_t*>(data),
26
+ dataLength,
27
+ reinterpret_cast<uint32_t*>(read));
28
+ return static_cast<Result>(result);
29
+ }
30
+
31
+ void StorageManager::ReadAsync(char const* name,
32
+ std::function<void(Result, std::uint8_t*, std::uint32_t)> callback)
33
+ {
34
+ static auto wrapper =
35
+ [](void* callbackData, EDiscordResult result, uint8_t* data, uint32_t dataLength) -> void {
36
+ std::unique_ptr<std::function<void(Result, std::uint8_t*, std::uint32_t)>> cb(
37
+ reinterpret_cast<std::function<void(Result, std::uint8_t*, std::uint32_t)>*>(
38
+ callbackData));
39
+ if (!cb || !(*cb)) {
40
+ return;
41
+ }
42
+ (*cb)(static_cast<Result>(result), data, dataLength);
43
+ };
44
+ std::unique_ptr<std::function<void(Result, std::uint8_t*, std::uint32_t)>> cb{};
45
+ cb.reset(new std::function<void(Result, std::uint8_t*, std::uint32_t)>(std::move(callback)));
46
+ internal_->read_async(internal_, const_cast<char*>(name), cb.release(), wrapper);
47
+ }
48
+
49
+ void StorageManager::ReadAsyncPartial(
50
+ char const* name,
51
+ std::uint64_t offset,
52
+ std::uint64_t length,
53
+ std::function<void(Result, std::uint8_t*, std::uint32_t)> callback)
54
+ {
55
+ static auto wrapper =
56
+ [](void* callbackData, EDiscordResult result, uint8_t* data, uint32_t dataLength) -> void {
57
+ std::unique_ptr<std::function<void(Result, std::uint8_t*, std::uint32_t)>> cb(
58
+ reinterpret_cast<std::function<void(Result, std::uint8_t*, std::uint32_t)>*>(
59
+ callbackData));
60
+ if (!cb || !(*cb)) {
61
+ return;
62
+ }
63
+ (*cb)(static_cast<Result>(result), data, dataLength);
64
+ };
65
+ std::unique_ptr<std::function<void(Result, std::uint8_t*, std::uint32_t)>> cb{};
66
+ cb.reset(new std::function<void(Result, std::uint8_t*, std::uint32_t)>(std::move(callback)));
67
+ internal_->read_async_partial(
68
+ internal_, const_cast<char*>(name), offset, length, cb.release(), wrapper);
69
+ }
70
+
71
+ Result StorageManager::Write(char const* name, std::uint8_t* data, std::uint32_t dataLength)
72
+ {
73
+ auto result = internal_->write(
74
+ internal_, const_cast<char*>(name), reinterpret_cast<uint8_t*>(data), dataLength);
75
+ return static_cast<Result>(result);
76
+ }
77
+
78
+ void StorageManager::WriteAsync(char const* name,
79
+ std::uint8_t* data,
80
+ std::uint32_t dataLength,
81
+ std::function<void(Result)> callback)
82
+ {
83
+ static auto wrapper = [](void* callbackData, EDiscordResult result) -> void {
84
+ std::unique_ptr<std::function<void(Result)>> cb(
85
+ reinterpret_cast<std::function<void(Result)>*>(callbackData));
86
+ if (!cb || !(*cb)) {
87
+ return;
88
+ }
89
+ (*cb)(static_cast<Result>(result));
90
+ };
91
+ std::unique_ptr<std::function<void(Result)>> cb{};
92
+ cb.reset(new std::function<void(Result)>(std::move(callback)));
93
+ internal_->write_async(internal_,
94
+ const_cast<char*>(name),
95
+ reinterpret_cast<uint8_t*>(data),
96
+ dataLength,
97
+ cb.release(),
98
+ wrapper);
99
+ }
100
+
101
+ Result StorageManager::Delete(char const* name)
102
+ {
103
+ auto result = internal_->delete_(internal_, const_cast<char*>(name));
104
+ return static_cast<Result>(result);
105
+ }
106
+
107
+ Result StorageManager::Exists(char const* name, bool* exists)
108
+ {
109
+ if (!exists) {
110
+ return Result::InternalError;
111
+ }
112
+
113
+ auto result =
114
+ internal_->exists(internal_, const_cast<char*>(name), reinterpret_cast<bool*>(exists));
115
+ return static_cast<Result>(result);
116
+ }
117
+
118
+ void StorageManager::Count(std::int32_t* count)
119
+ {
120
+ if (!count) {
121
+ return;
122
+ }
123
+
124
+ internal_->count(internal_, reinterpret_cast<int32_t*>(count));
125
+ }
126
+
127
+ Result StorageManager::Stat(char const* name, FileStat* stat)
128
+ {
129
+ if (!stat) {
130
+ return Result::InternalError;
131
+ }
132
+
133
+ auto result =
134
+ internal_->stat(internal_, const_cast<char*>(name), reinterpret_cast<DiscordFileStat*>(stat));
135
+ return static_cast<Result>(result);
136
+ }
137
+
138
+ Result StorageManager::StatAt(std::int32_t index, FileStat* stat)
139
+ {
140
+ if (!stat) {
141
+ return Result::InternalError;
142
+ }
143
+
144
+ auto result = internal_->stat_at(internal_, index, reinterpret_cast<DiscordFileStat*>(stat));
145
+ return static_cast<Result>(result);
146
+ }
147
+
148
+ Result StorageManager::GetPath(char path[4096])
149
+ {
150
+ if (!path) {
151
+ return Result::InternalError;
152
+ }
153
+
154
+ auto result = internal_->get_path(internal_, reinterpret_cast<DiscordPath*>(path));
155
+ return static_cast<Result>(result);
156
+ }
157
+
158
+ } // namespace discord