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 }