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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 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++) {