commit d3a3621

default  ·  2023-05-05 07:54:41 +0000 UTC
parent cd71bd0
Implemented 'Ping' and 'Pong' activities.

According to https://humungus.tedunangst.com/r/honk/v/tip/f/docs/ping.txt
3 files changed,  +54, -3
M main.c
M snac.h
+38, -3
 1@@ -437,7 +437,8 @@ void process_tags(snac *snac, const char *content, d_char **n_content, d_char **
 2 
 3 /** messages **/
 4 
 5-d_char *msg_base(snac *snac, char *type, char *id, char *actor, char *date, char *object)
 6+xs_dict *msg_base(snac *snac, const char *type, const char *id,
 7+                  const char *actor, const char *date, const char *object)
 8 /* creates a base ActivityPub message */
 9 {
10     xs *did       = NULL;
11@@ -467,7 +468,7 @@ d_char *msg_base(snac *snac, char *type, char *id, char *actor, char *date, char
12         }
13     }
14 
15-    d_char *msg = xs_dict_new();
16+    xs_dict *msg = xs_dict_new();
17 
18     msg = xs_dict_append(msg, "@context", "https:/" "/www.w3.org/ns/activitystreams");
19     msg = xs_dict_append(msg, "type",     type);
20@@ -845,6 +846,28 @@ xs_dict *msg_note(snac *snac, const xs_str *content, const xs_val *rcpts,
21 }
22 
23 
24+xs_dict *msg_ping(snac *user, const char *rcpt)
25+/* creates a Ping message (https://humungus.tedunangst.com/r/honk/v/tip/f/docs/ping.txt) */
26+{
27+    xs_dict *msg = msg_base(user, "Ping", "@dummy", user->actor, NULL, NULL);
28+
29+    msg = xs_dict_append(msg, "to", rcpt);
30+
31+    return msg;
32+}
33+
34+
35+xs_dict *msg_pong(snac *user, const char *rcpt, const char *object)
36+/* creates a Pong message (https://humungus.tedunangst.com/r/honk/v/tip/f/docs/ping.txt) */
37+{
38+    xs_dict *msg = msg_base(user, "Pong", "@dummy", user->actor, NULL, object);
39+
40+    msg = xs_dict_append(msg, "to", rcpt);
41+
42+    return msg;
43+}
44+
45+
46 void notify(snac *snac, xs_str *type, xs_str *utype, xs_str *actor, xs_dict *msg)
47 /* notifies the user of relevant events */
48 {
49@@ -1147,7 +1170,19 @@ int process_input_message(snac *snac, xs_dict *msg, xs_dict *req)
50             snac_debug(snac, 1, xs_fmt("ignored 'Delete' for unknown object %s", object));
51     }
52     else
53-        snac_debug(snac, 1, xs_fmt("process_message type '%s' ignored", type));
54+    if (strcmp(type, "Pong") == 0) {
55+        snac_log(snac, xs_fmt("'Pong' received from %s", actor));
56+    }
57+    else
58+    if (strcmp(type, "Ping") == 0) {
59+        snac_log(snac, xs_fmt("'Ping' requested from %s", actor));
60+
61+        xs *rsp = msg_pong(snac, actor, xs_dict_get(msg, "id"));
62+
63+        enqueue_output_by_actor(snac, rsp, actor, 0);
64+    }
65+    else
66+        snac_debug(snac, 1, xs_fmt("process_input_message type '%s' ignored", type));
67 
68     if (do_notify) {
69         notify(snac, type, utype, actor, msg);
M main.c
+14, -0
 1@@ -30,6 +30,7 @@ int usage(void)
 2     printf("actor {basedir} {uid} {url}      Requests an actor\n");
 3     printf("note {basedir} {uid} {'text'}    Sends a note to followers\n");
 4     printf("resetpwd {basedir} {uid}         Resets the password of a user\n");
 5+    printf("ping {basedir} {uid} {actor}     Pings an actor\n");
 6 
 7     return 1;
 8 }
 9@@ -228,6 +229,19 @@ int main(int argc, char *argv[])
10         return 0;
11     }
12 
13+    if (strcmp(cmd, "ping") == 0) {
14+        xs *msg = msg_ping(&snac, url);
15+
16+        enqueue_output_by_actor(&snac, msg, url, 0);
17+
18+        if (dbglevel) {
19+            xs *j = xs_json_dumps_pp(msg, 4);
20+            printf("%s\n", msg);
21+        }
22+
23+        return 0;
24+    }
25+
26     if (strcmp(cmd, "request") == 0) {
27         int status;
28         xs *data = NULL;
M snac.h
+2, -0
1@@ -203,6 +203,8 @@ d_char *msg_undo(snac *snac, char *object);
2 d_char *msg_delete(snac *snac, char *id);
3 d_char *msg_actor(snac *snac);
4 xs_dict *msg_update(snac *snac, xs_dict *object);
5+xs_dict *msg_ping(snac *user, const char *rcpt);
6+xs_dict *msg_pong(snac *user, const char *rcpt, const char *object);
7 
8 int activitypub_request(snac *snac, const char *url, xs_dict **data);
9 int actor_request(snac *snac, const char *actor, xs_dict **data);