diff --git a/rpcs3/rpcs3.vcxproj b/rpcs3/rpcs3.vcxproj
index bb843931b6..01a4d1f1dd 100644
--- a/rpcs3/rpcs3.vcxproj
+++ b/rpcs3/rpcs3.vcxproj
@@ -985,6 +985,7 @@
+
@@ -1424,6 +1425,7 @@
.\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp
"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DQT_OPENGL_LIB -DQT_WIDGETS_LIB -DQT_QUICK_LIB -DQT_GUI_LIB -DQT_QML_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DQT_WINEXTRAS_LIB -DLLVM_AVAILABLE -D_SCL_SECURE_NO_WARNINGS -D_UNICODE "-I$(VULKAN_SDK)\Include" "-I.\.." "-I.\..\3rdparty\minidx12\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtQuick" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtANGLE" "-I$(QTDIR)\include\QtQml" "-I$(QTDIR)\include\QtNetwork" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I$(QTDIR)\mkspecs\win32-msvc2015" "-I.\QTGeneratedFiles\$(ConfigurationName)\." "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtWinExtras"
+
diff --git a/rpcs3/rpcs3.vcxproj.filters b/rpcs3/rpcs3.vcxproj.filters
index 797257d46b..3f5393619c 100644
--- a/rpcs3/rpcs3.vcxproj.filters
+++ b/rpcs3/rpcs3.vcxproj.filters
@@ -638,6 +638,9 @@
Generated Files
+
+ Gui\utils
+
@@ -721,6 +724,9 @@
Gui
+
+ Gui\utils
+
diff --git a/rpcs3/rpcs3_app.cpp b/rpcs3/rpcs3_app.cpp
index fe9e45d9a6..661226805b 100644
--- a/rpcs3/rpcs3_app.cpp
+++ b/rpcs3/rpcs3_app.cpp
@@ -5,8 +5,7 @@
#include "rpcs3qt/welcome_dialog.h"
#ifdef WITH_DISCORD_RPC
-#include "discord_rpc.h"
-#include "discord_register.h"
+#include "rpcs3qt/_discord_utils.h"
#endif
#include "Emu/System.h"
@@ -98,8 +97,7 @@ void rpcs3_app::Init()
// Discord Rich Presence Integration
if (guiSettings->GetValue(gui::m_richPresence).toBool())
{
- DiscordEventHandlers handlers = {};
- Discord_Initialize("424004941485572097", &handlers, 1, NULL);
+ discord::initialize();
}
#endif
diff --git a/rpcs3/rpcs3qt/_discord_utils.cpp b/rpcs3/rpcs3qt/_discord_utils.cpp
new file mode 100644
index 0000000000..9d26900cf3
--- /dev/null
+++ b/rpcs3/rpcs3qt/_discord_utils.cpp
@@ -0,0 +1,33 @@
+#include "_discord_utils.h"
+#include "discord_rpc.h"
+#include "discord_register.h"
+
+namespace discord
+{
+ void initialize(const std::string& application_id)
+ {
+ DiscordEventHandlers handlers = {};
+ Discord_Initialize(application_id.c_str(), &handlers, 1, NULL);
+ }
+
+ void shutdown()
+ {
+ Discord_Shutdown();
+ }
+
+ void update_presence(const std::string& state, const std::string& details, bool reset_timer)
+ {
+ DiscordRichPresence discordPresence = {};
+ discordPresence.details = details.c_str();
+ discordPresence.state = state.c_str();
+ discordPresence.largeImageKey = "rpcs3_logo";
+ discordPresence.largeImageText = "RPCS3 is the world's first PlayStation 3 emulator.";
+
+ if (reset_timer)
+ {
+ discordPresence.startTimestamp = time(0);
+ }
+
+ Discord_UpdatePresence(&discordPresence);
+ }
+}
diff --git a/rpcs3/rpcs3qt/_discord_utils.h b/rpcs3/rpcs3qt/_discord_utils.h
new file mode 100644
index 0000000000..d6cbbe268a
--- /dev/null
+++ b/rpcs3/rpcs3qt/_discord_utils.h
@@ -0,0 +1,15 @@
+#pragma once
+
+#include "stdafx.h"
+
+namespace discord
+{
+ // Convenience function for initialization
+ void initialize(const std::string& application_id = "424004941485572097");
+
+ // Convenience function for shutdown
+ void shutdown();
+
+ // Convenience function for status updates. The default is set to idle.
+ void update_presence(const std::string& state = "", const std::string& details = "Idle", bool reset_timer = true);
+}
diff --git a/rpcs3/rpcs3qt/main_window.cpp b/rpcs3/rpcs3qt/main_window.cpp
index e05c5f9e34..37dd726642 100644
--- a/rpcs3/rpcs3qt/main_window.cpp
+++ b/rpcs3/rpcs3qt/main_window.cpp
@@ -9,8 +9,7 @@
#include
#ifdef WITH_DISCORD_RPC
-#include "discord_rpc.h"
-#include "discord_register.h"
+#include "_discord_utils.h"
#endif
#include "qt_utils.h"
@@ -65,7 +64,7 @@ main_window::~main_window()
{
delete ui;
#ifdef WITH_DISCORD_RPC
- Discord_Shutdown();
+ discord::shutdown();
#endif
}
@@ -277,19 +276,6 @@ void main_window::Boot(const std::string& path, bool direct, bool add_only)
LOG_SUCCESS(LOADER, "Boot successful.");
const std::string serial = Emu.GetTitleID().empty() ? "" : "[" + Emu.GetTitleID() + "] ";
AddRecentAction(gui::Recent_Game(qstr(Emu.GetBoot()), qstr(serial + Emu.GetTitle())));
-#ifdef WITH_DISCORD_RPC
- // Discord Rich Presence Integration
- if (guiSettings->GetValue(gui::m_richPresence).toBool())
- {
- DiscordRichPresence discordPresence = {};
- discordPresence.state = Emu.GetTitleID().c_str();
- discordPresence.details = Emu.GetTitle().c_str();
- discordPresence.largeImageKey = "rpcs3_logo";
- discordPresence.largeImageText = "RPCS3 is the world's first PlayStation 3 emulator.";
- discordPresence.startTimestamp = time(0);
- Discord_UpdatePresence(&discordPresence);
- }
-#endif
}
else
{
@@ -775,6 +761,14 @@ void main_window::OnEmuRun()
ui->toolbar_start->setIcon(m_icon_pause);
ui->toolbar_start->setToolTip(tr("Pause emulation"));
EnableMenus(true);
+
+#ifdef WITH_DISCORD_RPC
+ // Discord Rich Presence Integration
+ if (guiSettings->GetValue(gui::m_richPresence).toBool())
+ {
+ discord::update_presence(Emu.GetTitleID(), Emu.GetTitle());
+ }
+#endif
}
void main_window::OnEmuResume()
@@ -832,14 +826,7 @@ void main_window::OnEmuStop()
// Discord Rich Presence Integration
if (guiSettings->GetValue(gui::m_richPresence).toBool())
{
- QString discord_state = guiSettings->GetValue(gui::m_discordState).toString();
- DiscordRichPresence discordPresence = {};
- discordPresence.details = "Idle";
- discordPresence.state = sstr(discord_state).c_str();
- discordPresence.largeImageKey = "rpcs3_logo";
- discordPresence.largeImageText = "RPCS3 is the world's first PlayStation 3 emulator.";
- discordPresence.startTimestamp = time(0);
- Discord_UpdatePresence(&discordPresence);
+ discord::update_presence(sstr(guiSettings->GetValue(gui::m_discordState).toString()));
}
#endif
}
diff --git a/rpcs3/rpcs3qt/settings_dialog.cpp b/rpcs3/rpcs3qt/settings_dialog.cpp
index 1a1e2e5df0..8f6cbda5c6 100644
--- a/rpcs3/rpcs3qt/settings_dialog.cpp
+++ b/rpcs3/rpcs3qt/settings_dialog.cpp
@@ -26,8 +26,7 @@
#include
#ifdef WITH_DISCORD_RPC
-#include "discord_rpc.h"
-#include "discord_register.h"
+#include "_discord_utils.h"
#endif
inline std::string sstr(const QString& _in) { return _in.toStdString(); }
@@ -109,11 +108,11 @@ settings_dialog::settings_dialog(std::shared_ptr guiSettings, std:
}
// Discord variables
- bool use_discord = xgui_settings->GetValue(gui::m_richPresence).toBool();
- QString discord_state = xgui_settings->GetValue(gui::m_discordState).toString();
+ m_use_discord = xgui_settings->GetValue(gui::m_richPresence).toBool();
+ m_discord_state = xgui_settings->GetValue(gui::m_discordState).toString();
// Various connects
- connect(ui->okButton, &QAbstractButton::clicked, [=]
+ connect(ui->okButton, &QAbstractButton::clicked, [=, use_discord_old = m_use_discord, discord_state_old = m_discord_state]
{
std::set selectedlle;
for (int i = 0; illeList->count(); ++i)
@@ -129,30 +128,27 @@ settings_dialog::settings_dialog(std::shared_ptr guiSettings, std:
xemu_settings->SaveSettings();
accept();
+ // Discord Settings can be saved regardless of WITH_DISCORD_RPC
+ xgui_settings->SetValue(gui::m_richPresence, m_use_discord);
+ xgui_settings->SetValue(gui::m_discordState, m_discord_state);
+
#ifdef WITH_DISCORD_RPC
- bool use_discord_new = xgui_settings->GetValue(gui::m_richPresence).toBool();
- QString discord_state_new = xgui_settings->GetValue(gui::m_discordState).toString();
-
- if (use_discord != use_discord_new || discord_state != discord_state_new)
+ if (m_use_discord != use_discord_old)
{
- if (use_discord_new)
+ if (m_use_discord)
{
- DiscordEventHandlers handlers = {};
- Discord_Initialize("424004941485572097", &handlers, 1, NULL);
-
- DiscordRichPresence discordPresence = {};
- discordPresence.details = "Idle";
- discordPresence.state = sstr(discord_state_new).c_str();
- discordPresence.largeImageKey = "rpcs3_logo";
- discordPresence.largeImageText = "RPCS3 is the world's first PlayStation 3 emulator.";
- discordPresence.startTimestamp = time(0);
- Discord_UpdatePresence(&discordPresence);
+ discord::initialize();
+ discord::update_presence(sstr(m_discord_state));
}
else
{
- Discord_ClearPresence();
+ discord::shutdown();
}
}
+ else if (m_discord_state != discord_state_old && Emu.IsStopped())
+ {
+ discord::update_presence(sstr(m_discord_state), "Idle", false);
+ }
#endif
});
@@ -868,21 +864,21 @@ settings_dialog::settings_dialog(std::shared_ptr guiSettings, std:
if (!game)
{
// Discord:
- ui->useRichPresence->setChecked(use_discord);
- ui->label_discordState->setEnabled(use_discord);
- ui->discordState->setEnabled(use_discord);
- ui->discordState->setText(discord_state);
+ ui->useRichPresence->setChecked(m_use_discord);
+ ui->label_discordState->setEnabled(m_use_discord);
+ ui->discordState->setEnabled(m_use_discord);
+ ui->discordState->setText(m_discord_state);
connect(ui->useRichPresence, &QCheckBox::clicked, [this](bool checked)
{
ui->discordState->setEnabled(checked);
ui->label_discordState->setEnabled(checked);
- xgui_settings->SetValue(gui::m_richPresence, checked);
+ m_use_discord = checked;
});
connect(ui->discordState, &QLineEdit::editingFinished, [this]()
{
- xgui_settings->SetValue(gui::m_discordState, ui->discordState->text());
+ m_discord_state = ui->discordState->text();
});
// colorize preview icons
diff --git a/rpcs3/rpcs3qt/settings_dialog.h b/rpcs3/rpcs3qt/settings_dialog.h
index 9b74b567f3..33d9b68b79 100644
--- a/rpcs3/rpcs3qt/settings_dialog.h
+++ b/rpcs3/rpcs3qt/settings_dialog.h
@@ -47,6 +47,10 @@ private:
std::shared_ptr xgui_settings;
std::shared_ptr xemu_settings;
+ // Discord
+ bool m_use_discord;
+ QString m_discord_state;
+
// descriptions
QList> m_description_labels;
QHash m_descriptions;