summaryrefslogtreecommitdiff
path: root/protocols/Discord/src/gateway.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'protocols/Discord/src/gateway.cpp')
-rw-r--r--protocols/Discord/src/gateway.cpp45
1 files changed, 39 insertions, 6 deletions
diff --git a/protocols/Discord/src/gateway.cpp b/protocols/Discord/src/gateway.cpp
index 46b7586539..5dfcea52f5 100644
--- a/protocols/Discord/src/gateway.cpp
+++ b/protocols/Discord/src/gateway.cpp
@@ -172,7 +172,7 @@ void CDiscordProto::GatewayProcess(const JSONNode &pRoot)
{
int opCode = pRoot["op"].as_int();
switch (opCode) {
- case 0: // process incoming command
+ case OPCODE_DISPATCH: // process incoming command
{
int iSeq = pRoot["s"].as_int();
if (iSeq != 0)
@@ -187,7 +187,7 @@ void CDiscordProto::GatewayProcess(const JSONNode &pRoot)
}
break;
- case 9: // session invalidated
+ case OPCODE_INVALID_SESSION: // session invalidated
if (pRoot["d"].as_bool()) // session can be resumed
GatewaySendResume();
else {
@@ -196,13 +196,13 @@ void CDiscordProto::GatewayProcess(const JSONNode &pRoot)
}
break;
- case 10: // hello
+ case OPCODE_HELLO: // hello
m_iHartbeatInterval = pRoot["d"]["heartbeat_interval"].as_int();
GatewaySendIdentify();
break;
- case 11: // heartbeat ack
+ case OPCODE_HEARTBEAT_ACK: // heartbeat ack
break;
default:
@@ -220,7 +220,7 @@ void CDiscordProto::GatewaySendHeartbeat()
return;
JSONNode root;
- root << INT_PARAM("op", 1) << INT_PARAM("d", m_iGatewaySeq);
+ root << INT_PARAM("op", OPCODE_HEARTBEAT) << INT_PARAM("d", m_iGatewaySeq);
GatewaySend(root);
}
@@ -245,7 +245,7 @@ void CDiscordProto::GatewaySendIdentify()
payload << CHAR_PARAM("token", m_szAccessToken) << props << BOOL_PARAM("compress", false) << INT_PARAM("large_threshold", 250);
JSONNode root;
- root << INT_PARAM("op", 2) << payload;
+ root << INT_PARAM("op", OPCODE_IDENTIFY) << payload;
GatewaySend(root);
}
@@ -260,3 +260,36 @@ void CDiscordProto::GatewaySendResume()
root << CHAR_PARAM("token", szRandom) << CHAR_PARAM("session_id", m_szGatewaySessionId) << INT_PARAM("seq", m_iGatewaySeq);
GatewaySend(root);
}
+
+void CDiscordProto::GatewaySendStatus(int iStatus, const wchar_t *pwszStatusText)
+{
+ if (iStatus == ID_STATUS_OFFLINE) {
+ Push(new AsyncHttpRequest(this, REQUEST_POST, "/auth/logout", nullptr));
+ return;
+ }
+
+ const char *pszStatus;
+ switch (iStatus) {
+ case ID_STATUS_AWAY:
+ case ID_STATUS_NA:
+ pszStatus = "idle"; break;
+ case ID_STATUS_DND:
+ pszStatus = "dnd"; break;
+ case ID_STATUS_INVISIBLE:
+ pszStatus = "invisible"; break;
+ default:
+ pszStatus = "online"; break;
+ }
+
+ JSONNode payload; payload.set_name("d");
+ payload << INT64_PARAM("since", __int64(time(0)) * 1000) << BOOL_PARAM("afk", true) << CHAR_PARAM("status", pszStatus);
+ if (pwszStatusText == nullptr)
+ payload << CHAR_PARAM("game", nullptr);
+ else {
+ JSONNode game; game.set_name("game"); game << WCHAR_PARAM("name", pwszStatusText) << INT_PARAM("type", 0);
+ payload << game;
+ }
+
+ JSONNode root; root << INT_PARAM("op", OPCODE_STATUS_UPDATE) << payload;
+ GatewaySend(root);
+}