commit 796a111
default
·
2023-05-31 16:35:50 +0000 UTC
parent bec8e88
New function mastoapi_poll().
1 files changed,
+75,
-58
+75,
-58
1@@ -587,6 +587,78 @@ xs_dict *mastoapi_account(const xs_dict *actor)
2 }
3
4
5+xs_dict *mastoapi_poll(snac *snac, const xs_dict *msg)
6+/* creates a mastoapi Poll object */
7+{
8+ xs_dict *poll = NULL;
9+
10+ /* is it a poll? */
11+ if (strcmp(xs_dict_get(msg, "type"), "Question") == 0) {
12+ xs *mid = mastoapi_id(msg);
13+ xs *f = xs_val_new(XSTYPE_FALSE);
14+ xs *t = xs_val_new(XSTYPE_TRUE);
15+ xs_list *opts = NULL;
16+ xs_list *p;
17+ xs_val *v;
18+ int num_votes = 0;
19+ xs *options = xs_list_new();
20+
21+ poll = xs_dict_new();
22+
23+ poll = xs_dict_append(poll, "id", mid);
24+ poll = xs_dict_append(poll, "expires_at", xs_dict_get(msg, "endTime"));
25+ poll = xs_dict_append(poll, "expired", xs_dict_get(msg, "closed") != NULL ? t : f);
26+
27+ if ((opts = xs_dict_get(msg, "oneOf")) != NULL)
28+ poll = xs_dict_append(poll, "multiple", f);
29+ else {
30+ opts = xs_dict_get(msg, "anyOf");
31+ poll = xs_dict_append(poll, "multiple", t);
32+ }
33+
34+ while (xs_list_iter(&opts, &v)) {
35+ const char *title = xs_dict_get(v, "name");
36+ const char *replies = xs_dict_get(v, "replies");
37+
38+ if (title && replies) {
39+ const char *votes_count = xs_dict_get(replies, "totalItems");
40+
41+ if (xs_type(votes_count) == XSTYPE_NUMBER) {
42+ xs *d = xs_dict_new();
43+ d = xs_dict_append(d, "title", title);
44+ d = xs_dict_append(d, "votes_count", votes_count);
45+
46+ options = xs_list_append(options, d);
47+ num_votes += xs_number_get(votes_count);
48+ }
49+ }
50+ }
51+
52+ poll = xs_dict_append(poll, "options", options);
53+ xs *vc = xs_number_new(num_votes);
54+ poll = xs_dict_append(poll, "votes_count", vc);
55+
56+ xs *children = object_children(xs_dict_get(msg, "id"));
57+ int voted = 0;
58+ p = children;
59+ while (xs_list_iter(&p, &v)) {
60+ xs *obj = NULL;
61+
62+ if (valid_status(object_get_by_md5(v, &obj))) {
63+ if (strcmp(xs_dict_get(obj, "attributedTo"), snac->actor) == 0) {
64+ voted = 1;
65+ break;
66+ }
67+ }
68+ }
69+
70+ poll = xs_dict_append(poll, "voted", voted ? t : f);
71+ }
72+
73+ return poll;
74+}
75+
76+
77 xs_dict *mastoapi_status(snac *snac, const xs_dict *msg)
78 /* converts an ActivityPub note to a Mastodon status */
79 {
80@@ -803,66 +875,11 @@ xs_dict *mastoapi_status(snac *snac, const xs_dict *msg)
81
82 st = xs_dict_append(st, "edited_at", tmp);
83
84- /* is it a poll? */
85- if (strcmp(xs_dict_get(msg, "type"), "Question") == 0) {
86- xs *poll = xs_dict_new();
87- xs_list *opts = NULL;
88- xs_list *p;
89- xs_val *v;
90- int num_votes = 0;
91- xs *options = xs_list_new();
92-
93- poll = xs_dict_append(poll, "id", mid);
94- poll = xs_dict_append(poll, "expires_at", xs_dict_get(msg, "endTime"));
95- poll = xs_dict_append(poll, "expired", xs_dict_get(msg, "closed") != NULL ? t : f);
96-
97- if ((opts = xs_dict_get(msg, "oneOf")) != NULL)
98- poll = xs_dict_append(poll, "multiple", f);
99- else {
100- opts = xs_dict_get(msg, "anyOf");
101- poll = xs_dict_append(poll, "multiple", t);
102- }
103-
104- while (xs_list_iter(&opts, &v)) {
105- const char *title = xs_dict_get(v, "name");
106- const char *replies = xs_dict_get(v, "replies");
107-
108- if (title && replies) {
109- const char *votes_count = xs_dict_get(replies, "totalItems");
110-
111- if (xs_type(votes_count) == XSTYPE_NUMBER) {
112- xs *d = xs_dict_new();
113- d = xs_dict_append(d, "title", title);
114- d = xs_dict_append(d, "votes_count", votes_count);
115-
116- options = xs_list_append(options, d);
117- num_votes += xs_number_get(votes_count);
118- }
119- }
120- }
121-
122- poll = xs_dict_append(poll, "options", options);
123- xs *vc = xs_number_new(num_votes);
124- poll = xs_dict_append(poll, "votes_count", vc);
125-
126- xs *children = object_children(id);
127- int voted = 0;
128- p = children;
129- while (xs_list_iter(&p, &v)) {
130- xs *obj = NULL;
131-
132- if (valid_status(object_get_by_md5(v, &obj))) {
133- if (strcmp(xs_dict_get(obj, "attributedTo"), snac->actor) == 0) {
134- voted = 1;
135- break;
136- }
137- }
138- }
139-
140- poll = xs_dict_append(poll, "voted", voted ? t : f);
141+ /* build the poll object, if applicable */
142+ xs *poll = mastoapi_poll(snac, msg);
143
144+ if (poll)
145 st = xs_dict_append(st, "poll", poll);
146- }
147
148 return st;
149 }