From bdd3742ca912389cfba0eddcfbec3aa48acaa390 Mon Sep 17 00:00:00 2001 From: Grinch_ Date: Fri, 11 Mar 2022 00:20:53 +0600 Subject: [PATCH] Switch to ligher discord rpc library --- depend/discord/achievement_manager.cpp | 98 --- depend/discord/achievement_manager.h | 34 - depend/discord/activity_manager.cpp | 177 ----- depend/discord/activity_manager.h | 42 -- depend/discord/application_manager.cpp | 78 -- depend/discord/application_manager.h | 30 - depend/discord/core.cpp | 182 ----- depend/discord/core.h | 64 -- depend/discord/discord.h | 16 - depend/discord/event.h | 59 -- depend/discord/ffi.h | 942 ------------------------ depend/discord/image_manager.cpp | 57 -- depend/discord/image_manager.h | 28 - depend/discord/lobby_manager.cpp | 547 -------------- depend/discord/lobby_manager.h | 88 --- depend/discord/network_manager.cpp | 103 --- depend/discord/network_manager.h | 63 -- depend/discord/overlay_manager.cpp | 112 --- depend/discord/overlay_manager.h | 33 - depend/discord/relationship_manager.cpp | 90 --- depend/discord/relationship_manager.h | 32 - depend/discord/storage_manager.cpp | 158 ---- depend/discord/storage_manager.h | 46 -- depend/discord/store_manager.cpp | 160 ---- depend/discord/store_manager.h | 38 - depend/discord/types.cpp | 769 ------------------- depend/discord/types.h | 491 ------------ depend/discord/user_manager.cpp | 80 -- depend/discord/user_manager.h | 31 - depend/discord/voice_manager.cpp | 124 ---- depend/discord/voice_manager.h | 37 - depend/lib/discord_game_sdk.lib | Bin 2358 -> 0 bytes resource/common/dlls/discord-rpc.dll | Bin 0 -> 307720 bytes resource/common/locale/English.json | 2 +- src/dllmain.cpp | 1 - src/rpc.cpp | 72 +- src/rpc.h | 30 +- src/version.h | 2 +- tools/premake5.lua | 8 +- 39 files changed, 76 insertions(+), 4848 deletions(-) delete mode 100644 depend/discord/achievement_manager.cpp delete mode 100644 depend/discord/achievement_manager.h delete mode 100644 depend/discord/activity_manager.cpp delete mode 100644 depend/discord/activity_manager.h delete mode 100644 depend/discord/application_manager.cpp delete mode 100644 depend/discord/application_manager.h delete mode 100644 depend/discord/core.cpp delete mode 100644 depend/discord/core.h delete mode 100644 depend/discord/discord.h delete mode 100644 depend/discord/event.h delete mode 100644 depend/discord/ffi.h delete mode 100644 depend/discord/image_manager.cpp delete mode 100644 depend/discord/image_manager.h delete mode 100644 depend/discord/lobby_manager.cpp delete mode 100644 depend/discord/lobby_manager.h delete mode 100644 depend/discord/network_manager.cpp delete mode 100644 depend/discord/network_manager.h delete mode 100644 depend/discord/overlay_manager.cpp delete mode 100644 depend/discord/overlay_manager.h delete mode 100644 depend/discord/relationship_manager.cpp delete mode 100644 depend/discord/relationship_manager.h delete mode 100644 depend/discord/storage_manager.cpp delete mode 100644 depend/discord/storage_manager.h delete mode 100644 depend/discord/store_manager.cpp delete mode 100644 depend/discord/store_manager.h delete mode 100644 depend/discord/types.cpp delete mode 100644 depend/discord/types.h delete mode 100644 depend/discord/user_manager.cpp delete mode 100644 depend/discord/user_manager.h delete mode 100644 depend/discord/voice_manager.cpp delete mode 100644 depend/discord/voice_manager.h delete mode 100644 depend/lib/discord_game_sdk.lib create mode 100644 resource/common/dlls/discord-rpc.dll diff --git a/depend/discord/achievement_manager.cpp b/depend/discord/achievement_manager.cpp deleted file mode 100644 index 7e3bc43..0000000 --- a/depend/discord/achievement_manager.cpp +++ /dev/null @@ -1,98 +0,0 @@ -#if !defined(_CRT_SECURE_NO_WARNINGS) -#define _CRT_SECURE_NO_WARNINGS -#endif - -#include "achievement_manager.h" - -#include "core.h" - -#include -#include - -namespace discord { - -class AchievementEvents final { -public: - static void OnUserAchievementUpdate(void* callbackData, DiscordUserAchievement* userAchievement) - { - auto* core = reinterpret_cast(callbackData); - if (!core) { - return; - } - - auto& module = core->AchievementManager(); - module.OnUserAchievementUpdate(*reinterpret_cast(userAchievement)); - } -}; - -IDiscordAchievementEvents AchievementManager::events_{ - &AchievementEvents::OnUserAchievementUpdate, -}; - -void AchievementManager::SetUserAchievement(Snowflake achievementId, - std::uint8_t percentComplete, - std::function callback) -{ - static auto wrapper = [](void* callbackData, EDiscordResult result) -> void { - std::unique_ptr> cb( - reinterpret_cast*>(callbackData)); - if (!cb || !(*cb)) { - return; - } - (*cb)(static_cast(result)); - }; - std::unique_ptr> cb{}; - cb.reset(new std::function(std::move(callback))); - internal_->set_user_achievement( - internal_, achievementId, percentComplete, cb.release(), wrapper); -} - -void AchievementManager::FetchUserAchievements(std::function callback) -{ - static auto wrapper = [](void* callbackData, EDiscordResult result) -> void { - std::unique_ptr> cb( - reinterpret_cast*>(callbackData)); - if (!cb || !(*cb)) { - return; - } - (*cb)(static_cast(result)); - }; - std::unique_ptr> cb{}; - cb.reset(new std::function(std::move(callback))); - internal_->fetch_user_achievements(internal_, cb.release(), wrapper); -} - -void AchievementManager::CountUserAchievements(std::int32_t* count) -{ - if (!count) { - return; - } - - internal_->count_user_achievements(internal_, reinterpret_cast(count)); -} - -Result AchievementManager::GetUserAchievement(Snowflake userAchievementId, - UserAchievement* userAchievement) -{ - if (!userAchievement) { - return Result::InternalError; - } - - auto result = internal_->get_user_achievement( - internal_, userAchievementId, reinterpret_cast(userAchievement)); - return static_cast(result); -} - -Result AchievementManager::GetUserAchievementAt(std::int32_t index, - UserAchievement* userAchievement) -{ - if (!userAchievement) { - return Result::InternalError; - } - - auto result = internal_->get_user_achievement_at( - internal_, index, reinterpret_cast(userAchievement)); - return static_cast(result); -} - -} // namespace discord diff --git a/depend/discord/achievement_manager.h b/depend/discord/achievement_manager.h deleted file mode 100644 index 1f58c8e..0000000 --- a/depend/discord/achievement_manager.h +++ /dev/null @@ -1,34 +0,0 @@ -#pragma once - -#include "types.h" - -namespace discord { - -class AchievementManager final { -public: - ~AchievementManager() = default; - - void SetUserAchievement(Snowflake achievementId, - std::uint8_t percentComplete, - std::function callback); - void FetchUserAchievements(std::function callback); - void CountUserAchievements(std::int32_t* count); - Result GetUserAchievement(Snowflake userAchievementId, UserAchievement* userAchievement); - Result GetUserAchievementAt(std::int32_t index, UserAchievement* userAchievement); - - Event OnUserAchievementUpdate; - -private: - friend class Core; - - AchievementManager() = default; - AchievementManager(AchievementManager const& rhs) = delete; - AchievementManager& operator=(AchievementManager const& rhs) = delete; - AchievementManager(AchievementManager&& rhs) = delete; - AchievementManager& operator=(AchievementManager&& rhs) = delete; - - IDiscordAchievementManager* internal_; - static IDiscordAchievementEvents events_; -}; - -} // namespace discord diff --git a/depend/discord/activity_manager.cpp b/depend/discord/activity_manager.cpp deleted file mode 100644 index b9b6760..0000000 --- a/depend/discord/activity_manager.cpp +++ /dev/null @@ -1,177 +0,0 @@ -#if !defined(_CRT_SECURE_NO_WARNINGS) -#define _CRT_SECURE_NO_WARNINGS -#endif - -#include "activity_manager.h" - -#include "core.h" - -#include -#include - -namespace discord { - -class ActivityEvents final { -public: - static void OnActivityJoin(void* callbackData, char const* secret) - { - auto* core = reinterpret_cast(callbackData); - if (!core) { - return; - } - - auto& module = core->ActivityManager(); - module.OnActivityJoin(static_cast(secret)); - } - - static void OnActivitySpectate(void* callbackData, char const* secret) - { - auto* core = reinterpret_cast(callbackData); - if (!core) { - return; - } - - auto& module = core->ActivityManager(); - module.OnActivitySpectate(static_cast(secret)); - } - - static void OnActivityJoinRequest(void* callbackData, DiscordUser* user) - { - auto* core = reinterpret_cast(callbackData); - if (!core) { - return; - } - - auto& module = core->ActivityManager(); - module.OnActivityJoinRequest(*reinterpret_cast(user)); - } - - static void OnActivityInvite(void* callbackData, - EDiscordActivityActionType type, - DiscordUser* user, - DiscordActivity* activity) - { - auto* core = reinterpret_cast(callbackData); - if (!core) { - return; - } - - auto& module = core->ActivityManager(); - module.OnActivityInvite(static_cast(type), - *reinterpret_cast(user), - *reinterpret_cast(activity)); - } -}; - -IDiscordActivityEvents ActivityManager::events_{ - &ActivityEvents::OnActivityJoin, - &ActivityEvents::OnActivitySpectate, - &ActivityEvents::OnActivityJoinRequest, - &ActivityEvents::OnActivityInvite, -}; - -Result ActivityManager::RegisterCommand(char const* command) -{ - auto result = internal_->register_command(internal_, const_cast(command)); - return static_cast(result); -} - -Result ActivityManager::RegisterSteam(std::uint32_t steamId) -{ - auto result = internal_->register_steam(internal_, steamId); - return static_cast(result); -} - -void ActivityManager::UpdateActivity(Activity const& activity, std::function callback) -{ - static auto wrapper = [](void* callbackData, EDiscordResult result) -> void { - std::unique_ptr> cb( - reinterpret_cast*>(callbackData)); - if (!cb || !(*cb)) { - return; - } - (*cb)(static_cast(result)); - }; - std::unique_ptr> cb{}; - cb.reset(new std::function(std::move(callback))); - internal_->update_activity(internal_, - reinterpret_cast(const_cast(&activity)), - cb.release(), - wrapper); -} - -void ActivityManager::ClearActivity(std::function callback) -{ - static auto wrapper = [](void* callbackData, EDiscordResult result) -> void { - std::unique_ptr> cb( - reinterpret_cast*>(callbackData)); - if (!cb || !(*cb)) { - return; - } - (*cb)(static_cast(result)); - }; - std::unique_ptr> cb{}; - cb.reset(new std::function(std::move(callback))); - internal_->clear_activity(internal_, cb.release(), wrapper); -} - -void ActivityManager::SendRequestReply(UserId userId, - ActivityJoinRequestReply reply, - std::function callback) -{ - static auto wrapper = [](void* callbackData, EDiscordResult result) -> void { - std::unique_ptr> cb( - reinterpret_cast*>(callbackData)); - if (!cb || !(*cb)) { - return; - } - (*cb)(static_cast(result)); - }; - std::unique_ptr> cb{}; - cb.reset(new std::function(std::move(callback))); - internal_->send_request_reply(internal_, - userId, - static_cast(reply), - cb.release(), - wrapper); -} - -void ActivityManager::SendInvite(UserId userId, - ActivityActionType type, - char const* content, - std::function callback) -{ - static auto wrapper = [](void* callbackData, EDiscordResult result) -> void { - std::unique_ptr> cb( - reinterpret_cast*>(callbackData)); - if (!cb || !(*cb)) { - return; - } - (*cb)(static_cast(result)); - }; - std::unique_ptr> cb{}; - cb.reset(new std::function(std::move(callback))); - internal_->send_invite(internal_, - userId, - static_cast(type), - const_cast(content), - cb.release(), - wrapper); -} - -void ActivityManager::AcceptInvite(UserId userId, std::function callback) -{ - static auto wrapper = [](void* callbackData, EDiscordResult result) -> void { - std::unique_ptr> cb( - reinterpret_cast*>(callbackData)); - if (!cb || !(*cb)) { - return; - } - (*cb)(static_cast(result)); - }; - std::unique_ptr> cb{}; - cb.reset(new std::function(std::move(callback))); - internal_->accept_invite(internal_, userId, cb.release(), wrapper); -} - -} // namespace discord diff --git a/depend/discord/activity_manager.h b/depend/discord/activity_manager.h deleted file mode 100644 index c107be2..0000000 --- a/depend/discord/activity_manager.h +++ /dev/null @@ -1,42 +0,0 @@ -#pragma once - -#include "types.h" - -namespace discord { - -class ActivityManager final { -public: - ~ActivityManager() = default; - - Result RegisterCommand(char const* command); - Result RegisterSteam(std::uint32_t steamId); - void UpdateActivity(Activity const& activity, std::function callback); - void ClearActivity(std::function callback); - void SendRequestReply(UserId userId, - ActivityJoinRequestReply reply, - std::function callback); - void SendInvite(UserId userId, - ActivityActionType type, - char const* content, - std::function callback); - void AcceptInvite(UserId userId, std::function callback); - - Event OnActivityJoin; - Event OnActivitySpectate; - Event OnActivityJoinRequest; - Event OnActivityInvite; - -private: - friend class Core; - - ActivityManager() = default; - ActivityManager(ActivityManager const& rhs) = delete; - ActivityManager& operator=(ActivityManager const& rhs) = delete; - ActivityManager(ActivityManager&& rhs) = delete; - ActivityManager& operator=(ActivityManager&& rhs) = delete; - - IDiscordActivityManager* internal_; - static IDiscordActivityEvents events_; -}; - -} // namespace discord diff --git a/depend/discord/application_manager.cpp b/depend/discord/application_manager.cpp deleted file mode 100644 index 0e05f3f..0000000 --- a/depend/discord/application_manager.cpp +++ /dev/null @@ -1,78 +0,0 @@ -#if !defined(_CRT_SECURE_NO_WARNINGS) -#define _CRT_SECURE_NO_WARNINGS -#endif - -#include "application_manager.h" - -#include "core.h" - -#include -#include - -namespace discord { - -void ApplicationManager::ValidateOrExit(std::function callback) -{ - static auto wrapper = [](void* callbackData, EDiscordResult result) -> void { - std::unique_ptr> cb( - reinterpret_cast*>(callbackData)); - if (!cb || !(*cb)) { - return; - } - (*cb)(static_cast(result)); - }; - std::unique_ptr> cb{}; - cb.reset(new std::function(std::move(callback))); - internal_->validate_or_exit(internal_, cb.release(), wrapper); -} - -void ApplicationManager::GetCurrentLocale(char locale[128]) -{ - if (!locale) { - return; - } - - internal_->get_current_locale(internal_, reinterpret_cast(locale)); -} - -void ApplicationManager::GetCurrentBranch(char branch[4096]) -{ - if (!branch) { - return; - } - - internal_->get_current_branch(internal_, reinterpret_cast(branch)); -} - -void ApplicationManager::GetOAuth2Token(std::function callback) -{ - static auto wrapper = - [](void* callbackData, EDiscordResult result, DiscordOAuth2Token* oauth2Token) -> void { - std::unique_ptr> cb( - reinterpret_cast*>(callbackData)); - if (!cb || !(*cb)) { - return; - } - (*cb)(static_cast(result), *reinterpret_cast(oauth2Token)); - }; - std::unique_ptr> cb{}; - cb.reset(new std::function(std::move(callback))); - internal_->get_oauth2_token(internal_, cb.release(), wrapper); -} - -void ApplicationManager::GetTicket(std::function callback) -{ - static auto wrapper = [](void* callbackData, EDiscordResult result, char const* data) -> void { - std::unique_ptr> cb( - reinterpret_cast*>(callbackData)); - if (!cb || !(*cb)) { - return; - } - (*cb)(static_cast(result), static_cast(data)); - }; - std::unique_ptr> cb{}; - cb.reset(new std::function(std::move(callback))); - internal_->get_ticket(internal_, cb.release(), wrapper); -} - -} // namespace discord diff --git a/depend/discord/application_manager.h b/depend/discord/application_manager.h deleted file mode 100644 index ab0e856..0000000 --- a/depend/discord/application_manager.h +++ /dev/null @@ -1,30 +0,0 @@ -#pragma once - -#include "types.h" - -namespace discord { - -class ApplicationManager final { -public: - ~ApplicationManager() = default; - - void ValidateOrExit(std::function callback); - void GetCurrentLocale(char locale[128]); - void GetCurrentBranch(char branch[4096]); - void GetOAuth2Token(std::function callback); - void GetTicket(std::function callback); - -private: - friend class Core; - - ApplicationManager() = default; - ApplicationManager(ApplicationManager const& rhs) = delete; - ApplicationManager& operator=(ApplicationManager const& rhs) = delete; - ApplicationManager(ApplicationManager&& rhs) = delete; - ApplicationManager& operator=(ApplicationManager&& rhs) = delete; - - IDiscordApplicationManager* internal_; - static IDiscordApplicationEvents events_; -}; - -} // namespace discord diff --git a/depend/discord/core.cpp b/depend/discord/core.cpp deleted file mode 100644 index 110c9ef..0000000 --- a/depend/discord/core.cpp +++ /dev/null @@ -1,182 +0,0 @@ -#if !defined(_CRT_SECURE_NO_WARNINGS) -#define _CRT_SECURE_NO_WARNINGS -#endif - -#include "core.h" - -#include -#include - -namespace discord { - -Result Core::Create(ClientId clientId, std::uint64_t flags, Core** instance) -{ - if (!instance) { - return Result::InternalError; - } - - (*instance) = new Core(); - DiscordCreateParams params{}; - DiscordCreateParamsSetDefault(¶ms); - params.client_id = clientId; - params.flags = flags; - params.events = nullptr; - params.event_data = *instance; - params.user_events = &UserManager::events_; - params.activity_events = &ActivityManager::events_; - params.relationship_events = &RelationshipManager::events_; - params.lobby_events = &LobbyManager::events_; - params.network_events = &NetworkManager::events_; - params.overlay_events = &OverlayManager::events_; - params.store_events = &StoreManager::events_; - params.voice_events = &VoiceManager::events_; - params.achievement_events = &AchievementManager::events_; - auto result = DiscordCreate(DISCORD_VERSION, ¶ms, &((*instance)->internal_)); - if (result != DiscordResult_Ok || !(*instance)->internal_) { - delete (*instance); - (*instance) = nullptr; - } - - return static_cast(result); -} - -Core::~Core() -{ - if (internal_) { - internal_->destroy(internal_); - internal_ = nullptr; - } -} - -Result Core::RunCallbacks() -{ - auto result = internal_->run_callbacks(internal_); - return static_cast(result); -} - -void Core::SetLogHook(LogLevel minLevel, std::function hook) -{ - setLogHook_.DisconnectAll(); - setLogHook_.Connect(std::move(hook)); - static auto wrapper = - [](void* callbackData, EDiscordLogLevel level, char const* message) -> void { - auto cb(reinterpret_cast(callbackData)); - if (!cb) { - return; - } - (*cb)(static_cast(level), static_cast(message)); - }; - - internal_->set_log_hook( - internal_, static_cast(minLevel), &setLogHook_, wrapper); -} - -discord::ApplicationManager& Core::ApplicationManager() -{ - if (!applicationManager_.internal_) { - applicationManager_.internal_ = internal_->get_application_manager(internal_); - } - - return applicationManager_; -} - -discord::UserManager& Core::UserManager() -{ - if (!userManager_.internal_) { - userManager_.internal_ = internal_->get_user_manager(internal_); - } - - return userManager_; -} - -discord::ImageManager& Core::ImageManager() -{ - if (!imageManager_.internal_) { - imageManager_.internal_ = internal_->get_image_manager(internal_); - } - - return imageManager_; -} - -discord::ActivityManager& Core::ActivityManager() -{ - if (!activityManager_.internal_) { - activityManager_.internal_ = internal_->get_activity_manager(internal_); - } - - return activityManager_; -} - -discord::RelationshipManager& Core::RelationshipManager() -{ - if (!relationshipManager_.internal_) { - relationshipManager_.internal_ = internal_->get_relationship_manager(internal_); - } - - return relationshipManager_; -} - -discord::LobbyManager& Core::LobbyManager() -{ - if (!lobbyManager_.internal_) { - lobbyManager_.internal_ = internal_->get_lobby_manager(internal_); - } - - return lobbyManager_; -} - -discord::NetworkManager& Core::NetworkManager() -{ - if (!networkManager_.internal_) { - networkManager_.internal_ = internal_->get_network_manager(internal_); - } - - return networkManager_; -} - -discord::OverlayManager& Core::OverlayManager() -{ - if (!overlayManager_.internal_) { - overlayManager_.internal_ = internal_->get_overlay_manager(internal_); - } - - return overlayManager_; -} - -discord::StorageManager& Core::StorageManager() -{ - if (!storageManager_.internal_) { - storageManager_.internal_ = internal_->get_storage_manager(internal_); - } - - return storageManager_; -} - -discord::StoreManager& Core::StoreManager() -{ - if (!storeManager_.internal_) { - storeManager_.internal_ = internal_->get_store_manager(internal_); - } - - return storeManager_; -} - -discord::VoiceManager& Core::VoiceManager() -{ - if (!voiceManager_.internal_) { - voiceManager_.internal_ = internal_->get_voice_manager(internal_); - } - - return voiceManager_; -} - -discord::AchievementManager& Core::AchievementManager() -{ - if (!achievementManager_.internal_) { - achievementManager_.internal_ = internal_->get_achievement_manager(internal_); - } - - return achievementManager_; -} - -} // namespace discord diff --git a/depend/discord/core.h b/depend/discord/core.h deleted file mode 100644 index 8af6fca..0000000 --- a/depend/discord/core.h +++ /dev/null @@ -1,64 +0,0 @@ -#pragma once - -#include "types.h" -#include "application_manager.h" -#include "user_manager.h" -#include "image_manager.h" -#include "activity_manager.h" -#include "relationship_manager.h" -#include "lobby_manager.h" -#include "network_manager.h" -#include "overlay_manager.h" -#include "storage_manager.h" -#include "store_manager.h" -#include "voice_manager.h" -#include "achievement_manager.h" - -namespace discord { - -class Core final { -public: - static Result Create(ClientId clientId, std::uint64_t flags, Core** instance); - - ~Core(); - - Result RunCallbacks(); - void SetLogHook(LogLevel minLevel, std::function hook); - - discord::ApplicationManager& ApplicationManager(); - discord::UserManager& UserManager(); - discord::ImageManager& ImageManager(); - discord::ActivityManager& ActivityManager(); - discord::RelationshipManager& RelationshipManager(); - discord::LobbyManager& LobbyManager(); - discord::NetworkManager& NetworkManager(); - discord::OverlayManager& OverlayManager(); - discord::StorageManager& StorageManager(); - discord::StoreManager& StoreManager(); - discord::VoiceManager& VoiceManager(); - discord::AchievementManager& AchievementManager(); - -private: - Core() = default; - Core(Core const& rhs) = delete; - Core& operator=(Core const& rhs) = delete; - Core(Core&& rhs) = delete; - Core& operator=(Core&& rhs) = delete; - - IDiscordCore* internal_; - Event setLogHook_; - discord::ApplicationManager applicationManager_; - discord::UserManager userManager_; - discord::ImageManager imageManager_; - discord::ActivityManager activityManager_; - discord::RelationshipManager relationshipManager_; - discord::LobbyManager lobbyManager_; - discord::NetworkManager networkManager_; - discord::OverlayManager overlayManager_; - discord::StorageManager storageManager_; - discord::StoreManager storeManager_; - discord::VoiceManager voiceManager_; - discord::AchievementManager achievementManager_; -}; - -} // namespace discord diff --git a/depend/discord/discord.h b/depend/discord/discord.h deleted file mode 100644 index c991212..0000000 --- a/depend/discord/discord.h +++ /dev/null @@ -1,16 +0,0 @@ -#pragma once - -#include "types.h" -#include "core.h" -#include "application_manager.h" -#include "user_manager.h" -#include "image_manager.h" -#include "activity_manager.h" -#include "relationship_manager.h" -#include "lobby_manager.h" -#include "network_manager.h" -#include "overlay_manager.h" -#include "storage_manager.h" -#include "store_manager.h" -#include "voice_manager.h" -#include "achievement_manager.h" diff --git a/depend/discord/event.h b/depend/discord/event.h deleted file mode 100644 index 610887d..0000000 --- a/depend/discord/event.h +++ /dev/null @@ -1,59 +0,0 @@ -#pragma once - -#include -#include - -namespace discord { - -template -class Event final { -public: - using Token = int; - - Event() { slots_.reserve(4); } - - Event(Event const&) = default; - Event(Event&&) = default; - ~Event() = default; - - Event& operator=(Event const&) = default; - Event& operator=(Event&&) = default; - - template - Token Connect(EventHandler slot) - { - slots_.emplace_back(Slot{nextToken_, std::move(slot)}); - return nextToken_++; - } - - void Disconnect(Token token) - { - for (auto& slot : slots_) { - if (slot.token == token) { - slot = slots_.back(); - slots_.pop_back(); - break; - } - } - } - - void DisconnectAll() { slots_ = {}; } - - void operator()(Args... args) - { - for (auto const& slot : slots_) { - slot.fn(std::forward(args)...); - } - } - -private: - struct Slot { - Token token; - std::function fn; - }; - - Token nextToken_{}; - std::vector slots_{}; -}; - -} // namespace discord diff --git a/depend/discord/ffi.h b/depend/discord/ffi.h deleted file mode 100644 index 765fde7..0000000 --- a/depend/discord/ffi.h +++ /dev/null @@ -1,942 +0,0 @@ -#ifndef _DISCORD_GAME_SDK_H_ -#define _DISCORD_GAME_SDK_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -#include -#include -#ifndef __cplusplus -#include -#endif - -#define DISCORD_VERSION 2 -#define DISCORD_APPLICATION_MANAGER_VERSION 1 -#define DISCORD_USER_MANAGER_VERSION 1 -#define DISCORD_IMAGE_MANAGER_VERSION 1 -#define DISCORD_ACTIVITY_MANAGER_VERSION 1 -#define DISCORD_RELATIONSHIP_MANAGER_VERSION 1 -#define DISCORD_LOBBY_MANAGER_VERSION 1 -#define DISCORD_NETWORK_MANAGER_VERSION 1 -#define DISCORD_OVERLAY_MANAGER_VERSION 1 -#define DISCORD_STORAGE_MANAGER_VERSION 1 -#define DISCORD_STORE_MANAGER_VERSION 1 -#define DISCORD_VOICE_MANAGER_VERSION 1 -#define DISCORD_ACHIEVEMENT_MANAGER_VERSION 1 - -enum EDiscordResult { - DiscordResult_Ok = 0, - DiscordResult_ServiceUnavailable = 1, - DiscordResult_InvalidVersion = 2, - DiscordResult_LockFailed = 3, - DiscordResult_InternalError = 4, - DiscordResult_InvalidPayload = 5, - DiscordResult_InvalidCommand = 6, - DiscordResult_InvalidPermissions = 7, - DiscordResult_NotFetched = 8, - DiscordResult_NotFound = 9, - DiscordResult_Conflict = 10, - DiscordResult_InvalidSecret = 11, - DiscordResult_InvalidJoinSecret = 12, - DiscordResult_NoEligibleActivity = 13, - DiscordResult_InvalidInvite = 14, - DiscordResult_NotAuthenticated = 15, - DiscordResult_InvalidAccessToken = 16, - DiscordResult_ApplicationMismatch = 17, - DiscordResult_InvalidDataUrl = 18, - DiscordResult_InvalidBase64 = 19, - DiscordResult_NotFiltered = 20, - DiscordResult_LobbyFull = 21, - DiscordResult_InvalidLobbySecret = 22, - DiscordResult_InvalidFilename = 23, - DiscordResult_InvalidFileSize = 24, - DiscordResult_InvalidEntitlement = 25, - DiscordResult_NotInstalled = 26, - DiscordResult_NotRunning = 27, - DiscordResult_InsufficientBuffer = 28, - DiscordResult_PurchaseCanceled = 29, - DiscordResult_InvalidGuild = 30, - DiscordResult_InvalidEvent = 31, - DiscordResult_InvalidChannel = 32, - DiscordResult_InvalidOrigin = 33, - DiscordResult_RateLimited = 34, - DiscordResult_OAuth2Error = 35, - DiscordResult_SelectChannelTimeout = 36, - DiscordResult_GetGuildTimeout = 37, - DiscordResult_SelectVoiceForceRequired = 38, - DiscordResult_CaptureShortcutAlreadyListening = 39, - DiscordResult_UnauthorizedForAchievement = 40, - DiscordResult_InvalidGiftCode = 41, - DiscordResult_PurchaseError = 42, - DiscordResult_TransactionAborted = 43, -}; - -enum EDiscordCreateFlags { - DiscordCreateFlags_Default = 0, - DiscordCreateFlags_NoRequireDiscord = 1, -}; - -enum EDiscordLogLevel { - DiscordLogLevel_Error = 1, - DiscordLogLevel_Warn, - DiscordLogLevel_Info, - DiscordLogLevel_Debug, -}; - -enum EDiscordUserFlag { - DiscordUserFlag_Partner = 2, - DiscordUserFlag_HypeSquadEvents = 4, - DiscordUserFlag_HypeSquadHouse1 = 64, - DiscordUserFlag_HypeSquadHouse2 = 128, - DiscordUserFlag_HypeSquadHouse3 = 256, -}; - -enum EDiscordPremiumType { - DiscordPremiumType_None = 0, - DiscordPremiumType_Tier1 = 1, - DiscordPremiumType_Tier2 = 2, -}; - -enum EDiscordImageType { - DiscordImageType_User, -}; - -enum EDiscordActivityType { - DiscordActivityType_Playing, - DiscordActivityType_Streaming, - DiscordActivityType_Listening, - DiscordActivityType_Watching, -}; - -enum EDiscordActivityActionType { - DiscordActivityActionType_Join = 1, - DiscordActivityActionType_Spectate, -}; - -enum EDiscordActivityJoinRequestReply { - DiscordActivityJoinRequestReply_No, - DiscordActivityJoinRequestReply_Yes, - DiscordActivityJoinRequestReply_Ignore, -}; - -enum EDiscordStatus { - DiscordStatus_Offline = 0, - DiscordStatus_Online = 1, - DiscordStatus_Idle = 2, - DiscordStatus_DoNotDisturb = 3, -}; - -enum EDiscordRelationshipType { - DiscordRelationshipType_None, - DiscordRelationshipType_Friend, - DiscordRelationshipType_Blocked, - DiscordRelationshipType_PendingIncoming, - DiscordRelationshipType_PendingOutgoing, - DiscordRelationshipType_Implicit, -}; - -enum EDiscordLobbyType { - DiscordLobbyType_Private = 1, - DiscordLobbyType_Public, -}; - -enum EDiscordLobbySearchComparison { - DiscordLobbySearchComparison_LessThanOrEqual = -2, - DiscordLobbySearchComparison_LessThan, - DiscordLobbySearchComparison_Equal, - DiscordLobbySearchComparison_GreaterThan, - DiscordLobbySearchComparison_GreaterThanOrEqual, - DiscordLobbySearchComparison_NotEqual, -}; - -enum EDiscordLobbySearchCast { - DiscordLobbySearchCast_String = 1, - DiscordLobbySearchCast_Number, -}; - -enum EDiscordLobbySearchDistance { - DiscordLobbySearchDistance_Local, - DiscordLobbySearchDistance_Default, - DiscordLobbySearchDistance_Extended, - DiscordLobbySearchDistance_Global, -}; - -enum EDiscordEntitlementType { - DiscordEntitlementType_Purchase = 1, - DiscordEntitlementType_PremiumSubscription, - DiscordEntitlementType_DeveloperGift, - DiscordEntitlementType_TestModePurchase, - DiscordEntitlementType_FreePurchase, - DiscordEntitlementType_UserGift, - DiscordEntitlementType_PremiumPurchase, -}; - -enum EDiscordSkuType { - DiscordSkuType_Application = 1, - DiscordSkuType_DLC, - DiscordSkuType_Consumable, - DiscordSkuType_Bundle, -}; - -enum EDiscordInputModeType { - DiscordInputModeType_VoiceActivity = 0, - DiscordInputModeType_PushToTalk, -}; - -typedef int64_t DiscordClientId; -typedef int32_t DiscordVersion; -typedef int64_t DiscordSnowflake; -typedef int64_t DiscordTimestamp; -typedef DiscordSnowflake DiscordUserId; -typedef char DiscordLocale[128]; -typedef char DiscordBranch[4096]; -typedef DiscordSnowflake DiscordLobbyId; -typedef char DiscordLobbySecret[128]; -typedef char DiscordMetadataKey[256]; -typedef char DiscordMetadataValue[4096]; -typedef uint64_t DiscordNetworkPeerId; -typedef uint8_t DiscordNetworkChannelId; -typedef char DiscordPath[4096]; -typedef char DiscordDateTime[64]; - -struct DiscordUser { - DiscordUserId id; - char username[256]; - char discriminator[8]; - char avatar[128]; - bool bot; -}; - -struct DiscordOAuth2Token { - char access_token[128]; - char scopes[1024]; - DiscordTimestamp expires; -}; - -struct DiscordImageHandle { - enum EDiscordImageType type; - int64_t id; - uint32_t size; -}; - -struct DiscordImageDimensions { - uint32_t width; - uint32_t height; -}; - -struct DiscordActivityTimestamps { - DiscordTimestamp start; - DiscordTimestamp end; -}; - -struct DiscordActivityAssets { - char large_image[128]; - char large_text[128]; - char small_image[128]; - char small_text[128]; -}; - -struct DiscordPartySize { - int32_t current_size; - int32_t max_size; -}; - -struct DiscordActivityParty { - char id[128]; - struct DiscordPartySize size; -}; - -struct DiscordActivitySecrets { - char match[128]; - char join[128]; - char spectate[128]; -}; - -struct DiscordActivity { - enum EDiscordActivityType type; - int64_t application_id; - char name[128]; - char state[128]; - char details[128]; - struct DiscordActivityTimestamps timestamps; - struct DiscordActivityAssets assets; - struct DiscordActivityParty party; - struct DiscordActivitySecrets secrets; - bool instance; -}; - -struct DiscordPresence { - enum EDiscordStatus status; - struct DiscordActivity activity; -}; - -struct DiscordRelationship { - enum EDiscordRelationshipType type; - struct DiscordUser user; - struct DiscordPresence presence; -}; - -struct DiscordLobby { - DiscordLobbyId id; - enum EDiscordLobbyType type; - DiscordUserId owner_id; - DiscordLobbySecret secret; - uint32_t capacity; - bool locked; -}; - -struct DiscordFileStat { - char filename[260]; - uint64_t size; - uint64_t last_modified; -}; - -struct DiscordEntitlement { - DiscordSnowflake id; - enum EDiscordEntitlementType type; - DiscordSnowflake sku_id; -}; - -struct DiscordSkuPrice { - uint32_t amount; - char currency[16]; -}; - -struct DiscordSku { - DiscordSnowflake id; - enum EDiscordSkuType type; - char name[256]; - struct DiscordSkuPrice price; -}; - -struct DiscordInputMode { - enum EDiscordInputModeType type; - char shortcut[256]; -}; - -struct DiscordUserAchievement { - DiscordSnowflake user_id; - DiscordSnowflake achievement_id; - uint8_t percent_complete; - DiscordDateTime unlocked_at; -}; - -struct IDiscordLobbyTransaction { - enum EDiscordResult (*set_type)(struct IDiscordLobbyTransaction* lobby_transaction, - enum EDiscordLobbyType type); - enum EDiscordResult (*set_owner)(struct IDiscordLobbyTransaction* lobby_transaction, - DiscordUserId owner_id); - enum EDiscordResult (*set_capacity)(struct IDiscordLobbyTransaction* lobby_transaction, - uint32_t capacity); - enum EDiscordResult (*set_metadata)(struct IDiscordLobbyTransaction* lobby_transaction, - DiscordMetadataKey key, - DiscordMetadataValue value); - enum EDiscordResult (*delete_metadata)(struct IDiscordLobbyTransaction* lobby_transaction, - DiscordMetadataKey key); - enum EDiscordResult (*set_locked)(struct IDiscordLobbyTransaction* lobby_transaction, - bool locked); -}; - -struct IDiscordLobbyMemberTransaction { - enum EDiscordResult (*set_metadata)( - struct IDiscordLobbyMemberTransaction* lobby_member_transaction, - DiscordMetadataKey key, - DiscordMetadataValue value); - enum EDiscordResult (*delete_metadata)( - struct IDiscordLobbyMemberTransaction* lobby_member_transaction, - DiscordMetadataKey key); -}; - -struct IDiscordLobbySearchQuery { - enum EDiscordResult (*filter)(struct IDiscordLobbySearchQuery* lobby_search_query, - DiscordMetadataKey key, - enum EDiscordLobbySearchComparison comparison, - enum EDiscordLobbySearchCast cast, - DiscordMetadataValue value); - enum EDiscordResult (*sort)(struct IDiscordLobbySearchQuery* lobby_search_query, - DiscordMetadataKey key, - enum EDiscordLobbySearchCast cast, - DiscordMetadataValue value); - enum EDiscordResult (*limit)(struct IDiscordLobbySearchQuery* lobby_search_query, - uint32_t limit); - enum EDiscordResult (*distance)(struct IDiscordLobbySearchQuery* lobby_search_query, - enum EDiscordLobbySearchDistance distance); -}; - -typedef void* IDiscordApplicationEvents; - -struct IDiscordApplicationManager { - void (*validate_or_exit)(struct IDiscordApplicationManager* manager, - void* callback_data, - void (*callback)(void* callback_data, enum EDiscordResult result)); - void (*get_current_locale)(struct IDiscordApplicationManager* manager, DiscordLocale* locale); - void (*get_current_branch)(struct IDiscordApplicationManager* manager, DiscordBranch* branch); - void (*get_oauth2_token)(struct IDiscordApplicationManager* manager, - void* callback_data, - void (*callback)(void* callback_data, - enum EDiscordResult result, - struct DiscordOAuth2Token* oauth2_token)); - void (*get_ticket)(struct IDiscordApplicationManager* manager, - void* callback_data, - void (*callback)(void* callback_data, - enum EDiscordResult result, - const char* data)); -}; - -struct IDiscordUserEvents { - void (*on_current_user_update)(void* event_data); -}; - -struct IDiscordUserManager { - enum EDiscordResult (*get_current_user)(struct IDiscordUserManager* manager, - struct DiscordUser* current_user); - void (*get_user)(struct IDiscordUserManager* manager, - DiscordUserId user_id, - void* callback_data, - void (*callback)(void* callback_data, - enum EDiscordResult result, - struct DiscordUser* user)); - enum EDiscordResult (*get_current_user_premium_type)(struct IDiscordUserManager* manager, - enum EDiscordPremiumType* premium_type); - enum EDiscordResult (*current_user_has_flag)(struct IDiscordUserManager* manager, - enum EDiscordUserFlag flag, - bool* has_flag); -}; - -typedef void* IDiscordImageEvents; - -struct IDiscordImageManager { - void (*fetch)(struct IDiscordImageManager* manager, - struct DiscordImageHandle handle, - bool refresh, - void* callback_data, - void (*callback)(void* callback_data, - enum EDiscordResult result, - struct DiscordImageHandle handle_result)); - enum EDiscordResult (*get_dimensions)(struct IDiscordImageManager* manager, - struct DiscordImageHandle handle, - struct DiscordImageDimensions* dimensions); - enum EDiscordResult (*get_data)(struct IDiscordImageManager* manager, - struct DiscordImageHandle handle, - uint8_t* data, - uint32_t data_length); -}; - -struct IDiscordActivityEvents { - void (*on_activity_join)(void* event_data, const char* secret); - void (*on_activity_spectate)(void* event_data, const char* secret); - void (*on_activity_join_request)(void* event_data, struct DiscordUser* user); - void (*on_activity_invite)(void* event_data, - enum EDiscordActivityActionType type, - struct DiscordUser* user, - struct DiscordActivity* activity); -}; - -struct IDiscordActivityManager { - enum EDiscordResult (*register_command)(struct IDiscordActivityManager* manager, - const char* command); - enum EDiscordResult (*register_steam)(struct IDiscordActivityManager* manager, - uint32_t steam_id); - void (*update_activity)(struct IDiscordActivityManager* manager, - struct DiscordActivity* activity, - void* callback_data, - void (*callback)(void* callback_data, enum EDiscordResult result)); - void (*clear_activity)(struct IDiscordActivityManager* manager, - void* callback_data, - void (*callback)(void* callback_data, enum EDiscordResult result)); - void (*send_request_reply)(struct IDiscordActivityManager* manager, - DiscordUserId user_id, - enum EDiscordActivityJoinRequestReply reply, - void* callback_data, - void (*callback)(void* callback_data, enum EDiscordResult result)); - void (*send_invite)(struct IDiscordActivityManager* manager, - DiscordUserId user_id, - enum EDiscordActivityActionType type, - const char* content, - void* callback_data, - void (*callback)(void* callback_data, enum EDiscordResult result)); - void (*accept_invite)(struct IDiscordActivityManager* manager, - DiscordUserId user_id, - void* callback_data, - void (*callback)(void* callback_data, enum EDiscordResult result)); -}; - -struct IDiscordRelationshipEvents { - void (*on_refresh)(void* event_data); - void (*on_relationship_update)(void* event_data, struct DiscordRelationship* relationship); -}; - -struct IDiscordRelationshipManager { - void (*filter)(struct IDiscordRelationshipManager* manager, - void* filter_data, - bool (*filter)(void* filter_data, struct DiscordRelationship* relationship)); - enum EDiscordResult (*count)(struct IDiscordRelationshipManager* manager, int32_t* count); - enum EDiscordResult (*get)(struct IDiscordRelationshipManager* manager, - DiscordUserId user_id, - struct DiscordRelationship* relationship); - enum EDiscordResult (*get_at)(struct IDiscordRelationshipManager* manager, - uint32_t index, - struct DiscordRelationship* relationship); -}; - -struct IDiscordLobbyEvents { - void (*on_lobby_update)(void* event_data, int64_t lobby_id); - void (*on_lobby_delete)(void* event_data, int64_t lobby_id, uint32_t reason); - void (*on_member_connect)(void* event_data, int64_t lobby_id, int64_t user_id); - void (*on_member_update)(void* event_data, int64_t lobby_id, int64_t user_id); - void (*on_member_disconnect)(void* event_data, int64_t lobby_id, int64_t user_id); - void (*on_lobby_message)(void* event_data, - int64_t lobby_id, - int64_t user_id, - uint8_t* data, - uint32_t data_length); - void (*on_speaking)(void* event_data, int64_t lobby_id, int64_t user_id, bool speaking); - void (*on_network_message)(void* event_data, - int64_t lobby_id, - int64_t user_id, - uint8_t channel_id, - uint8_t* data, - uint32_t data_length); -}; - -struct IDiscordLobbyManager { - enum EDiscordResult (*get_lobby_create_transaction)( - struct IDiscordLobbyManager* manager, - struct IDiscordLobbyTransaction** transaction); - enum EDiscordResult (*get_lobby_update_transaction)( - struct IDiscordLobbyManager* manager, - DiscordLobbyId lobby_id, - struct IDiscordLobbyTransaction** transaction); - enum EDiscordResult (*get_member_update_transaction)( - struct IDiscordLobbyManager* manager, - DiscordLobbyId lobby_id, - DiscordUserId user_id, - struct IDiscordLobbyMemberTransaction** transaction); - void (*create_lobby)(struct IDiscordLobbyManager* manager, - struct IDiscordLobbyTransaction* transaction, - void* callback_data, - void (*callback)(void* callback_data, - enum EDiscordResult result, - struct DiscordLobby* lobby)); - void (*update_lobby)(struct IDiscordLobbyManager* manager, - DiscordLobbyId lobby_id, - struct IDiscordLobbyTransaction* transaction, - void* callback_data, - void (*callback)(void* callback_data, enum EDiscordResult result)); - void (*delete_lobby)(struct IDiscordLobbyManager* manager, - DiscordLobbyId lobby_id, - void* callback_data, - void (*callback)(void* callback_data, enum EDiscordResult result)); - void (*connect_lobby)(struct IDiscordLobbyManager* manager, - DiscordLobbyId lobby_id, - DiscordLobbySecret secret, - void* callback_data, - void (*callback)(void* callback_data, - enum EDiscordResult result, - struct DiscordLobby* lobby)); - void (*connect_lobby_with_activity_secret)(struct IDiscordLobbyManager* manager, - DiscordLobbySecret activity_secret, - void* callback_data, - void (*callback)(void* callback_data, - enum EDiscordResult result, - struct DiscordLobby* lobby)); - void (*disconnect_lobby)(struct IDiscordLobbyManager* manager, - DiscordLobbyId lobby_id, - void* callback_data, - void (*callback)(void* callback_data, enum EDiscordResult result)); - enum EDiscordResult (*get_lobby)(struct IDiscordLobbyManager* manager, - DiscordLobbyId lobby_id, - struct DiscordLobby* lobby); - enum EDiscordResult (*get_lobby_activity_secret)(struct IDiscordLobbyManager* manager, - DiscordLobbyId lobby_id, - DiscordLobbySecret* secret); - enum EDiscordResult (*get_lobby_metadata_value)(struct IDiscordLobbyManager* manager, - DiscordLobbyId lobby_id, - DiscordMetadataKey key, - DiscordMetadataValue* value); - enum EDiscordResult (*get_lobby_metadata_key)(struct IDiscordLobbyManager* manager, - DiscordLobbyId lobby_id, - int32_t index, - DiscordMetadataKey* key); - enum EDiscordResult (*lobby_metadata_count)(struct IDiscordLobbyManager* manager, - DiscordLobbyId lobby_id, - int32_t* count); - enum EDiscordResult (*member_count)(struct IDiscordLobbyManager* manager, - DiscordLobbyId lobby_id, - int32_t* count); - enum EDiscordResult (*get_member_user_id)(struct IDiscordLobbyManager* manager, - DiscordLobbyId lobby_id, - int32_t index, - DiscordUserId* user_id); - enum EDiscordResult (*get_member_user)(struct IDiscordLobbyManager* manager, - DiscordLobbyId lobby_id, - DiscordUserId user_id, - struct DiscordUser* user); - enum EDiscordResult (*get_member_metadata_value)(struct IDiscordLobbyManager* manager, - DiscordLobbyId lobby_id, - DiscordUserId user_id, - DiscordMetadataKey key, - DiscordMetadataValue* value); - enum EDiscordResult (*get_member_metadata_key)(struct IDiscordLobbyManager* manager, - DiscordLobbyId lobby_id, - DiscordUserId user_id, - int32_t index, - DiscordMetadataKey* key); - enum EDiscordResult (*member_metadata_count)(struct IDiscordLobbyManager* manager, - DiscordLobbyId lobby_id, - DiscordUserId user_id, - int32_t* count); - void (*update_member)(struct IDiscordLobbyManager* manager, - DiscordLobbyId lobby_id, - DiscordUserId user_id, - struct IDiscordLobbyMemberTransaction* transaction, - void* callback_data, - void (*callback)(void* callback_data, enum EDiscordResult result)); - void (*send_lobby_message)(struct IDiscordLobbyManager* manager, - DiscordLobbyId lobby_id, - uint8_t* data, - uint32_t data_length, - void* callback_data, - void (*callback)(void* callback_data, enum EDiscordResult result)); - enum EDiscordResult (*get_search_query)(struct IDiscordLobbyManager* manager, - struct IDiscordLobbySearchQuery** query); - void (*search)(struct IDiscordLobbyManager* manager, - struct IDiscordLobbySearchQuery* query, - void* callback_data, - void (*callback)(void* callback_data, enum EDiscordResult result)); - void (*lobby_count)(struct IDiscordLobbyManager* manager, int32_t* count); - enum EDiscordResult (*get_lobby_id)(struct IDiscordLobbyManager* manager, - int32_t index, - DiscordLobbyId* lobby_id); - void (*connect_voice)(struct IDiscordLobbyManager* manager, - DiscordLobbyId lobby_id, - void* callback_data, - void (*callback)(void* callback_data, enum EDiscordResult result)); - void (*disconnect_voice)(struct IDiscordLobbyManager* manager, - DiscordLobbyId lobby_id, - void* callback_data, - void (*callback)(void* callback_data, enum EDiscordResult result)); - enum EDiscordResult (*connect_network)(struct IDiscordLobbyManager* manager, - DiscordLobbyId lobby_id); - enum EDiscordResult (*disconnect_network)(struct IDiscordLobbyManager* manager, - DiscordLobbyId lobby_id); - enum EDiscordResult (*flush_network)(struct IDiscordLobbyManager* manager); - enum EDiscordResult (*open_network_channel)(struct IDiscordLobbyManager* manager, - DiscordLobbyId lobby_id, - uint8_t channel_id, - bool reliable); - enum EDiscordResult (*send_network_message)(struct IDiscordLobbyManager* manager, - DiscordLobbyId lobby_id, - DiscordUserId user_id, - uint8_t channel_id, - uint8_t* data, - uint32_t data_length); -}; - -struct IDiscordNetworkEvents { - void (*on_message)(void* event_data, - DiscordNetworkPeerId peer_id, - DiscordNetworkChannelId channel_id, - uint8_t* data, - uint32_t data_length); - void (*on_route_update)(void* event_data, const char* route_data); -}; - -struct IDiscordNetworkManager { - /** - * Get the local peer ID for this process. - */ - void (*get_peer_id)(struct IDiscordNetworkManager* manager, DiscordNetworkPeerId* peer_id); - /** - * Send pending network messages. - */ - enum EDiscordResult (*flush)(struct IDiscordNetworkManager* manager); - /** - * Open a connection to a remote peer. - */ - enum EDiscordResult (*open_peer)(struct IDiscordNetworkManager* manager, - DiscordNetworkPeerId peer_id, - const char* route_data); - /** - * Update the route data for a connected peer. - */ - enum EDiscordResult (*update_peer)(struct IDiscordNetworkManager* manager, - DiscordNetworkPeerId peer_id, - const char* route_data); - /** - * Close the connection to a remote peer. - */ - enum EDiscordResult (*close_peer)(struct IDiscordNetworkManager* manager, - DiscordNetworkPeerId peer_id); - /** - * Open a message channel to a connected peer. - */ - enum EDiscordResult (*open_channel)(struct IDiscordNetworkManager* manager, - DiscordNetworkPeerId peer_id, - DiscordNetworkChannelId channel_id, - bool reliable); - /** - * Close a message channel to a connected peer. - */ - enum EDiscordResult (*close_channel)(struct IDiscordNetworkManager* manager, - DiscordNetworkPeerId peer_id, - DiscordNetworkChannelId channel_id); - /** - * Send a message to a connected peer over an opened message channel. - */ - enum EDiscordResult (*send_message)(struct IDiscordNetworkManager* manager, - DiscordNetworkPeerId peer_id, - DiscordNetworkChannelId channel_id, - uint8_t* data, - uint32_t data_length); -}; - -struct IDiscordOverlayEvents { - void (*on_toggle)(void* event_data, bool locked); -}; - -struct IDiscordOverlayManager { - void (*is_enabled)(struct IDiscordOverlayManager* manager, bool* enabled); - void (*is_locked)(struct IDiscordOverlayManager* manager, bool* locked); - void (*set_locked)(struct IDiscordOverlayManager* manager, - bool locked, - void* callback_data, - void (*callback)(void* callback_data, enum EDiscordResult result)); - void (*open_activity_invite)(struct IDiscordOverlayManager* manager, - enum EDiscordActivityActionType type, - void* callback_data, - void (*callback)(void* callback_data, enum EDiscordResult result)); - void (*open_guild_invite)(struct IDiscordOverlayManager* manager, - const char* code, - void* callback_data, - void (*callback)(void* callback_data, enum EDiscordResult result)); - void (*open_voice_settings)(struct IDiscordOverlayManager* manager, - void* callback_data, - void (*callback)(void* callback_data, enum EDiscordResult result)); -}; - -typedef void* IDiscordStorageEvents; - -struct IDiscordStorageManager { - enum EDiscordResult (*read)(struct IDiscordStorageManager* manager, - const char* name, - uint8_t* data, - uint32_t data_length, - uint32_t* read); - void (*read_async)(struct IDiscordStorageManager* manager, - const char* name, - void* callback_data, - void (*callback)(void* callback_data, - enum EDiscordResult result, - uint8_t* data, - uint32_t data_length)); - void (*read_async_partial)(struct IDiscordStorageManager* manager, - const char* name, - uint64_t offset, - uint64_t length, - void* callback_data, - void (*callback)(void* callback_data, - enum EDiscordResult result, - uint8_t* data, - uint32_t data_length)); - enum EDiscordResult (*write)(struct IDiscordStorageManager* manager, - const char* name, - uint8_t* data, - uint32_t data_length); - void (*write_async)(struct IDiscordStorageManager* manager, - const char* name, - uint8_t* data, - uint32_t data_length, - void* callback_data, - void (*callback)(void* callback_data, enum EDiscordResult result)); - enum EDiscordResult (*delete_)(struct IDiscordStorageManager* manager, const char* name); - enum EDiscordResult (*exists)(struct IDiscordStorageManager* manager, - const char* name, - bool* exists); - void (*count)(struct IDiscordStorageManager* manager, int32_t* count); - enum EDiscordResult (*stat)(struct IDiscordStorageManager* manager, - const char* name, - struct DiscordFileStat* stat); - enum EDiscordResult (*stat_at)(struct IDiscordStorageManager* manager, - int32_t index, - struct DiscordFileStat* stat); - enum EDiscordResult (*get_path)(struct IDiscordStorageManager* manager, DiscordPath* path); -}; - -struct IDiscordStoreEvents { - void (*on_entitlement_create)(void* event_data, struct DiscordEntitlement* entitlement); - void (*on_entitlement_delete)(void* event_data, struct DiscordEntitlement* entitlement); -}; - -struct IDiscordStoreManager { - void (*fetch_skus)(struct IDiscordStoreManager* manager, - void* callback_data, - void (*callback)(void* callback_data, enum EDiscordResult result)); - void (*count_skus)(struct IDiscordStoreManager* manager, int32_t* count); - enum EDiscordResult (*get_sku)(struct IDiscordStoreManager* manager, - DiscordSnowflake sku_id, - struct DiscordSku* sku); - enum EDiscordResult (*get_sku_at)(struct IDiscordStoreManager* manager, - int32_t index, - struct DiscordSku* sku); - void (*fetch_entitlements)(struct IDiscordStoreManager* manager, - void* callback_data, - void (*callback)(void* callback_data, enum EDiscordResult result)); - void (*count_entitlements)(struct IDiscordStoreManager* manager, int32_t* count); - enum EDiscordResult (*get_entitlement)(struct IDiscordStoreManager* manager, - DiscordSnowflake entitlement_id, - struct DiscordEntitlement* entitlement); - enum EDiscordResult (*get_entitlement_at)(struct IDiscordStoreManager* manager, - int32_t index, - struct DiscordEntitlement* entitlement); - enum EDiscordResult (*has_sku_entitlement)(struct IDiscordStoreManager* manager, - DiscordSnowflake sku_id, - bool* has_entitlement); - void (*start_purchase)(struct IDiscordStoreManager* manager, - DiscordSnowflake sku_id, - void* callback_data, - void (*callback)(void* callback_data, enum EDiscordResult result)); -}; - -struct IDiscordVoiceEvents { - void (*on_settings_update)(void* event_data); -}; - -struct IDiscordVoiceManager { - enum EDiscordResult (*get_input_mode)(struct IDiscordVoiceManager* manager, - struct DiscordInputMode* input_mode); - void (*set_input_mode)(struct IDiscordVoiceManager* manager, - struct DiscordInputMode input_mode, - void* callback_data, - void (*callback)(void* callback_data, enum EDiscordResult result)); - enum EDiscordResult (*is_self_mute)(struct IDiscordVoiceManager* manager, bool* mute); - enum EDiscordResult (*set_self_mute)(struct IDiscordVoiceManager* manager, bool mute); - enum EDiscordResult (*is_self_deaf)(struct IDiscordVoiceManager* manager, bool* deaf); - enum EDiscordResult (*set_self_deaf)(struct IDiscordVoiceManager* manager, bool deaf); - enum EDiscordResult (*is_local_mute)(struct IDiscordVoiceManager* manager, - DiscordSnowflake user_id, - bool* mute); - enum EDiscordResult (*set_local_mute)(struct IDiscordVoiceManager* manager, - DiscordSnowflake user_id, - bool mute); - enum EDiscordResult (*get_local_volume)(struct IDiscordVoiceManager* manager, - DiscordSnowflake user_id, - uint8_t* volume); - enum EDiscordResult (*set_local_volume)(struct IDiscordVoiceManager* manager, - DiscordSnowflake user_id, - uint8_t volume); -}; - -struct IDiscordAchievementEvents { - void (*on_user_achievement_update)(void* event_data, - struct DiscordUserAchievement* user_achievement); -}; - -struct IDiscordAchievementManager { - void (*set_user_achievement)(struct IDiscordAchievementManager* manager, - DiscordSnowflake achievement_id, - uint8_t percent_complete, - void* callback_data, - void (*callback)(void* callback_data, enum EDiscordResult result)); - void (*fetch_user_achievements)(struct IDiscordAchievementManager* manager, - void* callback_data, - void (*callback)(void* callback_data, - enum EDiscordResult result)); - void (*count_user_achievements)(struct IDiscordAchievementManager* manager, int32_t* count); - enum EDiscordResult (*get_user_achievement)(struct IDiscordAchievementManager* manager, - DiscordSnowflake user_achievement_id, - struct DiscordUserAchievement* user_achievement); - enum EDiscordResult (*get_user_achievement_at)(struct IDiscordAchievementManager* manager, - int32_t index, - struct DiscordUserAchievement* user_achievement); -}; - -typedef void* IDiscordCoreEvents; - -struct IDiscordCore { - void (*destroy)(struct IDiscordCore* core); - enum EDiscordResult (*run_callbacks)(struct IDiscordCore* core); - void (*set_log_hook)(struct IDiscordCore* core, - enum EDiscordLogLevel min_level, - void* hook_data, - void (*hook)(void* hook_data, - enum EDiscordLogLevel level, - const char* message)); - struct IDiscordApplicationManager* (*get_application_manager)(struct IDiscordCore* core); - struct IDiscordUserManager* (*get_user_manager)(struct IDiscordCore* core); - struct IDiscordImageManager* (*get_image_manager)(struct IDiscordCore* core); - struct IDiscordActivityManager* (*get_activity_manager)(struct IDiscordCore* core); - struct IDiscordRelationshipManager* (*get_relationship_manager)(struct IDiscordCore* core); - struct IDiscordLobbyManager* (*get_lobby_manager)(struct IDiscordCore* core); - struct IDiscordNetworkManager* (*get_network_manager)(struct IDiscordCore* core); - struct IDiscordOverlayManager* (*get_overlay_manager)(struct IDiscordCore* core); - struct IDiscordStorageManager* (*get_storage_manager)(struct IDiscordCore* core); - struct IDiscordStoreManager* (*get_store_manager)(struct IDiscordCore* core); - struct IDiscordVoiceManager* (*get_voice_manager)(struct IDiscordCore* core); - struct IDiscordAchievementManager* (*get_achievement_manager)(struct IDiscordCore* core); -}; - -struct DiscordCreateParams { - DiscordClientId client_id; - uint64_t flags; - IDiscordCoreEvents* events; - void* event_data; - IDiscordApplicationEvents* application_events; - DiscordVersion application_version; - struct IDiscordUserEvents* user_events; - DiscordVersion user_version; - IDiscordImageEvents* image_events; - DiscordVersion image_version; - struct IDiscordActivityEvents* activity_events; - DiscordVersion activity_version; - struct IDiscordRelationshipEvents* relationship_events; - DiscordVersion relationship_version; - struct IDiscordLobbyEvents* lobby_events; - DiscordVersion lobby_version; - struct IDiscordNetworkEvents* network_events; - DiscordVersion network_version; - struct IDiscordOverlayEvents* overlay_events; - DiscordVersion overlay_version; - IDiscordStorageEvents* storage_events; - DiscordVersion storage_version; - struct IDiscordStoreEvents* store_events; - DiscordVersion store_version; - struct IDiscordVoiceEvents* voice_events; - DiscordVersion voice_version; - struct IDiscordAchievementEvents* achievement_events; - DiscordVersion achievement_version; -}; - -#ifdef __cplusplus -inline -#else -static -#endif - void - DiscordCreateParamsSetDefault(struct DiscordCreateParams* params) -{ - memset(params, 0, sizeof(struct DiscordCreateParams)); - params->application_version = DISCORD_APPLICATION_MANAGER_VERSION; - params->user_version = DISCORD_USER_MANAGER_VERSION; - params->image_version = DISCORD_IMAGE_MANAGER_VERSION; - params->activity_version = DISCORD_ACTIVITY_MANAGER_VERSION; - params->relationship_version = DISCORD_RELATIONSHIP_MANAGER_VERSION; - params->lobby_version = DISCORD_LOBBY_MANAGER_VERSION; - params->network_version = DISCORD_NETWORK_MANAGER_VERSION; - params->overlay_version = DISCORD_OVERLAY_MANAGER_VERSION; - params->storage_version = DISCORD_STORAGE_MANAGER_VERSION; - params->store_version = DISCORD_STORE_MANAGER_VERSION; - params->voice_version = DISCORD_VOICE_MANAGER_VERSION; - params->achievement_version = DISCORD_ACHIEVEMENT_MANAGER_VERSION; -} - -enum EDiscordResult DiscordCreate(DiscordVersion version, - struct DiscordCreateParams* params, - struct IDiscordCore** result); - -#ifdef __cplusplus -} -#endif - -#endif \ No newline at end of file diff --git a/depend/discord/image_manager.cpp b/depend/discord/image_manager.cpp deleted file mode 100644 index 03b1db4..0000000 --- a/depend/discord/image_manager.cpp +++ /dev/null @@ -1,57 +0,0 @@ -#if !defined(_CRT_SECURE_NO_WARNINGS) -#define _CRT_SECURE_NO_WARNINGS -#endif - -#include "image_manager.h" - -#include "core.h" - -#include -#include - -namespace discord { - -void ImageManager::Fetch(ImageHandle handle, - bool refresh, - std::function callback) -{ - static auto wrapper = - [](void* callbackData, EDiscordResult result, DiscordImageHandle handleResult) -> void { - std::unique_ptr> cb( - reinterpret_cast*>(callbackData)); - if (!cb || !(*cb)) { - return; - } - (*cb)(static_cast(result), *reinterpret_cast(&handleResult)); - }; - std::unique_ptr> cb{}; - cb.reset(new std::function(std::move(callback))); - internal_->fetch(internal_, - *reinterpret_cast(&handle), - (refresh ? 1 : 0), - cb.release(), - wrapper); -} - -Result ImageManager::GetDimensions(ImageHandle handle, ImageDimensions* dimensions) -{ - if (!dimensions) { - return Result::InternalError; - } - - auto result = internal_->get_dimensions(internal_, - *reinterpret_cast(&handle), - reinterpret_cast(dimensions)); - return static_cast(result); -} - -Result ImageManager::GetData(ImageHandle handle, std::uint8_t* data, std::uint32_t dataLength) -{ - auto result = internal_->get_data(internal_, - *reinterpret_cast(&handle), - reinterpret_cast(data), - dataLength); - return static_cast(result); -} - -} // namespace discord diff --git a/depend/discord/image_manager.h b/depend/discord/image_manager.h deleted file mode 100644 index b096b17..0000000 --- a/depend/discord/image_manager.h +++ /dev/null @@ -1,28 +0,0 @@ -#pragma once - -#include "types.h" - -namespace discord { - -class ImageManager final { -public: - ~ImageManager() = default; - - void Fetch(ImageHandle handle, bool refresh, std::function callback); - Result GetDimensions(ImageHandle handle, ImageDimensions* dimensions); - Result GetData(ImageHandle handle, std::uint8_t* data, std::uint32_t dataLength); - -private: - friend class Core; - - ImageManager() = default; - ImageManager(ImageManager const& rhs) = delete; - ImageManager& operator=(ImageManager const& rhs) = delete; - ImageManager(ImageManager&& rhs) = delete; - ImageManager& operator=(ImageManager&& rhs) = delete; - - IDiscordImageManager* internal_; - static IDiscordImageEvents events_; -}; - -} // namespace discord diff --git a/depend/discord/lobby_manager.cpp b/depend/discord/lobby_manager.cpp deleted file mode 100644 index 6bf1a1a..0000000 --- a/depend/discord/lobby_manager.cpp +++ /dev/null @@ -1,547 +0,0 @@ -#if !defined(_CRT_SECURE_NO_WARNINGS) -#define _CRT_SECURE_NO_WARNINGS -#endif - -#include "lobby_manager.h" - -#include "core.h" - -#include -#include - -namespace discord { - -class LobbyEvents final { -public: - static void OnLobbyUpdate(void* callbackData, int64_t lobbyId) - { - auto* core = reinterpret_cast(callbackData); - if (!core) { - return; - } - - auto& module = core->LobbyManager(); - module.OnLobbyUpdate(lobbyId); - } - - static void OnLobbyDelete(void* callbackData, int64_t lobbyId, uint32_t reason) - { - auto* core = reinterpret_cast(callbackData); - if (!core) { - return; - } - - auto& module = core->LobbyManager(); - module.OnLobbyDelete(lobbyId, reason); - } - - static void OnMemberConnect(void* callbackData, int64_t lobbyId, int64_t userId) - { - auto* core = reinterpret_cast(callbackData); - if (!core) { - return; - } - - auto& module = core->LobbyManager(); - module.OnMemberConnect(lobbyId, userId); - } - - static void OnMemberUpdate(void* callbackData, int64_t lobbyId, int64_t userId) - { - auto* core = reinterpret_cast(callbackData); - if (!core) { - return; - } - - auto& module = core->LobbyManager(); - module.OnMemberUpdate(lobbyId, userId); - } - - static void OnMemberDisconnect(void* callbackData, int64_t lobbyId, int64_t userId) - { - auto* core = reinterpret_cast(callbackData); - if (!core) { - return; - } - - auto& module = core->LobbyManager(); - module.OnMemberDisconnect(lobbyId, userId); - } - - static void OnLobbyMessage(void* callbackData, - int64_t lobbyId, - int64_t userId, - uint8_t* data, - uint32_t dataLength) - { - auto* core = reinterpret_cast(callbackData); - if (!core) { - return; - } - - auto& module = core->LobbyManager(); - module.OnLobbyMessage(lobbyId, userId, data, dataLength); - } - - static void OnSpeaking(void* callbackData, int64_t lobbyId, int64_t userId, bool speaking) - { - auto* core = reinterpret_cast(callbackData); - if (!core) { - return; - } - - auto& module = core->LobbyManager(); - module.OnSpeaking(lobbyId, userId, (speaking != 0)); - } - - static void OnNetworkMessage(void* callbackData, - int64_t lobbyId, - int64_t userId, - uint8_t channelId, - uint8_t* data, - uint32_t dataLength) - { - auto* core = reinterpret_cast(callbackData); - if (!core) { - return; - } - - auto& module = core->LobbyManager(); - module.OnNetworkMessage(lobbyId, userId, channelId, data, dataLength); - } -}; - -IDiscordLobbyEvents LobbyManager::events_{ - &LobbyEvents::OnLobbyUpdate, - &LobbyEvents::OnLobbyDelete, - &LobbyEvents::OnMemberConnect, - &LobbyEvents::OnMemberUpdate, - &LobbyEvents::OnMemberDisconnect, - &LobbyEvents::OnLobbyMessage, - &LobbyEvents::OnSpeaking, - &LobbyEvents::OnNetworkMessage, -}; - -Result LobbyManager::GetLobbyCreateTransaction(LobbyTransaction* transaction) -{ - if (!transaction) { - return Result::InternalError; - } - - auto result = internal_->get_lobby_create_transaction(internal_, transaction->Receive()); - return static_cast(result); -} - -Result LobbyManager::GetLobbyUpdateTransaction(LobbyId lobbyId, LobbyTransaction* transaction) -{ - if (!transaction) { - return Result::InternalError; - } - - auto result = - internal_->get_lobby_update_transaction(internal_, lobbyId, transaction->Receive()); - return static_cast(result); -} - -Result LobbyManager::GetMemberUpdateTransaction(LobbyId lobbyId, - UserId userId, - LobbyMemberTransaction* transaction) -{ - if (!transaction) { - return Result::InternalError; - } - - auto result = - internal_->get_member_update_transaction(internal_, lobbyId, userId, transaction->Receive()); - return static_cast(result); -} - -void LobbyManager::CreateLobby(LobbyTransaction const& transaction, - std::function callback) -{ - static auto wrapper = - [](void* callbackData, EDiscordResult result, DiscordLobby* lobby) -> void { - std::unique_ptr> cb( - reinterpret_cast*>(callbackData)); - if (!cb || !(*cb)) { - return; - } - (*cb)(static_cast(result), *reinterpret_cast(lobby)); - }; - std::unique_ptr> cb{}; - cb.reset(new std::function(std::move(callback))); - internal_->create_lobby( - internal_, const_cast(transaction).Internal(), cb.release(), wrapper); -} - -void LobbyManager::UpdateLobby(LobbyId lobbyId, - LobbyTransaction const& transaction, - std::function callback) -{ - static auto wrapper = [](void* callbackData, EDiscordResult result) -> void { - std::unique_ptr> cb( - reinterpret_cast*>(callbackData)); - if (!cb || !(*cb)) { - return; - } - (*cb)(static_cast(result)); - }; - std::unique_ptr> cb{}; - cb.reset(new std::function(std::move(callback))); - internal_->update_lobby(internal_, - lobbyId, - const_cast(transaction).Internal(), - cb.release(), - wrapper); -} - -void LobbyManager::DeleteLobby(LobbyId lobbyId, std::function callback) -{ - static auto wrapper = [](void* callbackData, EDiscordResult result) -> void { - std::unique_ptr> cb( - reinterpret_cast*>(callbackData)); - if (!cb || !(*cb)) { - return; - } - (*cb)(static_cast(result)); - }; - std::unique_ptr> cb{}; - cb.reset(new std::function(std::move(callback))); - internal_->delete_lobby(internal_, lobbyId, cb.release(), wrapper); -} - -void LobbyManager::ConnectLobby(LobbyId lobbyId, - LobbySecret secret, - std::function callback) -{ - static auto wrapper = - [](void* callbackData, EDiscordResult result, DiscordLobby* lobby) -> void { - std::unique_ptr> cb( - reinterpret_cast*>(callbackData)); - if (!cb || !(*cb)) { - return; - } - (*cb)(static_cast(result), *reinterpret_cast(lobby)); - }; - std::unique_ptr> cb{}; - cb.reset(new std::function(std::move(callback))); - internal_->connect_lobby(internal_, lobbyId, const_cast(secret), cb.release(), wrapper); -} - -void LobbyManager::ConnectLobbyWithActivitySecret( - LobbySecret activitySecret, - std::function callback) -{ - static auto wrapper = - [](void* callbackData, EDiscordResult result, DiscordLobby* lobby) -> void { - std::unique_ptr> cb( - reinterpret_cast*>(callbackData)); - if (!cb || !(*cb)) { - return; - } - (*cb)(static_cast(result), *reinterpret_cast(lobby)); - }; - std::unique_ptr> cb{}; - cb.reset(new std::function(std::move(callback))); - internal_->connect_lobby_with_activity_secret( - internal_, const_cast(activitySecret), cb.release(), wrapper); -} - -void LobbyManager::DisconnectLobby(LobbyId lobbyId, std::function callback) -{ - static auto wrapper = [](void* callbackData, EDiscordResult result) -> void { - std::unique_ptr> cb( - reinterpret_cast*>(callbackData)); - if (!cb || !(*cb)) { - return; - } - (*cb)(static_cast(result)); - }; - std::unique_ptr> cb{}; - cb.reset(new std::function(std::move(callback))); - internal_->disconnect_lobby(internal_, lobbyId, cb.release(), wrapper); -} - -Result LobbyManager::GetLobby(LobbyId lobbyId, Lobby* lobby) -{ - if (!lobby) { - return Result::InternalError; - } - - auto result = internal_->get_lobby(internal_, lobbyId, reinterpret_cast(lobby)); - return static_cast(result); -} - -Result LobbyManager::GetLobbyActivitySecret(LobbyId lobbyId, char secret[128]) -{ - if (!secret) { - return Result::InternalError; - } - - auto result = internal_->get_lobby_activity_secret( - internal_, lobbyId, reinterpret_cast(secret)); - return static_cast(result); -} - -Result LobbyManager::GetLobbyMetadataValue(LobbyId lobbyId, MetadataKey key, char value[4096]) -{ - if (!value) { - return Result::InternalError; - } - - auto result = internal_->get_lobby_metadata_value( - internal_, lobbyId, const_cast(key), reinterpret_cast(value)); - return static_cast(result); -} - -Result LobbyManager::GetLobbyMetadataKey(LobbyId lobbyId, std::int32_t index, char key[256]) -{ - if (!key) { - return Result::InternalError; - } - - auto result = internal_->get_lobby_metadata_key( - internal_, lobbyId, index, reinterpret_cast(key)); - return static_cast(result); -} - -Result LobbyManager::LobbyMetadataCount(LobbyId lobbyId, std::int32_t* count) -{ - if (!count) { - return Result::InternalError; - } - - auto result = - internal_->lobby_metadata_count(internal_, lobbyId, reinterpret_cast(count)); - return static_cast(result); -} - -Result LobbyManager::MemberCount(LobbyId lobbyId, std::int32_t* count) -{ - if (!count) { - return Result::InternalError; - } - - auto result = internal_->member_count(internal_, lobbyId, reinterpret_cast(count)); - return static_cast(result); -} - -Result LobbyManager::GetMemberUserId(LobbyId lobbyId, std::int32_t index, UserId* userId) -{ - if (!userId) { - return Result::InternalError; - } - - auto result = - internal_->get_member_user_id(internal_, lobbyId, index, reinterpret_cast(userId)); - return static_cast(result); -} - -Result LobbyManager::GetMemberUser(LobbyId lobbyId, UserId userId, User* user) -{ - if (!user) { - return Result::InternalError; - } - - auto result = - internal_->get_member_user(internal_, lobbyId, userId, reinterpret_cast(user)); - return static_cast(result); -} - -Result LobbyManager::GetMemberMetadataValue(LobbyId lobbyId, - UserId userId, - MetadataKey key, - char value[4096]) -{ - if (!value) { - return Result::InternalError; - } - - auto result = - internal_->get_member_metadata_value(internal_, - lobbyId, - userId, - const_cast(key), - reinterpret_cast(value)); - return static_cast(result); -} - -Result LobbyManager::GetMemberMetadataKey(LobbyId lobbyId, - UserId userId, - std::int32_t index, - char key[256]) -{ - if (!key) { - return Result::InternalError; - } - - auto result = internal_->get_member_metadata_key( - internal_, lobbyId, userId, index, reinterpret_cast(key)); - return static_cast(result); -} - -Result LobbyManager::MemberMetadataCount(LobbyId lobbyId, UserId userId, std::int32_t* count) -{ - if (!count) { - return Result::InternalError; - } - - auto result = internal_->member_metadata_count( - internal_, lobbyId, userId, reinterpret_cast(count)); - return static_cast(result); -} - -void LobbyManager::UpdateMember(LobbyId lobbyId, - UserId userId, - LobbyMemberTransaction const& transaction, - std::function callback) -{ - static auto wrapper = [](void* callbackData, EDiscordResult result) -> void { - std::unique_ptr> cb( - reinterpret_cast*>(callbackData)); - if (!cb || !(*cb)) { - return; - } - (*cb)(static_cast(result)); - }; - std::unique_ptr> cb{}; - cb.reset(new std::function(std::move(callback))); - internal_->update_member(internal_, - lobbyId, - userId, - const_cast(transaction).Internal(), - cb.release(), - wrapper); -} - -void LobbyManager::SendLobbyMessage(LobbyId lobbyId, - std::uint8_t* data, - std::uint32_t dataLength, - std::function callback) -{ - static auto wrapper = [](void* callbackData, EDiscordResult result) -> void { - std::unique_ptr> cb( - reinterpret_cast*>(callbackData)); - if (!cb || !(*cb)) { - return; - } - (*cb)(static_cast(result)); - }; - std::unique_ptr> cb{}; - cb.reset(new std::function(std::move(callback))); - internal_->send_lobby_message( - internal_, lobbyId, reinterpret_cast(data), dataLength, cb.release(), wrapper); -} - -Result LobbyManager::GetSearchQuery(LobbySearchQuery* query) -{ - if (!query) { - return Result::InternalError; - } - - auto result = internal_->get_search_query(internal_, query->Receive()); - return static_cast(result); -} - -void LobbyManager::Search(LobbySearchQuery const& query, std::function callback) -{ - static auto wrapper = [](void* callbackData, EDiscordResult result) -> void { - std::unique_ptr> cb( - reinterpret_cast*>(callbackData)); - if (!cb || !(*cb)) { - return; - } - (*cb)(static_cast(result)); - }; - std::unique_ptr> cb{}; - cb.reset(new std::function(std::move(callback))); - internal_->search( - internal_, const_cast(query).Internal(), cb.release(), wrapper); -} - -void LobbyManager::LobbyCount(std::int32_t* count) -{ - if (!count) { - return; - } - - internal_->lobby_count(internal_, reinterpret_cast(count)); -} - -Result LobbyManager::GetLobbyId(std::int32_t index, LobbyId* lobbyId) -{ - if (!lobbyId) { - return Result::InternalError; - } - - auto result = internal_->get_lobby_id(internal_, index, reinterpret_cast(lobbyId)); - return static_cast(result); -} - -void LobbyManager::ConnectVoice(LobbyId lobbyId, std::function callback) -{ - static auto wrapper = [](void* callbackData, EDiscordResult result) -> void { - std::unique_ptr> cb( - reinterpret_cast*>(callbackData)); - if (!cb || !(*cb)) { - return; - } - (*cb)(static_cast(result)); - }; - std::unique_ptr> cb{}; - cb.reset(new std::function(std::move(callback))); - internal_->connect_voice(internal_, lobbyId, cb.release(), wrapper); -} - -void LobbyManager::DisconnectVoice(LobbyId lobbyId, std::function callback) -{ - static auto wrapper = [](void* callbackData, EDiscordResult result) -> void { - std::unique_ptr> cb( - reinterpret_cast*>(callbackData)); - if (!cb || !(*cb)) { - return; - } - (*cb)(static_cast(result)); - }; - std::unique_ptr> cb{}; - cb.reset(new std::function(std::move(callback))); - internal_->disconnect_voice(internal_, lobbyId, cb.release(), wrapper); -} - -Result LobbyManager::ConnectNetwork(LobbyId lobbyId) -{ - auto result = internal_->connect_network(internal_, lobbyId); - return static_cast(result); -} - -Result LobbyManager::DisconnectNetwork(LobbyId lobbyId) -{ - auto result = internal_->disconnect_network(internal_, lobbyId); - return static_cast(result); -} - -Result LobbyManager::FlushNetwork() -{ - auto result = internal_->flush_network(internal_); - return static_cast(result); -} - -Result LobbyManager::OpenNetworkChannel(LobbyId lobbyId, std::uint8_t channelId, bool reliable) -{ - auto result = - internal_->open_network_channel(internal_, lobbyId, channelId, (reliable ? 1 : 0)); - return static_cast(result); -} - -Result LobbyManager::SendNetworkMessage(LobbyId lobbyId, - UserId userId, - std::uint8_t channelId, - std::uint8_t* data, - std::uint32_t dataLength) -{ - auto result = internal_->send_network_message( - internal_, lobbyId, userId, channelId, reinterpret_cast(data), dataLength); - return static_cast(result); -} - -} // namespace discord diff --git a/depend/discord/lobby_manager.h b/depend/discord/lobby_manager.h deleted file mode 100644 index 96380cb..0000000 --- a/depend/discord/lobby_manager.h +++ /dev/null @@ -1,88 +0,0 @@ -#pragma once - -#include "types.h" - -namespace discord { - -class LobbyManager final { -public: - ~LobbyManager() = default; - - Result GetLobbyCreateTransaction(LobbyTransaction* transaction); - Result GetLobbyUpdateTransaction(LobbyId lobbyId, LobbyTransaction* transaction); - Result GetMemberUpdateTransaction(LobbyId lobbyId, - UserId userId, - LobbyMemberTransaction* transaction); - void CreateLobby(LobbyTransaction const& transaction, - std::function callback); - void UpdateLobby(LobbyId lobbyId, - LobbyTransaction const& transaction, - std::function callback); - void DeleteLobby(LobbyId lobbyId, std::function callback); - void ConnectLobby(LobbyId lobbyId, - LobbySecret secret, - std::function callback); - void ConnectLobbyWithActivitySecret(LobbySecret activitySecret, - std::function callback); - void DisconnectLobby(LobbyId lobbyId, std::function callback); - Result GetLobby(LobbyId lobbyId, Lobby* lobby); - Result GetLobbyActivitySecret(LobbyId lobbyId, char secret[128]); - Result GetLobbyMetadataValue(LobbyId lobbyId, MetadataKey key, char value[4096]); - Result GetLobbyMetadataKey(LobbyId lobbyId, std::int32_t index, char key[256]); - Result LobbyMetadataCount(LobbyId lobbyId, std::int32_t* count); - Result MemberCount(LobbyId lobbyId, std::int32_t* count); - Result GetMemberUserId(LobbyId lobbyId, std::int32_t index, UserId* userId); - Result GetMemberUser(LobbyId lobbyId, UserId userId, User* user); - Result GetMemberMetadataValue(LobbyId lobbyId, - UserId userId, - MetadataKey key, - char value[4096]); - Result GetMemberMetadataKey(LobbyId lobbyId, UserId userId, std::int32_t index, char key[256]); - Result MemberMetadataCount(LobbyId lobbyId, UserId userId, std::int32_t* count); - void UpdateMember(LobbyId lobbyId, - UserId userId, - LobbyMemberTransaction const& transaction, - std::function callback); - void SendLobbyMessage(LobbyId lobbyId, - std::uint8_t* data, - std::uint32_t dataLength, - std::function callback); - Result GetSearchQuery(LobbySearchQuery* query); - void Search(LobbySearchQuery const& query, std::function callback); - void LobbyCount(std::int32_t* count); - Result GetLobbyId(std::int32_t index, LobbyId* lobbyId); - void ConnectVoice(LobbyId lobbyId, std::function callback); - void DisconnectVoice(LobbyId lobbyId, std::function callback); - Result ConnectNetwork(LobbyId lobbyId); - Result DisconnectNetwork(LobbyId lobbyId); - Result FlushNetwork(); - Result OpenNetworkChannel(LobbyId lobbyId, std::uint8_t channelId, bool reliable); - Result SendNetworkMessage(LobbyId lobbyId, - UserId userId, - std::uint8_t channelId, - std::uint8_t* data, - std::uint32_t dataLength); - - Event OnLobbyUpdate; - Event OnLobbyDelete; - Event OnMemberConnect; - Event OnMemberUpdate; - Event OnMemberDisconnect; - Event OnLobbyMessage; - Event OnSpeaking; - Event OnNetworkMessage; - -private: - friend class Core; - - LobbyManager() = default; - LobbyManager(LobbyManager const& rhs) = delete; - LobbyManager& operator=(LobbyManager const& rhs) = delete; - LobbyManager(LobbyManager&& rhs) = delete; - LobbyManager& operator=(LobbyManager&& rhs) = delete; - - IDiscordLobbyManager* internal_; - static IDiscordLobbyEvents events_; -}; - -} // namespace discord diff --git a/depend/discord/network_manager.cpp b/depend/discord/network_manager.cpp deleted file mode 100644 index 97c219e..0000000 --- a/depend/discord/network_manager.cpp +++ /dev/null @@ -1,103 +0,0 @@ -#if !defined(_CRT_SECURE_NO_WARNINGS) -#define _CRT_SECURE_NO_WARNINGS -#endif - -#include "network_manager.h" - -#include "core.h" - -#include -#include - -namespace discord { - -class NetworkEvents final { -public: - static void OnMessage(void* callbackData, - DiscordNetworkPeerId peerId, - DiscordNetworkChannelId channelId, - uint8_t* data, - uint32_t dataLength) - { - auto* core = reinterpret_cast(callbackData); - if (!core) { - return; - } - - auto& module = core->NetworkManager(); - module.OnMessage(peerId, channelId, data, dataLength); - } - - static void OnRouteUpdate(void* callbackData, char const* routeData) - { - auto* core = reinterpret_cast(callbackData); - if (!core) { - return; - } - - auto& module = core->NetworkManager(); - module.OnRouteUpdate(static_cast(routeData)); - } -}; - -IDiscordNetworkEvents NetworkManager::events_{ - &NetworkEvents::OnMessage, - &NetworkEvents::OnRouteUpdate, -}; - -void NetworkManager::GetPeerId(NetworkPeerId* peerId) -{ - if (!peerId) { - return; - } - - internal_->get_peer_id(internal_, reinterpret_cast(peerId)); -} - -Result NetworkManager::Flush() -{ - auto result = internal_->flush(internal_); - return static_cast(result); -} - -Result NetworkManager::OpenPeer(NetworkPeerId peerId, char const* routeData) -{ - auto result = internal_->open_peer(internal_, peerId, const_cast(routeData)); - return static_cast(result); -} - -Result NetworkManager::UpdatePeer(NetworkPeerId peerId, char const* routeData) -{ - auto result = internal_->update_peer(internal_, peerId, const_cast(routeData)); - return static_cast(result); -} - -Result NetworkManager::ClosePeer(NetworkPeerId peerId) -{ - auto result = internal_->close_peer(internal_, peerId); - return static_cast(result); -} - -Result NetworkManager::OpenChannel(NetworkPeerId peerId, NetworkChannelId channelId, bool reliable) -{ - auto result = internal_->open_channel(internal_, peerId, channelId, (reliable ? 1 : 0)); - return static_cast(result); -} - -Result NetworkManager::CloseChannel(NetworkPeerId peerId, NetworkChannelId channelId) -{ - auto result = internal_->close_channel(internal_, peerId, channelId); - return static_cast(result); -} - -Result NetworkManager::SendMessage(NetworkPeerId peerId, - NetworkChannelId channelId, - std::uint8_t* data, - std::uint32_t dataLength) -{ - auto result = internal_->send_message( - internal_, peerId, channelId, reinterpret_cast(data), dataLength); - return static_cast(result); -} - -} // namespace discord diff --git a/depend/discord/network_manager.h b/depend/discord/network_manager.h deleted file mode 100644 index e374670..0000000 --- a/depend/discord/network_manager.h +++ /dev/null @@ -1,63 +0,0 @@ -#pragma once - -#include "types.h" - -namespace discord { - -class NetworkManager final { -public: - ~NetworkManager() = default; - - /** - * Get the local peer ID for this process. - */ - void GetPeerId(NetworkPeerId* peerId); - /** - * Send pending network messages. - */ - Result Flush(); - /** - * Open a connection to a remote peer. - */ - Result OpenPeer(NetworkPeerId peerId, char const* routeData); - /** - * Update the route data for a connected peer. - */ - Result UpdatePeer(NetworkPeerId peerId, char const* routeData); - /** - * Close the connection to a remote peer. - */ - Result ClosePeer(NetworkPeerId peerId); - /** - * Open a message channel to a connected peer. - */ - Result OpenChannel(NetworkPeerId peerId, NetworkChannelId channelId, bool reliable); - /** - * Close a message channel to a connected peer. - */ - Result CloseChannel(NetworkPeerId peerId, NetworkChannelId channelId); - /** - * Send a message to a connected peer over an opened message channel. - */ - Result SendMessage(NetworkPeerId peerId, - NetworkChannelId channelId, - std::uint8_t* data, - std::uint32_t dataLength); - - Event OnMessage; - Event OnRouteUpdate; - -private: - friend class Core; - - NetworkManager() = default; - NetworkManager(NetworkManager const& rhs) = delete; - NetworkManager& operator=(NetworkManager const& rhs) = delete; - NetworkManager(NetworkManager&& rhs) = delete; - NetworkManager& operator=(NetworkManager&& rhs) = delete; - - IDiscordNetworkManager* internal_; - static IDiscordNetworkEvents events_; -}; - -} // namespace discord diff --git a/depend/discord/overlay_manager.cpp b/depend/discord/overlay_manager.cpp deleted file mode 100644 index e1c91ce..0000000 --- a/depend/discord/overlay_manager.cpp +++ /dev/null @@ -1,112 +0,0 @@ -#if !defined(_CRT_SECURE_NO_WARNINGS) -#define _CRT_SECURE_NO_WARNINGS -#endif - -#include "overlay_manager.h" - -#include "core.h" - -#include -#include - -namespace discord { - -class OverlayEvents final { -public: - static void OnToggle(void* callbackData, bool locked) - { - auto* core = reinterpret_cast(callbackData); - if (!core) { - return; - } - - auto& module = core->OverlayManager(); - module.OnToggle((locked != 0)); - } -}; - -IDiscordOverlayEvents OverlayManager::events_{ - &OverlayEvents::OnToggle, -}; - -void OverlayManager::IsEnabled(bool* enabled) -{ - if (!enabled) { - return; - } - - internal_->is_enabled(internal_, reinterpret_cast(enabled)); -} - -void OverlayManager::IsLocked(bool* locked) -{ - if (!locked) { - return; - } - - internal_->is_locked(internal_, reinterpret_cast(locked)); -} - -void OverlayManager::SetLocked(bool locked, std::function callback) -{ - static auto wrapper = [](void* callbackData, EDiscordResult result) -> void { - std::unique_ptr> cb( - reinterpret_cast*>(callbackData)); - if (!cb || !(*cb)) { - return; - } - (*cb)(static_cast(result)); - }; - std::unique_ptr> cb{}; - cb.reset(new std::function(std::move(callback))); - internal_->set_locked(internal_, (locked ? 1 : 0), cb.release(), wrapper); -} - -void OverlayManager::OpenActivityInvite(ActivityActionType type, - std::function callback) -{ - static auto wrapper = [](void* callbackData, EDiscordResult result) -> void { - std::unique_ptr> cb( - reinterpret_cast*>(callbackData)); - if (!cb || !(*cb)) { - return; - } - (*cb)(static_cast(result)); - }; - std::unique_ptr> cb{}; - cb.reset(new std::function(std::move(callback))); - internal_->open_activity_invite( - internal_, static_cast(type), cb.release(), wrapper); -} - -void OverlayManager::OpenGuildInvite(char const* code, std::function callback) -{ - static auto wrapper = [](void* callbackData, EDiscordResult result) -> void { - std::unique_ptr> cb( - reinterpret_cast*>(callbackData)); - if (!cb || !(*cb)) { - return; - } - (*cb)(static_cast(result)); - }; - std::unique_ptr> cb{}; - cb.reset(new std::function(std::move(callback))); - internal_->open_guild_invite(internal_, const_cast(code), cb.release(), wrapper); -} - -void OverlayManager::OpenVoiceSettings(std::function callback) -{ - static auto wrapper = [](void* callbackData, EDiscordResult result) -> void { - std::unique_ptr> cb( - reinterpret_cast*>(callbackData)); - if (!cb || !(*cb)) { - return; - } - (*cb)(static_cast(result)); - }; - std::unique_ptr> cb{}; - cb.reset(new std::function(std::move(callback))); - internal_->open_voice_settings(internal_, cb.release(), wrapper); -} - -} // namespace discord diff --git a/depend/discord/overlay_manager.h b/depend/discord/overlay_manager.h deleted file mode 100644 index c452aed..0000000 --- a/depend/discord/overlay_manager.h +++ /dev/null @@ -1,33 +0,0 @@ -#pragma once - -#include "types.h" - -namespace discord { - -class OverlayManager final { -public: - ~OverlayManager() = default; - - void IsEnabled(bool* enabled); - void IsLocked(bool* locked); - void SetLocked(bool locked, std::function callback); - void OpenActivityInvite(ActivityActionType type, std::function callback); - void OpenGuildInvite(char const* code, std::function callback); - void OpenVoiceSettings(std::function callback); - - Event OnToggle; - -private: - friend class Core; - - OverlayManager() = default; - OverlayManager(OverlayManager const& rhs) = delete; - OverlayManager& operator=(OverlayManager const& rhs) = delete; - OverlayManager(OverlayManager&& rhs) = delete; - OverlayManager& operator=(OverlayManager&& rhs) = delete; - - IDiscordOverlayManager* internal_; - static IDiscordOverlayEvents events_; -}; - -} // namespace discord diff --git a/depend/discord/relationship_manager.cpp b/depend/discord/relationship_manager.cpp deleted file mode 100644 index 005f2b0..0000000 --- a/depend/discord/relationship_manager.cpp +++ /dev/null @@ -1,90 +0,0 @@ -#if !defined(_CRT_SECURE_NO_WARNINGS) -#define _CRT_SECURE_NO_WARNINGS -#endif - -#include "relationship_manager.h" - -#include "core.h" - -#include -#include - -namespace discord { - -class RelationshipEvents final { -public: - static void OnRefresh(void* callbackData) - { - auto* core = reinterpret_cast(callbackData); - if (!core) { - return; - } - - auto& module = core->RelationshipManager(); - module.OnRefresh(); - } - - static void OnRelationshipUpdate(void* callbackData, DiscordRelationship* relationship) - { - auto* core = reinterpret_cast(callbackData); - if (!core) { - return; - } - - auto& module = core->RelationshipManager(); - module.OnRelationshipUpdate(*reinterpret_cast(relationship)); - } -}; - -IDiscordRelationshipEvents RelationshipManager::events_{ - &RelationshipEvents::OnRefresh, - &RelationshipEvents::OnRelationshipUpdate, -}; - -void RelationshipManager::Filter(std::function filter) -{ - static auto wrapper = [](void* callbackData, DiscordRelationship* relationship) -> bool { - auto cb(reinterpret_cast*>(callbackData)); - if (!cb || !(*cb)) { - return {}; - } - return (*cb)(*reinterpret_cast(relationship)); - }; - std::unique_ptr> cb{}; - cb.reset(new std::function(std::move(filter))); - internal_->filter(internal_, cb.get(), wrapper); -} - -Result RelationshipManager::Count(std::int32_t* count) -{ - if (!count) { - return Result::InternalError; - } - - auto result = internal_->count(internal_, reinterpret_cast(count)); - return static_cast(result); -} - -Result RelationshipManager::Get(UserId userId, Relationship* relationship) -{ - if (!relationship) { - return Result::InternalError; - } - - auto result = - internal_->get(internal_, userId, reinterpret_cast(relationship)); - return static_cast(result); -} - -Result RelationshipManager::GetAt(std::uint32_t index, Relationship* relationship) -{ - if (!relationship) { - return Result::InternalError; - } - - auto result = - internal_->get_at(internal_, index, reinterpret_cast(relationship)); - return static_cast(result); -} - -} // namespace discord diff --git a/depend/discord/relationship_manager.h b/depend/discord/relationship_manager.h deleted file mode 100644 index e9cd016..0000000 --- a/depend/discord/relationship_manager.h +++ /dev/null @@ -1,32 +0,0 @@ -#pragma once - -#include "types.h" - -namespace discord { - -class RelationshipManager final { -public: - ~RelationshipManager() = default; - - void Filter(std::function filter); - Result Count(std::int32_t* count); - Result Get(UserId userId, Relationship* relationship); - Result GetAt(std::uint32_t index, Relationship* relationship); - - Event<> OnRefresh; - Event OnRelationshipUpdate; - -private: - friend class Core; - - RelationshipManager() = default; - RelationshipManager(RelationshipManager const& rhs) = delete; - RelationshipManager& operator=(RelationshipManager const& rhs) = delete; - RelationshipManager(RelationshipManager&& rhs) = delete; - RelationshipManager& operator=(RelationshipManager&& rhs) = delete; - - IDiscordRelationshipManager* internal_; - static IDiscordRelationshipEvents events_; -}; - -} // namespace discord diff --git a/depend/discord/storage_manager.cpp b/depend/discord/storage_manager.cpp deleted file mode 100644 index fbf9ca7..0000000 --- a/depend/discord/storage_manager.cpp +++ /dev/null @@ -1,158 +0,0 @@ -#if !defined(_CRT_SECURE_NO_WARNINGS) -#define _CRT_SECURE_NO_WARNINGS -#endif - -#include "storage_manager.h" - -#include "core.h" - -#include -#include - -namespace discord { - -Result StorageManager::Read(char const* name, - std::uint8_t* data, - std::uint32_t dataLength, - std::uint32_t* read) -{ - if (!read) { - return Result::InternalError; - } - - auto result = internal_->read(internal_, - const_cast(name), - reinterpret_cast(data), - dataLength, - reinterpret_cast(read)); - return static_cast(result); -} - -void StorageManager::ReadAsync(char const* name, - std::function callback) -{ - static auto wrapper = - [](void* callbackData, EDiscordResult result, uint8_t* data, uint32_t dataLength) -> void { - std::unique_ptr> cb( - reinterpret_cast*>( - callbackData)); - if (!cb || !(*cb)) { - return; - } - (*cb)(static_cast(result), data, dataLength); - }; - std::unique_ptr> cb{}; - cb.reset(new std::function(std::move(callback))); - internal_->read_async(internal_, const_cast(name), cb.release(), wrapper); -} - -void StorageManager::ReadAsyncPartial( - char const* name, - std::uint64_t offset, - std::uint64_t length, - std::function callback) -{ - static auto wrapper = - [](void* callbackData, EDiscordResult result, uint8_t* data, uint32_t dataLength) -> void { - std::unique_ptr> cb( - reinterpret_cast*>( - callbackData)); - if (!cb || !(*cb)) { - return; - } - (*cb)(static_cast(result), data, dataLength); - }; - std::unique_ptr> cb{}; - cb.reset(new std::function(std::move(callback))); - internal_->read_async_partial( - internal_, const_cast(name), offset, length, cb.release(), wrapper); -} - -Result StorageManager::Write(char const* name, std::uint8_t* data, std::uint32_t dataLength) -{ - auto result = internal_->write( - internal_, const_cast(name), reinterpret_cast(data), dataLength); - return static_cast(result); -} - -void StorageManager::WriteAsync(char const* name, - std::uint8_t* data, - std::uint32_t dataLength, - std::function callback) -{ - static auto wrapper = [](void* callbackData, EDiscordResult result) -> void { - std::unique_ptr> cb( - reinterpret_cast*>(callbackData)); - if (!cb || !(*cb)) { - return; - } - (*cb)(static_cast(result)); - }; - std::unique_ptr> cb{}; - cb.reset(new std::function(std::move(callback))); - internal_->write_async(internal_, - const_cast(name), - reinterpret_cast(data), - dataLength, - cb.release(), - wrapper); -} - -Result StorageManager::Delete(char const* name) -{ - auto result = internal_->delete_(internal_, const_cast(name)); - return static_cast(result); -} - -Result StorageManager::Exists(char const* name, bool* exists) -{ - if (!exists) { - return Result::InternalError; - } - - auto result = - internal_->exists(internal_, const_cast(name), reinterpret_cast(exists)); - return static_cast(result); -} - -void StorageManager::Count(std::int32_t* count) -{ - if (!count) { - return; - } - - internal_->count(internal_, reinterpret_cast(count)); -} - -Result StorageManager::Stat(char const* name, FileStat* stat) -{ - if (!stat) { - return Result::InternalError; - } - - auto result = - internal_->stat(internal_, const_cast(name), reinterpret_cast(stat)); - return static_cast(result); -} - -Result StorageManager::StatAt(std::int32_t index, FileStat* stat) -{ - if (!stat) { - return Result::InternalError; - } - - auto result = internal_->stat_at(internal_, index, reinterpret_cast(stat)); - return static_cast(result); -} - -Result StorageManager::GetPath(char path[4096]) -{ - if (!path) { - return Result::InternalError; - } - - auto result = internal_->get_path(internal_, reinterpret_cast(path)); - return static_cast(result); -} - -} // namespace discord diff --git a/depend/discord/storage_manager.h b/depend/discord/storage_manager.h deleted file mode 100644 index 5d6d17b..0000000 --- a/depend/discord/storage_manager.h +++ /dev/null @@ -1,46 +0,0 @@ -#pragma once - -#include "types.h" - -namespace discord { - -class StorageManager final { -public: - ~StorageManager() = default; - - Result Read(char const* name, - std::uint8_t* data, - std::uint32_t dataLength, - std::uint32_t* read); - void ReadAsync(char const* name, - std::function callback); - void ReadAsyncPartial(char const* name, - std::uint64_t offset, - std::uint64_t length, - std::function callback); - Result Write(char const* name, std::uint8_t* data, std::uint32_t dataLength); - void WriteAsync(char const* name, - std::uint8_t* data, - std::uint32_t dataLength, - std::function callback); - Result Delete(char const* name); - Result Exists(char const* name, bool* exists); - void Count(std::int32_t* count); - Result Stat(char const* name, FileStat* stat); - Result StatAt(std::int32_t index, FileStat* stat); - Result GetPath(char path[4096]); - -private: - friend class Core; - - StorageManager() = default; - StorageManager(StorageManager const& rhs) = delete; - StorageManager& operator=(StorageManager const& rhs) = delete; - StorageManager(StorageManager&& rhs) = delete; - StorageManager& operator=(StorageManager&& rhs) = delete; - - IDiscordStorageManager* internal_; - static IDiscordStorageEvents events_; -}; - -} // namespace discord diff --git a/depend/discord/store_manager.cpp b/depend/discord/store_manager.cpp deleted file mode 100644 index d6bdad1..0000000 --- a/depend/discord/store_manager.cpp +++ /dev/null @@ -1,160 +0,0 @@ -#if !defined(_CRT_SECURE_NO_WARNINGS) -#define _CRT_SECURE_NO_WARNINGS -#endif - -#include "store_manager.h" - -#include "core.h" - -#include -#include - -namespace discord { - -class StoreEvents final { -public: - static void OnEntitlementCreate(void* callbackData, DiscordEntitlement* entitlement) - { - auto* core = reinterpret_cast(callbackData); - if (!core) { - return; - } - - auto& module = core->StoreManager(); - module.OnEntitlementCreate(*reinterpret_cast(entitlement)); - } - - static void OnEntitlementDelete(void* callbackData, DiscordEntitlement* entitlement) - { - auto* core = reinterpret_cast(callbackData); - if (!core) { - return; - } - - auto& module = core->StoreManager(); - module.OnEntitlementDelete(*reinterpret_cast(entitlement)); - } -}; - -IDiscordStoreEvents StoreManager::events_{ - &StoreEvents::OnEntitlementCreate, - &StoreEvents::OnEntitlementDelete, -}; - -void StoreManager::FetchSkus(std::function callback) -{ - static auto wrapper = [](void* callbackData, EDiscordResult result) -> void { - std::unique_ptr> cb( - reinterpret_cast*>(callbackData)); - if (!cb || !(*cb)) { - return; - } - (*cb)(static_cast(result)); - }; - std::unique_ptr> cb{}; - cb.reset(new std::function(std::move(callback))); - internal_->fetch_skus(internal_, cb.release(), wrapper); -} - -void StoreManager::CountSkus(std::int32_t* count) -{ - if (!count) { - return; - } - - internal_->count_skus(internal_, reinterpret_cast(count)); -} - -Result StoreManager::GetSku(Snowflake skuId, Sku* sku) -{ - if (!sku) { - return Result::InternalError; - } - - auto result = internal_->get_sku(internal_, skuId, reinterpret_cast(sku)); - return static_cast(result); -} - -Result StoreManager::GetSkuAt(std::int32_t index, Sku* sku) -{ - if (!sku) { - return Result::InternalError; - } - - auto result = internal_->get_sku_at(internal_, index, reinterpret_cast(sku)); - return static_cast(result); -} - -void StoreManager::FetchEntitlements(std::function callback) -{ - static auto wrapper = [](void* callbackData, EDiscordResult result) -> void { - std::unique_ptr> cb( - reinterpret_cast*>(callbackData)); - if (!cb || !(*cb)) { - return; - } - (*cb)(static_cast(result)); - }; - std::unique_ptr> cb{}; - cb.reset(new std::function(std::move(callback))); - internal_->fetch_entitlements(internal_, cb.release(), wrapper); -} - -void StoreManager::CountEntitlements(std::int32_t* count) -{ - if (!count) { - return; - } - - internal_->count_entitlements(internal_, reinterpret_cast(count)); -} - -Result StoreManager::GetEntitlement(Snowflake entitlementId, Entitlement* entitlement) -{ - if (!entitlement) { - return Result::InternalError; - } - - auto result = internal_->get_entitlement( - internal_, entitlementId, reinterpret_cast(entitlement)); - return static_cast(result); -} - -Result StoreManager::GetEntitlementAt(std::int32_t index, Entitlement* entitlement) -{ - if (!entitlement) { - return Result::InternalError; - } - - auto result = internal_->get_entitlement_at( - internal_, index, reinterpret_cast(entitlement)); - return static_cast(result); -} - -Result StoreManager::HasSkuEntitlement(Snowflake skuId, bool* hasEntitlement) -{ - if (!hasEntitlement) { - return Result::InternalError; - } - - auto result = - internal_->has_sku_entitlement(internal_, skuId, reinterpret_cast(hasEntitlement)); - return static_cast(result); -} - -void StoreManager::StartPurchase(Snowflake skuId, std::function callback) -{ - static auto wrapper = [](void* callbackData, EDiscordResult result) -> void { - std::unique_ptr> cb( - reinterpret_cast*>(callbackData)); - if (!cb || !(*cb)) { - return; - } - (*cb)(static_cast(result)); - }; - std::unique_ptr> cb{}; - cb.reset(new std::function(std::move(callback))); - internal_->start_purchase(internal_, skuId, cb.release(), wrapper); -} - -} // namespace discord diff --git a/depend/discord/store_manager.h b/depend/discord/store_manager.h deleted file mode 100644 index 8e0df8a..0000000 --- a/depend/discord/store_manager.h +++ /dev/null @@ -1,38 +0,0 @@ -#pragma once - -#include "types.h" - -namespace discord { - -class StoreManager final { -public: - ~StoreManager() = default; - - void FetchSkus(std::function callback); - void CountSkus(std::int32_t* count); - Result GetSku(Snowflake skuId, Sku* sku); - Result GetSkuAt(std::int32_t index, Sku* sku); - void FetchEntitlements(std::function callback); - void CountEntitlements(std::int32_t* count); - Result GetEntitlement(Snowflake entitlementId, Entitlement* entitlement); - Result GetEntitlementAt(std::int32_t index, Entitlement* entitlement); - Result HasSkuEntitlement(Snowflake skuId, bool* hasEntitlement); - void StartPurchase(Snowflake skuId, std::function callback); - - Event OnEntitlementCreate; - Event OnEntitlementDelete; - -private: - friend class Core; - - StoreManager() = default; - StoreManager(StoreManager const& rhs) = delete; - StoreManager& operator=(StoreManager const& rhs) = delete; - StoreManager(StoreManager&& rhs) = delete; - StoreManager& operator=(StoreManager&& rhs) = delete; - - IDiscordStoreManager* internal_; - static IDiscordStoreEvents events_; -}; - -} // namespace discord diff --git a/depend/discord/types.cpp b/depend/discord/types.cpp deleted file mode 100644 index 66cdd49..0000000 --- a/depend/discord/types.cpp +++ /dev/null @@ -1,769 +0,0 @@ -#if !defined(_CRT_SECURE_NO_WARNINGS) -#define _CRT_SECURE_NO_WARNINGS -#endif - -#include "types.h" - -#include -#include - -namespace discord { - -void User::SetId(UserId id) -{ - internal_.id = id; -} - -UserId User::GetId() const -{ - return internal_.id; -} - -void User::SetUsername(char const* username) -{ - strncpy(internal_.username, username, 256); - internal_.username[256 - 1] = '\0'; -} - -char const* User::GetUsername() const -{ - return internal_.username; -} - -void User::SetDiscriminator(char const* discriminator) -{ - strncpy(internal_.discriminator, discriminator, 8); - internal_.discriminator[8 - 1] = '\0'; -} - -char const* User::GetDiscriminator() const -{ - return internal_.discriminator; -} - -void User::SetAvatar(char const* avatar) -{ - strncpy(internal_.avatar, avatar, 128); - internal_.avatar[128 - 1] = '\0'; -} - -char const* User::GetAvatar() const -{ - return internal_.avatar; -} - -void User::SetBot(bool bot) -{ - internal_.bot = bot; -} - -bool User::GetBot() const -{ - return internal_.bot != 0; -} - -void OAuth2Token::SetAccessToken(char const* accessToken) -{ - strncpy(internal_.access_token, accessToken, 128); - internal_.access_token[128 - 1] = '\0'; -} - -char const* OAuth2Token::GetAccessToken() const -{ - return internal_.access_token; -} - -void OAuth2Token::SetScopes(char const* scopes) -{ - strncpy(internal_.scopes, scopes, 1024); - internal_.scopes[1024 - 1] = '\0'; -} - -char const* OAuth2Token::GetScopes() const -{ - return internal_.scopes; -} - -void OAuth2Token::SetExpires(Timestamp expires) -{ - internal_.expires = expires; -} - -Timestamp OAuth2Token::GetExpires() const -{ - return internal_.expires; -} - -void ImageHandle::SetType(ImageType type) -{ - internal_.type = static_cast(type); -} - -ImageType ImageHandle::GetType() const -{ - return static_cast(internal_.type); -} - -void ImageHandle::SetId(std::int64_t id) -{ - internal_.id = id; -} - -std::int64_t ImageHandle::GetId() const -{ - return internal_.id; -} - -void ImageHandle::SetSize(std::uint32_t size) -{ - internal_.size = size; -} - -std::uint32_t ImageHandle::GetSize() const -{ - return internal_.size; -} - -void ImageDimensions::SetWidth(std::uint32_t width) -{ - internal_.width = width; -} - -std::uint32_t ImageDimensions::GetWidth() const -{ - return internal_.width; -} - -void ImageDimensions::SetHeight(std::uint32_t height) -{ - internal_.height = height; -} - -std::uint32_t ImageDimensions::GetHeight() const -{ - return internal_.height; -} - -void ActivityTimestamps::SetStart(Timestamp start) -{ - internal_.start = start; -} - -Timestamp ActivityTimestamps::GetStart() const -{ - return internal_.start; -} - -void ActivityTimestamps::SetEnd(Timestamp end) -{ - internal_.end = end; -} - -Timestamp ActivityTimestamps::GetEnd() const -{ - return internal_.end; -} - -void ActivityAssets::SetLargeImage(char const* largeImage) -{ - strncpy(internal_.large_image, largeImage, 128); - internal_.large_image[128 - 1] = '\0'; -} - -char const* ActivityAssets::GetLargeImage() const -{ - return internal_.large_image; -} - -void ActivityAssets::SetLargeText(char const* largeText) -{ - strncpy(internal_.large_text, largeText, 128); - internal_.large_text[128 - 1] = '\0'; -} - -char const* ActivityAssets::GetLargeText() const -{ - return internal_.large_text; -} - -void ActivityAssets::SetSmallImage(char const* smallImage) -{ - strncpy(internal_.small_image, smallImage, 128); - internal_.small_image[128 - 1] = '\0'; -} - -char const* ActivityAssets::GetSmallImage() const -{ - return internal_.small_image; -} - -void ActivityAssets::SetSmallText(char const* smallText) -{ - strncpy(internal_.small_text, smallText, 128); - internal_.small_text[128 - 1] = '\0'; -} - -char const* ActivityAssets::GetSmallText() const -{ - return internal_.small_text; -} - -void PartySize::SetCurrentSize(std::int32_t currentSize) -{ - internal_.current_size = currentSize; -} - -std::int32_t PartySize::GetCurrentSize() const -{ - return internal_.current_size; -} - -void PartySize::SetMaxSize(std::int32_t maxSize) -{ - internal_.max_size = maxSize; -} - -std::int32_t PartySize::GetMaxSize() const -{ - return internal_.max_size; -} - -void ActivityParty::SetId(char const* id) -{ - strncpy(internal_.id, id, 128); - internal_.id[128 - 1] = '\0'; -} - -char const* ActivityParty::GetId() const -{ - return internal_.id; -} - -PartySize& ActivityParty::GetSize() -{ - return reinterpret_cast(internal_.size); -} - -PartySize const& ActivityParty::GetSize() const -{ - return reinterpret_cast(internal_.size); -} - -void ActivitySecrets::SetMatch(char const* match) -{ - strncpy(internal_.match, match, 128); - internal_.match[128 - 1] = '\0'; -} - -char const* ActivitySecrets::GetMatch() const -{ - return internal_.match; -} - -void ActivitySecrets::SetJoin(char const* join) -{ - strncpy(internal_.join, join, 128); - internal_.join[128 - 1] = '\0'; -} - -char const* ActivitySecrets::GetJoin() const -{ - return internal_.join; -} - -void ActivitySecrets::SetSpectate(char const* spectate) -{ - strncpy(internal_.spectate, spectate, 128); - internal_.spectate[128 - 1] = '\0'; -} - -char const* ActivitySecrets::GetSpectate() const -{ - return internal_.spectate; -} - -void Activity::SetType(ActivityType type) -{ - internal_.type = static_cast(type); -} - -ActivityType Activity::GetType() const -{ - return static_cast(internal_.type); -} - -void Activity::SetApplicationId(std::int64_t applicationId) -{ - internal_.application_id = applicationId; -} - -std::int64_t Activity::GetApplicationId() const -{ - return internal_.application_id; -} - -void Activity::SetName(char const* name) -{ - strncpy(internal_.name, name, 128); - internal_.name[128 - 1] = '\0'; -} - -char const* Activity::GetName() const -{ - return internal_.name; -} - -void Activity::SetState(char const* state) -{ - strncpy(internal_.state, state, 128); - internal_.state[128 - 1] = '\0'; -} - -char const* Activity::GetState() const -{ - return internal_.state; -} - -void Activity::SetDetails(char const* details) -{ - strncpy(internal_.details, details, 128); - internal_.details[128 - 1] = '\0'; -} - -char const* Activity::GetDetails() const -{ - return internal_.details; -} - -ActivityTimestamps& Activity::GetTimestamps() -{ - return reinterpret_cast(internal_.timestamps); -} - -ActivityTimestamps const& Activity::GetTimestamps() const -{ - return reinterpret_cast(internal_.timestamps); -} - -ActivityAssets& Activity::GetAssets() -{ - return reinterpret_cast(internal_.assets); -} - -ActivityAssets const& Activity::GetAssets() const -{ - return reinterpret_cast(internal_.assets); -} - -ActivityParty& Activity::GetParty() -{ - return reinterpret_cast(internal_.party); -} - -ActivityParty const& Activity::GetParty() const -{ - return reinterpret_cast(internal_.party); -} - -ActivitySecrets& Activity::GetSecrets() -{ - return reinterpret_cast(internal_.secrets); -} - -ActivitySecrets const& Activity::GetSecrets() const -{ - return reinterpret_cast(internal_.secrets); -} - -void Activity::SetInstance(bool instance) -{ - internal_.instance = instance; -} - -bool Activity::GetInstance() const -{ - return internal_.instance != 0; -} - -void Presence::SetStatus(Status status) -{ - internal_.status = static_cast(status); -} - -Status Presence::GetStatus() const -{ - return static_cast(internal_.status); -} - -Activity& Presence::GetActivity() -{ - return reinterpret_cast(internal_.activity); -} - -Activity const& Presence::GetActivity() const -{ - return reinterpret_cast(internal_.activity); -} - -void Relationship::SetType(RelationshipType type) -{ - internal_.type = static_cast(type); -} - -RelationshipType Relationship::GetType() const -{ - return static_cast(internal_.type); -} - -User& Relationship::GetUser() -{ - return reinterpret_cast(internal_.user); -} - -User const& Relationship::GetUser() const -{ - return reinterpret_cast(internal_.user); -} - -Presence& Relationship::GetPresence() -{ - return reinterpret_cast(internal_.presence); -} - -Presence const& Relationship::GetPresence() const -{ - return reinterpret_cast(internal_.presence); -} - -void Lobby::SetId(LobbyId id) -{ - internal_.id = id; -} - -LobbyId Lobby::GetId() const -{ - return internal_.id; -} - -void Lobby::SetType(LobbyType type) -{ - internal_.type = static_cast(type); -} - -LobbyType Lobby::GetType() const -{ - return static_cast(internal_.type); -} - -void Lobby::SetOwnerId(UserId ownerId) -{ - internal_.owner_id = ownerId; -} - -UserId Lobby::GetOwnerId() const -{ - return internal_.owner_id; -} - -void Lobby::SetSecret(LobbySecret secret) -{ - strncpy(internal_.secret, secret, 128); - internal_.secret[128 - 1] = '\0'; -} - -LobbySecret Lobby::GetSecret() const -{ - return internal_.secret; -} - -void Lobby::SetCapacity(std::uint32_t capacity) -{ - internal_.capacity = capacity; -} - -std::uint32_t Lobby::GetCapacity() const -{ - return internal_.capacity; -} - -void Lobby::SetLocked(bool locked) -{ - internal_.locked = locked; -} - -bool Lobby::GetLocked() const -{ - return internal_.locked != 0; -} - -void FileStat::SetFilename(char const* filename) -{ - strncpy(internal_.filename, filename, 260); - internal_.filename[260 - 1] = '\0'; -} - -char const* FileStat::GetFilename() const -{ - return internal_.filename; -} - -void FileStat::SetSize(std::uint64_t size) -{ - internal_.size = size; -} - -std::uint64_t FileStat::GetSize() const -{ - return internal_.size; -} - -void FileStat::SetLastModified(std::uint64_t lastModified) -{ - internal_.last_modified = lastModified; -} - -std::uint64_t FileStat::GetLastModified() const -{ - return internal_.last_modified; -} - -void Entitlement::SetId(Snowflake id) -{ - internal_.id = id; -} - -Snowflake Entitlement::GetId() const -{ - return internal_.id; -} - -void Entitlement::SetType(EntitlementType type) -{ - internal_.type = static_cast(type); -} - -EntitlementType Entitlement::GetType() const -{ - return static_cast(internal_.type); -} - -void Entitlement::SetSkuId(Snowflake skuId) -{ - internal_.sku_id = skuId; -} - -Snowflake Entitlement::GetSkuId() const -{ - return internal_.sku_id; -} - -void SkuPrice::SetAmount(std::uint32_t amount) -{ - internal_.amount = amount; -} - -std::uint32_t SkuPrice::GetAmount() const -{ - return internal_.amount; -} - -void SkuPrice::SetCurrency(char const* currency) -{ - strncpy(internal_.currency, currency, 16); - internal_.currency[16 - 1] = '\0'; -} - -char const* SkuPrice::GetCurrency() const -{ - return internal_.currency; -} - -void Sku::SetId(Snowflake id) -{ - internal_.id = id; -} - -Snowflake Sku::GetId() const -{ - return internal_.id; -} - -void Sku::SetType(SkuType type) -{ - internal_.type = static_cast(type); -} - -SkuType Sku::GetType() const -{ - return static_cast(internal_.type); -} - -void Sku::SetName(char const* name) -{ - strncpy(internal_.name, name, 256); - internal_.name[256 - 1] = '\0'; -} - -char const* Sku::GetName() const -{ - return internal_.name; -} - -SkuPrice& Sku::GetPrice() -{ - return reinterpret_cast(internal_.price); -} - -SkuPrice const& Sku::GetPrice() const -{ - return reinterpret_cast(internal_.price); -} - -void InputMode::SetType(InputModeType type) -{ - internal_.type = static_cast(type); -} - -InputModeType InputMode::GetType() const -{ - return static_cast(internal_.type); -} - -void InputMode::SetShortcut(char const* shortcut) -{ - strncpy(internal_.shortcut, shortcut, 256); - internal_.shortcut[256 - 1] = '\0'; -} - -char const* InputMode::GetShortcut() const -{ - return internal_.shortcut; -} - -void UserAchievement::SetUserId(Snowflake userId) -{ - internal_.user_id = userId; -} - -Snowflake UserAchievement::GetUserId() const -{ - return internal_.user_id; -} - -void UserAchievement::SetAchievementId(Snowflake achievementId) -{ - internal_.achievement_id = achievementId; -} - -Snowflake UserAchievement::GetAchievementId() const -{ - return internal_.achievement_id; -} - -void UserAchievement::SetPercentComplete(std::uint8_t percentComplete) -{ - internal_.percent_complete = percentComplete; -} - -std::uint8_t UserAchievement::GetPercentComplete() const -{ - return internal_.percent_complete; -} - -void UserAchievement::SetUnlockedAt(DateTime unlockedAt) -{ - strncpy(internal_.unlocked_at, unlockedAt, 64); - internal_.unlocked_at[64 - 1] = '\0'; -} - -DateTime UserAchievement::GetUnlockedAt() const -{ - return internal_.unlocked_at; -} - -Result LobbyTransaction::SetType(LobbyType type) -{ - auto result = internal_->set_type(internal_, static_cast(type)); - return static_cast(result); -} - -Result LobbyTransaction::SetOwner(UserId ownerId) -{ - auto result = internal_->set_owner(internal_, ownerId); - return static_cast(result); -} - -Result LobbyTransaction::SetCapacity(std::uint32_t capacity) -{ - auto result = internal_->set_capacity(internal_, capacity); - return static_cast(result); -} - -Result LobbyTransaction::SetMetadata(MetadataKey key, MetadataValue value) -{ - auto result = - internal_->set_metadata(internal_, const_cast(key), const_cast(value)); - return static_cast(result); -} - -Result LobbyTransaction::DeleteMetadata(MetadataKey key) -{ - auto result = internal_->delete_metadata(internal_, const_cast(key)); - return static_cast(result); -} - -Result LobbyTransaction::SetLocked(bool locked) -{ - auto result = internal_->set_locked(internal_, (locked ? 1 : 0)); - return static_cast(result); -} - -Result LobbyMemberTransaction::SetMetadata(MetadataKey key, MetadataValue value) -{ - auto result = - internal_->set_metadata(internal_, const_cast(key), const_cast(value)); - return static_cast(result); -} - -Result LobbyMemberTransaction::DeleteMetadata(MetadataKey key) -{ - auto result = internal_->delete_metadata(internal_, const_cast(key)); - return static_cast(result); -} - -Result LobbySearchQuery::Filter(MetadataKey key, - LobbySearchComparison comparison, - LobbySearchCast cast, - MetadataValue value) -{ - auto result = internal_->filter(internal_, - const_cast(key), - static_cast(comparison), - static_cast(cast), - const_cast(value)); - return static_cast(result); -} - -Result LobbySearchQuery::Sort(MetadataKey key, LobbySearchCast cast, MetadataValue value) -{ - auto result = internal_->sort(internal_, - const_cast(key), - static_cast(cast), - const_cast(value)); - return static_cast(result); -} - -Result LobbySearchQuery::Limit(std::uint32_t limit) -{ - auto result = internal_->limit(internal_, limit); - return static_cast(result); -} - -Result LobbySearchQuery::Distance(LobbySearchDistance distance) -{ - auto result = - internal_->distance(internal_, static_cast(distance)); - return static_cast(result); -} - -} // namespace discord diff --git a/depend/discord/types.h b/depend/discord/types.h deleted file mode 100644 index 8c7cc2b..0000000 --- a/depend/discord/types.h +++ /dev/null @@ -1,491 +0,0 @@ -#pragma once - -#include "ffi.h" -#include "event.h" - -namespace discord { - -enum class Result { - Ok = 0, - ServiceUnavailable = 1, - InvalidVersion = 2, - LockFailed = 3, - InternalError = 4, - InvalidPayload = 5, - InvalidCommand = 6, - InvalidPermissions = 7, - NotFetched = 8, - NotFound = 9, - Conflict = 10, - InvalidSecret = 11, - InvalidJoinSecret = 12, - NoEligibleActivity = 13, - InvalidInvite = 14, - NotAuthenticated = 15, - InvalidAccessToken = 16, - ApplicationMismatch = 17, - InvalidDataUrl = 18, - InvalidBase64 = 19, - NotFiltered = 20, - LobbyFull = 21, - InvalidLobbySecret = 22, - InvalidFilename = 23, - InvalidFileSize = 24, - InvalidEntitlement = 25, - NotInstalled = 26, - NotRunning = 27, - InsufficientBuffer = 28, - PurchaseCanceled = 29, - InvalidGuild = 30, - InvalidEvent = 31, - InvalidChannel = 32, - InvalidOrigin = 33, - RateLimited = 34, - OAuth2Error = 35, - SelectChannelTimeout = 36, - GetGuildTimeout = 37, - SelectVoiceForceRequired = 38, - CaptureShortcutAlreadyListening = 39, - UnauthorizedForAchievement = 40, - InvalidGiftCode = 41, - PurchaseError = 42, - TransactionAborted = 43, -}; - -enum class CreateFlags { - Default = 0, - NoRequireDiscord = 1, -}; - -enum class LogLevel { - Error = 1, - Warn, - Info, - Debug, -}; - -enum class UserFlag { - Partner = 2, - HypeSquadEvents = 4, - HypeSquadHouse1 = 64, - HypeSquadHouse2 = 128, - HypeSquadHouse3 = 256, -}; - -enum class PremiumType { - None = 0, - Tier1 = 1, - Tier2 = 2, -}; - -enum class ImageType { - User, -}; - -enum class ActivityType { - Playing, - Streaming, - Listening, - Watching, -}; - -enum class ActivityActionType { - Join = 1, - Spectate, -}; - -enum class ActivityJoinRequestReply { - No, - Yes, - Ignore, -}; - -enum class Status { - Offline = 0, - Online = 1, - Idle = 2, - DoNotDisturb = 3, -}; - -enum class RelationshipType { - None, - Friend, - Blocked, - PendingIncoming, - PendingOutgoing, - Implicit, -}; - -enum class LobbyType { - Private = 1, - Public, -}; - -enum class LobbySearchComparison { - LessThanOrEqual = -2, - LessThan, - Equal, - GreaterThan, - GreaterThanOrEqual, - NotEqual, -}; - -enum class LobbySearchCast { - String = 1, - Number, -}; - -enum class LobbySearchDistance { - Local, - Default, - Extended, - Global, -}; - -enum class EntitlementType { - Purchase = 1, - PremiumSubscription, - DeveloperGift, - TestModePurchase, - FreePurchase, - UserGift, - PremiumPurchase, -}; - -enum class SkuType { - Application = 1, - DLC, - Consumable, - Bundle, -}; - -enum class InputModeType { - VoiceActivity = 0, - PushToTalk, -}; - -using ClientId = std::int64_t; -using Version = std::int32_t; -using Snowflake = std::int64_t; -using Timestamp = std::int64_t; -using UserId = Snowflake; -using Locale = char const*; -using Branch = char const*; -using LobbyId = Snowflake; -using LobbySecret = char const*; -using MetadataKey = char const*; -using MetadataValue = char const*; -using NetworkPeerId = std::uint64_t; -using NetworkChannelId = std::uint8_t; -using Path = char const*; -using DateTime = char const*; - -class User final { -public: - void SetId(UserId id); - UserId GetId() const; - void SetUsername(char const* username); - char const* GetUsername() const; - void SetDiscriminator(char const* discriminator); - char const* GetDiscriminator() const; - void SetAvatar(char const* avatar); - char const* GetAvatar() const; - void SetBot(bool bot); - bool GetBot() const; - -private: - DiscordUser internal_; -}; - -class OAuth2Token final { -public: - void SetAccessToken(char const* accessToken); - char const* GetAccessToken() const; - void SetScopes(char const* scopes); - char const* GetScopes() const; - void SetExpires(Timestamp expires); - Timestamp GetExpires() const; - -private: - DiscordOAuth2Token internal_; -}; - -class ImageHandle final { -public: - void SetType(ImageType type); - ImageType GetType() const; - void SetId(std::int64_t id); - std::int64_t GetId() const; - void SetSize(std::uint32_t size); - std::uint32_t GetSize() const; - -private: - DiscordImageHandle internal_; -}; - -class ImageDimensions final { -public: - void SetWidth(std::uint32_t width); - std::uint32_t GetWidth() const; - void SetHeight(std::uint32_t height); - std::uint32_t GetHeight() const; - -private: - DiscordImageDimensions internal_; -}; - -class ActivityTimestamps final { -public: - void SetStart(Timestamp start); - Timestamp GetStart() const; - void SetEnd(Timestamp end); - Timestamp GetEnd() const; - -private: - DiscordActivityTimestamps internal_; -}; - -class ActivityAssets final { -public: - void SetLargeImage(char const* largeImage); - char const* GetLargeImage() const; - void SetLargeText(char const* largeText); - char const* GetLargeText() const; - void SetSmallImage(char const* smallImage); - char const* GetSmallImage() const; - void SetSmallText(char const* smallText); - char const* GetSmallText() const; - -private: - DiscordActivityAssets internal_; -}; - -class PartySize final { -public: - void SetCurrentSize(std::int32_t currentSize); - std::int32_t GetCurrentSize() const; - void SetMaxSize(std::int32_t maxSize); - std::int32_t GetMaxSize() const; - -private: - DiscordPartySize internal_; -}; - -class ActivityParty final { -public: - void SetId(char const* id); - char const* GetId() const; - PartySize& GetSize(); - PartySize const& GetSize() const; - -private: - DiscordActivityParty internal_; -}; - -class ActivitySecrets final { -public: - void SetMatch(char const* match); - char const* GetMatch() const; - void SetJoin(char const* join); - char const* GetJoin() const; - void SetSpectate(char const* spectate); - char const* GetSpectate() const; - -private: - DiscordActivitySecrets internal_; -}; - -class Activity final { -public: - void SetType(ActivityType type); - ActivityType GetType() const; - void SetApplicationId(std::int64_t applicationId); - std::int64_t GetApplicationId() const; - void SetName(char const* name); - char const* GetName() const; - void SetState(char const* state); - char const* GetState() const; - void SetDetails(char const* details); - char const* GetDetails() const; - ActivityTimestamps& GetTimestamps(); - ActivityTimestamps const& GetTimestamps() const; - ActivityAssets& GetAssets(); - ActivityAssets const& GetAssets() const; - ActivityParty& GetParty(); - ActivityParty const& GetParty() const; - ActivitySecrets& GetSecrets(); - ActivitySecrets const& GetSecrets() const; - void SetInstance(bool instance); - bool GetInstance() const; - -private: - DiscordActivity internal_; -}; - -class Presence final { -public: - void SetStatus(Status status); - Status GetStatus() const; - Activity& GetActivity(); - Activity const& GetActivity() const; - -private: - DiscordPresence internal_; -}; - -class Relationship final { -public: - void SetType(RelationshipType type); - RelationshipType GetType() const; - User& GetUser(); - User const& GetUser() const; - Presence& GetPresence(); - Presence const& GetPresence() const; - -private: - DiscordRelationship internal_; -}; - -class Lobby final { -public: - void SetId(LobbyId id); - LobbyId GetId() const; - void SetType(LobbyType type); - LobbyType GetType() const; - void SetOwnerId(UserId ownerId); - UserId GetOwnerId() const; - void SetSecret(LobbySecret secret); - LobbySecret GetSecret() const; - void SetCapacity(std::uint32_t capacity); - std::uint32_t GetCapacity() const; - void SetLocked(bool locked); - bool GetLocked() const; - -private: - DiscordLobby internal_; -}; - -class FileStat final { -public: - void SetFilename(char const* filename); - char const* GetFilename() const; - void SetSize(std::uint64_t size); - std::uint64_t GetSize() const; - void SetLastModified(std::uint64_t lastModified); - std::uint64_t GetLastModified() const; - -private: - DiscordFileStat internal_; -}; - -class Entitlement final { -public: - void SetId(Snowflake id); - Snowflake GetId() const; - void SetType(EntitlementType type); - EntitlementType GetType() const; - void SetSkuId(Snowflake skuId); - Snowflake GetSkuId() const; - -private: - DiscordEntitlement internal_; -}; - -class SkuPrice final { -public: - void SetAmount(std::uint32_t amount); - std::uint32_t GetAmount() const; - void SetCurrency(char const* currency); - char const* GetCurrency() const; - -private: - DiscordSkuPrice internal_; -}; - -class Sku final { -public: - void SetId(Snowflake id); - Snowflake GetId() const; - void SetType(SkuType type); - SkuType GetType() const; - void SetName(char const* name); - char const* GetName() const; - SkuPrice& GetPrice(); - SkuPrice const& GetPrice() const; - -private: - DiscordSku internal_; -}; - -class InputMode final { -public: - void SetType(InputModeType type); - InputModeType GetType() const; - void SetShortcut(char const* shortcut); - char const* GetShortcut() const; - -private: - DiscordInputMode internal_; -}; - -class UserAchievement final { -public: - void SetUserId(Snowflake userId); - Snowflake GetUserId() const; - void SetAchievementId(Snowflake achievementId); - Snowflake GetAchievementId() const; - void SetPercentComplete(std::uint8_t percentComplete); - std::uint8_t GetPercentComplete() const; - void SetUnlockedAt(DateTime unlockedAt); - DateTime GetUnlockedAt() const; - -private: - DiscordUserAchievement internal_; -}; - -class LobbyTransaction final { -public: - Result SetType(LobbyType type); - Result SetOwner(UserId ownerId); - Result SetCapacity(std::uint32_t capacity); - Result SetMetadata(MetadataKey key, MetadataValue value); - Result DeleteMetadata(MetadataKey key); - Result SetLocked(bool locked); - - IDiscordLobbyTransaction** Receive() { return &internal_; } - IDiscordLobbyTransaction* Internal() { return internal_; } - -private: - IDiscordLobbyTransaction* internal_; -}; - -class LobbyMemberTransaction final { -public: - Result SetMetadata(MetadataKey key, MetadataValue value); - Result DeleteMetadata(MetadataKey key); - - IDiscordLobbyMemberTransaction** Receive() { return &internal_; } - IDiscordLobbyMemberTransaction* Internal() { return internal_; } - -private: - IDiscordLobbyMemberTransaction* internal_; -}; - -class LobbySearchQuery final { -public: - Result Filter(MetadataKey key, - LobbySearchComparison comparison, - LobbySearchCast cast, - MetadataValue value); - Result Sort(MetadataKey key, LobbySearchCast cast, MetadataValue value); - Result Limit(std::uint32_t limit); - Result Distance(LobbySearchDistance distance); - - IDiscordLobbySearchQuery** Receive() { return &internal_; } - IDiscordLobbySearchQuery* Internal() { return internal_; } - -private: - IDiscordLobbySearchQuery* internal_; -}; - -} // namespace discord diff --git a/depend/discord/user_manager.cpp b/depend/discord/user_manager.cpp deleted file mode 100644 index e704e28..0000000 --- a/depend/discord/user_manager.cpp +++ /dev/null @@ -1,80 +0,0 @@ -#if !defined(_CRT_SECURE_NO_WARNINGS) -#define _CRT_SECURE_NO_WARNINGS -#endif - -#include "user_manager.h" - -#include "core.h" - -#include -#include - -namespace discord { - -class UserEvents final { -public: - static void OnCurrentUserUpdate(void* callbackData) - { - auto* core = reinterpret_cast(callbackData); - if (!core) { - return; - } - - auto& module = core->UserManager(); - module.OnCurrentUserUpdate(); - } -}; - -IDiscordUserEvents UserManager::events_{ - &UserEvents::OnCurrentUserUpdate, -}; - -Result UserManager::GetCurrentUser(User* currentUser) -{ - if (!currentUser) { - return Result::InternalError; - } - - auto result = - internal_->get_current_user(internal_, reinterpret_cast(currentUser)); - return static_cast(result); -} - -void UserManager::GetUser(UserId userId, std::function callback) -{ - static auto wrapper = [](void* callbackData, EDiscordResult result, DiscordUser* user) -> void { - std::unique_ptr> cb( - reinterpret_cast*>(callbackData)); - if (!cb || !(*cb)) { - return; - } - (*cb)(static_cast(result), *reinterpret_cast(user)); - }; - std::unique_ptr> cb{}; - cb.reset(new std::function(std::move(callback))); - internal_->get_user(internal_, userId, cb.release(), wrapper); -} - -Result UserManager::GetCurrentUserPremiumType(PremiumType* premiumType) -{ - if (!premiumType) { - return Result::InternalError; - } - - auto result = internal_->get_current_user_premium_type( - internal_, reinterpret_cast(premiumType)); - return static_cast(result); -} - -Result UserManager::CurrentUserHasFlag(UserFlag flag, bool* hasFlag) -{ - if (!hasFlag) { - return Result::InternalError; - } - - auto result = internal_->current_user_has_flag( - internal_, static_cast(flag), reinterpret_cast(hasFlag)); - return static_cast(result); -} - -} // namespace discord diff --git a/depend/discord/user_manager.h b/depend/discord/user_manager.h deleted file mode 100644 index d85de1b..0000000 --- a/depend/discord/user_manager.h +++ /dev/null @@ -1,31 +0,0 @@ -#pragma once - -#include "types.h" - -namespace discord { - -class UserManager final { -public: - ~UserManager() = default; - - Result GetCurrentUser(User* currentUser); - void GetUser(UserId userId, std::function callback); - Result GetCurrentUserPremiumType(PremiumType* premiumType); - Result CurrentUserHasFlag(UserFlag flag, bool* hasFlag); - - Event<> OnCurrentUserUpdate; - -private: - friend class Core; - - UserManager() = default; - UserManager(UserManager const& rhs) = delete; - UserManager& operator=(UserManager const& rhs) = delete; - UserManager(UserManager&& rhs) = delete; - UserManager& operator=(UserManager&& rhs) = delete; - - IDiscordUserManager* internal_; - static IDiscordUserEvents events_; -}; - -} // namespace discord diff --git a/depend/discord/voice_manager.cpp b/depend/discord/voice_manager.cpp deleted file mode 100644 index a92d4bd..0000000 --- a/depend/discord/voice_manager.cpp +++ /dev/null @@ -1,124 +0,0 @@ -#if !defined(_CRT_SECURE_NO_WARNINGS) -#define _CRT_SECURE_NO_WARNINGS -#endif - -#include "voice_manager.h" - -#include "core.h" - -#include -#include - -namespace discord { - -class VoiceEvents final { -public: - static void OnSettingsUpdate(void* callbackData) - { - auto* core = reinterpret_cast(callbackData); - if (!core) { - return; - } - - auto& module = core->VoiceManager(); - module.OnSettingsUpdate(); - } -}; - -IDiscordVoiceEvents VoiceManager::events_{ - &VoiceEvents::OnSettingsUpdate, -}; - -Result VoiceManager::GetInputMode(InputMode* inputMode) -{ - if (!inputMode) { - return Result::InternalError; - } - - auto result = - internal_->get_input_mode(internal_, reinterpret_cast(inputMode)); - return static_cast(result); -} - -void VoiceManager::SetInputMode(InputMode inputMode, std::function callback) -{ - static auto wrapper = [](void* callbackData, EDiscordResult result) -> void { - std::unique_ptr> cb( - reinterpret_cast*>(callbackData)); - if (!cb || !(*cb)) { - return; - } - (*cb)(static_cast(result)); - }; - std::unique_ptr> cb{}; - cb.reset(new std::function(std::move(callback))); - internal_->set_input_mode( - internal_, *reinterpret_cast(&inputMode), cb.release(), wrapper); -} - -Result VoiceManager::IsSelfMute(bool* mute) -{ - if (!mute) { - return Result::InternalError; - } - - auto result = internal_->is_self_mute(internal_, reinterpret_cast(mute)); - return static_cast(result); -} - -Result VoiceManager::SetSelfMute(bool mute) -{ - auto result = internal_->set_self_mute(internal_, (mute ? 1 : 0)); - return static_cast(result); -} - -Result VoiceManager::IsSelfDeaf(bool* deaf) -{ - if (!deaf) { - return Result::InternalError; - } - - auto result = internal_->is_self_deaf(internal_, reinterpret_cast(deaf)); - return static_cast(result); -} - -Result VoiceManager::SetSelfDeaf(bool deaf) -{ - auto result = internal_->set_self_deaf(internal_, (deaf ? 1 : 0)); - return static_cast(result); -} - -Result VoiceManager::IsLocalMute(Snowflake userId, bool* mute) -{ - if (!mute) { - return Result::InternalError; - } - - auto result = internal_->is_local_mute(internal_, userId, reinterpret_cast(mute)); - return static_cast(result); -} - -Result VoiceManager::SetLocalMute(Snowflake userId, bool mute) -{ - auto result = internal_->set_local_mute(internal_, userId, (mute ? 1 : 0)); - return static_cast(result); -} - -Result VoiceManager::GetLocalVolume(Snowflake userId, std::uint8_t* volume) -{ - if (!volume) { - return Result::InternalError; - } - - auto result = - internal_->get_local_volume(internal_, userId, reinterpret_cast(volume)); - return static_cast(result); -} - -Result VoiceManager::SetLocalVolume(Snowflake userId, std::uint8_t volume) -{ - auto result = internal_->set_local_volume(internal_, userId, volume); - return static_cast(result); -} - -} // namespace discord diff --git a/depend/discord/voice_manager.h b/depend/discord/voice_manager.h deleted file mode 100644 index 95b20e9..0000000 --- a/depend/discord/voice_manager.h +++ /dev/null @@ -1,37 +0,0 @@ -#pragma once - -#include "types.h" - -namespace discord { - -class VoiceManager final { -public: - ~VoiceManager() = default; - - Result GetInputMode(InputMode* inputMode); - void SetInputMode(InputMode inputMode, std::function callback); - Result IsSelfMute(bool* mute); - Result SetSelfMute(bool mute); - Result IsSelfDeaf(bool* deaf); - Result SetSelfDeaf(bool deaf); - Result IsLocalMute(Snowflake userId, bool* mute); - Result SetLocalMute(Snowflake userId, bool mute); - Result GetLocalVolume(Snowflake userId, std::uint8_t* volume); - Result SetLocalVolume(Snowflake userId, std::uint8_t volume); - - Event<> OnSettingsUpdate; - -private: - friend class Core; - - VoiceManager() = default; - VoiceManager(VoiceManager const& rhs) = delete; - VoiceManager& operator=(VoiceManager const& rhs) = delete; - VoiceManager(VoiceManager&& rhs) = delete; - VoiceManager& operator=(VoiceManager&& rhs) = delete; - - IDiscordVoiceManager* internal_; - static IDiscordVoiceEvents events_; -}; - -} // namespace discord diff --git a/depend/lib/discord_game_sdk.lib b/depend/lib/discord_game_sdk.lib deleted file mode 100644 index 58ec2820f7544ba9fc53a323b07fa23b662e8634..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2358 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
MfQF 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%0A^v zMgEeRKRovz<+v`Zn}0nyFxBD6zqcP=5u3VtS;DoJ3}foOE#Lp=Qqta3pZ7Cvy#3&A z>MKF^*B9>^o_1==pl@Egqev@#wqfSK=f9O!@A~eiT_yIzuiq53tbEZq=Yr*ep?nfSHJDP#4#1t(itn}ebHg*ql+0o%zH6KJ@=5!pYy!O zbs4o}-wT<`9bVfvXX~8IFk=q-TV6F9Q9p%Y)0RRoWK-GH5ojInpUhk>3H*>mQ z;3@}i8Z9xqL;_M`R9#&dhdPQG(YOrhwo_~kI$9vIUu|7GW@Mb&q-vX)$#Lpf2AB3I=k zTfT|^pML|bNk&?K{F8Y$Baq@Rt;Nual+znvC+w+m^Z_+9Ac=H~9^ z;pXY)<>u`+%5AipkDIT%o4dQahr6e{m%F$7DEHCsKJLCAZXWI)9v+?^ULM{aqdZ1? z_;~nwx_P>LdU$$zdU<+#j`AGs>Er3^<>uw?<>BS&<>lq=HOgzWmyegPx0|=Sw}-c< zx0koK_bBht-ag*GqufThkMbDhIm&C4_oz{$Mvw9tCI$uthv>y$k}g}Hsxg1HVvcK5e&EZ0{}am3e^38^ zf^s%Do0|a0;Zy)6OervFxnxewX<#0~?301rSnvkJjehN^%=R<5NG^;UgTHz%o0D^C zoPx`OTscP+a`>TvWF3Hf$YipjU`mBu9%wZz41sV_fL@C)Ey5&757ubZ8ac-23Y{uD zO+HUq(3unL@-!-Dm7=7Pc8*S^&PG)wghkFpJjKr-NKSiNc?Se+qn2j&0AItj@|(WTzk;PsT3>T$#x8r0*#Buf%tjl?-)` zGMl0prBf=hgowhml`@#i2M_&(@Ioai7W&|PrNA1`mij`A-0F@_t7e;SrL=Cn~E z{3Asj&%S6Y%UQ_DoECGkU_d%x4!$?Rej)H+e8&N_0Gju?1N(H?JK)X=mY2g7_}7gQfy`UfK`AEfGvO;01u$a zAi8r4Qz)#3k^s8`=v~GXWv(h&DMx} zwff|Ad5%V%jA*UI8wLUFfo~6uEYp7mBifEAS)Y)=!#YdJ(r$bw9k)DDi$W$lK zljo`RnJIF0atcOxqJ}5a>!0WQD>;&9M&KNn~DzN&lg_-z%fLk`e znlDY6t<?SKRqtGzGhv0mU+@_&jKt@j1 z>y%{V0;$w1gL9E&!TGVM>)CgdGE0$@uGT1F^MsuhU35B?kQ}u-GaBt4r3(V`gk`Kk zr3+DO+Sv!9!Anvk&(m^&)IDqG+Ujqs1IZ!#Hhzef?PM_9kW9TcJwnKQvCxKcqCPcM zsbLi@DKSiyq)})JV$+q`=D1zAbzOjUB2 zDtlh6H9g{l)_rmc*+r|8=LM?u*}73)OlF8GQ#m<1Rjon$jYOGP5Q?fS6DcCb>u=l{ zZ&ZO+r_3TnM`)DEDy=d=OXOt1v9uM_U7el6@>GmMqoQKL#VY101D~+P1E#P?#(J6) z7nP}0<~-pN7)9Z1&0|rKv0*5iunS0@uUBc5qD63iGIX!XRdUgqg1>X(B9)m+h4x9F zr~3`j@JGXA-}g+fRfe1`>wD{?HZ zsQa$8)+I?8D7oE2Lx$I5NDmD%BHE6;2zvnmByN|mZoQU#i&&P7$nsWLN_X&9Fz z73h?5t#ZCzDRka2v7LjuGY82C2bEfmR#T@@XUZ*=CU~=TN{vRJLv^OP4%RA_Oef%g zn=m!5(#jR`6r@lx=E_m=iu3exbH6fMsmp_I>%)zj>CR+0{0+}IAr%qm8w9iYok2jTZ`y0 z)rjt>(cwKrvu`9-HgrwN%f7YxoE)`A__idUJej)bnMBlThk+?#oF;~|)t-E9mC|Z2 zw2Mi|l9cF3K4dLwG&zp7rdlmEuE=#N78Z*##hhXJZYv(`D>Aw|JF`H}G@@m759A|Q z`b?c%tp}vaHHvJEW7rr-P6CjpeH~LcpmTtfci(Ti8vCN=>J4#iFogb_%9I?ExC^dken0@ z^2v^_cN+?zvvt(h$^p0lA^_yCjR-FQlReE8kQ_ReMRKT5HU!WCK>Q0uJOG$@PKmfk zwEqp^A%63$1HBU61welF08pW)@GHddT?M@g-`xP@H$GXIaMLoQ`^8S+?<0Q8fk{5B zIcLDL0Fp;xCHrR)D8l~0$eLULuo8Fza4N7ja2jwQU<82+2F?Hu2c~=-0!+Q3(ZE^2 z{edZL(}5}MUcjV7CtwQ0^T4E+P~iE%Lx3q}*8-Dnnt@3-4q96orKKF0bmRq0d5!w| zLxH35P3fNwOzB<-+z)saFzI3g@DSiFz@*a}V9NJpI8Of}@K#_-@58{P<3?c8F^wZA zy&vM6(%d1#Rz~^D8JKiE1ekQ}157#&1tuNG0h5k1fja{)0;Vy+8epi8TMtYfqs_nz zfUAHhEsg|(sLatAYannU?3V)TfJ=c_0ULlf08<{?4EzjmIWXnjTHxn^8-S^={Sdeq*d@zW zMtN^Iu-L-MQx#b%RNn1sb(C+R1*EzaQ#Y;OL}=XzD>A7CD4;Hfr5!Vm?NF_1bwWK# zLmHYJV`DyZtB|73Vq-AYR}x!XGP9P%Je7cM3E7z&`Xr5d9;*BtOxI#B0rQjEEk%;p zXjeFf)u!$ zyG=};%B&pB$SK(vij6vj-n`h=VsTXFLqS@OnOmD1_Dy>jtW?LP>a*GKtbIzQtD$1+ z&KAOTCctBrV9C6HwqbqknrE`%Q@Aj#XcmrN2g_KsHq7p&8Cj)1?zl z^Yz%+HYe@ z&S67mEw>5Z$9@v#2`uB&NgB02Cm=Odg@HFJHX0AI0rQjgPakWV$0lhsj*k!qvTBXh z_)!=)-m&sK==WBguCX$ow=xgmTWNGw<_asbgQ=A!&dU6WmATQ%JoZK_y|lj7yc_0^ zZgR3BfV9C@wiEb0fU;4rTM6?D@HR;#vPm`)nFQeaA5OLw_K9aWSuzctk!NzElGBwb z`b-*tqlZbITFOdX=r_CHy?uJYc=o|H2FPKcj5y>!Pv(Vhoh33S*q;J!pQrxmdo1{t z^pVISfL{ZD;vWbz@TV_HWZ}alvgv?7eI>GieiGTDF%nt#XC<9Oyon7vOX`h>(r)G6-0dvs+b7Kp6tx_^lb)fdowTD znaw1}Ok<77{_o%+;%1&-tZ76)CP5;*l!~;6d4_1F_?*YLr}+H}4Dg=u&@WRNn~?|8?s` zcv8*;toGrzPuQ2oHU4-9d=;e<*^ZSG+07*q*<;{JKw_ap)_0jiR!}67`2(I=E|Jmv zl(0&M`azh~M70np&P${HXDbOwSOcK-j@B8~NVO#bN~oTTRL{VwfO*~&{juAaOTR6V z4QiCg4&Ri>0$!KM%8U|OH<;c2e0qMbhdasgr$3Y-DI?uMzjBR4cKo&0{GJ8#V$fRW z|DCYQhg_odTrH9P3aA4RZ4GEU!~bqDzXo@r{rK(eP20l#!he`wb)xvU_>qgJe5(n| z89(uj<|SDvyLZ00^0`h|I`?;nhyMa$|0ffg^{_v4^MsT{*o>42f2;h-}SSC znuN&7pSW~S{<>jq`K%MpFZ?yDAn3IfyLPAS`SGCVx7&`7Yq&Fc{l_8UeLo0UKJRRe zyHYXH-|)uT58M;Ni%U-Ln4S9moRD3YL%Mh97wxrb$F`k4JFXA?sPF!Q$>;y*sKAIY z7pX*RW$ov_Bb90BODQ$c8q6?F(yLOmvD^&ILAAFfwKE#l9t&+Pv4pA9(v;YCNVBX& zLv1kG2WL~?EsUlH+S!FL7ydA0SWSTe%VW@g0=kGKp;U1_>Ka zQNmOITn?b|lN*3KQ2u~WKm;HTkO-g-P!1p;PzYE7SOZuOCL_i^+3{U~6 z15gDi2lxXL0fm4vKn0)AgR4RsU}11v2%t%jLh9nmggTtC+h0#Fm$Q+M zm;No0-3HVHUMxpieuMV*ONlJwYl*C7JIXfNJs0p_g?s1kBrXFd&Qxj4wqKpSmc=7V6@z8yBV<3va8IALnX zbI|i6Iho+0_VoMnLKr7sl*sHZNMy!y64^<>A$)rPWU%`;zIC8`S{NxmuetkleVN1f z3Ecl1y*&io)AXjg^uN=adJ`wxjrf(;p}quc1RR5mpMa^4M6d{c&4-=2&$S0`|4pB( z1a#&;m!l}}X??D6xXGH(K5HbhF*ndB0(bz%1I&6MEET`k{|)WZdWq~`4HDVAf1oc5 zb2zXzPlXK|Xoj&{qyc=?zF5nAQT*nbanDO9n}4i#rXn0+pf&eFXsl(uzDZXNQV}=* zsJPN~gXV9a<+idgzzRSWpnV-obV7|h0`qNJ>{G}??VJrP>|jvBlnR?9wr)x8nVdWR z3h>XoTCM=nl2IR;IXz%B7mCB*VX?a6)?4Z1nw8n@UaPJGl4&_wo~u%4 z3WNR;7=6nlqoXIYtziSmzlqRiiqHp2NLFZd%o6sE#kR7C0J{>*tpQvBLjYcYAV35l z4v+}Q1mpuEA~8<`yb7=uupY1hPzLw}unDjkum!LiPywg{)Bp|xjsZ>qY60f~b%1LC z9?$@21l$2M10DjnR}emc6yN}m0h|EN02hE9;0hQ57!Gg)cmaF>L4XKA93Ta-2(SXM z0k9iz9`F$0@~W+DEFclE2v7#70Pq0274Q$>43God0MUTifOJ4UU@c%P;5@*t6yX5G z0d#=%fZYHd;ItC_0Mem9a5NwXPz?A4kdTmsCB&2=lx7JD$tlX@OyC@a7TsaNPOD3S znLZK{bm=%U!afobQjw}=b1qvJ6Uj(UrpCgfR3u?C5HfWdEaE04Uk7!D0Yl)*SP?kI;u70h$-#K5Q7r zjTiwSGvIl^i19CCFA0a;B#=V@ej4WDg(oH1`ngAF+?`>2xTX?lew zMX)EuWTy${TuK*c0CsvBq`)>&P_v*G+7;2p749j@R0XXrC9AQ6O<-etH}x7JT$FYS zTHS(LpT;lBw`RwxKlYa}@2&i|NVj&jxC=plx|GCRVHk`BLTyeaI+8Tt!OB$*#ZQ?o z|A!!0)3nB3-Wm)m8UIr-xWr_24x62|M1?lF3W`e9r_fRy?POrdkr*7xB~ta)ns%1d z7SmGve!Au66t5&Bm#EIlR$=`zGgGUg6i;kbhLG#667C7NS#zvh!Hb1IMVd0@ zpOn|0?x_l-uvw==J1w$|)3k%IZ28QDJgwFm4xoyg;j!i+Di>uXh%g;QzU4MSY_(fH_mtK59H~xd&?>4zCUOK+%;?N&!oA*w*^WEdaec#zPA?Z;1 z8FfhYg#8D4oUNLFc)}FZ%C)YOPq6ufogC6 zOnm9L2|xQSP5q$kH~LPT)T?R2nP<$ySc?iK!{u}B~jAE^hEqHV9d$KPudZ- z9XY8K!zP$H`j0VZHr6g_w-_1${Dx%fGcyGv4aq8KC`G?#VHShWy=7%K!c4<3`n_gl zUTtMwV`YBb%KV0v`AsYHR-0Ct+pNqqoTGkRCjj*;&AmzM`I$hqCK%-i<0rOl5R@42 zVNR6r4iR^K7jvWlnkyyvCe=pPG0jF+wbMrS3xH_v!2Z)WZDhv*uYYKR+w^Q?&sGcc zXZ8s+L`VFDADLwVzag4w-O%SXVSRHfa9@1;1Jk-`5b$%rVZgNR7!6GA`)pturltVX zur(8yhO0VY@@Nq-4Uda~`vb26?g6|8SPr}vnDn$Bn9{BcnATG_0lNTi0j7?8IWVo` zRscH#*8tOc>@i?kH>?F72wVp|2>2SXD=-gC{fGu&>Ra3aR_5n$IqEzvQ=LZO?go3U zDmxtr>u6erv8kM41sup;0SAWRV8$LWXy>zS@5E2M962W|Rn!IJQZv=8vy-YwV!T=E zlvJ|MOra2AfQRalZ{DFMJihQR=KvHbuvPB4!Z2vd0=-BEf_TA`e>yh&w`(tyeZVal(BX?lX(C|%5Mq;ujW zOzBK=DV@oV(udNPfb1!MkiEC~9Uy)Oir*2y#1kpnM~OHVnB>O;$Zt|6$;kr90i-+1 z8&ClYYauX&b(x5l15+G|03@dvK>V)*sH*rt{N4ym;rs+Z{(KG~x*Y%t*AW1@p9YY- zGn7GksaYe8C#A2WuMXG(cnF~JrOzAa^8>a58Ug-qqK^-#1JF2>#-DC$VGmdVfVh7g zd*Va|+k36U7?k$Gn@5rV?f5ejbHmAykqQ0xh%CsY#t=07ET|BW2$7*ZHXb8T~XtL`ZTtvk*CE-ff`zi985wLXM-9jZGefTv-qbE$4N*RR%?t$it{VrNCPIxKK< z5Xe~FO!YI>SphjY!uk{@|HV#4G#xY$wtR#ub?HJI)1FqC#!vAH7Z9+UjZQ$w)d zHkF$iFqO+j`vyED3V*0B#rF^`{*amMCr=F`BeTb9A2Tb5;iMewqV(BZIM%YGv5!9% z^9a%DdM-qx;-VBfa!XNQ1{v-QgGNgR&}9oI^f}V?8fFPu;A3>))oYju@1P@WA<87I zFKVC%4R8TB1%6J^XL14hG%iY+!%f3v##D7K7o*UW>LGvams2*dq^_YBE8t*^1;_%mLw8s{n+Dk4#A!S-|9^;5S?zj-Q+i z1^98Hp<}YL#;`5BIHyB-4m`+*gro6I0g1)m6!x7C8|ZEe7*O8l(P|fsnwQFdtBu*8Ryl%yMAd3H1-?>PLm({)I2_;9MhBog5vFen)f5&+ z0aM!^fbTTmDDdR~Ph<59@)P2oi*Gt-l?*J%*E6XkNAQPAC;4NJFPUks)$FedW!UT| zOG@T{rbsXNO(htKik}b$p{^6=d(GjYHjZjlbGWEBG~1ZN*w!upF{WRHh{J(LLSO$6 zd+z}j#r3ui4^074H;RhJC@Lx{;8LW>!Y)NcMMXu#lE4Bhpi6OC6pTsGSTL4gV!;+s zQHhl#MlmrFYe<5MCB{M&6D)})qA|7@{qASZjLfbJwDkt`#W4W_dMr3&vWXW znK^TIhJGoPEu>Ep{kh=EhT`eZ@p%YoG0iYMUF(Y!Q}Cb8j6Ik0G7*fPXO2hPJkB>3Pb~1 zU^3n4Z!8YC*TN>z6;nF2n8a6Bp?e|02Ba4KrwI_ zxCL-4Fc*tYMCSpkfg)fc`kpI#R0PU0ji2EULBFMSymaL-n7_7V;gL9YrCZHA{PMMD zw}tC=E=P#XkzrI9>L*8dOdvIUuEzpvo{3xvhqPbIET&Y@V3IFgeq$3^u3)lU!R7%* zt3>9w$4`UZ<|sw(>(9?j1c-dq`s62i*$m~_!U>pPIHJt?{Z_Zpqc$qvyh0_r3_IGy z`2-nv+mH9B!WH#b9&y%mDUD6MZ^0TneiQ3MhB(TbT!B}iSQ2=3+#WxB=lR~V%FRFS zojqalCrwo>?Af!Xst4X7cKL1ZFa1ZzL6y>i-B2+VGkb3FIdfUhOXjlPz=8AP-SLa* zlR zmj_3T8HRt(m?>d@hT*2AFxX4-%|#z?*}84}j-ADyeEQk0 z&v)-B+55$p`@Z^mf9ZjPhYlY(`c2ul-+fbLZ}#_x`&7;Nhdke?R%>=`+sE+``hTQDbWx+a`8Rn>Clc z(xRn(tJZBC+O~VO{c9aMI(F*Z#i?tz?#?}W_HuD`>s|XEiN5}dfIy{69fyay6B3h> zCr;9)q^6}$)@A53r%cVto;GegzM&Occl?{v-+KF<|LOAoPpAJM*FSrm$AGYbg9e8W z89FRt_=u5_qoPJfj~UDAzwY?|74=Ui0r@uJ_ds9^$SN>hIE8_&z|mluTZjeIJVO$g z<_^-qHsCBU&86mmY0fhjOc!c-V454v2R8#3fN5T$2uxRM#bBCKC;_(smx5b@%fR$p zp#n_v`sctjCtC%kx#%0C&$htOA#TgTNJFy6`>+#^pU%1?~^N0UiLZ0S^Q}1P=mp zJ1k^_LDpcppOArvfgQkfui*%e0y~50zCsQj3-$%mU9JlJ4mb>Kh7J%8HU~$8Ex-w2 zOEBHTSb@_aHv&%wHwNc|t-(vcHekB8_!hW7_#t=z*zyzfAFvEO2;3e#80-uV2YZ2sf>q#Q;BasR zI2t?xoB)mjr-SKEYdUx=cmY@gUJafE-Uil!_km}C%fMzBK+b?I!E|qo2en)kWE=1; zur2r@823G#<)`Q$U>Ue2xINe&>+6T4-mw_9D&wy>fRbX52EwCN%r~7IbeVA0x)hcxz%7xa1ppMco*0PTne@YmxJxV=fLg2)nI?{6R;Tu zM!Q|m2Rndm!A@X1upHbDtN{CiBf(~P7?uFG0jGm)!PCL*z`0<5Z~@rN5&a5m1KtO= z1(#7g_zcB6As-YEuAzAF6N(30e~x%(l?&nMJWGAU6*JRxj;8)W`~9%bo)`__=l!T(xMG%?&g;}SXnzFu zseia46x|j3nb;4*EH3LO6h4yQrzdCwG4Id%hbv|kNk0|6m-gvefcl9mW*#Y=`U>Tl z{8N8%#UANUpP_y7PyL3{A|2{GR9?zI^&eN1ocv^p=5h;<+Q9>P38H4#}_|(71C)EQzAEx>w|J2W1kt$usP+y~cDlhdn@=5um zKIaMzx(1?tNBN{#b?SSxKNkPPA>nQ92xWayY%l7MuF$4@QoJj)seQBfabIf}^<7u=0LmwO3f!NsPwK;zH_A^6pXVWbp6Lmo*e>k3=McW^)W>NanEDL$bK0kV zMSY$2$v^dXsyE}ZQ2!U(E{@MXOP7uZF%NW1i2HP0)b6uBM){=ULkv&h+d|AgwIkcl zkl503L-j_s@qC^Kpe5;@71WOGSfH_sO2(|IJakM^E02Mucx;guYF&CS1uJDRUyIa_ z=~!a*p2FAZP`-}XaX640&ikM;gz){3J?mikpmCQxM?;4lSHXNe()cRs)0j&AkLov- zFOPW4kWPfqW-P}M2$A+7b_}rNR@%=(_%dqYk;+SXW5)?=?_j>Zq-`nH7t7xd<)Mw0 zvmf6V*!d@n@26}m3F7m|${fTWyR6Kt?pc{b_`aMW)H;`Cw^>3+YiGU}>7L2!G78^09o-x)N%~ApAFMBbFX(0WrNHd|p_+4dhG9{6_HM%n)<+NWN{EU)E=t-%!3xQeTE`KyP*wdx_|47A4onXEl#JZqkg7v>aeEykEq|oOmFF|}eFr9Gz*cZ!A z_nOQP>&Z-KF#l|e=|l*}EBOgQn~7-!N!nu+-}jhputYyX53F7lVyZ*Bmv;e2f5qNWBgfnWDI`EX2TliH08a;h z0?q{&fR}*Z2N!@(fVY8v0GEJIfe(W}23LUhf-Av?!8gE_;CoOTzA>JIE2btPD8nPvL zHDo#m6@ll1V-aoz-UXS?^+}Lvj;Iv!dT=>-G58#q>bM&G8Mp?#6-;vtbY6V|c|JHD z_Km@I``KJZ7G!J44v;s1oxsPya_}~=0{ksF4EzB&68r@?7JLM(1@8i9fzN_xfh)jy zU^=(22A6`1z^B1ENY4hm3-U>DDflOFIrvBLIq-MjYVhaa8t?(|6Yv?Zbt!&t1GWcm z2Rni@ObbQa1!_;SP#Ag&Hr(f@#dL zJYXT)4VHoTft}HAG-uTwaxR$WpnNDCGR+<3!>=9K3o=~`6eGSjSOr-Reu#Jna5&_h z;Ak*i=M*5kDL4W0FmM*^oWbdkCxYdWJA$V}R)dS6-wd1!8MkiyTw-(Z639!z1z@@! zD1jawpxYqRwP6ALxKcP|I|X)XT$vJFiST*gTi}u4 zGT3{7A41Ls$3pH3wmit*K@|Uh1x!^*5Pku&m1^F*|t$nVn? z7Oe@UaJt^0cWuxL-CA2VS3p-Lbl*fe@qGPIx~}j-bbn4(;=D#OUv@S(#AXiJ`~sULWA`X*W{&N%_7eB$*kk+jU)eCqS;MtY`Py3XAHj~NbU)Wpb*}M;% zQKb1zIyR_`>>ix;W46y`J=r?BiI}IN`3O3468ZXJ^COe^e#Pb~SboI$1tyUV&1p^I z%gp9cCh^B5n>S)Jm25tV&0exO1=e5LJP@0mWb+@)E4yoAvxGEvC?4PJ4vc18*zdOJ zD5LR!&G*oMaUPD%*s{3>)@E#<&FHdu2T_OWh#e1X{)Xj&&Ec^bUp9vq$Cr`qvl(FV z{+-sz(J8&X*|i&cp8;h>P(+%r&gx9cS{eVT(5>w)&gveWz=y`6#5Vsl&UOha>tR9aS#?AI>hKFyc1*>^VI z$l9CDozj1@rLlpv2b(XY)yp&oNaajNisF1An@N(EnT4?b(lW3)(kXm@WpkS>U3ULV z$08k>;`&sQsR!4})X$l25}!WXr(Zyb;Tim~#=_|v8x&6C0!xRhZW3vZFkD&1yT0+w zBrATOQ~mb4zJJAPm$h~ztN+@&b$=oMg+#g*!Wr!If4r;?pPD=2gGa6WwV`|%Cp({~ zS>h5L_oG?A&MVt=>pqOGLsjNW8y}b#<7gzoF(zjG+O z-Sy3r$I@?Kp42h$w>2?z@q^32)Tf7zO|;uL!K0&}n}vD5v0WdYnjAIg;GqkRk<<6x zimXFE-7>vhr$wsc@BP{2_~BXIo7|kvf8wtNtX1uPx)8axe7|~3<<_m^zp)Fo`YW;Z zzLO(%?)kgN!uMmB^yJg%WcS{eZ3-9djQV)(fJWY*4t~8VrZUHN%hMXw`9(z)IqfEO z!C;)=8}6~}o6+z75Im?_-TCA50W!r`x<9Wj*0&l{+H})vx3uSb%1&Q{KiTXK!3x>Zq{wmQU|t6ZA-PS^5~}8ZW*EL@aTt= zOL}~HY}|xpZvN{pzV%qMZRDk?tJXUfk9@TM=+>@F1`qkglAGar=Y~nZ14L4ch>&1IeVvWoTh%dr^Q5d6V%=-uPsbG6y?})N#FV2 zHmj_Y)4%#!GsW@d;clze+(>MdYSU^>ue%d238r6@PHAF}7z zrSvry0)kra8TwttFR+w547qb04+U=2W!ZrtiC{qvpQb ze&T_9b2F#h2z5CzpdjcYE9-9q8+}o5qwK`>QKgTsd>U$YyZCKKr;M(;lQSNbRPV5A z)mRnhKW*6Sg~vUEejb*R(!A4M�?WEe~{E{^L#OSvQxRp6Wla!w%Pu0~~#~FFSes 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 literal 0 HcmV?d00001 diff --git a/resource/common/locale/English.json b/resource/common/locale/English.json index 992fa7f..fad0148 100644 --- a/resource/common/locale/English.json +++ b/resource/common/locale/English.json @@ -279,7 +279,7 @@ "RPC": { "BrowsingCheatMenu": "Browsing CheatMenu", "Busted": "Busted!", - "DoingMission": "Doing {}", + "DoingMission": "Doing mission", "Driving": "Driving", "In": "in", "InsideMenus": "Inside Menus", diff --git a/src/dllmain.cpp b/src/dllmain.cpp index 86a62ea..6d64036 100644 --- a/src/dllmain.cpp +++ b/src/dllmain.cpp @@ -103,7 +103,6 @@ BOOL WINAPI DllMain(HINSTANCE hDllHandle, DWORD nReason, LPVOID Reserved) if (gameVer == BY_GAME(NULL, GAME_10EN, GAME_10EN)) #endif { - SetDllDirectory(PLUGIN_PATH((char*)"CheatMenu/dlls/")); CreateThread(nullptr, NULL, (LPTHREAD_START_ROUTINE)&MenuThread, nullptr, NULL, nullptr); } else diff --git a/src/rpc.cpp b/src/rpc.cpp index d125573..5ec3dc7 100644 --- a/src/rpc.cpp +++ b/src/rpc.cpp @@ -17,13 +17,43 @@ char asciitolower(char in) void RPC::Shutdown() { + if (f_ShutDown) + { + CallDyn<>(int(f_ShutDown)); + } } void RPC::Init() { - discord::ClientId Id = BY_GAME(951199292981403669, 951448264195059712, 951457540573655080); - discord::Result result = discord::Core::Create(Id, DiscordCreateFlags_Default, &pCore); - bInit = result == discord::Result::Ok; + std::string Id = BY_GAME("951199292981403669", "951448264195059712", "951457540573655080"); + + if (!hDll) + { + hDll = NULL; + f_Init = NULL; + f_Update = NULL; + f_ShutDown = NULL; + + hDll = LoadLibrary(PLUGIN_PATH((char*)"CheatMenu/dlls/discord-rpc.dll")); + + if (hDll) + { + f_Init = GetProcAddress(hDll, "Discord_Initialize"); + f_Update = GetProcAddress(hDll, "Discord_UpdatePresence"); + f_ShutDown = GetProcAddress(hDll, "Discord_Shutdown"); + } + } + + if (f_Init) + { + CallDyn((int)f_Init, Id.c_str(), NULL, NULL, NULL); + drpc.startTimestamp = time(0); + bInit = true; + } + else + { + gLog << "Failed to init discord rpc" << std::endl; + } } void RPC::Process() @@ -36,7 +66,6 @@ void RPC::Process() static std::string detailsText, stateText, smallImg, smallImgText, largeImg, largeImgText; static size_t curImage = Random(1, 5); static size_t timer = CTimer::m_snTimeInMilliseconds; - static size_t startTime = CTimer::m_snTimeInMilliseconds; CPlayerInfo *pInfo = &CWorld::Players[CWorld::PlayerInFocus]; CPlayerPed *pPed = pInfo->m_pPed; @@ -76,11 +105,11 @@ void RPC::Process() smallImgText = std::format("{} {} {}", TEXT("RPC.Walking"), TEXT("RPC.In"), Util::GetLocationName(&pPed->GetPosition())); } - size_t seconds = (curTimer - startTime) / 1000; - size_t minutes = (seconds / 60) % 60; - size_t hours = (minutes / 60) % 60; - stateText = std::format(TEXT("RPC.PlayingFor"), hours, minutes, seconds); - + if (BY_GAME(Util::IsOnMission(), false, false)) + { + stateText = TEXT("RPC.DoingMission"); + } + if (CheatMenu::IsMenuShown()) { stateText = TEXT("RPC.BrowsingCheatMenu"); @@ -99,24 +128,17 @@ void RPC::Process() largeImgText = std::format("{}: {} - {}: {}", TEXT("Player.Armour"), pPed->m_fArmour, TEXT("Player.Health"), int(pPed->m_fHealth)); largeImg = std::format("{}{}", BY_GAME("sa", "vc", "3"), curImage); - discord::Activity activity{}; - activity.SetDetails(detailsText.c_str()); - activity.SetState(stateText.c_str()); - activity.GetAssets().SetSmallImage(smallImg.c_str()); - activity.GetAssets().SetSmallText(smallImgText.c_str()); - activity.GetAssets().SetLargeImage(largeImg.c_str()); - activity.GetAssets().SetLargeText(largeImgText.c_str()); + drpc.details = detailsText.c_str(); + drpc.state = stateText.c_str(); + drpc.smallImageKey = smallImg.c_str(); + drpc.smallImageText = smallImgText.c_str(); + drpc.largeImageKey = largeImg.c_str(); + drpc.largeImageText = largeImgText.c_str(); - activity.SetType(discord::ActivityType::Playing); - pCore->ActivityManager().UpdateActivity(activity, - [](discord::Result result) + if (f_Update) { - if (result != discord::Result::Ok) - { - gLog << "Failed to set discord activity!" << std::endl; - } - }); - pCore->RunCallbacks(); + CallDyn(int(f_Update), &drpc); + } if (curTimer - timer > 5*60000) { diff --git a/src/rpc.h b/src/rpc.h index 668f483..5e1f98c 100644 --- a/src/rpc.h +++ b/src/rpc.h @@ -1,12 +1,34 @@ #pragma once -#include "../depend/discord/discord.h" +#include class RPC { private: - static inline discord::Core* pCore; - static inline bool bInit = false; - + typedef struct + { + const char* state; + const char* details; + int64_t startTimestamp; + int64_t endTimestamp; + const char* largeImageKey; + const char* largeImageText; + const char* smallImageKey; + const char* smallImageText; + const char* partyId; + int partySize; + int partyMax; + const char* matchSecret; + const char* joinSecret; + const char* spectateSecret; + int8_t instance; + } DiscordRichPresence; + + static inline FARPROC f_Init, f_ShutDown, f_Update; + static inline DiscordRichPresence drpc; + static inline HMODULE hDll = NULL; + static inline bool bInit; + static void Discord_Initialize(const char* applicationId, int handlers, int autoRegister, const char* optionalSteamId); + static void Discord_UpdatePresence(const DiscordRichPresence* presence); public: RPC() = delete; RPC(RPC&) = delete; diff --git a/src/version.h b/src/version.h index a4597d7..a5fcabe 100644 --- a/src/version.h +++ b/src/version.h @@ -2,5 +2,5 @@ #define MENU_NAME "Cheat Menu" #define MENU_VERSION_NUMBER "3.2" #define MENU_VERSION MENU_VERSION_NUMBER"-beta" -#define BUILD_NUMBER "20220306" +#define BUILD_NUMBER "20220310" #define MENU_TITLE MENU_NAME " v" MENU_VERSION diff --git a/tools/premake5.lua b/tools/premake5.lua index 522e0b0..8c7b6e6 100644 --- a/tools/premake5.lua +++ b/tools/premake5.lua @@ -39,13 +39,7 @@ workspace "CheatMenu" "d3d9", "d3d11", "Pdh", - "urlmon", - "delayimp", - "discord_game_sdk" - } - - linkoptions { - "/DELAYLOAD:discord_game_sdk.dll" + "urlmon" } project "depend"