diff options
Diffstat (limited to 'source/application/StarPlatformServices_pc.cpp')
-rw-r--r-- | source/application/StarPlatformServices_pc.cpp | 175 |
1 files changed, 175 insertions, 0 deletions
diff --git a/source/application/StarPlatformServices_pc.cpp b/source/application/StarPlatformServices_pc.cpp new file mode 100644 index 0000000..7e528f0 --- /dev/null +++ b/source/application/StarPlatformServices_pc.cpp @@ -0,0 +1,175 @@ +#include "StarLogging.hpp" +#include "StarPlatformServices_pc.hpp" +#include "StarP2PNetworkingService_pc.hpp" + +#ifdef STAR_ENABLE_STEAM_INTEGRATION +#include "StarStatisticsService_pc_steam.hpp" +#include "StarUserGeneratedContentService_pc_steam.hpp" +#include "StarDesktopService_pc_steam.hpp" +#endif + +namespace Star { + +#ifdef STAR_ENABLE_DISCORD_INTEGRATION +uint64_t const DiscordClientId = 467102538278109224; +#endif + +PcPlatformServicesState::PcPlatformServicesState() +#ifdef STAR_ENABLE_STEAM_INTEGRATION + : callbackGameOverlayActivated(this, &PcPlatformServicesState::onGameOverlayActivated) { +#else + { +#endif + +#ifdef STAR_ENABLE_STEAM_INTEGRATION + if (SteamAPI_Init()) { + steamAvailable = true; + Logger::info("Initialized Steam platform services"); + } else { + Logger::info("Failed to initialize Steam platform services"); + } +#endif + +#ifdef STAR_ENABLE_DISCORD_INTEGRATION + static int64_t const DiscordEventSleep = 3; + + discord::Core* discordCorePtr = nullptr; + discord::Result res = discord::Core::Create(DiscordClientId, DiscordCreateFlags_NoRequireDiscord, &discordCorePtr); + if (res == discord::Result::Ok && discordCorePtr) { + discordCore.reset(discordCorePtr); + discordAvailable = true; + + discordCore->UserManager().OnCurrentUserUpdate.Connect([this](){ + discord::User user; + auto res = discordCore->UserManager().GetCurrentUser(&user); + if (res != discord::Result::Ok) + Logger::error("Could not get current discord user. (err %s)", (int)res); + else + discordCurrentUser = user; + }); + + } else { + Logger::error("Failed to instantiate discord core (err %s)", (int)res); + } + + if (discordAvailable) { + MutexLocker locker(discordMutex); + discordCore->SetLogHook(discord::LogLevel::Info, [](discord::LogLevel level, char const* msg) { + if (level == discord::LogLevel::Debug) + Logger::debug("[DISCORD]: %s", msg); + else if (level == discord::LogLevel::Error) + Logger::debug("[DISCORD]: %s", msg); + else if (level == discord::LogLevel::Info) + Logger::info("[DISCORD]: %s", msg); + else if (level == discord::LogLevel::Warn) + Logger::warn("[DISCORD]: %s", msg); + }); + discordEventShutdown = false; + discordEventThread = Thread::invoke("PcPlatformServices::discordEventThread", [this]() { + while (!discordEventShutdown) { + { + MutexLocker locker(discordMutex); + discordCore->RunCallbacks(); + discordCore->LobbyManager().FlushNetwork(); + } + Thread::sleep(DiscordEventSleep); + } + }); + + Logger::info("Initialized Discord platform services"); + } else { + Logger::info("Was not able to authenticate with Discord and create all components, Discord services will be unavailable"); + } +#endif +} + +PcPlatformServicesState::~PcPlatformServicesState() { +#ifdef STAR_ENABLE_DISCORD_INTEGRATION + if (discordAvailable) { + discordEventShutdown = true; + discordEventThread.finish(); + } +#endif +} + +#ifdef STAR_ENABLE_STEAM_INTEGRATION +void PcPlatformServicesState::onGameOverlayActivated(GameOverlayActivated_t* callback) { + overlayActive = callback->m_bActive; +} +#endif + +PcPlatformServicesUPtr PcPlatformServices::create(String const& path, StringList platformArguments) { + auto services = unique_ptr<PcPlatformServices>(new PcPlatformServices); + + services->m_state = make_shared<PcPlatformServicesState>(); + + bool provideP2PNetworking = false; + +#ifdef STAR_ENABLE_STEAM_INTEGRATION + provideP2PNetworking |= services->m_state->steamAvailable; +#endif + +#ifdef STAR_ENABLE_DISCORD_INTEGRATION + provideP2PNetworking |= services->m_state->discordAvailable; +#endif + + if (provideP2PNetworking) { + auto p2pNetworkingService = make_shared<PcP2PNetworkingService>(services->m_state); + for (auto& argument : platformArguments) { + if (argument.beginsWith("+platform:connect:")) { + Logger::info("PC platform services joining from command line argument '%s'", argument); + p2pNetworkingService->addPendingJoin(move(argument)); + } else { + throw ApplicationException::format("Unrecognized PC platform services command line argument '%s'", argument); + } + } + + services->m_p2pNetworkingService = p2pNetworkingService; + } + +#ifdef STAR_ENABLE_STEAM_INTEGRATION + if (services->m_state->steamAvailable) { + services->m_statisticsService = make_shared<SteamStatisticsService>(services->m_state); + services->m_userGeneratedContentService = make_shared<SteamUserGeneratedContentService>(services->m_state); + services->m_desktopService = make_shared<SteamDesktopService>(services->m_state); + } +#endif + +#ifdef STAR_ENABLE_DISCORD_INTEGRATION + MutexLocker discordLocker(services->m_state->discordMutex); + if (services->m_state->discordAvailable) { + Logger::debug("Registering starbound to discord at path: %s", path); + services->m_state->discordCore->ActivityManager().RegisterCommand(path.utf8Ptr()); + } +#endif + + return services; +} + +StatisticsServicePtr PcPlatformServices::statisticsService() const { + return m_statisticsService; +} + +P2PNetworkingServicePtr PcPlatformServices::p2pNetworkingService() const { + return m_p2pNetworkingService; +} + +UserGeneratedContentServicePtr PcPlatformServices::userGeneratedContentService() const { + return m_userGeneratedContentService; +} + +DesktopServicePtr PcPlatformServices::desktopService() const { + return m_desktopService; +} + +bool PcPlatformServices::overlayActive() const { + return m_state->overlayActive; +} + +void PcPlatformServices::update() { +#ifdef STAR_ENABLE_STEAM_INTEGRATION + SteamAPI_RunCallbacks(); +#endif +} + +} |