Slon/Api/V1/Polls: Implement Polls

Fixes #8
This commit is contained in:
Alec Murphy 2025-03-16 19:21:44 -04:00
parent 9a2a68ef93
commit 966be78422
8 changed files with 347 additions and 0 deletions

View file

@ -40,6 +40,11 @@ U0 @slon_api_v1_statuses_query(SlonHttpSession* session, JsonArray* status_array
Bool exclude_reblogs = @slon_api_get_value_as_boolean(request_json->@("exclude_reblogs", TRUE));
Bool pinned = @slon_api_get_value_as_boolean(request_json->@("pinned", TRUE));
JsonObject* poll = NULL;
JsonArray* poll_choices = NULL;
JsonItem* poll_choice = NULL;
JsonArray* own_votes = NULL;
no_warn exclude_reblogs;
// FIXME: Implement "only_media", "exclude_reblogs", "tagged"
Bool exclude_status = FALSE;
@ -71,6 +76,27 @@ U0 @slon_api_v1_statuses_query(SlonHttpSession* session, JsonArray* status_array
status->o("reblog")->set("reblogged", TRUE, JSON_BOOLEAN);
}
}
if (status->@("poll")) {
poll = status->o("poll");
poll_choices = @slon_api_status_poll_choices(session, status, account_id);
poll_choice = NULL;
own_votes = Json.CreateArray(session->mem_task);
for (i = 0; i < poll_choices->length; i++) {
poll_choice = poll_choices->@(i, TRUE);
switch (poll_choice->type) {
case JSON_NUMBER:
own_votes->append(poll_choice->value, JSON_NUMBER);
break;
case JSON_STRING:
own_votes->append(Str2I64(poll_choice->value), JSON_NUMBER);
break;
default:
break;
}
}
poll->set("voted", poll_choices > NULL, JSON_BOOLEAN);
poll->set("own_votes", own_votes, JSON_ARRAY);
}
exclude_status = FALSE;
if (status->@("deleted")) {
exclude_status = TRUE;
@ -182,6 +208,11 @@ U0 @slon_api_v1_statuses_get(SlonHttpSession* session)
U8* id = session->path(3);
JsonObject* status = NULL;
JsonObject* poll = NULL;
JsonArray* poll_choices = NULL;
JsonItem* poll_choice = NULL;
JsonArray* own_votes = NULL;
if (@slon_api_authorized(session)) {
SLON_AUTH_ACCOUNT_ID
@ -218,6 +249,28 @@ U0 @slon_api_v1_statuses_get(SlonHttpSession* session)
status->o("reblog")->set("reblogged", TRUE, JSON_BOOLEAN);
}
}
if (status->@("poll")) {
poll = status->o("poll");
poll_choices = @slon_api_status_poll_choices(session, status, account_id);
poll_choice = NULL;
own_votes = Json.CreateArray(session->mem_task);
I64 i;
for (i = 0; i < poll_choices->length; i++) {
poll_choice = poll_choices->@(i, TRUE);
switch (poll_choice->type) {
case JSON_NUMBER:
own_votes->append(poll_choice->value, JSON_NUMBER);
break;
case JSON_STRING:
own_votes->append(Str2I64(poll_choice->value), JSON_NUMBER);
break;
default:
break;
}
}
poll->set("voted", poll_choices > NULL, JSON_BOOLEAN);
poll->set("own_votes", own_votes, JSON_ARRAY);
}
session->send(status);
return;
}