Discord museum status

This commit is contained in:
fed 2022-10-09 16:39:57 +02:00
parent e14962398a
commit d3fca84cd8

View File

@ -5,8 +5,10 @@
#include "scheduler.hpp" #include "scheduler.hpp"
#include "command.hpp" #include "command.hpp"
#include "console.hpp"
#include <utils/string.hpp> #include <utils/string.hpp>
#include <utils/hook.hpp>
#include <discord_rpc.h> #include <discord_rpc.h>
@ -15,16 +17,21 @@ namespace discord
namespace namespace
{ {
DiscordRichPresence discord_presence; DiscordRichPresence discord_presence;
std::string state;
std::optional<std::string> state{};
std::optional<std::string> details{}; std::optional<std::string> details{};
void update_discord() void update_discord()
{ {
static char details_buf[128] = {0};
static char state_buf[128] = {0};
static char image_key_buf[32] = {0};
Discord_RunCallbacks(); Discord_RunCallbacks();
if (!game::CL_IsCgameInitialized()) if (!game::CL_IsCgameInitialized())
{ {
state = {}; state.reset();
details.reset(); details.reset();
discord_presence.details = game::UI_SafeTranslateString("MENU_MAIN_MENU"); discord_presence.details = game::UI_SafeTranslateString("MENU_MAIN_MENU");
@ -33,16 +40,24 @@ namespace discord
discord_presence.startTimestamp = 0; discord_presence.startTimestamp = 0;
const auto background_index = static_cast<int>(game::Sys_Milliseconds() / 300000) % 10; const auto background_index = static_cast<int>(game::Sys_Milliseconds() / 300000) % 10;
discord_presence.largeImageKey = utils::string::va("bg_%i", background_index); strcpy_s(image_key_buf, sizeof(image_key_buf), utils::string::va("bg_%i", background_index));
discord_presence.largeImageKey = image_key_buf;
} }
else else
{ {
const char* base_mapname = nullptr; const char* base_mapname = nullptr;
auto* map = game::Dvar_FindVar("mapname")->current.string; auto* map = game::Dvar_FindVar("mapname")->current.string;
auto* museum_mode = game::Dvar_FindVar("ui_char_museum_mode")->current.string;
if (game::Com_IsAddonMap(map, &base_mapname)) if (game::Com_IsAddonMap(map, &base_mapname))
{ {
map = base_mapname; map = base_mapname;
} }
if (museum_mode == "free"s)
{
map = "museum";
}
const auto mapname = game::UI_SafeTranslateString(utils::string::va("PRESENCE_SP_%s", map)); const auto mapname = game::UI_SafeTranslateString(utils::string::va("PRESENCE_SP_%s", map));
discord_presence.largeImageKey = map; discord_presence.largeImageKey = map;
@ -57,7 +72,8 @@ namespace discord
} }
else else
{ {
discord_presence.details = utils::string::va("%s", details_.data()); strcpy_s(details_buf, sizeof(details_buf), utils::string::va("%s", details_.data()));
discord_presence.details = details_buf;
} }
} }
else else
@ -65,7 +81,16 @@ namespace discord
discord_presence.details = mapname; discord_presence.details = mapname;
} }
discord_presence.state = state.data(); if (state.has_value())
{
strcpy_s(state_buf, sizeof(state_buf), state.value().data());
discord_presence.state = state_buf;
}
else
{
discord_presence.state = "";
}
if (!discord_presence.startTimestamp) if (!discord_presence.startTimestamp)
{ {
@ -134,7 +159,7 @@ namespace discord
static void errored(const int error_code, const char* message) static void errored(const int error_code, const char* message)
{ {
printf("Discord: (%i) %s", error_code, message); console::error("Discord: (%i) %s", error_code, message);
} }
}; };
} }