diff --git a/Globals.h b/Globals.h index e6ceb265..ef6c9e93 100644 --- a/Globals.h +++ b/Globals.h @@ -16,6 +16,7 @@ http://mozilla.org/MPL/2.0/. #include "light.h" #include "utilities.h" #include "motiontelemetry.h" +#include "ref/discord-rpc/include/discord_rpc.h" #ifdef WITH_UART #include "uart.h" #endif @@ -23,10 +24,17 @@ http://mozilla.org/MPL/2.0/. #include "zmq_input.h" #endif +struct DiscordData +{ + DiscordRichPresence dcRcp; + char *scnName = ""; +}; + struct global_settings { // members // data items // TODO: take these out of the settings + DiscordData dcData; bool shiftState{ false }; //m7todo: brzydko bool ctrlState{ false }; bool altState{ false }; diff --git a/application.cpp b/application.cpp index a6762cc7..6b3b728a 100644 --- a/application.cpp +++ b/application.cpp @@ -29,6 +29,8 @@ http://mozilla.org/MPL/2.0/. #include "Timer.h" #include "dictionary.h" #include "version_info.h" +#include "ref/discord-rpc/include/discord_rpc.h" +#include #ifdef _WIN32 #pragma comment (lib, "dsound.lib") @@ -239,6 +241,43 @@ eu07_application::init( int Argc, char *Argv[] ) { if (!init_network()) return -1; + // initialize discord-rpc + WriteLog("Initializing Discord Rich Presence..."); + static const char *discord_app_id = "1343662664504840222"; + DiscordEventHandlers handlers; + memset(&handlers, 0, sizeof(handlers)); + Discord_Initialize(discord_app_id, &handlers, 1, nullptr); + + std::string rpcScnName = Global.SceneryFile; + if (rpcScnName[0] == '$') + rpcScnName.erase(0, 1); + rpcScnName.erase(rpcScnName.size() - 4, 4); + if (rpcScnName.find('_') != std::string::npos) + { + std::replace(rpcScnName.begin(), rpcScnName.end(), '_', ' '); + } + + // calculate startup timestamp + auto now = std::chrono::system_clock::now(); + auto now_c = std::chrono::system_clock::to_time_t(now); + + // Init RPC object + static DiscordRichPresence discord_rpc; + memset(&discord_rpc, 0, sizeof(discord_rpc)); + // realworld timestamp from datetime + discord_rpc.startTimestamp = static_cast(now_c); + static std::string state = "Sceneria: " + rpcScnName; + discord_rpc.state = state.c_str(); + discord_rpc.details = "Ɓadowanie scenerii"; + discord_rpc.largeImageKey = "logo"; + discord_rpc.largeImageText = "MaSzyna"; + Global.dcData.dcRcp = discord_rpc; + + // First RPC upload + Discord_UpdatePresence(&Global.dcData.dcRcp); + + + return result; } @@ -282,6 +321,19 @@ eu07_application::run() { // main application loop while (!glfwWindowShouldClose( m_windows.front() ) && !m_modestack.empty()) { + // Discord RPC updater + if (simulation::is_ready) + { + std::string PlayerVehicle = simulation::Train->name(); + // make to upper + for (auto &c : PlayerVehicle) c = toupper(c); + + PlayerVehicle = "Prowadzi: " + PlayerVehicle; + Global.dcData.dcRcp.details = PlayerVehicle.c_str(); + Discord_UpdatePresence(&Global.dcData.dcRcp); + } + + Timer::subsystem.mainloop_total.start(); glfwPollEvents();