mirror of
https://github.com/Cockatrice/Cockatrice.git
synced 2026-07-09 01:23:57 -07:00
[Application] Add discord integration shenanigans
Took 21 seconds Took 16 seconds
This commit is contained in:
parent
3e5124f0c0
commit
094c817206
6 changed files with 180 additions and 1 deletions
|
|
@ -325,6 +325,10 @@ set(cockatrice_SOURCES
|
||||||
src/interface/widgets/tabs/api/edhrec/display/commander/edhrec_commander_api_response_bracket_navigation_widget.h
|
src/interface/widgets/tabs/api/edhrec/display/commander/edhrec_commander_api_response_bracket_navigation_widget.h
|
||||||
src/interface/widgets/tabs/api/edhrec/display/commander/edhrec_commander_api_response_budget_navigation_widget.cpp
|
src/interface/widgets/tabs/api/edhrec/display/commander/edhrec_commander_api_response_budget_navigation_widget.cpp
|
||||||
src/interface/widgets/tabs/api/edhrec/display/commander/edhrec_commander_api_response_budget_navigation_widget.h
|
src/interface/widgets/tabs/api/edhrec/display/commander/edhrec_commander_api_response_budget_navigation_widget.h
|
||||||
|
src/client/network/integrations/discord_social_manager.cpp
|
||||||
|
src/client/network/integrations/discord_social_manager.h
|
||||||
|
src/client/network/integrations/discord_social_client.cpp
|
||||||
|
src/client/network/integrations/discord_social_client.h
|
||||||
src/single_instance_manager.cpp
|
src/single_instance_manager.cpp
|
||||||
src/single_instance_manager.h
|
src/single_instance_manager.h
|
||||||
)
|
)
|
||||||
|
|
@ -337,6 +341,12 @@ configure_file(
|
||||||
|
|
||||||
set(cockatrice_RESOURCES cockatrice.qrc)
|
set(cockatrice_RESOURCES cockatrice.qrc)
|
||||||
|
|
||||||
|
# Define some handy Discord Social SDK variables
|
||||||
|
set(DISCORD_SDK_ROOT "${CMAKE_SOURCE_DIR}/external/discord_social_sdk")
|
||||||
|
set(DISCORD_SDK_LIB_DIR "${DISCORD_SDK_ROOT}/lib/release")
|
||||||
|
set(DISCORD_SDK_BIN_DIR "${DISCORD_SDK_ROOT}/bin/release")
|
||||||
|
set(DISCORD_SDK_INCLUDE_DIR "${DISCORD_SDK_ROOT}/include")
|
||||||
|
|
||||||
if(UPDATE_TRANSLATIONS)
|
if(UPDATE_TRANSLATIONS)
|
||||||
# Cockatrice main sources
|
# Cockatrice main sources
|
||||||
file(GLOB_RECURSE translate_cockatrice_SRCS ${CMAKE_SOURCE_DIR}/cockatrice/src/*.cpp
|
file(GLOB_RECURSE translate_cockatrice_SRCS ${CMAKE_SOURCE_DIR}/cockatrice/src/*.cpp
|
||||||
|
|
@ -427,6 +437,19 @@ elseif(Qt5_FOUND)
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
target_include_directories(cockatrice PRIVATE ${DISCORD_SDK_INCLUDE_DIR})
|
||||||
|
|
||||||
|
if(WIN32)
|
||||||
|
set(DISCORD_LIB_PATH "${DISCORD_SDK_LIB_DIR}/discord_partner_sdk.lib")
|
||||||
|
set(DISCORD_SHARED_LIB "${DISCORD_SDK_BIN_DIR}/discord_partner_sdk.dll")
|
||||||
|
elseif(APPLE)
|
||||||
|
set(DISCORD_LIB_PATH "${DISCORD_SDK_LIB_DIR}/libdiscord_partner_sdk.dylib")
|
||||||
|
set(DISCORD_SHARED_LIB "${DISCORD_SDK_LIB_DIR}/libdiscord_partner_sdk.dylib")
|
||||||
|
else() # Linux
|
||||||
|
set(DISCORD_LIB_PATH "${DISCORD_SDK_LIB_DIR}/libdiscord_partner_sdk.so")
|
||||||
|
set(DISCORD_SHARED_LIB "${DISCORD_SDK_LIB_DIR}/libdiscord_partner_sdk.so")
|
||||||
|
endif()
|
||||||
|
|
||||||
if(Qt5_FOUND)
|
if(Qt5_FOUND)
|
||||||
target_link_libraries(
|
target_link_libraries(
|
||||||
cockatrice
|
cockatrice
|
||||||
|
|
@ -439,6 +462,7 @@ if(Qt5_FOUND)
|
||||||
libcockatrice_rng
|
libcockatrice_rng
|
||||||
libcockatrice_settings
|
libcockatrice_settings
|
||||||
${COCKATRICE_QT_MODULES}
|
${COCKATRICE_QT_MODULES}
|
||||||
|
${DISCORD_LIB_PATH}
|
||||||
)
|
)
|
||||||
else()
|
else()
|
||||||
target_link_libraries(
|
target_link_libraries(
|
||||||
|
|
@ -452,9 +476,27 @@ else()
|
||||||
libcockatrice_rng
|
libcockatrice_rng
|
||||||
libcockatrice_settings
|
libcockatrice_settings
|
||||||
${COCKATRICE_QT_MODULES}
|
${COCKATRICE_QT_MODULES}
|
||||||
|
${DISCORD_LIB_PATH}
|
||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if(UNIX)
|
||||||
|
# Use RPATH when building
|
||||||
|
set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
|
||||||
|
# Set the RPATH to use the lib directory relative to the executable
|
||||||
|
set(CMAKE_INSTALL_RPATH "$ORIGIN")
|
||||||
|
if(APPLE)
|
||||||
|
set(CMAKE_INSTALL_RPATH "@executable_path")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Copy Social SDK shared library to output directory, so it's available at runtime.
|
||||||
|
add_custom_command(
|
||||||
|
TARGET cockatrice
|
||||||
|
POST_BUILD
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E copy_if_different "${DISCORD_SHARED_LIB}" $<TARGET_FILE_DIR:cockatrice>
|
||||||
|
)
|
||||||
|
|
||||||
if(UNIX)
|
if(UNIX)
|
||||||
if(APPLE)
|
if(APPLE)
|
||||||
set(MACOSX_BUNDLE_INFO_STRING "${PROJECT_NAME}")
|
set(MACOSX_BUNDLE_INFO_STRING "${PROJECT_NAME}")
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,90 @@
|
||||||
|
#include "discord_social_client.h"
|
||||||
|
|
||||||
|
#define DISCORDPP_IMPLEMENTATION
|
||||||
|
#include "discordpp.h"
|
||||||
|
|
||||||
|
#include <QDebug>
|
||||||
|
#include <QTimer>
|
||||||
|
|
||||||
|
const uint64_t APPLICATION_ID = 1489873419875913832;
|
||||||
|
|
||||||
|
DiscordSocialClient::DiscordSocialClient(QObject *parent)
|
||||||
|
{
|
||||||
|
Q_UNUSED(parent);
|
||||||
|
|
||||||
|
auto client = std::make_shared<discordpp::Client>();
|
||||||
|
client->AddLogCallback(
|
||||||
|
[](auto message, auto severity) { qInfo() << "[" << EnumToString(severity) << "] " << message; },
|
||||||
|
discordpp::LoggingSeverity::Info);
|
||||||
|
|
||||||
|
client->SetStatusChangedCallback(
|
||||||
|
[client](discordpp::Client::Status status, discordpp::Client::Error error, int32_t errorDetail) {
|
||||||
|
qInfo() << "🔄 Status changed: " << discordpp::Client::StatusToString(status);
|
||||||
|
|
||||||
|
if (status == discordpp::Client::Status::Ready) {
|
||||||
|
qInfo() << "✅ Client is ready! You can now call SDK functions.\n";
|
||||||
|
qInfo() << "👥 Friends Count: " << client->GetRelationships().size();
|
||||||
|
// Configure rich presence details
|
||||||
|
discordpp::Activity activity;
|
||||||
|
activity.SetType(discordpp::ActivityTypes::Playing);
|
||||||
|
activity.SetState("Coding features");
|
||||||
|
activity.SetDetails("Working on integrating Discord");
|
||||||
|
|
||||||
|
// Update rich presence
|
||||||
|
client->UpdateRichPresence(activity, [](discordpp::ClientResult result) {
|
||||||
|
if (result.Successful()) {
|
||||||
|
qInfo() << "🎮 Rich Presence updated successfully!\n";
|
||||||
|
} else {
|
||||||
|
qInfo() << "❌ Rich Presence update failed";
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else if (error != discordpp::Client::Error::None) {
|
||||||
|
qInfo() << "❌ Connection Error: " << discordpp::Client::ErrorToString(error)
|
||||||
|
<< " - Details: " << errorDetail;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Generate OAuth2 code verifier for authentication
|
||||||
|
auto codeVerifier = client->CreateAuthorizationCodeVerifier();
|
||||||
|
|
||||||
|
// Set up authentication arguments
|
||||||
|
discordpp::AuthorizationArgs args{};
|
||||||
|
args.SetClientId(APPLICATION_ID);
|
||||||
|
args.SetScopes(discordpp::Client::GetDefaultPresenceScopes());
|
||||||
|
args.SetCodeChallenge(codeVerifier.Challenge());
|
||||||
|
|
||||||
|
// Begin authentication process
|
||||||
|
client->Authorize(args, [client, codeVerifier](auto result, auto code, auto redirectUri) {
|
||||||
|
if (!result.Successful()) {
|
||||||
|
qInfo() << "❌ Authentication Error: " << result.Error();
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
qInfo() << "✅ Authorization successful! Getting access token...\n";
|
||||||
|
|
||||||
|
// Exchange auth code for access token
|
||||||
|
client->GetToken(APPLICATION_ID, code, codeVerifier.Verifier(), redirectUri,
|
||||||
|
[client](discordpp::ClientResult result, std::string accessToken, std::string refreshToken,
|
||||||
|
discordpp::AuthorizationTokenType tokenType, int32_t expiresIn,
|
||||||
|
std::string scope) {
|
||||||
|
Q_UNUSED(result);
|
||||||
|
Q_UNUSED(expiresIn);
|
||||||
|
Q_UNUSED(refreshToken);
|
||||||
|
Q_UNUSED(tokenType);
|
||||||
|
Q_UNUSED(scope);
|
||||||
|
qInfo() << "🔓 Access token received! Establishing connection...\n";
|
||||||
|
client->UpdateToken(discordpp::AuthorizationTokenType::Bearer, accessToken,
|
||||||
|
[client](discordpp::ClientResult result) {
|
||||||
|
if (result.Successful()) {
|
||||||
|
qInfo() << "🔑 Token updated, connecting to Discord...\n";
|
||||||
|
client->Connect();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
QTimer *timer = new QTimer(this);
|
||||||
|
connect(timer, &QTimer::timeout, this, []() { discordpp::RunCallbacks(); });
|
||||||
|
|
||||||
|
timer->start(10);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,13 @@
|
||||||
|
#ifndef COCKATRICE_DISCORD_SOCIAL_CLIENT_H
|
||||||
|
#define COCKATRICE_DISCORD_SOCIAL_CLIENT_H
|
||||||
|
#include "discordpp.h"
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
|
||||||
|
class DiscordSocialClient : public QObject
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
DiscordSocialClient(QObject *parent = nullptr);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // COCKATRICE_DISCORD_SOCIAL_CLIENT_H
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
#include "discord_social_manager.h"
|
||||||
|
|
||||||
|
DiscordSocialClient *DiscordSocialManager::getInstance()
|
||||||
|
{
|
||||||
|
static DiscordSocialClient instance(nullptr);
|
||||||
|
return &instance;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,24 @@
|
||||||
|
#ifndef COCKATRICE_DISCORD_SOCIAL_MANAGER_H
|
||||||
|
#define COCKATRICE_DISCORD_SOCIAL_MANAGER_H
|
||||||
|
#include "discord_social_client.h"
|
||||||
|
|
||||||
|
class DiscordSocialManager
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
DiscordSocialManager(const DiscordSocialManager &) = delete;
|
||||||
|
|
||||||
|
DiscordSocialManager &operator=(const DiscordSocialManager &) = delete;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Returns the singleton CardDatabase instance.
|
||||||
|
* @return Pointer to the global CardDatabase.
|
||||||
|
*/
|
||||||
|
static DiscordSocialClient *getInstance();
|
||||||
|
|
||||||
|
private:
|
||||||
|
DiscordSocialManager() = default;
|
||||||
|
|
||||||
|
~DiscordSocialManager() = default;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // COCKATRICE_DISCORD_SOCIAL_MANAGER_H
|
||||||
|
|
@ -24,6 +24,7 @@
|
||||||
#include "client/settings/cache_settings.h"
|
#include "client/settings/cache_settings.h"
|
||||||
#include "client/sound_engine.h"
|
#include "client/sound_engine.h"
|
||||||
#include "database/interface/settings_card_preference_provider.h"
|
#include "database/interface/settings_card_preference_provider.h"
|
||||||
|
#include "integrations/discord_social_manager.h"
|
||||||
#include "interface/logger.h"
|
#include "interface/logger.h"
|
||||||
#include "interface/pixel_map_generator.h"
|
#include "interface/pixel_map_generator.h"
|
||||||
#include "interface/theme_manager.h"
|
#include "interface/theme_manager.h"
|
||||||
|
|
@ -258,6 +259,8 @@ int main(int argc, char *argv[])
|
||||||
CardDatabaseManager::setCardDatabasePathProvider(&SettingsCache::instance());
|
CardDatabaseManager::setCardDatabasePathProvider(&SettingsCache::instance());
|
||||||
CardDatabaseManager::setCardSetPriorityController(SettingsCache::instance().cardDatabase());
|
CardDatabaseManager::setCardSetPriorityController(SettingsCache::instance().cardDatabase());
|
||||||
|
|
||||||
|
DiscordSocialManager::getInstance();
|
||||||
|
|
||||||
qCInfo(MainLog) << "Starting main program";
|
qCInfo(MainLog) << "Starting main program";
|
||||||
|
|
||||||
MainWindow ui;
|
MainWindow ui;
|
||||||
|
|
@ -348,5 +351,5 @@ int main(int argc, char *argv[])
|
||||||
CountryPixmapGenerator::clear();
|
CountryPixmapGenerator::clear();
|
||||||
UserLevelPixmapGenerator::clear();
|
UserLevelPixmapGenerator::clear();
|
||||||
|
|
||||||
return 0;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue