diff --git a/DiscordRichPresence/Config.rc b/DiscordRichPresence/Config.rc index f06a5cf..54f1459 100644 --- a/DiscordRichPresence/Config.rc +++ b/DiscordRichPresence/Config.rc @@ -59,8 +59,10 @@ BEGIN PUSHBUTTON "Cancel",IDCANCEL,119,72,50,14 CONTROL "Display currently-playing title in Discord status",IDC_CHECK_DISPLAY_TITLE_IN_STATUS, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,7,163,10 - LTEXT "Discord Application ID:",IDC_STATIC,7,47,73,8 - EDITTEXT IDC_EDIT_DISCORD_APPLICATION_ID,83,45,101,14,ES_AUTOHSCROLL + CONTROL "Send status when paused or stopped",IDC_SEND_WHEN_PAUSE_OR_STOPPED, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,37,163,10 + LTEXT "Discord Application ID:",IDC_STATIC,7,57,73,8 + EDITTEXT IDC_EDIT_DISCORD_APPLICATION_ID,83,55,101,14,ES_AUTOHSCROLL CONTROL "Show elapsed time",IDC_SHOW_ELAPSED_TIME,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,31,23,115,10 END diff --git a/DiscordRichPresence/DiscordRichPresence.cpp b/DiscordRichPresence/DiscordRichPresence.cpp index c23d483..5cf5fc5 100644 --- a/DiscordRichPresence/DiscordRichPresence.cpp +++ b/DiscordRichPresence/DiscordRichPresence.cpp @@ -93,38 +93,45 @@ int init() LoadSettingsFile(); - g_presenceInfo.InitializeDiscordRPC(); + if (g_pluginSettings.SendWhenPausedOrStopped) + { + g_presenceInfo.InitializeDiscordRPC(); - ReportIdleStatus(); + ReportIdleStatus(); + } return 0; } void ReportIdleStatus() { - if (!g_presenceInfo.HasDiscordModuleLoaded()) - return; - if (g_pluginSettings.ApplicationID == "0") return; + if (!g_presenceInfo.IsDiscordRPCConnected()) + { + g_presenceInfo.InitializeDiscordRPC(); + } + g_presenceInfo.CurrentPlaybackState = Stopped; g_presenceInfo.SetStartTimestamp(0); g_presenceInfo.SetStateText("(Idle)"); g_presenceInfo.ClearDetails(); - - g_presenceInfo.PostToDiscord(); + g_presenceInfo.PostToDiscord(); } void ReportCurrentSongStatus(PlaybackState playbackState) { - if (!g_presenceInfo.HasDiscordModuleLoaded()) - return; + assert(playbackState != Stopped); if (g_pluginSettings.ApplicationID == "0") return; + + if (!g_presenceInfo.IsDiscordRPCConnected()) + { + g_presenceInfo.InitializeDiscordRPC(); + } - assert(playbackState != Stopped); g_presenceInfo.CurrentPlaybackState = playbackState; g_presenceInfo.SetStartTimestamp(0); g_presenceInfo.SetStateText(playbackState == Playing ? "(Playing)" : "(Paused)"); @@ -163,12 +170,26 @@ void UpdateRichPresenceDetails() else if (isPlayingResult == Paused) { g_timer.Stop(); - ReportCurrentSongStatus(Paused); + if (g_pluginSettings.SendWhenPausedOrStopped) + { + ReportCurrentSongStatus(Paused); + } + else + { + g_presenceInfo.ShutdownDiscordRPC(); + } } else if (isPlayingResult == Stopped) { g_timer.Stop(); - ReportIdleStatus(); + if (g_pluginSettings.SendWhenPausedOrStopped) + { + ReportIdleStatus(); + } + else + { + g_presenceInfo.ShutdownDiscordRPC(); + } } } @@ -198,6 +219,9 @@ void UpdateInMemorySettingsFromDialogState(HWND hWndDlg) { g_pluginSettings.ApplicationID = stringData; } + + checkboxHwnd = GetDlgItem(hWndDlg, IDC_SEND_WHEN_PAUSE_OR_STOPPED); + g_pluginSettings.SendWhenPausedOrStopped = Button_GetCheck(checkboxHwnd) == BST_CHECKED; } void OnConfirmSettingsDialog(HWND hWndDlg) @@ -209,8 +233,9 @@ void OnConfirmSettingsDialog(HWND hWndDlg) bool applicationIDChanged = previousSettings.ApplicationID != g_pluginSettings.ApplicationID; bool displayTitleSettingChanged = previousSettings.DisplayTitleInStatus != g_pluginSettings.DisplayTitleInStatus; bool elapsedTimeChanged = previousSettings.ShowElapsedTime != g_pluginSettings.ShowElapsedTime; + bool sendOnPausedOrStopChanged = previousSettings.SendWhenPausedOrStopped != g_pluginSettings.SendWhenPausedOrStopped; - if (!applicationIDChanged && !displayTitleSettingChanged && !elapsedTimeChanged) + if (!applicationIDChanged && !displayTitleSettingChanged && !elapsedTimeChanged && !sendOnPausedOrStopChanged) return; // Nothing to do // Save settings to file @@ -233,6 +258,11 @@ void OnConfirmSettingsDialog(HWND hWndDlg) shouldUpdateRichPresenceDetails = true; } + if (previousSettings.SendWhenPausedOrStopped != g_pluginSettings.SendWhenPausedOrStopped) + { + shouldUpdateRichPresenceDetails = true; + } + if (shouldUpdateRichPresenceDetails) { UpdateRichPresenceDetails(); @@ -263,6 +293,9 @@ void PopulateSettingsDialogFields(HWND hWndDlg) HWND editboxHwnd = GetDlgItem(hWndDlg, IDC_EDIT_DISCORD_APPLICATION_ID); SetWindowTextA(editboxHwnd, g_pluginSettings.ApplicationID.c_str()); + + checkboxHwnd = GetDlgItem(hWndDlg, IDC_SEND_WHEN_PAUSE_OR_STOPPED); + Button_SetCheck(checkboxHwnd, (g_pluginSettings.SendWhenPausedOrStopped ? BST_CHECKED : BST_UNCHECKED)); } // Dialogue box callback function diff --git a/DiscordRichPresence/PresenceInfo.cpp b/DiscordRichPresence/PresenceInfo.cpp index 99d9983..271e919 100644 --- a/DiscordRichPresence/PresenceInfo.cpp +++ b/DiscordRichPresence/PresenceInfo.cpp @@ -3,6 +3,9 @@ #include "DiscordRichPresence.h" #include "SettingsFile.h" +//initialize the static variable +bool PresenceInfo::m_discordConnected = false; + PresenceInfo::PresenceInfo() : m_initializeFn{} , m_shutdownFn{} @@ -17,6 +20,7 @@ PresenceInfo::PresenceInfo() m_lowLevelTrackTitleIsUrl = false; } + void PresenceInfo::SetStateText(char const* str) { m_stateBuffer = str; @@ -77,14 +81,17 @@ bool PresenceInfo::HasDiscordModuleLoaded() const static void handleDiscordReady(const DiscordUser* connectedUser) { + PresenceInfo::SetDiscordRPCConnectStatus(true); } static void handleDiscordError(int errcode, const char* message) { + PresenceInfo::SetDiscordRPCConnectStatus(false); } static void handleDiscordDisconnected(int errcode, const char* message) { + PresenceInfo::SetDiscordRPCConnectStatus(false); } static void handleDiscordJoinGame(const char* secret) @@ -99,6 +106,15 @@ static void handleDiscordJoinRequest(const DiscordUser* request) { } +void PresenceInfo::SetDiscordRPCConnectStatus(bool connected) +{ + m_discordConnected = connected; +} +bool PresenceInfo::IsDiscordRPCConnected() +{ + return HasDiscordModuleLoaded() && m_discordConnected; +} + void PresenceInfo::InitializeDiscordRPC() { if (g_pluginSettings.ApplicationID == "0") @@ -137,5 +153,6 @@ void PresenceInfo::ShutdownDiscordRPC() if (m_hDiscordModule) { m_shutdownFn(); + PresenceInfo::SetDiscordRPCConnectStatus(false); } } diff --git a/DiscordRichPresence/PresenceInfo.h b/DiscordRichPresence/PresenceInfo.h index c250585..72ad283 100644 --- a/DiscordRichPresence/PresenceInfo.h +++ b/DiscordRichPresence/PresenceInfo.h @@ -13,6 +13,8 @@ class PresenceInfo std::string m_streamingTrackTitleBuffer; HMODULE m_hDiscordModule; + //used to interop with Discord callbacks for connected status + static bool m_discordConnected; typedef void (DISCORD_EXPORT *Discord_InitializeFn)(const char*, DiscordEventHandlers*, int, const char*); typedef void (DISCORD_EXPORT *Discord_ShutdownFn)(void); @@ -28,6 +30,9 @@ class PresenceInfo PresenceInfo(); PlaybackState CurrentPlaybackState; + //used to interop with Discord callbacks for connected status + static void SetDiscordRPCConnectStatus(bool); + bool IsDiscordRPCConnected(); void InitializeDiscordRPC(); void ShutdownDiscordRPC(); diff --git a/DiscordRichPresence/SettingsFile.cpp b/DiscordRichPresence/SettingsFile.cpp index 13bffe8..4cf5c9b 100644 --- a/DiscordRichPresence/SettingsFile.cpp +++ b/DiscordRichPresence/SettingsFile.cpp @@ -51,6 +51,12 @@ void SaveSettingsFile() settingsFileWrite << "ShowElapsedTime:false" << "\n"; settingsFileWrite << "ApplicationID:" << g_pluginSettings.ApplicationID << "\n"; + + if (g_pluginSettings.SendWhenPausedOrStopped) + settingsFileWrite << "SendWhenPausedOrStopped:true" << "\n"; + else + settingsFileWrite << "SendWhenPausedOrStopped:false" << "\n"; + settingsFileWrite.close(); } @@ -91,6 +97,7 @@ void LoadSettingsFile() static const char* displayTileInStatus_label = "DisplayTitleInStatus:"; static const char* showElapsedTime_label = "ShowElapsedTime:"; static const char* applicationID_label = "ApplicationID:"; + static const char* sendWhenPausedOrStopped_label = "SendWhenPausedOrStopped:"; if (line.find(displayTileInStatus_label) == 0) { @@ -105,6 +112,10 @@ void LoadSettingsFile() std::string value = line.substr(strlen(applicationID_label)); g_pluginSettings.ApplicationID = value; } + else if (line.find(sendWhenPausedOrStopped_label) == 0) + { + g_pluginSettings.SendWhenPausedOrStopped = GetBooleanSettingsFileValue(line, sendWhenPausedOrStopped_label); + } } } else diff --git a/DiscordRichPresence/SettingsFile.h b/DiscordRichPresence/SettingsFile.h index 4dc8d45..39bfde7 100644 --- a/DiscordRichPresence/SettingsFile.h +++ b/DiscordRichPresence/SettingsFile.h @@ -5,6 +5,7 @@ struct PluginSettings bool DisplayTitleInStatus; bool ShowElapsedTime; std::string ApplicationID; + bool SendWhenPausedOrStopped; }; std::string GetSettingsFilePath(); diff --git a/DiscordRichPresence/resource.h b/DiscordRichPresence/resource.h index 42307a9..f382e62 100644 --- a/DiscordRichPresence/resource.h +++ b/DiscordRichPresence/resource.h @@ -8,6 +8,7 @@ #define IDC_BUTTON_APPLY 1004 #define IDC_CHECK1 1005 #define IDC_SHOW_ELAPSED_TIME 1005 +#define IDC_SEND_WHEN_PAUSE_OR_STOPPED 1008 // Next default values for new objects // diff --git a/Images/PluginDialog.png b/Images/PluginDialog.png new file mode 100644 index 0000000..c459e14 Binary files /dev/null and b/Images/PluginDialog.png differ