diff options
author | Anton Luka Šijanec <anton@sijanec.eu> | 2022-02-16 08:40:26 +0100 |
---|---|---|
committer | Anton Luka Šijanec <anton@sijanec.eu> | 2022-02-16 08:40:26 +0100 |
commit | 4b056a414f9eec40a4fb6517c45337a2016544dd (patch) | |
tree | efc12c0adf90bb6b1250453485b4344a4ee9830a /src | |
parent | zunanjedelo (diff) | |
download | discord.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.c | 43 |
1 files changed, 38 insertions, 5 deletions
@@ -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; } |