diff --git a/Makefile.common b/Makefile.common index 4392060c11..580beba7eb 100644 --- a/Makefile.common +++ b/Makefile.common @@ -2226,6 +2226,7 @@ ifeq ($(HAVE_NETWORKING), 1) ifeq ($(HAVE_DISCORD), 1) NEED_CXX_LINKER = 1 + HAVE_PRESENCE = 1 DEFINES += -DHAVE_DISCORD INCLUDE_DIRS += -Ideps/discord-rpc/include @@ -2463,11 +2464,20 @@ endif ### Steam integration using mist ifeq ($(HAVE_MIST), 1) + HAVE_PRESENCE = 1 + DEFINES += -DHAVE_MIST INCLUDE_DIRS += -I$(MIST_PATH)/include LDFLAGS += -L$(MIST_PATH) -lmist OBJ += steam/steam.o tasks/task_steam.o endif +### Shared rich presence code for Discord and Steam + +ifeq ($(HAVE_PRESENCE), 1) + DEFINES += -DHAVE_PRESENCE + OBJ += network/presence.o +endif + ################################## ### Classic Platform specifics ### ###############WIP################ diff --git a/cheevos/cheevos_client.c b/cheevos/cheevos_client.c index 4667fa28df..f4854ab61d 100644 --- a/cheevos/cheevos_client.c +++ b/cheevos/cheevos_client.c @@ -32,8 +32,8 @@ #include "../network/net_http_special.h" #include "../tasks/tasks_internal.h" -#ifdef HAVE_DISCORD -#include "../network/discord.h" +#ifdef HAVE_PRESENCE +#include "../network/presence.h" #endif #include "../deps/rcheevos/include/rc_api_runtime.h" @@ -1268,9 +1268,8 @@ static retro_time_t rcheevos_client_prepare_ping( rcheevos_log_post_url(request->request.url, request->request.post_data); -#ifdef HAVE_DISCORD - if (settings->bools.discord_enable && discord_is_ready()) - discord_update(DISCORD_PRESENCE_RETROACHIEVEMENTS); +#ifdef HAVE_PRESENCE + presence_update(PRESENCE_RETROACHIEVEMENTS); #endif /* Update rich presence every two minutes */ diff --git a/command.h b/command.h index c44550ed7f..c94cf94030 100644 --- a/command.h +++ b/command.h @@ -244,7 +244,7 @@ enum event_command CMD_EVENT_MIXER_VOLUME_UP, CMD_EVENT_MIXER_VOLUME_DOWN, CMD_EVENT_DISCORD_INIT, - CMD_EVENT_DISCORD_UPDATE, + CMD_EVENT_PRESENCE_UPDATE, CMD_EVENT_OSK_TOGGLE, CMD_EVENT_RECORDING_TOGGLE, CMD_EVENT_STREAMING_TOGGLE, diff --git a/config.def.h b/config.def.h index 1ac8ccb235..49a2eacb94 100644 --- a/config.def.h +++ b/config.def.h @@ -53,6 +53,11 @@ #include "../input/input_overlay.h" #endif +/* Required for Steam enum settings */ +#if defined(HAVE_MIST) +#include "steam/steam.h" +#endif + #if defined(HW_RVL) #define MAX_GAMMA_SETTING 30 #elif defined(GEKKO) @@ -605,6 +610,8 @@ #define DEFAULT_SETTINGS_SHOW_DIRECTORY true +#define DEFAULT_SETTINGS_SHOW_STEAM true + #define DEFAULT_QUICK_MENU_SHOW_RESUME_CONTENT true #define DEFAULT_QUICK_MENU_SHOW_RESTART_CONTENT true @@ -1518,6 +1525,11 @@ static const enum resampler_quality audio_resampler_quality_level = RESAMPLER_QU static const unsigned midi_volume = 100; +#ifdef HAVE_MIST +/* Steam */ +#define DEFAULT_STEAM_RICH_PRESENCE_FORMAT STEAM_RICH_PRESENCE_FORMAT_CONTENT_SYSTEM +#endif + /* Only applies to Android 7.0 (API 24) and up */ static const bool sustained_performance_mode = false; diff --git a/configuration.c b/configuration.c index 50acf1be27..8720d33ccb 100644 --- a/configuration.c +++ b/configuration.c @@ -1752,6 +1752,9 @@ static struct config_bool_setting *populate_settings_bool( #ifdef HAVE_THREADS SETTING_BOOL("threaded_data_runloop_enable", &settings->bools.threaded_data_runloop_enable, true, DEFAULT_THREADED_DATA_RUNLOOP_ENABLE, false); #endif +#ifdef HAVE_MIST + SETTING_BOOL("steam_rich_presence_enable", &settings->bools.steam_rich_presence_enable, true, false, false); +#endif #ifdef HAVE_MENU SETTING_BOOL("menu_unified_controls", &settings->bools.menu_unified_controls, true, false, false); SETTING_BOOL("menu_throttle_framerate", &settings->bools.menu_throttle_framerate, true, true, false); @@ -1792,6 +1795,9 @@ static struct config_bool_setting *populate_settings_bool( SETTING_BOOL("settings_show_playlists", &settings->bools.settings_show_playlists, true, DEFAULT_SETTINGS_SHOW_PLAYLISTS, false); SETTING_BOOL("settings_show_user", &settings->bools.settings_show_user, true, DEFAULT_SETTINGS_SHOW_USER, false); SETTING_BOOL("settings_show_directory", &settings->bools.settings_show_directory, true, DEFAULT_SETTINGS_SHOW_DIRECTORY, false); +#ifdef HAVE_MIST + SETTING_BOOL("settings_show_steam", &settings->bools.settings_show_steam, true, DEFAULT_SETTINGS_SHOW_STEAM, false); +#endif SETTING_BOOL("quick_menu_show_resume_content", &settings->bools.quick_menu_show_resume_content, true, DEFAULT_QUICK_MENU_SHOW_RESUME_CONTENT, false); SETTING_BOOL("quick_menu_show_restart_content", &settings->bools.quick_menu_show_restart_content, true, DEFAULT_QUICK_MENU_SHOW_RESTART_CONTENT, false); @@ -2331,6 +2337,10 @@ static struct config_uint_setting *populate_settings_uint( SETTING_UINT("cpu_max_freq", &settings->uints.cpu_max_freq, true, ~0U, false); #endif +#ifdef HAVE_MIST + SETTING_UINT("steam_rich_presence_format", &settings->uints.steam_rich_presence_format, true, DEFAULT_STEAM_RICH_PRESENCE_FORMAT, false); +#endif + *size = count; return tmp; diff --git a/configuration.h b/configuration.h index 8e785d9ea1..f452a22bc7 100644 --- a/configuration.h +++ b/configuration.h @@ -339,6 +339,10 @@ typedef struct settings unsigned cpu_min_freq; unsigned cpu_max_freq; #endif + +#ifdef HAVE_MIST + unsigned steam_rich_presence_format; +#endif } uints; struct @@ -740,6 +744,9 @@ typedef struct settings bool settings_show_playlists; bool settings_show_user; bool settings_show_directory; +#ifdef HAVE_MIST + bool settings_show_steam; +#endif bool quick_menu_show_resume_content; bool quick_menu_show_restart_content; bool quick_menu_show_close_content; @@ -832,6 +839,11 @@ typedef struct settings /* Driver */ bool driver_switch_enable; +#ifdef HAVE_MIST + /* Steam */ + bool steam_rich_presence_enable; +#endif + /* Misc. */ bool discord_enable; bool threaded_data_runloop_enable; diff --git a/intl/msg_hash_lbl.h b/intl/msg_hash_lbl.h index 7cdbbc9679..85490e433e 100644 --- a/intl/msg_hash_lbl.h +++ b/intl/msg_hash_lbl.h @@ -629,6 +629,18 @@ MSG_HASH( MENU_ENUM_LABEL_CORE_STEAM_UNINSTALL, "core_steam_uninstall" ) +MSG_HASH( + MENU_ENUM_LABEL_STEAM_SETTINGS, + "steam_settings" + ) +MSG_HASH( + MENU_ENUM_LABEL_STEAM_RICH_PRESENCE_ENABLE, + "steam_rich_presence_enable" + ) +MSG_HASH( + MENU_ENUM_LABEL_STEAM_RICH_PRESENCE_FORMAT, + "steam_rich_presence_format" + ) #endif MSG_HASH( MENU_ENUM_LABEL_CPU_ARCHITECTURE, @@ -909,6 +921,10 @@ MSG_HASH( "deferred_core_manager_list" ) #ifdef HAVE_MIST +MSG_HASH( + MENU_ENUM_LABEL_DEFERRED_STEAM_SETTINGS_LIST, + "deferred_steam_settings_list" + ) MSG_HASH( MENU_ENUM_LABEL_DEFERRED_CORE_MANAGER_STEAM_LIST, "deferred_core_manager_steam_list" @@ -5206,6 +5222,12 @@ MSG_HASH( MENU_ENUM_LABEL_SETTINGS_SHOW_DIRECTORY, "settings_show_directory" ) +#ifdef HAVE_MIST +MSG_HASH( + MENU_ENUM_LABEL_SETTINGS_SHOW_STEAM, + "settings_show_steam" + ) +#endif MSG_HASH( MENU_ENUM_LABEL_FRAME_TIME_COUNTER_RESET_AFTER_FASTFORWARDING, "frame_time_counter_reset_after_fastforwarding" diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index c8b8383b00..8b4230f391 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -1289,6 +1289,17 @@ MSG_HASH( "Change default directories where files are located." ) +#ifdef HAVE_MIST +MSG_HASH( + MENU_ENUM_LABEL_VALUE_STEAM_SETTINGS, + "Steam" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_STEAM_SETTINGS, + "Change settings related to Steam." + ) +#endif + /* Settings > Drivers */ MSG_HASH( @@ -5249,6 +5260,15 @@ MSG_HASH( "Show 'Directory' settings." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SETTINGS_SHOW_STEAM, + "Show 'Steam'" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SETTINGS_SHOW_STEAM, + "Show 'Steam' settings." + ) + /* Settings > User Interface > Appearance */ MSG_HASH( @@ -6371,6 +6391,53 @@ MSG_HASH( "System event logs are stored in this directory." ) +#ifdef HAVE_MIST +/* Settings > Steam */ + +MSG_HASH( + MENU_ENUM_LABEL_VALUE_STEAM_RICH_PRESENCE_ENABLE, + "Enable Rich Presence" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_STEAM_RICH_PRESENCE_ENABLE, + "Share your current status within RetroArch on Steam." + ) + +MSG_HASH( + MENU_ENUM_LABEL_VALUE_STEAM_RICH_PRESENCE_FORMAT, + "Rich Presence Content Format" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_STEAM_RICH_PRESENCE_FORMAT, + "Decide what information related to the running content will be shared." + ) + +MSG_HASH( + MENU_ENUM_LABEL_VALUE_STEAM_RICH_PRESENCE_FORMAT_CONTENT, + "Content" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_STEAM_RICH_PRESENCE_FORMAT_CORE, + "Core name" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_STEAM_RICH_PRESENCE_FORMAT_SYSTEM, + "System name" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_STEAM_RICH_PRESENCE_FORMAT_CONTENT_SYSTEM, + "Content (System name)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_STEAM_RICH_PRESENCE_FORMAT_CONTENT_CORE, + "Content (Core name)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_STEAM_RICH_PRESENCE_FORMAT_CONTENT_SYSTEM_CORE, + "Content (System name - Core name)" + ) +#endif + /* Music */ /* Music > Quick Menu */ diff --git a/menu/cbs/menu_cbs_deferred_push.c b/menu/cbs/menu_cbs_deferred_push.c index d6ee28375d..dff545e63b 100644 --- a/menu/cbs/menu_cbs_deferred_push.c +++ b/menu/cbs/menu_cbs_deferred_push.c @@ -273,6 +273,7 @@ GENERIC_DEFERRED_PUSH(deferred_push_core_delete_backup_list, DISPLAYLIST_ GENERIC_DEFERRED_PUSH(deferred_push_core_manager_list, DISPLAYLIST_CORE_MANAGER_LIST) #ifdef HAVE_MIST +GENERIC_DEFERRED_PUSH(deferred_push_steam_settings_list, DISPLAYLIST_STEAM_SETTINGS_LIST) GENERIC_DEFERRED_PUSH(deferred_push_core_manager_steam_list, DISPLAYLIST_CORE_MANAGER_STEAM_LIST) GENERIC_DEFERRED_PUSH(deferred_push_core_information_steam_list, DISPLAYLIST_CORE_INFORMATION_STEAM_LIST) #endif @@ -888,6 +889,7 @@ static int menu_cbs_init_bind_deferred_push_compare_label( {MENU_ENUM_LABEL_DEFERRED_CORE_DELETE_BACKUP_LIST, deferred_push_core_delete_backup_list}, {MENU_ENUM_LABEL_DEFERRED_CORE_MANAGER_LIST, deferred_push_core_manager_list}, #ifdef HAVE_MIST + {MENU_ENUM_LABEL_DEFERRED_STEAM_SETTINGS_LIST, deferred_push_steam_settings_list}, {MENU_ENUM_LABEL_DEFERRED_CORE_MANAGER_STEAM_LIST, deferred_push_core_manager_steam_list}, {MENU_ENUM_LABEL_DEFERRED_CORE_INFORMATION_STEAM_LIST, deferred_push_core_information_steam_list}, #endif @@ -1322,6 +1324,9 @@ static int menu_cbs_init_bind_deferred_push_compare_label( BIND_ACTION_DEFERRED_PUSH(cbs, deferred_push_core_manager_list); break; #ifdef HAVE_MIST + case MENU_ENUM_LABEL_DEFERRED_STEAM_SETTINGS_LIST: + BIND_ACTION_DEFERRED_PUSH(cbs, deferred_push_steam_settings_list); + break; case MENU_ENUM_LABEL_DEFERRED_CORE_MANAGER_STEAM_LIST: BIND_ACTION_DEFERRED_PUSH(cbs, deferred_push_core_manager_steam_list); break; diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index f6458fb48d..435aeeae22 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -489,6 +489,8 @@ static enum msg_hash_enums action_ok_dl_to_enum(unsigned lbl) case ACTION_OK_DL_CORE_MANAGER_LIST: return MENU_ENUM_LABEL_DEFERRED_CORE_MANAGER_LIST; #ifdef HAVE_MIST + case ACTION_OK_DL_STEAM_SETTINGS_LIST: + return MENU_ENUM_LABEL_DEFERRED_STEAM_SETTINGS_LIST; case ACTION_OK_DL_CORE_MANAGER_STEAM_LIST: return MENU_ENUM_LABEL_DEFERRED_CORE_MANAGER_STEAM_LIST; #endif @@ -1583,6 +1585,7 @@ int generic_action_ok_displaylist_push(const char *path, case ACTION_OK_DL_MANUAL_CONTENT_SCAN_LIST: case ACTION_OK_DL_CORE_MANAGER_LIST: #ifdef HAVE_MIST + case ACTION_OK_DL_STEAM_SETTINGS_LIST: case ACTION_OK_DL_CORE_MANAGER_STEAM_LIST: #endif case ACTION_OK_DL_CORE_OPTION_OVERRIDE_LIST: @@ -5829,6 +5832,7 @@ DEFAULT_ACTION_OK_FUNC(action_ok_push_manual_content_scan_list, ACTION_OK_DL_MAN DEFAULT_ACTION_OK_FUNC(action_ok_manual_content_scan_dat_file, ACTION_OK_DL_MANUAL_CONTENT_SCAN_DAT_FILE) DEFAULT_ACTION_OK_FUNC(action_ok_push_core_manager_list, ACTION_OK_DL_CORE_MANAGER_LIST) #ifdef HAVE_MIST +DEFAULT_ACTION_OK_FUNC(action_ok_steam_settings_list, ACTION_OK_DL_STEAM_SETTINGS_LIST) DEFAULT_ACTION_OK_FUNC(action_ok_push_core_manager_steam_list, ACTION_OK_DL_CORE_MANAGER_STEAM_LIST) #endif DEFAULT_ACTION_OK_FUNC(action_ok_push_core_option_override_list, ACTION_OK_DL_CORE_OPTION_OVERRIDE_LIST) @@ -8262,6 +8266,7 @@ static int menu_cbs_init_bind_ok_compare_label(menu_file_list_cbs_t *cbs, {MENU_ENUM_LABEL_PLAYLIST_MANAGER_DEFAULT_CORE, action_ok_playlist_default_core}, {MENU_ENUM_LABEL_CORE_MANAGER_LIST, action_ok_push_core_manager_list}, #ifdef HAVE_MIST + {MENU_ENUM_LABEL_STEAM_SETTINGS, action_ok_steam_settings_list}, {MENU_ENUM_LABEL_CORE_MANAGER_STEAM_LIST, action_ok_push_core_manager_steam_list}, {MENU_ENUM_LABEL_CORE_STEAM_INSTALL, action_ok_core_steam_install}, {MENU_ENUM_LABEL_CORE_STEAM_UNINSTALL, action_ok_core_steam_uninstall}, diff --git a/menu/cbs/menu_cbs_sublabel.c b/menu/cbs/menu_cbs_sublabel.c index f99da8a6ea..52ba84848b 100644 --- a/menu/cbs/menu_cbs_sublabel.c +++ b/menu/cbs/menu_cbs_sublabel.c @@ -532,6 +532,9 @@ DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_switch_installed_cores_pfd, MENU_ DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_sideload_core_list, MENU_ENUM_SUBLABEL_SIDELOAD_CORE_LIST) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_core_manager_list, MENU_ENUM_SUBLABEL_CORE_MANAGER_LIST) #ifdef HAVE_MIST +DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_steam_settings_list, MENU_ENUM_SUBLABEL_STEAM_SETTINGS) +DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_steam_rich_presence_enable, MENU_ENUM_SUBLABEL_STEAM_RICH_PRESENCE_ENABLE) +DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_steam_rich_presence_format, MENU_ENUM_SUBLABEL_STEAM_RICH_PRESENCE_FORMAT) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_core_manager_steam_list, MENU_ENUM_SUBLABEL_CORE_MANAGER_STEAM_LIST) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_menu_show_core_manager_steam, MENU_ENUM_SUBLABEL_MENU_SHOW_CORE_MANAGER_STEAM) #endif @@ -914,6 +917,7 @@ DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_settings_show_network, DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_settings_show_playlists, MENU_ENUM_SUBLABEL_SETTINGS_SHOW_PLAYLISTS) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_settings_show_user, MENU_ENUM_SUBLABEL_SETTINGS_SHOW_USER) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_settings_show_directory, MENU_ENUM_SUBLABEL_SETTINGS_SHOW_DIRECTORY) +DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_settings_show_steam, MENU_ENUM_SUBLABEL_SETTINGS_SHOW_STEAM) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_quick_menu_show_take_screenshot, MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_TAKE_SCREENSHOT) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_quick_menu_show_resume_content, MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_RESUME_CONTENT) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_quick_menu_show_restart_content, MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_RESTART_CONTENT) @@ -2543,6 +2547,9 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs, case MENU_ENUM_LABEL_SETTINGS_SHOW_DIRECTORY: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_settings_show_directory); break; + case MENU_ENUM_LABEL_SETTINGS_SHOW_STEAM: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_settings_show_steam); + break; case MENU_ENUM_LABEL_QUICK_MENU_SHOW_RESUME_CONTENT: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_quick_menu_show_resume_content); break; @@ -3776,6 +3783,15 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs, BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_core_manager_list); break; #ifdef HAVE_MIST + case MENU_ENUM_LABEL_STEAM_SETTINGS: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_steam_settings_list); + break; + case MENU_ENUM_LABEL_STEAM_RICH_PRESENCE_ENABLE: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_steam_rich_presence_enable); + break; + case MENU_ENUM_LABEL_STEAM_RICH_PRESENCE_FORMAT: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_steam_rich_presence_format); + break; case MENU_ENUM_LABEL_CORE_MANAGER_STEAM_LIST: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_core_manager_steam_list); break; diff --git a/menu/cbs/menu_cbs_title.c b/menu/cbs/menu_cbs_title.c index 4bb962e571..523723e410 100644 --- a/menu/cbs/menu_cbs_title.c +++ b/menu/cbs/menu_cbs_title.c @@ -770,6 +770,7 @@ DEFAULT_TITLE_SEARCH_FILTER_MACRO(action_get_title_deferred_contentless_cores_li DEFAULT_TITLE_SEARCH_FILTER_MACRO(action_get_core_updater_list, MENU_ENUM_LABEL_VALUE_CORE_UPDATER_LIST) DEFAULT_TITLE_SEARCH_FILTER_MACRO(action_get_core_manager_list, MENU_ENUM_LABEL_VALUE_CORE_MANAGER_LIST) #ifdef HAVE_MIST +DEFAULT_TITLE_SEARCH_FILTER_MACRO(action_get_steam_settings_list, MENU_ENUM_LABEL_VALUE_STEAM_SETTINGS) DEFAULT_TITLE_SEARCH_FILTER_MACRO(action_get_core_manager_steam_list, MENU_ENUM_LABEL_VALUE_CORE_MANAGER_STEAM_LIST) #endif DEFAULT_TITLE_SEARCH_FILTER_MACRO(action_get_core_cheat_options_list, MENU_ENUM_LABEL_VALUE_CORE_CHEAT_OPTIONS) @@ -1160,6 +1161,8 @@ static int menu_cbs_init_bind_title_compare_label(menu_file_list_cbs_t *cbs, {MENU_ENUM_LABEL_DEFERRED_CORE_MANAGER_LIST, action_get_core_manager_list}, #ifdef HAVE_MIST + {MENU_ENUM_LABEL_DEFERRED_STEAM_SETTINGS_LIST, + action_get_steam_settings_list}, {MENU_ENUM_LABEL_DEFERRED_CORE_MANAGER_STEAM_LIST, action_get_core_manager_steam_list}, #endif @@ -1487,6 +1490,9 @@ static int menu_cbs_init_bind_title_compare_label(menu_file_list_cbs_t *cbs, BIND_ACTION_GET_TITLE(cbs, action_get_core_manager_list); break; #ifdef HAVE_MIST + case MENU_ENUM_LABEL_DEFERRED_STEAM_SETTINGS_LIST: + BIND_ACTION_GET_TITLE(cbs, action_get_steam_settings_list); + break; case MENU_ENUM_LABEL_DEFERRED_CORE_MANAGER_STEAM_LIST: BIND_ACTION_GET_TITLE(cbs, action_get_core_manager_steam_list); break; diff --git a/menu/menu_cbs.h b/menu/menu_cbs.h index b071e5ac51..b5f689d120 100644 --- a/menu/menu_cbs.h +++ b/menu/menu_cbs.h @@ -155,6 +155,7 @@ enum ACTION_OK_DL_CORE_UPDATER_LIST, ACTION_OK_DL_CORE_MANAGER_LIST, #ifdef HAVE_MIST + ACTION_OK_DL_STEAM_SETTINGS_LIST, ACTION_OK_DL_CORE_MANAGER_STEAM_LIST, #endif ACTION_OK_DL_THUMBNAILS_UPDATER_LIST, diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index b6550a4843..1f53726e4e 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -9309,6 +9309,40 @@ unsigned menu_displaylist_build_list( } } break; +#ifdef HAVE_MIST + case DISPLAYLIST_STEAM_SETTINGS_LIST: + { + menu_displaylist_build_info_selective_t build_list[] = { + {MENU_ENUM_LABEL_STEAM_RICH_PRESENCE_ENABLE, PARSE_ONLY_BOOL, true}, + {MENU_ENUM_LABEL_STEAM_RICH_PRESENCE_FORMAT, PARSE_ONLY_UINT, false}, + }; + + for (i = 0; i < ARRAY_SIZE(build_list); i++) + { + switch (build_list[i].enum_idx) + { + case MENU_ENUM_LABEL_STEAM_RICH_PRESENCE_FORMAT: + if (settings->bools.steam_rich_presence_enable) + build_list[i].checked = true; + break; + default: + break; + } + } + + for (i = 0; i < ARRAY_SIZE(build_list); i++) + { + if (!build_list[i].checked) + continue; + + if (MENU_DISPLAYLIST_PARSE_SETTINGS_ENUM(list, + build_list[i].enum_idx, build_list[i].parse_type, + false) == 0) + count++; + } + } + break; +#endif case DISPLAYLIST_SETTINGS_ALL: { #ifdef HAVE_TRANSLATE @@ -9345,6 +9379,9 @@ unsigned menu_displaylist_build_list( {MENU_ENUM_LABEL_PLAYLIST_SETTINGS, PARSE_ACTION, true}, {MENU_ENUM_LABEL_USER_SETTINGS, PARSE_ACTION, true}, {MENU_ENUM_LABEL_DIRECTORY_SETTINGS, PARSE_ACTION, true}, +#ifdef HAVE_MIST + {MENU_ENUM_LABEL_STEAM_SETTINGS, PARSE_ACTION, true}, +#endif }; @@ -9422,6 +9459,11 @@ unsigned menu_displaylist_build_list( case MENU_ENUM_LABEL_DIRECTORY_SETTINGS: build_list[i].checked = settings->bools.settings_show_directory; break; +#ifdef HAVE_MIST + case MENU_ENUM_LABEL_STEAM_SETTINGS: + build_list[i].checked = settings->bools.settings_show_steam; + break; +#endif /* MISSING: * MENU_ENUM_LABEL_BLUETOOTH_SETTINGS * MENU_ENUM_LABEL_WIFI_SETTINGS @@ -9574,6 +9616,9 @@ unsigned menu_displaylist_build_list( {MENU_ENUM_LABEL_SETTINGS_SHOW_PLAYLISTS, PARSE_ONLY_BOOL}, {MENU_ENUM_LABEL_SETTINGS_SHOW_USER, PARSE_ONLY_BOOL}, {MENU_ENUM_LABEL_SETTINGS_SHOW_DIRECTORY, PARSE_ONLY_BOOL}, +#ifdef HAVE_MIST + {MENU_ENUM_LABEL_SETTINGS_SHOW_STEAM, PARSE_ONLY_BOOL}, +#endif }; for (i = 0; i < ARRAY_SIZE(build_list); i++) @@ -12580,6 +12625,9 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, case DISPLAYLIST_INPUT_HAPTIC_FEEDBACK_SETTINGS_LIST: case DISPLAYLIST_PLAYLIST_SETTINGS_LIST: case DISPLAYLIST_SUBSYSTEM_SETTINGS_LIST: +#ifdef HAVE_MIST + case DISPLAYLIST_STEAM_SETTINGS_LIST: +#endif menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list); count = menu_displaylist_build_list(info->list, settings, type, false); diff --git a/menu/menu_displaylist.h b/menu/menu_displaylist.h index 1c81ba06e3..8df1ca716b 100644 --- a/menu/menu_displaylist.h +++ b/menu/menu_displaylist.h @@ -104,6 +104,7 @@ enum menu_displaylist_ctl_state DISPLAYLIST_CORES_UPDATER, DISPLAYLIST_CORE_MANAGER_LIST, #ifdef HAVE_MIST + DISPLAYLIST_STEAM_SETTINGS_LIST, DISPLAYLIST_CORE_MANAGER_STEAM_LIST, DISPLAYLIST_CORE_INFORMATION_STEAM_LIST, #endif diff --git a/menu/menu_setting.c b/menu/menu_setting.c index 9f4183fd86..0b69ade2ab 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -309,6 +309,9 @@ enum settings_list_type SETTINGS_LIST_DIRECTORY, SETTINGS_LIST_PRIVACY, SETTINGS_LIST_MIDI, +#ifdef HAVE_MIST + SETTINGS_LIST_STEAM, +#endif SETTINGS_LIST_MANUAL_CONTENT_SCAN }; @@ -6860,6 +6863,42 @@ static void setting_get_string_representation_uint_menu_screensaver_animation( } #endif +#ifdef HAVE_MIST +static void setting_get_string_representation_steam_rich_presence_format( + rarch_setting_t *setting, + char *s, size_t len) +{ + if (!setting) + return; + + switch (*setting->value.target.unsigned_integer) + { + case STEAM_RICH_PRESENCE_FORMAT_CONTENT: + strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_STEAM_RICH_PRESENCE_FORMAT_CONTENT), len); + break; + case STEAM_RICH_PRESENCE_FORMAT_CORE: + strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_STEAM_RICH_PRESENCE_FORMAT_CORE), len); + break; + case STEAM_RICH_PRESENCE_FORMAT_SYSTEM: + strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_STEAM_RICH_PRESENCE_FORMAT_SYSTEM), len); + break; + case STEAM_RICH_PRESENCE_FORMAT_CONTENT_SYSTEM: + strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_STEAM_RICH_PRESENCE_FORMAT_CONTENT_SYSTEM), len); + break; + case STEAM_RICH_PRESENCE_FORMAT_CONTENT_CORE: + strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_STEAM_RICH_PRESENCE_FORMAT_CONTENT_CORE), len); + break; + case STEAM_RICH_PRESENCE_FORMAT_CONTENT_SYSTEM_CORE: + strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_STEAM_RICH_PRESENCE_FORMAT_CONTENT_SYSTEM_CORE), len); + break; + case STEAM_RICH_PRESENCE_FORMAT_NONE: + default: + strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NONE), len); + break; + } +} +#endif + enum setting_type menu_setting_get_browser_selection_type(rarch_setting_t *setting) { if (!setting) @@ -9888,6 +9927,16 @@ static bool setting_append_list( &subgroup_info, parent_group); +#ifdef HAVE_MIST + CONFIG_ACTION( + list, list_info, + MENU_ENUM_LABEL_STEAM_SETTINGS, + MENU_ENUM_LABEL_VALUE_STEAM_SETTINGS, + &group_info, + &subgroup_info, + parent_group); +#endif + if (string_is_not_equal(settings->arrays.midi_driver, "null")) { CONFIG_ACTION( @@ -18341,6 +18390,23 @@ static bool setting_append_list( general_read_handler, SD_FLAG_NONE); +#ifdef HAVE_MIST + CONFIG_BOOL( + list, list_info, + &settings->bools.settings_show_steam, + MENU_ENUM_LABEL_SETTINGS_SHOW_STEAM, + MENU_ENUM_LABEL_VALUE_SETTINGS_SHOW_STEAM, + DEFAULT_SETTINGS_SHOW_STEAM, + MENU_ENUM_LABEL_VALUE_OFF, + MENU_ENUM_LABEL_VALUE_ON, + &group_info, + &subgroup_info, + parent_group, + general_write_handler, + general_read_handler, + SD_FLAG_NONE); +#endif + CONFIG_BOOL( list, list_info, &settings->bools.quick_menu_show_take_screenshot, @@ -21120,6 +21186,55 @@ static bool setting_append_list( END_SUB_GROUP(list, list_info, parent_group); END_GROUP(list, list_info, parent_group); break; +#ifdef HAVE_MIST + case SETTINGS_LIST_STEAM: + START_GROUP(list, list_info, &group_info, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_STEAM_SETTINGS), parent_group); + + parent_group = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_STEAM_SETTINGS); + + START_SUB_GROUP(list, list_info, "State", + &group_info, &subgroup_info, parent_group); + + CONFIG_BOOL( + list, list_info, + &settings->bools.steam_rich_presence_enable, + MENU_ENUM_LABEL_STEAM_RICH_PRESENCE_ENABLE, + MENU_ENUM_LABEL_VALUE_STEAM_RICH_PRESENCE_ENABLE, + false, + MENU_ENUM_LABEL_VALUE_OFF, + MENU_ENUM_LABEL_VALUE_ON, + &group_info, + &subgroup_info, + parent_group, + general_write_handler, + general_read_handler, + SD_FLAG_NONE); + (*list)[list_info->index - 1].action_ok = &setting_bool_action_left_with_refresh; + (*list)[list_info->index - 1].action_left = &setting_bool_action_left_with_refresh; + (*list)[list_info->index - 1].action_right = &setting_bool_action_right_with_refresh; + + CONFIG_UINT( + list, list_info, + &settings->uints.steam_rich_presence_format, + MENU_ENUM_LABEL_STEAM_RICH_PRESENCE_FORMAT, + MENU_ENUM_LABEL_VALUE_STEAM_RICH_PRESENCE_FORMAT, + DEFAULT_STEAM_RICH_PRESENCE_FORMAT, + &group_info, + &subgroup_info, + parent_group, + general_write_handler, + general_read_handler); + (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_COMBOBOX; + (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint; + (*list)[list_info->index - 1].get_string_representation = + &setting_get_string_representation_steam_rich_presence_format; + menu_settings_list_current_add_range(list, list_info, 0, (STEAM_RICH_PRESENCE_FORMAT_LAST-1), 1, true, true); + + END_SUB_GROUP(list, list_info, parent_group); + END_GROUP(list, list_info, parent_group); + break; +#endif case SETTINGS_LIST_NONE: default: break; @@ -21268,6 +21383,9 @@ static rarch_setting_t *menu_setting_new_internal(rarch_setting_info_t *list_inf SETTINGS_LIST_DIRECTORY, SETTINGS_LIST_PRIVACY, SETTINGS_LIST_MIDI, +#ifdef HAVE_MIST + SETTINGS_LIST_STEAM, +#endif SETTINGS_LIST_MANUAL_CONTENT_SCAN }; settings_t *settings = config_get_ptr(); diff --git a/msg_hash.h b/msg_hash.h index 4bca5aee7a..bd202f926a 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -1301,6 +1301,7 @@ enum msg_hash_enums MENU_LABEL(SETTINGS_SHOW_PLAYLISTS), MENU_LABEL(SETTINGS_SHOW_USER), MENU_LABEL(SETTINGS_SHOW_DIRECTORY), + MENU_LABEL(SETTINGS_SHOW_STEAM), MENU_LABEL(QUICK_MENU_SHOW_RESUME_CONTENT), MENU_LABEL(QUICK_MENU_SHOW_RESTART_CONTENT), MENU_LABEL(QUICK_MENU_SHOW_CLOSE_CONTENT), @@ -1592,6 +1593,7 @@ enum msg_hash_enums MENU_ENUM_LABEL_DEFERRED_CORE_UPDATER_LIST, MENU_ENUM_LABEL_DEFERRED_CORE_MANAGER_LIST, #ifdef HAVE_MIST + MENU_ENUM_LABEL_DEFERRED_STEAM_SETTINGS_LIST, MENU_ENUM_LABEL_DEFERRED_CORE_MANAGER_STEAM_LIST, #endif MENU_ENUM_LABEL_DEFERRED_THUMBNAILS_UPDATER_LIST, @@ -2310,6 +2312,19 @@ enum msg_hash_enums MENU_LABEL(CORE_UPDATER_LIST), MENU_LABEL(CORE_MANAGER_LIST), #ifdef HAVE_MIST + /* Steam settings */ + MENU_LABEL(STEAM_SETTINGS), + MENU_LABEL(STEAM_RICH_PRESENCE_ENABLE), + MENU_LABEL(STEAM_RICH_PRESENCE_FORMAT), + + MENU_ENUM_LABEL_VALUE_STEAM_RICH_PRESENCE_FORMAT_CONTENT, + MENU_ENUM_LABEL_VALUE_STEAM_RICH_PRESENCE_FORMAT_CORE, + MENU_ENUM_LABEL_VALUE_STEAM_RICH_PRESENCE_FORMAT_SYSTEM, + MENU_ENUM_LABEL_VALUE_STEAM_RICH_PRESENCE_FORMAT_CONTENT_SYSTEM, + MENU_ENUM_LABEL_VALUE_STEAM_RICH_PRESENCE_FORMAT_CONTENT_CORE, + MENU_ENUM_LABEL_VALUE_STEAM_RICH_PRESENCE_FORMAT_CONTENT_SYSTEM_CORE, + + /* Steam Core Manager */ MENU_LABEL(CORE_MANAGER_STEAM_LIST), MENU_LABEL(CORE_STEAM_INSTALL), MENU_LABEL(CORE_STEAM_UNINSTALL), diff --git a/network/discord.c b/network/discord.c index b4b8e31bf2..c2f2669161 100644 --- a/network/discord.c +++ b/network/discord.c @@ -187,7 +187,7 @@ static void handle_discord_join_cb(retro_task_t *task, room->gamename, join_hostname, room->corename, room->subsystem_name); discord_st->connecting = true; if (discord_st->ready) - discord_update(DISCORD_PRESENCE_NETPLAY_CLIENT); + discord_update(PRESENCE_NETPLAY_CLIENT); } finish: @@ -261,7 +261,7 @@ static void handle_discord_join_request(const DiscordUser* request) #endif } -void discord_update(enum discord_presence presence) +void discord_update(enum presence presence) { discord_state_t *discord_st = &discord_state_st; #ifdef HAVE_CHEEVOS @@ -273,8 +273,8 @@ void discord_update(enum discord_presence presence) if (!discord_st->connecting && - ( presence == DISCORD_PRESENCE_NONE - || presence == DISCORD_PRESENCE_MENU)) + ( presence == PRESENCE_NONE + || presence == PRESENCE_MENU)) { memset(&discord_st->presence, 0, sizeof(discord_st->presence)); @@ -283,7 +283,7 @@ void discord_update(enum discord_presence presence) switch (presence) { - case DISCORD_PRESENCE_MENU: + case PRESENCE_MENU: discord_st->presence.details = msg_hash_to_str( MENU_ENUM_LABEL_VALUE_DISCORD_IN_MENU); discord_st->presence.largeImageKey = "base"; @@ -291,7 +291,7 @@ void discord_update(enum discord_presence presence) MENU_ENUM_LABEL_VALUE_NO_CORE); discord_st->presence.instance = 0; break; - case DISCORD_PRESENCE_GAME_PAUSED: + case PRESENCE_GAME_PAUSED: discord_st->presence.smallImageKey = "paused"; discord_st->presence.smallImageText = msg_hash_to_str( MENU_ENUM_LABEL_VALUE_DISCORD_STATUS_PAUSED); @@ -302,7 +302,7 @@ void discord_update(enum discord_presence presence) discord_st->start_time); discord_st->presence.startTimestamp = discord_st->pause_time; break; - case DISCORD_PRESENCE_GAME: + case PRESENCE_GAME: { core_info_t *core_info = NULL; core_info_get_current_core(&core_info); @@ -372,7 +372,7 @@ void discord_update(enum discord_presence presence) } } break; - case DISCORD_PRESENCE_NETPLAY_HOSTING: + case PRESENCE_NETPLAY_HOSTING: { char join_secret[128]; struct netplay_room *room = &networking_state_get_ptr()->host_room; @@ -394,10 +394,10 @@ void discord_update(enum discord_presence presence) discord_st->presence.partySize = 1; } break; - case DISCORD_PRESENCE_NETPLAY_CLIENT: + case PRESENCE_NETPLAY_CLIENT: discord_st->presence.partyId = strdup(discord_st->peer_party_id); break; - case DISCORD_PRESENCE_NETPLAY_NETPLAY_STOPPED: + case PRESENCE_NETPLAY_NETPLAY_STOPPED: { if (!netplay_driver_ctl(RARCH_NETPLAY_CTL_IS_ENABLED, NULL) && !netplay_driver_ctl(RARCH_NETPLAY_CTL_IS_CONNECTED, NULL)) @@ -412,16 +412,16 @@ void discord_update(enum discord_presence presence) } break; #ifdef HAVE_CHEEVOS - case DISCORD_PRESENCE_RETROACHIEVEMENTS: + case PRESENCE_RETROACHIEVEMENTS: if (discord_st->pause_time) return; if (rcheevos_get_richpresence(cheevos_richpresence, sizeof(cheevos_richpresence)) > 0) discord_st->presence.details = cheevos_richpresence; - presence = DISCORD_PRESENCE_GAME; + presence = PRESENCE_GAME; break; #endif - case DISCORD_PRESENCE_SHUTDOWN: + case PRESENCE_SHUTDOWN: discord_st->presence.partyId = NULL; discord_st->presence.partyMax = 0; discord_st->presence.partySize = 0; diff --git a/network/discord.h b/network/discord.h index 8f29a9e1fd..a8a7b14a8f 100644 --- a/network/discord.h +++ b/network/discord.h @@ -25,24 +25,7 @@ #include #include "../deps/discord-rpc/include/discord_rpc.h" - -enum discord_presence -{ - DISCORD_PRESENCE_NONE = 0, - DISCORD_PRESENCE_MENU, - DISCORD_PRESENCE_GAME, - DISCORD_PRESENCE_GAME_PAUSED, - DISCORD_PRESENCE_NETPLAY_HOSTING, - DISCORD_PRESENCE_NETPLAY_CLIENT, - DISCORD_PRESENCE_NETPLAY_NETPLAY_STOPPED, - DISCORD_PRESENCE_RETROACHIEVEMENTS, - DISCORD_PRESENCE_SHUTDOWN -}; - -typedef struct discord_userdata -{ - enum discord_presence status; -} discord_userdata_t; +#include "presence.h" /* The Discord API specifies these variables: - userId --------- char[24] - the userId of the player asking to join @@ -76,7 +59,7 @@ struct discord_state typedef struct discord_state discord_state_t; -void discord_update(enum discord_presence presence); +void discord_update(enum presence presence); bool discord_is_ready(void); diff --git a/network/netplay/netplay_frontend.c b/network/netplay/netplay_frontend.c index 51a9b87b6c..3b5c32f918 100644 --- a/network/netplay/netplay_frontend.c +++ b/network/netplay/netplay_frontend.c @@ -45,6 +45,9 @@ #include #include +#ifdef HAVE_PRESENCE +#include "../presence.h" +#endif #ifdef HAVE_DISCORD #include "../discord.h" #endif @@ -3965,13 +3968,10 @@ void netplay_hangup(netplay_t *netplay, else { dmsg = msg_hash_to_str(MSG_NETPLAY_CLIENT_HANGUP); -#ifdef HAVE_DISCORD - if (discord_state_get_ptr()->inited) - { - discord_userdata_t userdata; - userdata.status = DISCORD_PRESENCE_NETPLAY_NETPLAY_STOPPED; - command_event(CMD_EVENT_DISCORD_UPDATE, &userdata); - } +#ifdef HAVE_PRESENCE + presence_userdata_t userdata; + userdata.status = PRESENCE_NETPLAY_NETPLAY_STOPPED; + command_event(CMD_EVENT_PRESENCE_UPDATE, &userdata); #endif netplay->is_connected = false; } @@ -7861,13 +7861,10 @@ static void netplay_announce_cb(retro_task_t *task, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO); } -#ifdef HAVE_DISCORD - if (discord_state_get_ptr()->inited) - { - discord_userdata_t userdata; - userdata.status = DISCORD_PRESENCE_NETPLAY_HOSTING; - command_event(CMD_EVENT_DISCORD_UPDATE, &userdata); - } +#ifdef HAVE_PRESENCE + presence_userdata_t userdata; + userdata.status = PRESENCE_NETPLAY_HOSTING; + command_event(CMD_EVENT_PRESENCE_UPDATE, &userdata); #endif } @@ -8156,13 +8153,10 @@ static void netplay_disconnect(netplay_t *netplay) deinit_netplay(); -#ifdef HAVE_DISCORD - if (discord_state_get_ptr()->inited) - { - discord_userdata_t userdata; - userdata.status = DISCORD_PRESENCE_NETPLAY_NETPLAY_STOPPED; - command_event(CMD_EVENT_DISCORD_UPDATE, &userdata); - } +#ifdef HAVE_PRESENCE + presence_userdata_t userdata; + userdata.status = PRESENCE_NETPLAY_NETPLAY_STOPPED; + command_event(CMD_EVENT_PRESENCE_UPDATE, &userdata); #endif } @@ -8442,13 +8436,10 @@ bool netplay_driver_ctl(enum rarch_netplay_ctl_state state, void *data) case RARCH_NETPLAY_CTL_DISABLE: net_st->netplay_enabled = false; -#ifdef HAVE_DISCORD - if (discord_state_get_ptr()->inited) - { - discord_userdata_t userdata; - userdata.status = DISCORD_PRESENCE_NETPLAY_NETPLAY_STOPPED; - command_event(CMD_EVENT_DISCORD_UPDATE, &userdata); - } +#ifdef HAVE_PRESENCE + presence_userdata_t userdata; + userdata.status = PRESENCE_NETPLAY_NETPLAY_STOPPED; + command_event(CMD_EVENT_PRESENCE_UPDATE, &userdata); #endif goto done; diff --git a/network/presence.c b/network/presence.c new file mode 100644 index 0000000000..7ea93ec233 --- /dev/null +++ b/network/presence.c @@ -0,0 +1,22 @@ +#include "presence.h" + +#ifdef HAVE_DISCORD +#include "discord.h" +#endif + +#ifdef HAVE_MIST +#include "steam/steam.h" +#endif + +void presence_update(enum presence presence) +{ +#ifdef HAVE_DISCORD + discord_state_t *discord_st = discord_state_get_ptr(); + + if (discord_st->ready) + discord_update(presence); +#endif +#ifdef HAVE_MIST + steam_update_presence(presence, false); +#endif +} diff --git a/network/presence.h b/network/presence.h new file mode 100644 index 0000000000..e5dca493c5 --- /dev/null +++ b/network/presence.h @@ -0,0 +1,24 @@ +#ifndef __RARCH_PRESENCE_H +#define __RARCH_PRESENCE_H + +enum presence +{ + PRESENCE_NONE = 0, + PRESENCE_MENU, + PRESENCE_GAME, + PRESENCE_GAME_PAUSED, + PRESENCE_NETPLAY_HOSTING, + PRESENCE_NETPLAY_CLIENT, + PRESENCE_NETPLAY_NETPLAY_STOPPED, + PRESENCE_RETROACHIEVEMENTS, + PRESENCE_SHUTDOWN +}; + +typedef struct presence_userdata +{ + enum presence status; +} presence_userdata_t; + +void presence_update(enum presence presence); + +#endif /* __RARCH_PRESENCE_H */ diff --git a/retroarch.c b/retroarch.c index 9ebc2f7c7a..dcb6626760 100644 --- a/retroarch.c +++ b/retroarch.c @@ -102,6 +102,9 @@ #include "play_feature_delivery/play_feature_delivery.h" #endif +#ifdef HAVE_PRESENCE +#include "network/presence.h" +#endif #ifdef HAVE_DISCORD #include "network/discord.h" #endif @@ -1948,15 +1951,12 @@ bool command_event(enum event_command cmd, void *data) if (!task_push_start_dummy_core(&content_info)) return false; } -#ifdef HAVE_DISCORD - if (discord_state_get_ptr()->inited) - { - discord_userdata_t userdata; - userdata.status = DISCORD_PRESENCE_NETPLAY_NETPLAY_STOPPED; - command_event(CMD_EVENT_DISCORD_UPDATE, &userdata); - userdata.status = DISCORD_PRESENCE_MENU; - command_event(CMD_EVENT_DISCORD_UPDATE, &userdata); - } +#ifdef HAVE_PRESENCE + presence_userdata_t userdata; + userdata.status = PRESENCE_NETPLAY_NETPLAY_STOPPED; + command_event(CMD_EVENT_PRESENCE_UPDATE, &userdata); + userdata.status = PRESENCE_MENU; + command_event(CMD_EVENT_PRESENCE_UPDATE, &userdata); #endif #ifdef HAVE_DYNAMIC path_clear(RARCH_PATH_CORE); @@ -3342,17 +3342,15 @@ bool command_event(enum event_command cmd, void *data) } #endif break; - case CMD_EVENT_DISCORD_UPDATE: + case CMD_EVENT_PRESENCE_UPDATE: { -#ifdef HAVE_DISCORD - discord_userdata_t *userdata = NULL; - discord_state_t *discord_st = discord_state_get_ptr(); - if (!data || !discord_st->ready) +#ifdef HAVE_PRESENCE + presence_userdata_t *userdata = NULL; + if (!data) return false; - userdata = (discord_userdata_t*)data; - if (discord_st->ready) - discord_update(userdata->status); + userdata = (presence_userdata_t*)data; + presence_update(userdata->status); #endif } break; @@ -5497,17 +5495,16 @@ bool retroarch_main_init(int argc, char *argv[]) if (command_event(CMD_EVENT_DISCORD_INIT, NULL)) discord_st->inited = true; - - if (discord_st->inited) - { - discord_userdata_t userdata; - userdata.status = DISCORD_PRESENCE_MENU; - - command_event(CMD_EVENT_DISCORD_UPDATE, &userdata); - } } #endif +#ifdef HAVE_PRESENCE + presence_userdata_t userdata; + userdata.status = PRESENCE_MENU; + + command_event(CMD_EVENT_PRESENCE_UPDATE, &userdata); +#endif + #if defined(HAVE_AUDIOMIXER) audio_driver_load_system_sounds(); #endif @@ -6013,14 +6010,14 @@ bool retroarch_main_quit(void) runloop_state_t *runloop_st = runloop_state_get_ptr(); video_driver_state_t*video_st = video_state_get_ptr(); settings_t *settings = config_get_ptr(); + +#ifdef HAVE_PRESENCE + presence_userdata_t userdata; + userdata.status = PRESENCE_SHUTDOWN; + command_event(CMD_EVENT_PRESENCE_UPDATE, &userdata); +#endif #ifdef HAVE_DISCORD discord_state_t *discord_st = discord_state_get_ptr(); - if (discord_st->inited) - { - discord_userdata_t userdata; - userdata.status = DISCORD_PRESENCE_SHUTDOWN; - command_event(CMD_EVENT_DISCORD_UPDATE, &userdata); - } if (discord_st->ready) { Discord_ClearPresence(); diff --git a/runloop.c b/runloop.c index 624e8412f5..16cf8fe3f9 100644 --- a/runloop.c +++ b/runloop.c @@ -106,6 +106,9 @@ #include "play_feature_delivery/play_feature_delivery.h" #endif +#ifdef HAVE_PRESENCE +#include "network/presence.h" +#endif #ifdef HAVE_DISCORD #include "network/discord.h" #endif @@ -5457,8 +5460,8 @@ void runloop_runahead_clear_variables(runloop_state_t *runloop_st) void runloop_pause_checks(void) { -#ifdef HAVE_DISCORD - discord_userdata_t userdata; +#ifdef HAVE_PRESENCE + presence_userdata_t userdata; #endif runloop_state_t *runloop_st = &runloop_state; bool is_paused = runloop_st->paused; @@ -5483,9 +5486,9 @@ void runloop_pause_checks(void) if (!is_idle) video_driver_cached_frame(); -#ifdef HAVE_DISCORD - userdata.status = DISCORD_PRESENCE_GAME_PAUSED; - command_event(CMD_EVENT_DISCORD_UPDATE, &userdata); +#ifdef HAVE_PRESENCE + userdata.status = PRESENCE_GAME_PAUSED; + command_event(CMD_EVENT_PRESENCE_UPDATE, &userdata); #endif #ifndef HAVE_LAKKA_SWITCH @@ -6162,11 +6165,11 @@ static bool display_menu_libretro( if (runloop_idle) { -#ifdef HAVE_DISCORD - discord_userdata_t userdata; - userdata.status = DISCORD_PRESENCE_GAME_PAUSED; +#ifdef HAVE_PRESENCE + presence_userdata_t userdata; + userdata.status = PRESENCE_GAME_PAUSED; - command_event(CMD_EVENT_DISCORD_UPDATE, &userdata); + command_event(CMD_EVENT_PRESENCE_UPDATE, &userdata); #endif return false; } @@ -7692,9 +7695,8 @@ int runloop_iterate(void) #ifdef HAVE_CHEATS cheat_manager_apply_retro_cheats(); #endif -#ifdef HAVE_DISCORD - if (discord_st->inited && discord_st->ready) - discord_update(DISCORD_PRESENCE_GAME); +#ifdef HAVE_PRESENCE + presence_update(PRESENCE_GAME); #endif /* Restores analog D-pad binds temporarily overridden. */ diff --git a/steam/steam.c b/steam/steam.c index c34c0afa22..9b7b331bb9 100644 --- a/steam/steam.c +++ b/steam/steam.c @@ -9,6 +9,7 @@ #include "../menu/menu_entries.h" #include "../retroarch.h" #include "../runloop.h" +#include "paths.h" #include "verbosity.h" #include "steam.h" @@ -16,6 +17,7 @@ static bool mist_initialized = false; static bool mist_showing_osk = false; static steam_core_dlc_list_t *mist_dlc_list = NULL; +static enum presence last_presence = PRESENCE_NONE; void str_to_lower(char *str) { @@ -43,7 +45,9 @@ void steam_poll(void) MistCallbackMsg callback; steam_core_dlc_list_t *core_dlc_list; bool has_callback = false; + settings_t* settings = config_get_ptr(); static bool has_poll_errored = false; + static bool has_rich_presence_enabled = false; result = mist_poll(); if (MIST_IS_ERROR(result)) @@ -79,6 +83,13 @@ void steam_poll(void) result = mist_next_callback(&has_callback, &callback); } + + /* Ensure rich presence state is correct */ + if(settings->bools.steam_rich_presence_enable != has_rich_presence_enabled) + { + steam_update_presence(last_presence, true); + has_rich_presence_enabled = settings->bools.steam_rich_presence_enable; + } } steam_core_dlc_list_t *steam_core_dlc_list_new(size_t count) @@ -350,6 +361,101 @@ bool steam_has_osk_open(void) return mist_showing_osk; } +void steam_update_presence(enum presence presence, bool force) +{ + settings_t* settings = config_get_ptr(); + + if (!mist_initialized) + return; + + /* Avoid spamming steam with presence updates */ + if (presence == last_presence && !force) + return; + last_presence = presence; + + /* Ensure rich presence is enabled */ + if(!settings->bools.steam_rich_presence_enable) + { + mist_steam_friends_clear_rich_presence(); + return; + } + + switch (presence) + { + case PRESENCE_MENU: + mist_steam_friends_set_rich_presence("steam_display", "#Status_InMenu"); + break; + case PRESENCE_GAME_PAUSED: + mist_steam_friends_set_rich_presence("steam_display", "#Status_Paused"); + break; + case PRESENCE_GAME: + { + const char *label = NULL; + const struct playlist_entry *entry = NULL; + core_info_t *core_info = NULL; + playlist_t *current_playlist = playlist_get_cached(); + char content[PATH_MAX_LENGTH] = {0}; + + core_info_get_current_core(&core_info); + + if (current_playlist) + { + playlist_get_index_by_path( + current_playlist, + path_get(RARCH_PATH_CONTENT), + &entry); + + if (entry && !string_is_empty(entry->label)) + label = entry->label; + } + + if (!label) + label = path_basename(path_get(RARCH_PATH_BASENAME)); + + switch(settings->uints.steam_rich_presence_format) + { + case STEAM_RICH_PRESENCE_FORMAT_CONTENT: + strncpy(content, label, sizeof(content) - 1); + break; + case STEAM_RICH_PRESENCE_FORMAT_CORE: + strncpy(content, core_info ? core_info->core_name : "N/A", sizeof(content) - 1); + break; + case STEAM_RICH_PRESENCE_FORMAT_SYSTEM: + strncpy(content, core_info ? core_info->systemname : "N/A", sizeof(content) - 1); + break; + case STEAM_RICH_PRESENCE_FORMAT_CONTENT_SYSTEM: + snprintf(content, sizeof(content) - 1, "%s (%s)", + label, + core_info ? core_info->systemname : "N/A"); + break; + case STEAM_RICH_PRESENCE_FORMAT_CONTENT_CORE: + snprintf(content, sizeof(content) - 1, "%s (%s)", + label, + core_info ? core_info->core_name : "N/A"); + break; + case STEAM_RICH_PRESENCE_FORMAT_CONTENT_SYSTEM_CORE: + snprintf(content, sizeof(content) - 1, "%s (%s - %s)", + label, + core_info ? core_info->systemname : "N/A", + core_info ? core_info->core_name : "N/A"); + break; + case STEAM_RICH_PRESENCE_FORMAT_NONE: + default: + break; + } + + + mist_steam_friends_set_rich_presence("content", content); + mist_steam_friends_set_rich_presence("steam_display", + settings->uints.steam_rich_presence_format != STEAM_RICH_PRESENCE_FORMAT_NONE + ? "#Status_RunningContent" : "#Status_Running" ); + } + break; + default: + break; + } +} + void steam_deinit(void) { MistResult result; diff --git a/steam/steam.h b/steam/steam.h index b7f8403559..6ab673fb9e 100644 --- a/steam/steam.h +++ b/steam/steam.h @@ -5,6 +5,7 @@ #include #include "core_info.h" +#include "network/presence.h" #define MIST_UNPACK_RESULT(result) MIST_RESULT_CODE(result), MIST_ERROR(result) @@ -23,6 +24,18 @@ typedef struct size_t count; } steam_core_dlc_list_t; +enum steam_rich_presence_running_format +{ + STEAM_RICH_PRESENCE_FORMAT_NONE = 0, + STEAM_RICH_PRESENCE_FORMAT_CONTENT, + STEAM_RICH_PRESENCE_FORMAT_CORE, + STEAM_RICH_PRESENCE_FORMAT_SYSTEM, + STEAM_RICH_PRESENCE_FORMAT_CONTENT_SYSTEM, + STEAM_RICH_PRESENCE_FORMAT_CONTENT_CORE, + STEAM_RICH_PRESENCE_FORMAT_CONTENT_SYSTEM_CORE, + STEAM_RICH_PRESENCE_FORMAT_LAST +}; + void steam_init(void); void steam_deinit(void); @@ -41,6 +54,8 @@ void steam_uninstall_core_dlc(steam_core_dlc_t *core_dlc); bool steam_open_osk(void); bool steam_has_osk_open(void); +void steam_update_presence(enum presence presence, bool force); + /* Located in tasks/task_steam.c */ void task_push_steam_core_dlc_install(AppId app_id, const char *name); diff --git a/tasks/task_content.c b/tasks/task_content.c index 98e53892c4..a861e4e7aa 100644 --- a/tasks/task_content.c +++ b/tasks/task_content.c @@ -103,8 +103,8 @@ #include "../paths.h" #include "../verbosity.h" -#ifdef HAVE_DISCORD -#include "../network/discord.h" +#ifdef HAVE_PRESENCE +#include "../network/presence.h" #endif #define MAX_ARGS 32 @@ -2456,15 +2456,12 @@ static bool task_load_content_internal( if (firmware_update_status(&content_ctx)) goto end; -#ifdef HAVE_DISCORD - if (discord_state_get_ptr()->inited) - { - discord_userdata_t userdata; - userdata.status = DISCORD_PRESENCE_NETPLAY_NETPLAY_STOPPED; - command_event(CMD_EVENT_DISCORD_UPDATE, &userdata); - userdata.status = DISCORD_PRESENCE_MENU; - command_event(CMD_EVENT_DISCORD_UPDATE, &userdata); - } +#ifdef HAVE_PRESENCE + presence_userdata_t userdata; + userdata.status = PRESENCE_NETPLAY_NETPLAY_STOPPED; + command_event(CMD_EVENT_PRESENCE_UPDATE, &userdata); + userdata.status = PRESENCE_MENU; + command_event(CMD_EVENT_PRESENCE_UPDATE, &userdata); #endif /* Loads content into currently selected core. */