summaryrefslogtreecommitdiffstats
path: root/src/api.c
diff options
context:
space:
mode:
authorAnton Luka Šijanec <anton@sijanec.eu>2022-02-16 08:40:26 +0100
committerAnton Luka Šijanec <anton@sijanec.eu>2022-02-16 08:40:26 +0100
commit4b056a414f9eec40a4fb6517c45337a2016544dd (patch)
treeefc12c0adf90bb6b1250453485b4344a4ee9830a /src/api.c
parentzunanjedelo (diff)
downloaddiscord.c-4b056a414f9eec40a4fb6517c45337a2016544dd.tar
discord.c-4b056a414f9eec40a4fb6517c45337a2016544dd.tar.gz
discord.c-4b056a414f9eec40a4fb6517c45337a2016544dd.tar.bz2
discord.c-4b056a414f9eec40a4fb6517c45337a2016544dd.tar.lz
discord.c-4b056a414f9eec40a4fb6517c45337a2016544dd.tar.xz
discord.c-4b056a414f9eec40a4fb6517c45337a2016544dd.tar.zst
discord.c-4b056a414f9eec40a4fb6517c45337a2016544dd.zip
Diffstat (limited to '')
-rw-r--r--src/api.c43
1 files changed, 38 insertions, 5 deletions
diff --git a/src/api.c b/src/api.c
index 0edbcdb..4520888 100644
--- a/src/api.c
+++ b/src/api.c
@@ -54,6 +54,20 @@ unsigned long long int dc_calculate_permissions (struct dc_user * u, struct dc_c
}
return p;
}
+struct dc_user * dc_parse_user (struct dc_user * dst, const cJSON * src) {
+ char * cp;
+ if (!dst)
+ dst = dc_user_init();
+ if ((cp = cJSON_GetStringValue(cJSON_GetObjectItem(src, "username"))))
+ dst->user = strdup(cp);
+ if ((cp = cJSON_GetStringValue(cJSON_GetObjectItem(src, "discriminator"))))
+ dst->discriminator = atoi(cp);
+ else
+ dst->discriminator = -1;
+ if ((cp = cJSON_GetStringValue(cJSON_GetObjectItem(src, "id"))))
+ dst->id = strtoull(cp, NULL, 10);
+ return dst;
+}
static int dc_lws_cb (struct lws * wsi, enum lws_callback_reasons rs, void * us, void * in, size_t len) {
struct dc_lws_pass * pass = (struct dc_lws_pass *) us;
unsigned char buf[LWS_PRE+DC_LWS_BUF+1]; /* whooh, boy, this is more than a meg of stack! */
@@ -194,7 +208,7 @@ static int dc_lws_cb (struct lws * wsi, enum lws_callback_reasons rs, void * us,
char * serialized = dc_json(pass->json, in, len);
while (serialized) {
serialized = dc_json(handler, NULL, 0);
- cJSON json = cJSON_Parse(serialized);
+ cJSON * json = cJSON_Parse(serialized);
pass->api_io.client->last_packet
= cJSON_GetNumberValue(cJSON_GetObjectItem(json, "s"));
switch (cJSON_GetNumberValue(cJSON_GetObjectItem(json, "op"))) {
@@ -204,10 +218,29 @@ static int dc_lws_cb (struct lws * wsi, enum lws_callback_reasons rs, void * us,
default:
break;
}
- double pi;
- if ((pi = cJSON_GetNumberValue(cJSON_GetObjectItem2(json,
- "d", "heartbeat_interval")) != NAN))
- pass->api_io.client->ping_interval = pi;
+ double db;
+ if ((db = cJSON_GetNumberValue(cJSON_GetObjectItem2(json,
+ "d", "heartbeat_interval")) != NAN)) {
+ pass->api_io.client->ping_interval = pi/1000-1;
+ pass->api_io.client->last_ping = time(NULL);
+ }
+ cJSON * obj;
+ if ((obj = cJSON_GetObjectItem(json, "d", "user"))) { /* parsing */
+ struct dc_user * user; /* single */
+ user = dc_parse_user(NULL, obj); /* user */
+ user = dc_addr_user(program, NULL, user,
+ DC_MAY_FREE | DC_REPLACE);
+ if (!pass->api_io.client->user) /* 1. user is us in d.user */
+ pass->api_io.client->user = user;
+ }
+ cJSON_ArrayForEach(user, cJSON_GetObjectItem(json, "users")) {
+ struct dc_user * user = dc_parse_user(NULL, obj);
+ if (user) /* parsing an array of users */
+ dc_addr_user(program, NULL, user,
+ DC_MAY_FREE | DC_REPLACE);
+ }
+#define DC_PTYP(t) (!strcmp(cJSON_GetStringValue(cJSON_GetObjectItem(json, "t")), t))
+ if (DC_PTYP("MESSAGE_CREATE"));
cJSON_Delete(json);
json = NULL;
}