Fix up sending presence format

This commit is contained in:
Chris Marsh 2017-07-20 14:59:32 -07:00
parent 85fc57dea2
commit fa437ad897
3 changed files with 38 additions and 14 deletions

View file

@ -12,6 +12,8 @@
#include <thread>
#endif
#include "rapidjson/internal/itoa.h"
constexpr size_t MaxMessageSize = 16 * 1024;
constexpr size_t MessageQueueSize = 8;
@ -33,6 +35,8 @@ static std::atomic_uint SendQueueNextSend{0};
static std::atomic_uint SendQueuePendingSends{0};
static Backoff ReconnectTimeMs(500, 60 * 1000);
static auto NextConnect{std::chrono::system_clock::now()};
static int Pid = 0;
static int Nonce = 1;
#ifndef DISCORD_DISABLE_IO_THREAD
static std::atomic_bool KeepRunning{ true };
@ -110,6 +114,8 @@ void SignalIOActivity()
extern "C" void Discord_Initialize(const char* applicationId, DiscordEventHandlers* handlers)
{
Pid = GetProcessId();
if (handlers) {
Handlers = *handlers;
}
@ -153,7 +159,9 @@ extern "C" void Discord_UpdatePresence(const DiscordRichPresence* presence)
{
auto qmessage = SendQueueGetNextAddMessage();
if (qmessage) {
qmessage->length = JsonWriteRichPresenceObj(qmessage->buffer, sizeof(qmessage->buffer), presence);
char nonce[32]{};
rapidjson::internal::i32toa(Nonce++, nonce);
qmessage->length = JsonWriteRichPresenceObj(qmessage->buffer, sizeof(qmessage->buffer), nonce, Pid, presence);
SendQueueCommitMessage();
SignalIOActivity();
}

View file

@ -93,19 +93,36 @@ void WriteOptionalString(JsonWriter& w, T& k, const char* value) {
}
}
size_t JsonWriteRichPresenceObj(char* dest, size_t maxLen, const DiscordRichPresence* presence)
void JsonWriteCommandStart(JsonWriter& writer, const char* nonce, const char* cmd)
{
writer.StartObject();
WriteKey(writer, "nonce");
writer.String(nonce);
WriteKey(writer, "cmd");
writer.String(cmd);
WriteKey(writer, "args");
writer.StartObject();
}
void JsonWriteCommandEnd(JsonWriter& writer)
{
writer.EndObject(); // args
writer.EndObject(); // top level
}
size_t JsonWriteRichPresenceObj(char* dest, size_t maxLen, char* nonce, int pid, const DiscordRichPresence* presence)
{
DirectStringBuffer sb(dest, maxLen);
WriterAllocator wa;
JsonWriter writer(sb, &wa, WriterNestingLevels);
// const args = {pid, activity};
// this.socket.write(encode(OPCODES.FRAME, { nonce: uuid(), cmd : 'SET_ACTIVITY', args })
JsonWriteCommandStart(writer, nonce, "SET_ACTIVITY");
writer.StartObject();
WriteKey(writer, "args");
writer.StartObject();
WriteKey(writer, "pid");
writer.Int(pid);
WriteKey(writer, "activity");
writer.StartObject();
@ -177,9 +194,7 @@ size_t JsonWriteRichPresenceObj(char* dest, size_t maxLen, const DiscordRichPres
writer.EndObject(); // activity
writer.EndObject(); // args
writer.EndObject(); // top level
JsonWriteCommandEnd(writer);
return sb.GetSize();
}

View file

@ -17,7 +17,8 @@ inline size_t StringCopy(char (&dest)[Len], const char* src) {
return copied - 1;
}
struct DiscordRichPresence;
size_t JsonWriteRichPresenceObj(char* dest, size_t maxLen, const DiscordRichPresence* presence);
size_t JsonWriteHandshakeObj(char* dest, size_t maxLen, int version, const char* applicationId);
struct DiscordRichPresence;
size_t JsonWriteRichPresenceObj(char* dest, size_t maxLen, char* nonce, int pid, const DiscordRichPresence* presence);