summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnton Luka Šijanec <anton@sijanec.eu>2021-09-16 20:43:23 +0200
committerAnton Luka Šijanec <anton@sijanec.eu>2021-09-16 20:43:23 +0200
commit05a742b954d69b78e41d95ec2d5d07d127712cd5 (patch)
treeaaf6f55b3f51f8421b43129bf7b73c1068c41975
parentadded json parsing mechanism (diff)
downloaddiscord.c-05a742b954d69b78e41d95ec2d5d07d127712cd5.tar
discord.c-05a742b954d69b78e41d95ec2d5d07d127712cd5.tar.gz
discord.c-05a742b954d69b78e41d95ec2d5d07d127712cd5.tar.bz2
discord.c-05a742b954d69b78e41d95ec2d5d07d127712cd5.tar.lz
discord.c-05a742b954d69b78e41d95ec2d5d07d127712cd5.tar.xz
discord.c-05a742b954d69b78e41d95ec2d5d07d127712cd5.tar.zst
discord.c-05a742b954d69b78e41d95ec2d5d07d127712cd5.zip
-rw-r--r--src/api.c20
-rw-r--r--src/h.c2
2 files changed, 20 insertions, 2 deletions
diff --git a/src/api.c b/src/api.c
index ead58df..d76393b 100644
--- a/src/api.c
+++ b/src/api.c
@@ -23,6 +23,8 @@ void dc_api_stack (struct dc_api_io i) { /* stack output struct to be delivered
signed char dc_json_cb (struct lejp_ctx * ctx, char /* enum lejp_callbacks */ reason) {
enum dc_json_paths path = ctx->path_match-1; /* we assume that the order of incoming data is */
struct dc_lws_pass * pass = ctx->user; /* correct. op should come first, etc. */
+ char * cp;
+ char buf[LEJP_MAX_PATH+1];
pass->json_reason = reason;
if (reason == LEJPCB_FAILED) {
DC_API_IO_GC(pass->api_io);
@@ -56,13 +58,27 @@ signed char dc_json_cb (struct lejp_ctx * ctx, char /* enum lejp_callbacks */ re
return '\0';
}
*pass->parsing_status &= ~DC_IN_PROGRESS;
- pass->api_io.status |= DC_FROM_LWS; /* we callback on FAILED too, so that we don't */
- // dc_api_io(pass->api_io); /* end up with a memory leak if we allocated a struct */
+ pass->api_io.status |= DC_FROM_LWS;
+ // dc_api_io(pass->api_io); /* not implemented, still testing */
pass->api_io.status &= ~DC_FROM_LWS;
pass->parsing_status = NULL;
pass->packet = DC_NONE;
return '\0';
}
+#define DC_IF_NO_INIT(m) if (!pass->api_io.m) if ((pass->api_io.m = dc_##m##_init()) && (pass->api_io.m->path = strdup(ctx->path)) && (cp = strrchr(pass->api_io.m->path, '.'))) cp[0] = '\0';
+#define DC_IF_PATH_MATCHES(m) if (pass->api_io.m && pass->api_io.m->path && strcpy(buf, ctx->path) && (cp = strrchr(buf, '.')) && (cp[0] = '\0') && !strcmp(pass->api_io.m->path, buf))
+ if (reason & LEJP_FLAG_CB_IS_VALUE) {
+ if (strstr(ctx->path, ".username")) { /* checking properties of user objects */
+ DC_IF_NO_INIT(user);
+ pass->api_io.user->username = strdup(ctx->buf);
+ } else if (strstr(ctx->path, ".discriminator")) {
+ DC_IF_NO_INIT(user);
+ pass->api_io.user->discriminator = atoi(ctx->buf);
+ } else DC_IF_PATH_MATCHES(user) {
+ if (strstr(ctx->path, ".id"))
+ pass->api_io.user->discriminator = strtoull(ctx->buf, NULL, 10);
+ } else if (strstr(ctx->path, ""))
+ }
switch (pass->packet) { /* we fill in structs, set DC_INCOMPLETE and pass->parsing_status */
case DC_PING:
dc_handle_ping(pass->api_io, pass /* this is just so it's not NULL */);
diff --git a/src/h.c b/src/h.c
index 5774cf2..3e47408 100644
--- a/src/h.c
+++ b/src/h.c
@@ -323,6 +323,7 @@ struct dc_user {
unsigned long long int id;
short int discriminator;
enum dc_status status;
+ char * path; /* yesfree, internal, so parser knows what object this user is from */
};
struct dc_user * dc_user_init () {
struct dc_user * s = calloc(1, sizeof(*s));
@@ -332,6 +333,7 @@ void dc_user_free (struct dc_user * s) {
if (!s)
return;
free(s->username);
+ free(s->path);
free(s);
}
struct dc_permission { /* permissions can be individual on a per-channel basis */