From 3797a1e9efa9423c5512004c18860c283a54301b Mon Sep 17 00:00:00 2001 From: oldmud0 Date: Mon, 8 Jan 2018 00:40:50 -0600 Subject: Add Discord rich presence This would work, were it not for some freak stack corruption caused by GCC not liking the Discord RPC library... --- discord_rich_presence.cpp | 58 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 discord_rich_presence.cpp (limited to 'discord_rich_presence.cpp') diff --git a/discord_rich_presence.cpp b/discord_rich_presence.cpp new file mode 100644 index 0000000..5d64c10 --- /dev/null +++ b/discord_rich_presence.cpp @@ -0,0 +1,58 @@ +#include "discord_rich_presence.h" + +#include + +#include + +namespace AttorneyOnline { + +Discord::Discord() +{ + DiscordEventHandlers handlers; + std::memset(&handlers, 0, sizeof(handlers)); + handlers = {}; + handlers.ready = [] { + qInfo() << "Discord RPC ready"; + }; + /* + handlers.disconnected = [](int errorCode, const char* message) { + qInfo() << "Discord RPC disconnected! " << message; + }; + handlers.errored = [](int errorCode, const char* message) { + qWarning() << "Discord RPC errored out! " << message; + }; + */ + qInfo() << "Are things working out all right?"; + Discord_Initialize(APPLICATION_ID, &handlers, 1, nullptr); +} + +Discord::~Discord() +{ + Discord_Shutdown(); +} + +void Discord::state_lobby() +{ + DiscordRichPresence presence; + std::memset(&presence, 0, sizeof(presence)); + presence.state = "In Lobby"; + presence.details = "Idle"; + presence.largeImageKey = "ao2-logo"; + presence.largeImageText = "Objection!"; + presence.instance = 1; + Discord_UpdatePresence(&presence); +} + +void Discord::state_server(const char* name, const char* server_id) +{ + DiscordRichPresence presence; + std::memset(&presence, 0, sizeof(presence)); + presence.state = "In a Server"; + presence.details = name; + presence.largeImageKey = "ao2-logo"; + presence.largeImageText = "Objection!"; + presence.instance = 1; + presence.matchSecret = server_id; +} + +} -- cgit From dee8de29da7b72b5a1b2566311402933bacf007f Mon Sep 17 00:00:00 2001 From: oldmud0 Date: Mon, 8 Jan 2018 01:13:56 -0600 Subject: Just switch to DLLs. --- discord_rich_presence.cpp | 1 + 1 file changed, 1 insertion(+) (limited to 'discord_rich_presence.cpp') diff --git a/discord_rich_presence.cpp b/discord_rich_presence.cpp index 5d64c10..f5f6c11 100644 --- a/discord_rich_presence.cpp +++ b/discord_rich_presence.cpp @@ -53,6 +53,7 @@ void Discord::state_server(const char* name, const char* server_id) presence.largeImageText = "Objection!"; presence.instance = 1; presence.matchSecret = server_id; + Discord_UpdatePresence(&presence); } } -- cgit From 8a91dea6ce2fa88cdc720759f17d3ac4cf05070b Mon Sep 17 00:00:00 2001 From: oldmud0 Date: Mon, 8 Jan 2018 13:33:39 -0600 Subject: Add spectate state; add "playing as character" state --- discord_rich_presence.cpp | 63 +++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 56 insertions(+), 7 deletions(-) (limited to 'discord_rich_presence.cpp') diff --git a/discord_rich_presence.cpp b/discord_rich_presence.cpp index f5f6c11..bcc0d2a 100644 --- a/discord_rich_presence.cpp +++ b/discord_rich_presence.cpp @@ -1,6 +1,7 @@ #include "discord_rich_presence.h" #include +#include #include @@ -14,15 +15,13 @@ Discord::Discord() handlers.ready = [] { qInfo() << "Discord RPC ready"; }; - /* handlers.disconnected = [](int errorCode, const char* message) { qInfo() << "Discord RPC disconnected! " << message; }; handlers.errored = [](int errorCode, const char* message) { qWarning() << "Discord RPC errored out! " << message; }; - */ - qInfo() << "Are things working out all right?"; + qInfo() << "Initializing Discord RPC"; Discord_Initialize(APPLICATION_ID, &handlers, 1, nullptr); } @@ -35,24 +34,74 @@ void Discord::state_lobby() { DiscordRichPresence presence; std::memset(&presence, 0, sizeof(presence)); + presence.largeImageKey = "ao2-logo"; + presence.largeImageText = "Objection!"; + presence.instance = 1; + presence.state = "In Lobby"; presence.details = "Idle"; + Discord_UpdatePresence(&presence); +} + +void Discord::state_server(std::string name, std::string server_id) +{ + qDebug() << "Discord RPC: Setting server state"; + + DiscordRichPresence presence; + std::memset(&presence, 0, sizeof(presence)); presence.largeImageKey = "ao2-logo"; presence.largeImageText = "Objection!"; presence.instance = 1; + + auto timestamp = static_cast(std::time(nullptr)); + + presence.state = "In a Server"; + presence.details = name.c_str(); + presence.matchSecret = server_id.c_str(); + presence.startTimestamp = this->timestamp; + + this->server_id = server_id; + this->server_name = name; + this->timestamp = timestamp; Discord_UpdatePresence(&presence); } -void Discord::state_server(const char* name, const char* server_id) +void Discord::state_character(std::string name) { + auto name_internal = QString(name.c_str()).toLower().replace(' ', '_').toStdString(); + auto name_friendly = QString(name.c_str()).replace('_', ' ').toStdString(); + const std::string playing_as = "Playing as " + name_friendly; + qDebug() << "Discord RPC: Setting character state (" << playing_as.c_str() << ")"; + + DiscordRichPresence presence; + std::memset(&presence, 0, sizeof(presence)); + presence.largeImageKey = "ao2-logo"; + presence.largeImageText = "Objection!"; + presence.instance = 1; + presence.details = this->server_name.c_str(); + presence.matchSecret = this->server_id.c_str(); + presence.startTimestamp = this->timestamp; + + presence.state = playing_as.c_str(); + presence.smallImageKey = name_internal.c_str(); + // presence.smallImageText = name_internal.c_str(); + Discord_UpdatePresence(&presence); +} + +void Discord::state_spectate() +{ + qDebug() << "Discord RPC: Setting specator state"; + DiscordRichPresence presence; std::memset(&presence, 0, sizeof(presence)); - presence.state = "In a Server"; - presence.details = name; presence.largeImageKey = "ao2-logo"; presence.largeImageText = "Objection!"; presence.instance = 1; - presence.matchSecret = server_id; + presence.details = this->server_name.c_str(); + presence.matchSecret = this->server_id.c_str(); + presence.startTimestamp = this->timestamp; + + presence.state = "Spectating"; Discord_UpdatePresence(&presence); } -- cgit