From d5c2bc90c1e40e9caee672a18ccbca9ace1d8d56 Mon Sep 17 00:00:00 2001 From: radius 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 . + */ + +#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 . + */ + +#ifndef __RARCH_DISCORD_H +#define __RARCH_DISCORD_H + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#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++) {