commit 5b93e90

default  ·  2023-04-23 03:33:54 +0000 UTC
parent 99529a9
Added mastoapi code for account search.
4 files changed,  +46, -6
M snac.h
+2, -2
 1@@ -46,7 +46,7 @@ const char *default_avatar_base64(void)
 2 }
 3 
 4 
 5-int activitypub_request(snac *snac, char *url, d_char **data)
 6+int activitypub_request(snac *snac, const char *url, xs_dict **data)
 7 /* request an object */
 8 {
 9     int status;
10@@ -91,7 +91,7 @@ int activitypub_request(snac *snac, char *url, d_char **data)
11 }
12 
13 
14-int actor_request(snac *snac, char *actor, d_char **data)
15+int actor_request(snac *snac, const char *actor, xs_dict **data)
16 /* request an actor */
17 {
18     int status, status2;
+40, -0
 1@@ -1179,6 +1179,46 @@ int mastoapi_get_handler(const xs_dict *req, const char *q_path,
 2         *ctype = "application/json";
 3         status = 200;
 4     }
 5+    else
 6+    if (strcmp(cmd, "/v2/search") == 0) {
 7+        const char *q      = xs_dict_get(args, "q");
 8+        const char *type   = xs_dict_get(args, "type");
 9+        const char *offset = xs_dict_get(args, "offset");
10+
11+        xs *acl = xs_list_new();
12+        xs *stl = xs_list_new();
13+        xs *htl = xs_list_new();
14+        xs *res = xs_dict_new();
15+
16+        if (xs_is_null(offset) || strcmp(offset, "0") == 0) {
17+            /* reply something only for offset 0; otherwise,
18+               apps like Tusky keep asking again and again */
19+
20+            if (!xs_is_null(q) && strcmp(type, "accounts") == 0) {
21+                /* do a webfinger query */
22+                char *actor = NULL;
23+                char *user  = NULL;
24+
25+                if (valid_status(webfinger_request(q, &actor, &user))) {
26+                    xs *actor_o = NULL;
27+
28+                    if (valid_status(actor_request(&snac1, actor, &actor_o))) {
29+                        xs *acct = mastoapi_account(actor_o);
30+
31+                        acl = xs_list_append(acl, acct);
32+                    }
33+                }
34+            }
35+        }
36+
37+        res = xs_dict_append(res, "accounts", acl);
38+        res = xs_dict_append(res, "statuses", stl);
39+        res = xs_dict_append(res, "hashtags", htl);
40+
41+        *body  = xs_json_dumps_pp(res, 4);
42+        *ctype = "application/json";
43+        status = 200;
44+    }
45 
46     /* user cleanup */
47     if (logged_in)
M snac.h
+3, -3
 1@@ -183,7 +183,7 @@ int check_signature(snac *snac, xs_dict *req, xs_str **err);
 2 
 3 void httpd(void);
 4 
 5-int webfinger_request(char *qs, char **actor, char **user);
 6+int webfinger_request(const char *qs, char **actor, char **user);
 7 int webfinger_get_handler(d_char *req, char *q_path,
 8                           char **body, int *b_size, char **ctype);
 9 
10@@ -201,8 +201,8 @@ d_char *msg_delete(snac *snac, char *id);
11 d_char *msg_actor(snac *snac);
12 xs_dict *msg_update(snac *snac, xs_dict *object);
13 
14-int activitypub_request(snac *snac, char *url, d_char **data);
15-int actor_request(snac *snac, char *actor, d_char **data);
16+int activitypub_request(snac *snac, const char *url, xs_dict **data);
17+int actor_request(snac *snac, const char *actor, xs_dict **data);
18 int send_to_inbox_raw(const char *keyid, const char *seckey,
19                   const xs_str *inbox, const xs_dict *msg,
20                   xs_val **payload, int *p_size, int timeout);
+1, -1
1@@ -8,7 +8,7 @@
2 
3 #include "snac.h"
4 
5-int webfinger_request(char *qs, char **actor, char **user)
6+int webfinger_request(const char *qs, char **actor, char **user)
7 /* queries the webfinger for qs and fills the required fields */
8 {
9     int status;