Explorar o código

Notes can be posted WOW!.

default %!s(int64=3) %!d(string=hai) anos
pai
achega
0b6540f503
Modificáronse 3 ficheiros con 97 adicións e 11 borrados
  1. 84 7
      activitypub.c
  2. 11 4
      main.c
  3. 2 0
      snac.h

+ 84 - 7
activitypub.c

@@ -253,11 +253,12 @@ d_char *msg_admiration(snac *snac, char *object, char *type)
 d_char *msg_actor(snac *snac)
 /* create a Person message for this actor */
 {
-    xs *ctxt = xs_list_new();
-    xs *icon = xs_dict_new();
-    xs *keys = xs_dict_new();
-    xs *avtr = NULL;
-    xs *kid  = NULL;
+    xs *ctxt    = xs_list_new();
+    xs *icon    = xs_dict_new();
+    xs *keys    = xs_dict_new();
+    xs *avtr    = NULL;
+    xs *kid     = NULL;
+    xs *f_bio   = NULL;
     d_char *msg = msg_base(snac, "Person", snac->actor, NULL, NULL, NULL);
     char *p;
     int n;
@@ -271,10 +272,11 @@ d_char *msg_actor(snac *snac)
     msg = xs_dict_set(msg, "name",              xs_dict_get(snac->config, "name"));
     msg = xs_dict_set(msg, "preferredUsername", snac->uid);
     msg = xs_dict_set(msg, "published",         xs_dict_get(snac->config, "published"));
-    msg = xs_dict_set(msg, "summary",           xs_dict_get(snac->config, "bio"));
 
-    char *folders[] = { "inbox", "outbox", "followers", "following", NULL };
+    not_really_markdown(xs_dict_get(snac->config, "bio"), &f_bio);
+    msg = xs_dict_set(msg, "summary", f_bio);
 
+    char *folders[] = { "inbox", "outbox", "followers", "following", NULL };
     for (n = 0; folders[n]; n++) {
         xs *f = xs_fmt("%s/%s", snac->actor, folders[n]);
         msg = xs_dict_set(msg, folders[n], f);
@@ -303,6 +305,81 @@ d_char *msg_actor(snac *snac)
 }
 
 
+d_char *msg_create(snac *snac, char *object)
+/* creates a 'Create' message */
+{
+    d_char *msg = msg_base(snac, "Create", "@object", snac->actor, "@now", object);
+
+    msg = xs_dict_append(msg, "attributedTo", xs_dict_get(object, "attributedTo"));
+    msg = xs_dict_append(msg, "to",           xs_dict_get(object, "to"));
+    msg = xs_dict_append(msg, "cc",           xs_dict_get(object, "cc"));
+
+    return msg;
+}
+
+
+d_char *msg_note(snac *snac, char *content, char *rcpts, char *in_reply_to)
+/* creates a 'Note' message */
+{
+    xs *ntid = tid(0);
+    xs *id   = xs_fmt("%s/p/%s", snac->actor, ntid);
+    xs *ctxt = xs_fmt("%s#ctxt", id);
+    xs *fc1  = NULL;
+    xs *to   = NULL;
+    xs *cc   = xs_list_new();
+    xs *irt  = NULL;
+    xs *tag  = NULL;
+    d_char *msg = msg_base(snac, "Note", id, NULL, "@now", NULL);
+    char *p, *v;
+
+    if (rcpts == NULL)
+        to = xs_list_new();
+    else
+        to = xs_dup(rcpts);
+
+    /* format the content */
+    not_really_markdown(content, &fc1);
+
+    if (in_reply_to != NULL) {
+        irt = xs_dup(in_reply_to);
+    }
+    else
+        irt = xs_val_new(XSTYPE_NULL);
+
+    if (tag == NULL)
+        tag = xs_list_new();
+
+    /* add all mentions to the cc */
+    p = tag;
+    while (xs_list_iter(&p, &v)) {
+        if (xs_type(v) == XSTYPE_DICT) {
+            char *t;
+
+            if ((t = xs_dict_get(v, "type")) != NULL && strcmp(t, "Mention") == 0) {
+                if ((t = xs_dict_get(v, "href")) != NULL)
+                    cc = xs_list_append(cc, t);
+            }
+        }
+    }
+
+    /* no recipients? must be for everybody */
+    if (xs_list_len(to) == 0)
+        to = xs_list_append(to, public_address);
+
+    msg = xs_dict_append(msg, "attributedTo", snac->actor);
+    msg = xs_dict_append(msg, "summary",      "");
+    msg = xs_dict_append(msg, "content",      fc1);
+    msg = xs_dict_append(msg, "context",      ctxt);
+    msg = xs_dict_append(msg, "url",          id);
+    msg = xs_dict_append(msg, "to",           to);
+    msg = xs_dict_append(msg, "cc",           cc);
+    msg = xs_dict_append(msg, "inReplyTo",    irt);
+    msg = xs_dict_append(msg, "tag",          tag);
+
+    return msg;
+}
+
+
 /** queues **/
 
 void process_message(snac *snac, char *msg, char *req)

+ 11 - 4
main.c

@@ -165,9 +165,9 @@ int main(int argc, char *argv[])
 
     if (strcmp(cmd, "note") == 0) {
         int status;
-        xs *data = NULL;
         xs *content = NULL;
-        xs *f_content = NULL;
+        xs *msg = NULL;
+        xs *c_msg = NULL;
 
         if (strcmp(url, "-") == 0) {
             /* get the content from an editor */
@@ -189,9 +189,16 @@ int main(int argc, char *argv[])
         else
             content = xs_dup(url);
 
-        not_really_markdown(content, &f_content);
+        msg = msg_note(&snac, content, NULL, NULL);
+
+        c_msg = msg_create(&snac, msg);
+
+        {
+            xs *j = xs_json_dumps_pp(c_msg, 4);
+            printf("%s\n", j);
+        }
 
-        printf("%s\n", f_content);
+        post(&snac, c_msg);
 
         return 0;
     }

+ 2 - 0
snac.h

@@ -88,6 +88,8 @@ int webfinger_get_handler(d_char *req, char *q_path,
                           char **body, int *b_size, char **ctype);
 
 d_char *msg_admiration(snac *snac, char *object, char *type);
+d_char *msg_create(snac *snac, char *object);
+d_char *msg_note(snac *snac, char *content, char *rcpts, char *in_reply_to);
 
 int activitypub_request(snac *snac, char *url, d_char **data);
 int actor_request(snac *snac, char *actor, d_char **data);