diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index f0e209d1e6c523451216c9a6de49291404703839..30fad310fb822f2c826dc890ae955015b29697f6 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -32,7 +32,7 @@ variables: - .\.venv\Scripts\activate.ps1 - pip3 install --upgrade llbase autobuild script: - - autobuild configure -c ReleaseOS -- -DUSE_FMODSTUDIO=ON -DUSE_NVAPI=ON -DUSE_LTO=ON -DDISABLE_FATAL_WARNINGS=ON -DREVISION_FROM_VCS=FALSE + - autobuild configure -c ReleaseOS -- -DUSE_FMODSTUDIO=ON -DUSE_NVAPI=ON -DUSE_DISCORD=ON -DUSE_LTO=ON -DDISABLE_FATAL_WARNINGS=ON -DREVISION_FROM_VCS=FALSE - autobuild build -c ReleaseOS --no-configure - autobuild graph -c ReleaseOS --graph-file alchemy-windows${AUTOBUILD_ADDRSIZE}-dependencies.svg build-vc-64/autobuild-package.xml - | @@ -138,7 +138,7 @@ variables: - source .venv/bin/activate - pip3 install --upgrade llbase autobuild script: - - autobuild configure -c ReleaseOS -- -DUSE_FMODSTUDIO=ON -DUSE_NVAPI=ON -DUSE_LTO=ON -DDISABLE_FATAL_WARNINGS=ON -DREVISION_FROM_VCS=FALSE + - autobuild configure -c ReleaseOS -- -DUSE_FMODSTUDIO=ON -DUSE_NVAPI=ON -DUSE_DISCORD=ON -DUSE_LTO=ON -DDISABLE_FATAL_WARNINGS=ON -DREVISION_FROM_VCS=FALSE - autobuild build -c ReleaseOS --no-configure - autobuild graph -c ReleaseOS --graph-file alchemy-linuxs${AUTOBUILD_ADDRSIZE}-dependencies.svg build-linux-${AUTOBUILD_ADDRSIZE}/autobuild-package.xml - | diff --git a/autobuild.xml b/autobuild.xml index 641aa2b4f06381e358fd716fd735c856dd10d2e9..f7cca9ed4c4aa8c57eb29ad655aff488ee2b85f1 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -455,6 +455,68 @@ <key>version</key> <string>1.0.0</string> </map> + <key>discord-gamesdk</key> + <map> + <key>canonical_repo</key> + <string>https://git.alchemyviewer.org/alchemy/thirdparty/3p-discord-gamesdk</string> + <key>copyright</key> + <string>Copyright (c) Discord.</string> + <key>description</key> + <string>Discord GameSDK for integrating with Discord</string> + <key>license</key> + <string>proprietary</string> + <key>license_file</key> + <string>LICENSES/discord-gamesdk.txt</string> + <key>name</key> + <string>discord-gamesdk</string> + <key>platforms</key> + <map> + <key>darwin64</key> + <map> + <key>archive</key> + <map> + <key>hash</key> + <string>bea8b6231ebe028863654cceaae0a38bd625b722a18ed0f494d8bd2baa8de654454d1d80468308af00c501ed39ff32f942e2ae323efa955d34e9d97cd066525f</string> + <key>hash_algorithm</key> + <string>blake2b</string> + <key>url</key> + <string>https://git.alchemyviewer.org/api/v4/projects/191/packages/generic/discord-gamesdk/3.2.1.1755/discord_gamesdk-3.2.1-darwin64-1755.tar.zst</string> + </map> + <key>name</key> + <string>darwin64</string> + </map> + <key>linux64</key> + <map> + <key>archive</key> + <map> + <key>hash</key> + <string>d8d7ea887b53e132a51c92a0bcf324675404906e53fac2f28a0519a6e021e2ee2d5edf48d86c4527ffa3b4771b902c4cf7c1682bf9adbb37e35782dcb4d3efc8</string> + <key>hash_algorithm</key> + <string>blake2b</string> + <key>url</key> + <string>https://git.alchemyviewer.org/api/v4/projects/191/packages/generic/discord-gamesdk/3.2.1.1755/discord_gamesdk-3.2.1-linux64-1755.tar.zst</string> + </map> + <key>name</key> + <string>linux64</string> + </map> + <key>windows64</key> + <map> + <key>archive</key> + <map> + <key>hash</key> + <string>b8854ca9543c56c3d44cdad48cfdc58beb8daeaa5d6419b7220cf82c7f53a558f955677da194f72011a0621ebf72c65f823bd50e9b97dc3901b7b74e6061a26a</string> + <key>hash_algorithm</key> + <string>blake2b</string> + <key>url</key> + <string>https://git.alchemyviewer.org/api/v4/projects/191/packages/generic/discord-gamesdk/3.2.1.1755/discord_gamesdk-3.2.1-windows64-1755.tar.zst</string> + </map> + <key>name</key> + <string>windows64</string> + </map> + </map> + <key>version</key> + <string>3.2.1</string> + </map> <key>dullahan</key> <map> <key>copyright</key> diff --git a/indra/cmake/CMakeLists.txt b/indra/cmake/CMakeLists.txt index e83871eb459693d5c963e8e367b57b5ff1627500..87e0281a900467cc741a22c34ad6f01f4e79bc8d 100644 --- a/indra/cmake/CMakeLists.txt +++ b/indra/cmake/CMakeLists.txt @@ -19,6 +19,7 @@ set(cmake_SOURCE_FILES Copy3rdPartyLibs.cmake DBusGlib.cmake DeploySharedLibs.cmake + DiscordSDK.cmake DragDrop.cmake EXPAT.cmake FindAPR.cmake diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake index 30256cc993f5416a3f2fa3b031273b2b93fcbc3f..378157180c1e3eb951aa2a0d6148e5e48a78f9a8 100644 --- a/indra/cmake/Copy3rdPartyLibs.cmake +++ b/indra/cmake/Copy3rdPartyLibs.cmake @@ -115,6 +115,10 @@ if(WINDOWS) list(APPEND debug_files kdud.dll) list(APPEND release_files kdu.dll) endif (USE_KDU) + + if(USE_DISCORD) + list(APPEND release_files discord_game_sdk.dll) + endif() #******************************* # Copy MS C runtime dlls, required for packaging. diff --git a/indra/cmake/DiscordSDK.cmake b/indra/cmake/DiscordSDK.cmake new file mode 100644 index 0000000000000000000000000000000000000000..9e84ad5811dac350fc74c27e31148ecd99347514 --- /dev/null +++ b/indra/cmake/DiscordSDK.cmake @@ -0,0 +1,46 @@ +# -*- cmake -*- +include(Linking) +include(Prebuilt) + +if (INSTALL_PROPRIETARY) + set(USE_DISCORD ON) +endif (INSTALL_PROPRIETARY) + +if (USE_DISCORD) + if (STANDALONE) + # In that case, we use the version of the library installed on the system + set(DISCORD_FIND_REQUIRED ON) + include(FindFMODSTUDIO) + else (STANDALONE) + use_prebuilt_binary(discord-gamesdk) + if (WINDOWS) + set(DISCORD_LIBRARY + ${ARCH_PREBUILT_DIRS_RELEASE}/discordgamesdk.lib + ${ARCH_PREBUILT_DIRS_RELEASE}/discord_game_sdk.dll.lib) + elseif (DARWIN) + set(DISCORD_LIBRARY + ${ARCH_PREBUILT_DIRS_RELEASE}/libdiscordgamesdk.a + ${ARCH_PREBUILT_DIRS_RELEASE}/discord_game_sdk.dylib) + elseif (LINUX) + set(DISCORD_LIBRARY + ${ARCH_PREBUILT_DIRS_RELEASE}/libdiscordgamesdk.a + ${ARCH_PREBUILT_DIRS_RELEASE}/discord_game_sdk.so) + endif (WINDOWS) + set(DISCORD_LIBRARIES ${DISCORD_LIBRARY}) + set(DISCORD_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include/discord/) + + add_definitions(-DUSE_DISCORD=1) + endif (STANDALONE) + + if(DEFINED ENV{DISCORD_CLIENTID}) + set(DISCORD_CLIENTID $ENV{SENTRY_DSN} CACHE STRING "Discord Client ID" FORCE) + else() + set(DISCORD_CLIENTID "" CACHE STRING "Discord Client ID") + endif() + + if(DISCORD_CLIENTID STREQUAL "") + message(FATAL_ERROR "You must set a ClientID with -DDISCORD_CLIENTID= to enable Discord integration") + endif() + +endif (USE_DISCORD) + diff --git a/indra/cmake/Variables.cmake b/indra/cmake/Variables.cmake index 656966cb56c2b033c16206d3574ed1212b105a34..78fb64fcb7a2e7993f14a83adfb6bd4ae7285e29 100644 --- a/indra/cmake/Variables.cmake +++ b/indra/cmake/Variables.cmake @@ -57,6 +57,12 @@ if (DEFINED ENV{USE_SENTRY}) set(USE_SENTRY $ENV{USE_SENTRY} CACHE BOOL "" FORCE) endif() +#Discord Integration +option(USE_DISCORD "Enable Discord client integration" OFF) +if (DEFINED ENV{USE_DISCORD}) + set(USE_DISCORD $ENV{USE_DISCORD} CACHE BOOL "" FORCE) +endif() + if(LIBS_CLOSED_DIR) file(TO_CMAKE_PATH "${LIBS_CLOSED_DIR}" LIBS_CLOSED_DIR) else(LIBS_CLOSED_DIR) diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 785e2b4eee9af38f2610f3e664da2b8e25ad175e..ce71a53353c8b886f4e5e8596df08f17f5959f9e 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -14,6 +14,7 @@ include(BuildVersion) include(CMakeCopyIfDifferent) include(CubemapToEquirectangularJS) include(DBusGlib) +include(DiscordSDK) include(DragDrop) include(EXPAT) include(FMODSTUDIO) @@ -101,6 +102,7 @@ include_directories( "${LIBS_PREBUILT_DIR}/include/collada/1.4" ${LLAPPEARANCE_INCLUDE_DIRS} ${TRACY_INCLUDE_DIR} + ${DISCORD_INCLUDE_DIRS} ) if(USE_FMODSTUDIO) @@ -1528,6 +1530,11 @@ set(viewer_HEADER_FILES VorbisFramework.h ) +if(USE_DISCORD) + LIST(APPEND viewer_HEADER_FILES aldiscordmanager.h) + LIST(APPEND viewer_SOURCE_FILES aldiscordmanager.cpp) +endif() + source_group("CMake Rules" FILES ViewerInstall.cmake) #build_data.json creation moved to viewer_manifest.py MAINT-6413 @@ -2034,6 +2041,7 @@ if (WINDOWS) --actions=copy --arch=${ARCH} --artwork=${ARTWORK_DIR} + "--discord=${USE_DISCORD}" "--sentry=${SENTRY_DSN}" "--fmodstudio=${USE_FMODSTUDIO}" "--openal=${USE_OPENAL}" @@ -2095,6 +2103,7 @@ if (WINDOWS) ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py --arch=${ARCH} --artwork=${ARTWORK_DIR} + "--discord=${USE_DISCORD}" "--sentry=${SENTRY_DSN}" "--fmodstudio=${USE_FMODSTUDIO}" "--openal=${USE_OPENAL}" @@ -2211,6 +2220,7 @@ target_link_libraries(${VIEWER_BINARY_NAME} ${LLAPPEARANCE_LIBRARIES} ${TRACY_LIBRARY} ${MINIZIP_LIBRARIES} + ${DISCORD_LIBRARIES} absl::flat_hash_map absl::node_hash_map absl::strings @@ -2263,6 +2273,7 @@ if (LINUX) ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py --arch=${ARCH} --artwork=${ARTWORK_DIR} + "--discord=${USE_DISCORD}" "--sentry=${SENTRY_DSN}" "--fmodstudio=${USE_FMODSTUDIO}" "--openal=${USE_OPENAL}" @@ -2290,6 +2301,7 @@ if (LINUX) --actions=copy --arch=${ARCH} --artwork=${ARTWORK_DIR} + "--discord=${USE_DISCORD}" "--sentry=${SENTRY_DSN}" "--fmodstudio=${USE_FMODSTUDIO}" "--openal=${USE_OPENAL}" diff --git a/indra/newview/aldiscordmanager.cpp b/indra/newview/aldiscordmanager.cpp new file mode 100644 index 0000000000000000000000000000000000000000..858297b50e83b128dfc9fc0d63fda75b7a69fdb7 --- /dev/null +++ b/indra/newview/aldiscordmanager.cpp @@ -0,0 +1,226 @@ +/** +* @file aldiscordmanager.cpp +* @brief Alchemy Discord Integration +* +* $LicenseInfo:firstyear=2021&license=viewerlgpl$ +* Alchemy Viewer Source Code +* Copyright (C) 2022, Alchemy Viewer Project. +* Copyright (C) 2022, Rye Mutt <rye@alchemyviewer.org> +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; +* version 2.1 of the License only. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* $/LicenseInfo$ +*/ + +#include "llviewerprecompiledheaders.h" + +#include "aldiscordmanager.h" + +// library +#include "llevents.h" +#include "lltrans.h" + +// newview +#include "llagent.h" +#include "llappviewer.h" +#include "llviewernetwork.h" +#include "llregioninfomodel.h" +#include "llviewerbuildconfig.h" +#include "llviewercontrol.h" +#include "llviewerregion.h" +#include "rlvactions.h" + +#include "discord.h" + +ALDiscordManager::ALDiscordManager() +{ + LLAppViewer::instance()->setOnLoginCompletedCallback(boost::bind(&ALDiscordManager::onLoginCompleted, this)); + + gSavedPerAccountSettings.getControl("ALDiscordIntegration")->getSignal()->connect([this](LLControlVariable* control, const LLSD& new_val, const LLSD& old_val) + { + bool discord_enabled = new_val; + if(discord_enabled) + { + init(); + } + else + { + shutdown(); + } + }); + + if(gSavedPerAccountSettings.getBool("ALDiscordIntegration")) + { + init(); + } +} + +ALDiscordManager::~ALDiscordManager() +{ + shutdown(); +} + +void ALDiscordManager::init() +{ + if(initialized()) return; + + discord::Core* core{}; + auto result = discord::Core::Create(DISCORD_CLIENTID, DiscordCreateFlags_NoRequireDiscord, &core); + mDiscord.reset(core); + if (!mDiscord) { + LL_WARNS() << "Failed to instantiate discord core! (err " << static_cast<int>(result) + << ")" << LL_ENDL; + return; + } + + mDiscord->SetLogHook( + discord::LogLevel::Info, [](discord::LogLevel level, const char* message) + { + switch (level) + { + case discord::LogLevel::Error: + case discord::LogLevel::Warn: + { + LL_WARNS() << "Discord: " << message << LL_ENDL; + break; + } + case discord::LogLevel::Info: + { + LL_INFOS() << "Discord: " << message << LL_ENDL; + break; + } + case discord::LogLevel::Debug: + { + LL_DEBUGS() << "Discord: " << message << LL_ENDL; + break; + } + } + }); + + discord::Activity activity{}; + activity.GetAssets().SetLargeImage("alchemy_1024"); + activity.GetAssets().SetLargeText("Alchemy Viewer"); + activity.SetType(discord::ActivityType::Playing); + mDiscord->ActivityManager().UpdateActivity(activity, [](discord::Result result) { + LL_INFOS() << ((result == discord::Result::Ok) ? "Succeeded" : "Failed") + << " updating activity!" << LL_ENDL; + }); + + LLEventPumps::instance().obtain("mainloop").listen("ALDiscordManager", boost::bind(&ALDiscordManager::update, this, _1)); +} + +void ALDiscordManager::shutdown() +{ + LLEventPumps::instance().obtain("mainloop").stopListening("ALDiscordManager"); + mDiscord.reset(); +} + +bool ALDiscordManager::update(const LLSD&) +{ + if(mDiscord) + { + mDiscord->RunCallbacks(); + } + static LLFrameTimer timer; + if(timer.checkExpirationAndReset(5.f)) + { + updateActivity(); + } + + return true; +} + +void ALDiscordManager::onLoginCompleted() +{ + mLoggedInTime = LLDate::now().secondsSinceEpoch(); + updateActivity(); +} + +void ALDiscordManager::updateActivity() +{ + LLViewerRegion* region = gAgent.getRegion(); + if (!mDiscord || !region) + { + return; + } + + discord::Activity activity{}; + activity.SetType(discord::ActivityType::Playing); + + static LLCachedControl<bool> discord_shared_region(gSavedPerAccountSettings, "ALDiscordShareLocationRegion", true); + static LLCachedControl<U32> discord_shared_region_maturity(gSavedPerAccountSettings, "ALDiscordShareRegionMaxMaturity", true); + std::string region_name; + if (RlvActions::canShowLocation() && discord_shared_region && region->getSimAccess() > discord_shared_region_maturity) + { + const LLVector3& pos = gAgent.getPositionAgent(); + region_name = fmt::format(FMT_COMPILE("{} ({:.0f}, {:.0f}, {:.0f})"), region->getName(), pos.mV[VX], pos.mV[VY], pos.mV[VZ]); + } + else + { + region_name = "Hidden Region"; + } + activity.SetState(region_name.c_str()); + + static LLCachedControl<bool> discord_shared_name(gSavedPerAccountSettings, "ALDiscordShareName", true); + if (RlvActions::canShowName(RlvActions::SNC_DEFAULT, gAgentID) && discord_shared_name) + { + std::string name; + LLAvatarName av_name; + if (LLAvatarNameCache::get(gAgentID, &av_name)) + { + name = av_name.getCompleteName(true, true); + } + else + { + name = gAgentUsername; + } + activity.SetDetails(name.c_str()); + } + + if(mLoggedInTime > 0.0) + { + activity.GetTimestamps().SetStart(mLoggedInTime); + } + + if (LLGridManager::getInstance()->isInSecondlife()) + { + activity.GetAssets().SetLargeImage("secondlife_512"); + } + else + { + activity.GetAssets().SetLargeImage("opensim_512"); + } + + activity.GetAssets().SetLargeText(LLGridManager::getInstance()->getGridLabel().c_str()); + activity.GetAssets().SetSmallImage("alchemy_1024"); + + static std::string app_str = fmt::format("via {}", LLTrans::getString("APP_NAME")); + activity.GetAssets().SetSmallText(app_str.c_str()); + + std::string regionId = region->getRegionID().asString(); + activity.GetParty().GetSize().SetCurrentSize(region->mMapAvatars.size()); + S32 max_agents = LLRegionInfoModel::instance().mAgentLimit; + if(max_agents > 1) + { + activity.GetParty().GetSize().SetMaxSize(max_agents); + } + activity.GetParty().SetId(regionId.c_str()); + activity.GetParty().SetPrivacy(discord::ActivityPartyPrivacy::Public); + + mDiscord->ActivityManager().UpdateActivity(activity, [](discord::Result result) { + LL_INFOS() << ((result == discord::Result::Ok) ? "Succeeded" : "Failed") + << " updating activity!" << LL_ENDL; + }); +} diff --git a/indra/newview/aldiscordmanager.h b/indra/newview/aldiscordmanager.h new file mode 100644 index 0000000000000000000000000000000000000000..5cf39d1d14da2dfd62cad08a78707bb5cde9c550 --- /dev/null +++ b/indra/newview/aldiscordmanager.h @@ -0,0 +1,55 @@ +/** +* @file aldiscordmanager.h +* @brief Alchemy Discord Integration +* +* $LicenseInfo:firstyear=2021&license=viewerlgpl$ +* Alchemy Viewer Source Code +* Copyright (C) 2022, Alchemy Viewer Project. +* Copyright (C) 2022, Rye Mutt <rye@alchemyviewer.org> +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; +* version 2.1 of the License only. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* $/LicenseInfo$ +*/ + +#ifndef AL_DISCORDMANAGER_H +#define AL_DISCORDMANAGER_H + +#include "llsingleton.h" + +#include "discord.h" + +class ALDiscordManager final +: public LLSingleton<ALDiscordManager> +{ + LLSINGLETON(ALDiscordManager); + ~ALDiscordManager(); + +public: + bool initialized() { return mDiscord != nullptr; } + void init(); + void shutdown(); + bool update(const LLSD&); + +private: + void onLoginCompleted(); + void updateActivity(); + + std::unique_ptr<discord::Core> mDiscord; + F64 mLoggedInTime = 0.0; +}; + + +#endif // AL_DISCORDMANAGER_H \ No newline at end of file diff --git a/indra/newview/app_settings/settings_per_account_alchemy.xml b/indra/newview/app_settings/settings_per_account_alchemy.xml index 4bb92914d4090dc45d008d527591ee7f67862df4..3923fac6dbba541f096b344b30f5735e75fb4b6d 100644 --- a/indra/newview/app_settings/settings_per_account_alchemy.xml +++ b/indra/newview/app_settings/settings_per_account_alchemy.xml @@ -11,6 +11,50 @@ <key>Value</key> <integer>0</integer> </map> + <key>ALDiscordIntegration</key> + <map> + <key>Comment</key> + <string>Enable discord integration</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> + <key>ALDiscordShareLocationRegion</key> + <map> + <key>Comment</key> + <string>Share avatar region to discord</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> + <key>ALDiscordShareRegionMaxMaturity</key> + <map> + <key>Comment</key> + <string>Maximum maturity of location shared to Discord</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>U32</string> + <key>Value</key> + <integer>0</integer> + </map> + <key>ALDiscordShareName</key> + <map> + <key>Comment</key> + <string>Share avatar name to discord</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> <key>AlchemyMouselookAlternativeFOV</key> <map> <key>Comment</key> diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 902a119be5ba5bedad5e4b1472b42be4f9c3e503..ececbccbd43e16a04fb9330e36757e26a145f16e 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -256,6 +256,10 @@ using namespace LL; #include "llcoproceduremanager.h" #include "llviewereventrecorder.h" +#if USE_DISCORD +#include "aldiscordmanager.h" +#endif + // *FIX: These extern globals should be cleaned up. // The globals either represent state/config/resource-storage of either // this app, or another 'component' of the viewer. App globals should be @@ -1296,6 +1300,11 @@ bool LLAppViewer::init() } #endif +#if USE_DISCORD + ALDiscordManager::getInstance(); + LL_INFOS("AppInit") << "Discord Integration Initialized." << LL_ENDL; +#endif + return true; } diff --git a/indra/newview/llviewerbuildconfig.h.in b/indra/newview/llviewerbuildconfig.h.in index 09e01a0fcf210e277d3a33ed654fcab576b8a2de..141304158fe23f5c6bb231df499b1261bfcd2f8d 100644 --- a/indra/newview/llviewerbuildconfig.h.in +++ b/indra/newview/llviewerbuildconfig.h.in @@ -46,6 +46,9 @@ // Sentry #define SENTRY_DSN "@SENTRY_DSN@" +// Discord +#define DISCORD_CLIENTID @DISCORD_CLIENTID@ + // Graphics Utils #cmakedefine01 USE_NVAPI diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 377cb383b2fa475d3fc1fd172770a46b9a787f46..be59b03dca62acccba67f8e762c3e848a5ab7a10 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -529,6 +529,9 @@ def construct(self): with self.prefix(src=os.path.join(pkgdir, 'bin', 'release')): self.path("crashpad_handler.exe") + if self.args.get('discord'): + self.path("discord_game_sdk.dll") + self.path(src="licenses-win32.txt", dst="licenses.txt") self.path("featuretable.txt") self.path("cube.dae") @@ -1218,6 +1221,9 @@ def construct(self): if self.args['fmodstudio'] == 'ON' or self.args['fmodstudio'] == 'TRUE': self.path("libfmod.so*") + if self.args.get('discord'): + self.path("discord_game_sdk.so") + # Vivox runtimes with self.prefix(src=os.path.join(pkgdir, 'bin', 'release'), dst="bin"): self.path("SLVoice") @@ -1256,6 +1262,9 @@ def construct(self): if self.args['fmodstudio'] == 'ON' or self.args['fmodstudio'] == 'TRUE': self.path("libfmod.so*") + if self.args.get('discord'): + self.path("discord_game_sdk.so") + # Vivox runtimes with self.prefix(src=os.path.join(pkgdir, 'bin', 'release'), dst="bin"): self.path("SLVoice") @@ -1278,6 +1287,7 @@ def construct(self): ' '.join((("'%s'" % arg) if ' ' in arg else arg) for arg in sys.argv)))) # fmodstudio and openal can be used simultaneously and controled by environment extra_arguments = [ + dict(name='discord', description="""Enable Discord integration""", default=''), dict(name='sentry', description="""Enable Sentry crash report system""", default=''), dict(name='fmodstudio', description="""Indication if fmod studio libraries are needed""", default='OFF'), dict(name='openal', description="""Indication if openal libraries are needed""", default='OFF'),