From d5c2bc90c1e40e9caee672a18ccbca9ace1d8d56 Mon Sep 17 00:00:00 2001 From: radius <andres.430@gmail.com> Date: Mon, 28 May 2018 23:43:30 -0500 Subject: [PATCH] add discord files --- Makefile.common | 13 +++++ command.c | 6 ++- discord/discord.c | 121 ++++++++++++++++++++++++++++++++++++++++++++ discord/discord.h | 47 +++++++++++++++++ media/canvas.png | Bin 18243 -> 15886 bytes qb/config.libs.sh | 1 + qb/config.params.sh | 1 + retroarch.c | 19 ++++++- 8 files changed, 205 insertions(+), 3 deletions(-) create mode 100644 discord/discord.c create mode 100644 discord/discord.h diff --git a/Makefile.common b/Makefile.common index 5dd66d7a87..06ff9f83eb 100644 --- a/Makefile.common +++ b/Makefile.common @@ -1623,6 +1623,19 @@ ifeq ($(HAVE_NETWORKING), 1) $(LIBRETRO_COMM_DIR)/utils/md5.o endif + ifeq ($(HAVE_DISCORD), 1) + DEFINES += -DHAVE_DISCORD + DEFINES += -Ideps/discord-rpc/include/ -Ideps/discord-rpc/thirdparty/rapidjson-1.1.0/include/ + OBJ += deps/discord-rpc/src/connection_win.o \ + deps/discord-rpc/src/discord_register_win.o \ + deps/discord-rpc/src/discord_rpc.o \ + deps/discord-rpc/src/rpc_connection.o \ + deps/discord-rpc/src/serialization.o \ + discord/discord.o + LIBS += -lpsapi -ladvapi32 + + endif + ifeq ($(HAVE_NETWORKGAMEPAD), 1) OBJ += input/input_remote.o \ cores/libretro-net-retropad/net_retropad_core.o diff --git a/command.c b/command.c index 1606ec41a4..693d32cfa1 100644 --- a/command.c +++ b/command.c @@ -44,6 +44,10 @@ #include "cheevos/var.h" #endif +#ifdef HAVE_DISCORD +#include "discord/discord.h" +#endif + #ifdef HAVE_MENU #include "menu/menu_driver.h" #include "menu/menu_content.h" @@ -1275,8 +1279,8 @@ static bool command_event_init_core(enum rarch_core_type *data) if (!core_load(settings->uints.input_poll_type_behavior)) return false; - rarch_ctl(RARCH_CTL_SET_FRAME_LIMIT, NULL); + rarch_ctl(RARCH_CTL_SET_FRAME_LIMIT, NULL); return true; } diff --git a/discord/discord.c b/discord/discord.c new file mode 100644 index 0000000000..c8b5f527f7 --- /dev/null +++ b/discord/discord.c @@ -0,0 +1,121 @@ +/* RetroArch - A frontend for libretro. + * Copyright (C) 2018 - Andrés Suárez + * + * RetroArch is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with RetroArch. + * If not, see <http://www.gnu.org/licenses/>. + */ + +#include "discord.h" + +static const char* APPLICATION_ID = "450822022025576457"; +static int FrustrationLevel = 0; +static int64_t start_time; + +static bool discord_ready = false; +static unsigned discord_status = 0; + +DiscordRichPresence discord_presence; + +static void handle_discord_ready(const DiscordUser* connectedUser) +{ + RARCH_LOG("[discord] connected to user %s#%s - %s\n", + connectedUser->username, + connectedUser->discriminator, + connectedUser->userId); +} + +static void handle_discord_disconnected(int errcode, const char* message) +{ + RARCH_LOG("[discord] disconnected (%d: %s)\n", errcode, message); +} + +static void handle_discord_error(int errcode, const char* message) +{ + RARCH_LOG("[discord] error (%d: %s)\n", errcode, message); +} + +static void handle_discord_join(const char* secret) +{ + RARCH_LOG("[discord] join (%s)\n", secret); +} + +static void handle_discord_spectate(const char* secret) +{ + RARCH_LOG("[discord] spectate (%s)\n", secret); +} + +static void handle_discord_join_request(const DiscordUser* request) +{ + int response = -1; + char yn[4]; + RARCH_LOG("[discord] join request from %s#%s - %s\n", + request->username, + request->discriminator, + request->userId); +} + +void discord_update(unsigned presence) +{ + if (!discord_ready || discord_status != DISCORD_PRESENCE_MENU && discord_status == presence) + return; + + RARCH_LOG("[discord] updating (%d)\n", presence); + memset(&discord_presence, 0, sizeof(discord_presence)); + + switch (presence) + { + case DISCORD_PRESENCE_MENU: + discord_presence.state = "In-Menu"; + discord_presence.largeImageKey = "icon"; + discord_presence.instance = 0; + discord_presence.startTimestamp = start_time; + break; + case DISCORD_PRESENCE_GAME: + start_time = time(0); + discord_presence.state = "Link's House"; + discord_presence.details = "Legend of Zelda, The - Link's Awakening DX"; + discord_presence.largeImageKey = "icon"; + //discord_presence.smallImageKey = "icon"; + discord_presence.instance = 0; + discord_presence.startTimestamp = start_time; + break; + default: + break; + } + Discord_UpdatePresence(&discord_presence); + discord_status = presence; +} + +void discord_init() +{ + RARCH_LOG("[discord] initializing\n"); + start_time = time(0); + + DiscordEventHandlers handlers; + memset(&handlers, 0, sizeof(handlers)); + handlers.ready = handle_discord_ready; + handlers.disconnected = handle_discord_disconnected; + handlers.errored = handle_discord_error; + handlers.joinGame = handle_discord_join; + handlers.spectateGame = handle_discord_spectate; + handlers.joinRequest = handle_discord_join_request; + Discord_Initialize(APPLICATION_ID, &handlers, 1, NULL); + + discord_ready = true; +} + +void discord_shutdown() +{ + RARCH_LOG("[discord] shutting down\n"); + Discord_ClearPresence(); + Discord_Shutdown(); + discord_ready = false; +} \ No newline at end of file diff --git a/discord/discord.h b/discord/discord.h new file mode 100644 index 0000000000..0db386bc5e --- /dev/null +++ b/discord/discord.h @@ -0,0 +1,47 @@ +/* RetroArch - A frontend for libretro. + * Copyright (C) 2018 - Andrés Suárez + * + * RetroArch is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with RetroArch. + * If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef __RARCH_DISCORD_H +#define __RARCH_DISCORD_H + +#include <stdlib.h> +#include <stdarg.h> +#include <stdint.h> +#include <string.h> +#include <math.h> + +#include <boolean.h> +#include <string/stdstring.h> +#include <lists/string_list.h> +#include <retro_timers.h> + +#include "discord_rpc.h" +#include "verbosity.h" + +enum discord_presence +{ + DISCORD_PRESENCE_MENU = 0, + DISCORD_PRESENCE_GAME, + DISCORD_PRESENCE_CHEEVO_UNLOCKED, + DISCORD_PRESENCE_NETPLAY_HOSTING, + DISCORD_PRESENCE_NETPLAY_CLIENT +}; + + +void discord_init(); +void discord_shutdown(); +void discord_update(unsigned presence); + +#endif /* __RARCH_DISCORD_H */ diff --git a/media/canvas.png b/media/canvas.png index 9db4f97136e82ae17067ae7cd8c854b3a5f8ee04..4bc25c00350496cf03f51fb49c9231df1e31a9f7 100644 GIT binary patch literal 15886 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 literal 18243 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 Szaj>6^4OW9Ie*yy`M&^N(j(CT diff --git a/qb/config.libs.sh b/qb/config.libs.sh index e36974ceef..ab7bf0f0d6 100644 --- a/qb/config.libs.sh +++ b/qb/config.libs.sh @@ -213,6 +213,7 @@ else HAVE_NETWORK_CMD='no' HAVE_NETWORKGAMEPAD='no' HAVE_CHEEVOS='no' + HAVE_DISCORD='no' fi check_lib '' STDIN_CMD "$CLIB" fcntl diff --git a/qb/config.params.sh b/qb/config.params.sh index 487bc003a5..af48758f53 100644 --- a/qb/config.params.sh +++ b/qb/config.params.sh @@ -105,6 +105,7 @@ HAVE_QT=auto # Qt companion support C89_QT=no HAVE_XSHM=no # XShm video driver support HAVE_CHEEVOS=yes # Retro Achievements +HAVE_DISCORD=yes # Discord Integration HAVE_SHADERPIPELINE=yes # Additional shader-based pipelines C89_SHADERPIPELINE=no HAVE_VULKAN=auto # Vulkan support diff --git a/retroarch.c b/retroarch.c index e26f3128a9..d20b2fc28e 100644 --- a/retroarch.c +++ b/retroarch.c @@ -70,6 +70,10 @@ #include "cheevos/cheevos.h" #endif +#ifdef HAVE_DISCORD +#include "discord/discord.h" +#endif + #ifdef HAVE_NETWORKING #include "network/netplay/netplay.h" #endif @@ -1374,9 +1378,13 @@ bool retroarch_main_init(int argc, char *argv[]) rarch_error_on_init = false; rarch_is_inited = true; +#ifdef HAVE_DISCORD + discord_init(); + discord_update(DISCORD_PRESENCE_MENU); +#endif + if (rarch_first_start) rarch_first_start = false; - return true; error: @@ -1384,7 +1392,7 @@ error: rarch_is_inited = false; if (rarch_first_start) - rarch_first_start = false; + rarch_first_start = false; return false; } @@ -2322,6 +2330,10 @@ bool retroarch_main_quit(void) runloop_shutdown_initiated = true; rarch_menu_running_finished(); +#ifdef HAVE_DISCORD + discord_shutdown(); +#endif + return true; } @@ -3325,6 +3337,9 @@ int runloop_iterate(unsigned *sleep_ms) if (runloop_check_cheevos()) cheevos_test(); #endif +#ifdef HAVE_DISCORD + discord_update(DISCORD_PRESENCE_GAME); +#endif for (i = 0; i < max_users; i++) {