aboutsummaryrefslogtreecommitdiff
path: root/externals/discord-rpc/examples/send-presence/send-presence.c
diff options
context:
space:
mode:
Diffstat (limited to 'externals/discord-rpc/examples/send-presence/send-presence.c')
-rw-r--r--externals/discord-rpc/examples/send-presence/send-presence.c206
1 files changed, 206 insertions, 0 deletions
diff --git a/externals/discord-rpc/examples/send-presence/send-presence.c b/externals/discord-rpc/examples/send-presence/send-presence.c
new file mode 100644
index 0000000000..1b651f2c49
--- /dev/null
+++ b/externals/discord-rpc/examples/send-presence/send-presence.c
@@ -0,0 +1,206 @@
+/*
+ This is a simple example in C of using the rich presence API asynchronously.
+*/
+
+#define _CRT_SECURE_NO_WARNINGS /* thanks Microsoft */
+
+#include <stdint.h>
+#include <stdio.h>
+#include <string.h>
+#include <time.h>
+
+#include "discord_rpc.h"
+
+static const char* APPLICATION_ID = "345229890980937739";
+static int FrustrationLevel = 0;
+static int64_t StartTime;
+static int SendPresence = 1;
+
+static int prompt(char* line, size_t size)
+{
+ int res;
+ char* nl;
+ printf("\n> ");
+ fflush(stdout);
+ res = fgets(line, (int)size, stdin) ? 1 : 0;
+ line[size - 1] = 0;
+ nl = strchr(line, '\n');
+ if (nl) {
+ *nl = 0;
+ }
+ return res;
+}
+
+static void updateDiscordPresence()
+{
+ if (SendPresence) {
+ char buffer[256];
+ DiscordRichPresence discordPresence;
+ memset(&discordPresence, 0, sizeof(discordPresence));
+ discordPresence.state = "West of House";
+ sprintf(buffer, "Frustration level: %d", FrustrationLevel);
+ discordPresence.details = buffer;
+ discordPresence.startTimestamp = StartTime;
+ discordPresence.endTimestamp = time(0) + 5 * 60;
+ discordPresence.largeImageKey = "canary-large";
+ discordPresence.smallImageKey = "ptb-small";
+ discordPresence.partyId = "party1234";
+ discordPresence.partySize = 1;
+ discordPresence.partyMax = 6;
+ discordPresence.partyPrivacy = DISCORD_PARTY_PUBLIC;
+ discordPresence.matchSecret = "xyzzy";
+ discordPresence.joinSecret = "join";
+ discordPresence.spectateSecret = "look";
+ discordPresence.instance = 0;
+ Discord_UpdatePresence(&discordPresence);
+ }
+ else {
+ Discord_ClearPresence();
+ }
+}
+
+static void handleDiscordReady(const DiscordUser* connectedUser)
+{
+ printf("\nDiscord: connected to user %s#%s - %s\n",
+ connectedUser->username,
+ connectedUser->discriminator,
+ connectedUser->userId);
+}
+
+static void handleDiscordDisconnected(int errcode, const char* message)
+{
+ printf("\nDiscord: disconnected (%d: %s)\n", errcode, message);
+}
+
+static void handleDiscordError(int errcode, const char* message)
+{
+ printf("\nDiscord: error (%d: %s)\n", errcode, message);
+}
+
+static void handleDiscordJoin(const char* secret)
+{
+ printf("\nDiscord: join (%s)\n", secret);
+}
+
+static void handleDiscordSpectate(const char* secret)
+{
+ printf("\nDiscord: spectate (%s)\n", secret);
+}
+
+static void handleDiscordJoinRequest(const DiscordUser* request)
+{
+ int response = -1;
+ char yn[4];
+ printf("\nDiscord: join request from %s#%s - %s\n",
+ request->username,
+ request->discriminator,
+ request->userId);
+ do {
+ printf("Accept? (y/n)");
+ if (!prompt(yn, sizeof(yn))) {
+ break;
+ }
+
+ if (!yn[0]) {
+ continue;
+ }
+
+ if (yn[0] == 'y') {
+ response = DISCORD_REPLY_YES;
+ break;
+ }
+
+ if (yn[0] == 'n') {
+ response = DISCORD_REPLY_NO;
+ break;
+ }
+ } while (1);
+ if (response != -1) {
+ Discord_Respond(request->userId, response);
+ }
+}
+
+static void discordInit()
+{
+ DiscordEventHandlers handlers;
+ memset(&handlers, 0, sizeof(handlers));
+ handlers.ready = handleDiscordReady;
+ handlers.disconnected = handleDiscordDisconnected;
+ handlers.errored = handleDiscordError;
+ handlers.joinGame = handleDiscordJoin;
+ handlers.spectateGame = handleDiscordSpectate;
+ handlers.joinRequest = handleDiscordJoinRequest;
+ Discord_Initialize(APPLICATION_ID, &handlers, 1, NULL);
+}
+
+static void gameLoop()
+{
+ char line[512];
+ char* space;
+
+ StartTime = time(0);
+
+ printf("You are standing in an open field west of a white house.\n");
+ while (prompt(line, sizeof(line))) {
+ if (line[0]) {
+ if (line[0] == 'q') {
+ break;
+ }
+
+ if (line[0] == 't') {
+ printf("Shutting off Discord.\n");
+ Discord_Shutdown();
+ continue;
+ }
+
+ if (line[0] == 'c') {
+ if (SendPresence) {
+ printf("Clearing presence information.\n");
+ SendPresence = 0;
+ }
+ else {
+ printf("Restoring presence information.\n");
+ SendPresence = 1;
+ }
+ updateDiscordPresence();
+ continue;
+ }
+
+ if (line[0] == 'y') {
+ printf("Reinit Discord.\n");
+ discordInit();
+ continue;
+ }
+
+ if (time(NULL) & 1) {
+ printf("I don't understand that.\n");
+ }
+ else {
+ space = strchr(line, ' ');
+ if (space) {
+ *space = 0;
+ }
+ printf("I don't know the word \"%s\".\n", line);
+ }
+
+ ++FrustrationLevel;
+
+ updateDiscordPresence();
+ }
+
+#ifdef DISCORD_DISABLE_IO_THREAD
+ Discord_UpdateConnection();
+#endif
+ Discord_RunCallbacks();
+ }
+}
+
+int main(int argc, char* argv[])
+{
+ discordInit();
+
+ gameLoop();
+
+ Discord_Shutdown();
+ return 0;
+}