diff --git a/orbisrpc/discord.c b/orbisrpc/discord.c index 0744a98..308ef32 100644 --- a/orbisrpc/discord.c +++ b/orbisrpc/discord.c @@ -108,7 +108,7 @@ static int rx_frame(discord_t *d, char *buf, size_t cap, int *op, int *fin, int6 static int send_identify(discord_t *d, const char *token){ jl_val_t *root=jl_new_object(); if(!root) return -1; - jl_obj_set(root,"op",jl_new_number(2)); + jl_obj_set(root,"op",jl_new_int(2)); jl_val_t *dd=jl_new_object(); if(!dd){ jl_free(root); return -1; } jl_obj_set(dd,"token",jl_new_string(token)); @@ -230,13 +230,14 @@ int discord_set_presence_ex(discord_t *d, const char *state, const char *name, jl_val_t *act=jl_new_object(); if(!act) return -1; jl_obj_set(act,"name",jl_new_string(name?name:"")); - jl_obj_set(act,"type",jl_new_number(0)); /* Playing */ + jl_obj_set(act,"type",jl_new_int(0)); /* Playing */ if(state&&state[0]) jl_obj_set(act,"state",jl_new_string(state)); if(title_id&&title_id[0]) jl_obj_set(act,"details",jl_new_string(title_id)); if(started_epoch>0){ jl_val_t *ts=jl_new_object(); if(!ts){ jl_free(act); return -1; } - jl_obj_set(ts,"start",jl_new_number((double)started_epoch*1000.0)); /* ms epoch */ + if(started_epoch > 0 && started_epoch < 100000000000LL) + jl_obj_set(ts,"start",jl_new_int(started_epoch*1000LL)); /* integer ms epoch */ jl_obj_set(act,"timestamps",ts); } if(application_id&&application_id[0]) @@ -274,7 +275,7 @@ int discord_set_presence_ex(discord_t *d, const char *state, const char *name, jl_obj_set(dd,"afk",jl_new_bool(0)); jl_val_t *root=jl_new_object(); if(!root){ jl_free(dd); return -1; } - jl_obj_set(root,"op",jl_new_number(3)); + jl_obj_set(root,"op",jl_new_int(3)); jl_obj_set(root,"d",dd); char *s=jl_stringify(root); jl_free(root); if(!s) return -1; @@ -291,7 +292,7 @@ int discord_clear_presence(discord_t *d){ jl_obj_set(dd,"afk",jl_new_bool(0)); jl_val_t *root=jl_new_object(); if(!root){ jl_free(dd); return -1; } - jl_obj_set(root,"op",jl_new_number(3)); + jl_obj_set(root,"op",jl_new_int(3)); jl_obj_set(root,"d",dd); char *s=jl_stringify(root); jl_free(root); if(!s) return -1; diff --git a/orbisrpc/jsonlite.c b/orbisrpc/jsonlite.c index 70abcb4..8fad610 100644 --- a/orbisrpc/jsonlite.c +++ b/orbisrpc/jsonlite.c @@ -252,7 +252,7 @@ static int emit(jl_val_t *v, char **out, size_t *cap, size_t *len){ case JL_NULL: { size_t l=4; if(ensure_capacity(out,cap,*len+l+1)<0)return -1; memcpy(*out+*len,"null",4);*len+=4; return 0; } case JL_BOOL: { const char*s=v->num?"true":"false"; size_t l=strlen(s); if(ensure_capacity(out,cap,*len+l+1)<0)return -1; memcpy(*out+*len,s,l);*len+=l; return 0; } - case JL_NUMBER: snprintf(buf,sizeof buf,"%.17g",v->num); break; + case JL_NUMBER: if(v->num_is_int) snprintf(buf,sizeof buf,"%lld",(long long)v->inum); else snprintf(buf,sizeof buf,"%.17g",v->num); break; case JL_STRING: return escstr(v->str,out,cap,len); case JL_ARRAY:{ size_t l=*len+1; if(ensure_capacity(out,cap,l+1)<0)return -1; (*out)[(*len)++]='['; @@ -298,7 +298,8 @@ jl_val_t *jl_new_string(const char *s){ v->strlen=strlen(v->str); return v; } -jl_val_t *jl_new_number(double n){ jl_val_t *v=newval(JL_NUMBER); if(v)v->num=n; return v; } +jl_val_t *jl_new_number(double n){ jl_val_t *v=newval(JL_NUMBER); if(v){v->num=n; v->num_is_int=0;} return v; } +jl_val_t *jl_new_int(int64_t n){ jl_val_t *v=newval(JL_NUMBER); if(v){v->num=(double)n; v->num_is_int=1; v->inum=n;} return v; } jl_val_t *jl_new_bool(int b){ jl_val_t *v=newval(JL_BOOL); if(v)v->num=b?1:0; return v; } jl_val_t *jl_new_null(void){ return newval(JL_NULL); } jl_val_t *jl_new_object(void){ return newval(JL_OBJECT); } diff --git a/orbisrpc/jsonlite.h b/orbisrpc/jsonlite.h index a2a7238..1cba42a 100644 --- a/orbisrpc/jsonlite.h +++ b/orbisrpc/jsonlite.h @@ -9,6 +9,8 @@ typedef struct jl_val { char *str; /* string text OR object-entry key */ size_t strlen; double num; + int num_is_int; + int64_t inum; struct jl_val *child; /* object: first pair ; array: first elem */ struct jl_val *next; /* object pair chain OR array elem chain */ int32_t count; @@ -23,6 +25,7 @@ jl_val_t *jl_arr_at(const jl_val_t *arr, size_t i); char *jl_stringify(const jl_val_t *v); jl_val_t *jl_new_string(const char *s); jl_val_t *jl_new_number(double n); +jl_val_t *jl_new_int(int64_t n); jl_val_t *jl_new_bool(int b); jl_val_t *jl_new_null(void); jl_val_t *jl_new_object(void);