Skip to content

Commit

Permalink
Fix #1357: discord crashes from a4f447a (#1358)
Browse files Browse the repository at this point in the history
* Fix a bug with discord rich presence not respecting CVars load

* Fix crash at #1349

* Fix coding style

* Fix all the bugs which caused crash after a4f447a

* Move all the initialization values to class declaration

* Addendum ea42a3c
  • Loading branch information
0x416c69 committed Apr 8, 2020
1 parent 35ce166 commit 16d249d
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 36 deletions.
6 changes: 3 additions & 3 deletions Client/core/CCore.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,9 @@ CCore::CCore() : m_DiscordManager(new CDiscordManager())
ApplyCoreInitSettings();
g_pLocalization = new CLocalization;

// Initialize discord manager
m_DiscordManager->Initialize();

// Create a logger instance.
m_pConsoleLogger = new CConsoleLogger();

Expand Down Expand Up @@ -1006,9 +1009,6 @@ void CCore::CreateXML()

// Load XML-dependant subsystems
m_ClientVariables.Load();

// Initialize discord rich presence after client variables have been loaded completely as it is dependant on CVars
m_DiscordManager->Initialize();
}

void CCore::DestroyGame()
Expand Down
20 changes: 6 additions & 14 deletions Client/core/CDiscordManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,6 @@
#define DISCORD_CLIENT_ID 468493322583801867
#endif

CDiscordManager::CDiscordManager() : m_DiscordCore(nullptr), m_Suicide(false), m_WaitingForServerName(false), m_StoredActivity{}, m_Initialized(false)
{

}

CDiscordManager::~CDiscordManager()
{
m_Suicide = true;
Expand All @@ -37,6 +32,8 @@ CDiscordManager::~CDiscordManager()

void CDiscordManager::Initialize()
{
if (m_Initialized) return;

Reconnect(true); // Try to interact with discord on construction
m_Thread = new CThreadHandle(CDiscordManager::DiscordThread, this);

Expand Down Expand Up @@ -175,10 +172,11 @@ void* CDiscordManager::DiscordThread(void* arg)
// establishing connection with discord is sometimes time-consuming, especially when it's not running
void CDiscordManager::DoPulse()
{
if (!m_Initialized) return; // Wait until initialization

m_ThreadSafety.lock();
if (!m_DiscordCore)
{
m_ThreadSafety.unlock();

// Discord is not initialized, maybe it's not installed or not yet running
// So every 15sec we will check if the player got discord running
if (m_TimeForReconnection.Get() >= 15000)
Expand All @@ -189,6 +187,7 @@ void CDiscordManager::DoPulse()

return;
}
m_ThreadSafety.unlock();

std::lock_guard<std::mutex> guardian(m_ThreadSafety);

Expand Down Expand Up @@ -364,13 +363,6 @@ void CDiscordManager::Disconnect()
SAFE_DELETE(m_DiscordCore);
}

void CDiscordManager::DisconnectNotification()
{
std::lock_guard<std::mutex> guardian(m_ThreadSafety);
m_WaitingForServerName = false; // No longer wait
m_QueryReceiver.InvalidateSocket();
}

SString CDiscordManager::GetJoinSecret()
{
return CCore::GetSingleton().GetConnectManager()->GetJoinSecret();
Expand Down
34 changes: 15 additions & 19 deletions Client/core/CDiscordManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,16 +17,9 @@
class CDiscordManager : public CDiscordManagerInterface
{
public:
CDiscordManager();
~CDiscordManager();

static void DiscordLogCallback(discord::LogLevel level, const char* message);
static void OnActivityJoin(const char* joinSecret);
static void* DiscordThread(void* arg);

void Initialize();
void Reconnect(bool bOnInitialization = false);
void DoPulse();

// ActivityManager
void UpdateActivity(SDiscordActivity& activity, std::function<void(EDiscordRes)> callback); // Change it all, or ...
Expand All @@ -41,27 +34,30 @@ class CDiscordManager : public CDiscordManagerInterface
void RegisterPlay(bool connected);
void Disconnect();

discord::Activity GetStoredActivity() const { return m_StoredActivity; } // For retrieving stored information in rich presence

bool NeedsSuicide() const { return m_Suicide; }
void SetDead() { m_Suicide = false; }
void DisconnectNotification();

SString GetJoinSecret();

private:
void Reconnect(bool bOnInitialization = false);
void DoPulse();
void Restore();

discord::Core* m_DiscordCore;
discord::Activity m_StoredActivity;
static void DiscordLogCallback(discord::LogLevel level, const char* message);
static void OnActivityJoin(const char* joinSecret);
static void* DiscordThread(void* arg);

bool NeedsSuicide() const { return m_Suicide; }
void SetDead() { m_Suicide = false; }

discord::Core* m_DiscordCore = nullptr;
discord::Activity m_StoredActivity{};

bool m_WaitingForServerName;
bool m_Initialized;
bool m_WaitingForServerName = false;
bool m_Initialized = false;

volatile bool m_Suicide; // Thread kill command
volatile bool m_Suicide = false; // Thread kill command

std::mutex m_ThreadSafety;
SharedUtil::CThreadHandle* m_Thread;
SharedUtil::CThreadHandle* m_Thread = nullptr;

CElapsedTime m_TimeForReconnection;
CQueryReceiver m_QueryReceiver;
Expand Down

0 comments on commit 16d249d

Please sign in to comment.