commit 1ee9814

default  ·  2024-07-30 20:18:30 +0000 UTC
parent 05d4fca
Added initial support for the input message 'Move' (untested).
1 files changed,  +54, -0
+54, -0
 1@@ -2143,6 +2143,60 @@ int process_input_message(snac *snac, const xs_dict *msg, const xs_dict *req)
 2 
 3         do_notify = 1;
 4     }
 5+    else
 6+    if (strcmp(type, "Move") == 0) { /** **/
 7+        const char *old_account = xs_dict_get(msg, "object");
 8+        const char *new_account = xs_dict_get(msg, "target");
 9+
10+        if (!xs_is_null(old_account) && !xs_is_null(new_account)) {
11+            if (following_check(snac, old_account)) {
12+                xs *n_actor = NULL;
13+
14+                if (valid_status(object_get(new_account, &n_actor))) {
15+                    const xs_list *aka = xs_dict_get(n_actor, "alsoKnownAs");
16+
17+                    if (xs_type(aka) == XSTYPE_LIST) {
18+                        if (xs_list_in(aka, old_account) != -1) {
19+                            /* all conditions met! */
20+
21+                            /* follow new account */
22+                            xs *f_msg = msg_follow(snac, new_account);
23+
24+                            if (f_msg != NULL) {
25+                                const char *new_actor = xs_dict_get(f_msg, "object");
26+                                following_add(snac, new_actor, f_msg);
27+                                enqueue_output_by_actor(snac, f_msg, new_actor, 0);
28+
29+                                snac_log(snac, xs_fmt("'Move': following %s", new_account));
30+                            }
31+
32+                            /* unfollow old account */
33+                            xs *of_msg = NULL;
34+
35+                            if (valid_status(following_get(snac, old_account, &of_msg))) {
36+                                xs *uf_msg = msg_undo(snac, xs_dict_get(of_msg, "object"));
37+                                following_del(snac, old_account);
38+                                enqueue_output_by_actor(snac, uf_msg, old_account, 0);
39+
40+                                snac_log(snac, xs_fmt("'Move': unfollowing %s", old_account));
41+                            }
42+                        }
43+                        else
44+                            snac_log(snac, xs_fmt("'Move' error: old actor %s not found in %s 'alsoKnownAs'",
45+                                old_account, new_account));
46+                    }
47+                    else
48+                        snac_log(snac, xs_fmt("'Move' error: cannot get %s 'alsoKnownAs'", new_account));
49+                }
50+                else
51+                    snac_log(snac, xs_fmt("'Move' error: cannot get new actor %s", new_account));
52+            }
53+            else
54+                snac_log(snac, xs_fmt("'Move' error: actor %s is not being followed", old_account));
55+        }
56+        else
57+            snac_log(snac, xs_fmt("'Move' error: malformed message from %s", actor));
58+    }
59     else {
60         srv_archive_error("unsupported_type", "unsupported_type", req, msg);
61