summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar default2022-10-01 09:12:33 +0200
committerGravatar default2022-10-01 09:12:33 +0200
commit2c00c7b0b585867495a505a9daf3ab48aa1dfa0b (patch)
treeba3d8f3619f80ab269a24da861ebb38c7056581d
parentNew web action 'Follow'. (diff)
downloadsnac2-2c00c7b0b585867495a505a9daf3ab48aa1dfa0b.tar.gz
snac2-2c00c7b0b585867495a505a9daf3ab48aa1dfa0b.tar.xz
snac2-2c00c7b0b585867495a505a9daf3ab48aa1dfa0b.zip
New web action 'Unfollow'.
-rw-r--r--activitypub.c11
-rw-r--r--data.c21
-rw-r--r--html.c16
-rw-r--r--snac.h2
4 files changed, 49 insertions, 1 deletions
diff --git a/activitypub.c b/activitypub.c
index 5e26fb6..29ce676 100644
--- a/activitypub.c
+++ b/activitypub.c
@@ -437,6 +437,17 @@ d_char *msg_create(snac *snac, char *object)
437} 437}
438 438
439 439
440d_char *msg_undo(snac *snac, char *object)
441/* creates an 'Undo' message */
442{
443 d_char *msg = msg_base(snac, "Undo", "@object", snac->actor, "@now", object);
444
445 msg = xs_dict_append(msg, "to", xs_dict_get(object, "object"));
446
447 return msg;
448}
449
450
440d_char *msg_follow(snac *snac, char *actor) 451d_char *msg_follow(snac *snac, char *actor)
441/* creates a 'Follow' message */ 452/* creates a 'Follow' message */
442{ 453{
diff --git a/data.c b/data.c
index 9051810..4ff5a84 100644
--- a/data.c
+++ b/data.c
@@ -693,6 +693,27 @@ int following_check(snac *snac, char *actor)
693} 693}
694 694
695 695
696int following_get(snac *snac, char *actor, d_char **data)
697/* returns the 'Follow' object */
698{
699 xs *fn = _following_fn(snac, actor);
700 FILE *f;
701 int status = 200;
702
703 if ((f = fopen(fn, "r")) != NULL) {
704 xs *j = xs_readall(f);
705
706 fclose(f);
707
708 *data = xs_json_loads(j);
709 }
710 else
711 status = 404;
712
713 return status;
714}
715
716
696d_char *_muted_fn(snac *snac, char *actor) 717d_char *_muted_fn(snac *snac, char *actor)
697{ 718{
698 xs *md5 = xs_md5_hex(actor, strlen(actor)); 719 xs *md5 = xs_md5_hex(actor, strlen(actor));
diff --git a/html.c b/html.c
index 4e60903..45e1963 100644
--- a/html.c
+++ b/html.c
@@ -867,7 +867,7 @@ int html_post_handler(d_char *req, char *q_path, d_char *payload, int p_size,
867 } 867 }
868 else 868 else
869 if (strcmp(action, L("Follow")) == 0) { 869 if (strcmp(action, L("Follow")) == 0) {
870 char *msg = msg_follow(&snac, actor); 870 xs *msg = msg_follow(&snac, actor);
871 871
872 /* reload the actor from the message, in may be different */ 872 /* reload the actor from the message, in may be different */
873 actor = xs_dict_get(msg, "object"); 873 actor = xs_dict_get(msg, "object");
@@ -878,6 +878,20 @@ int html_post_handler(d_char *req, char *q_path, d_char *payload, int p_size,
878 } 878 }
879 else 879 else
880 if (strcmp(action, L("Unfollow")) == 0) { 880 if (strcmp(action, L("Unfollow")) == 0) {
881 /* get the following object */
882 xs *object = NULL;
883
884 if (valid_status(following_get(&snac, actor, &object))) {
885 xs *msg = msg_undo(&snac, xs_dict_get(object, "object"));
886
887 following_del(&snac, actor);
888
889 enqueue_output(&snac, msg, actor, 0);
890
891 snac_log(&snac, xs_fmt("unfollowed actor %s", actor));
892 }
893 else
894 snac_log(&snac, xs_fmt("actor is not being followed %s", actor));
881 } 895 }
882 else 896 else
883 if (strcmp(action, L("Delete")) == 0) { 897 if (strcmp(action, L("Delete")) == 0) {
diff --git a/snac.h b/snac.h
index 26f153e..afccc65 100644
--- a/snac.h
+++ b/snac.h
@@ -75,6 +75,7 @@ d_char *local_list(snac *snac, int max);
75int following_add(snac *snac, char *actor, char *msg); 75int following_add(snac *snac, char *actor, char *msg);
76int following_del(snac *snac, char *actor); 76int following_del(snac *snac, char *actor);
77int following_check(snac *snac, char *actor); 77int following_check(snac *snac, char *actor);
78int following_get(snac *snac, char *actor, d_char **data);
78 79
79void mute(snac *snac, char *actor); 80void mute(snac *snac, char *actor);
80void unmute(snac *snac, char *actor); 81void unmute(snac *snac, char *actor);
@@ -112,6 +113,7 @@ d_char *msg_admiration(snac *snac, char *object, char *type);
112d_char *msg_create(snac *snac, char *object); 113d_char *msg_create(snac *snac, char *object);
113d_char *msg_follow(snac *snac, char *actor); 114d_char *msg_follow(snac *snac, char *actor);
114d_char *msg_note(snac *snac, char *content, char *rcpts, char *in_reply_to); 115d_char *msg_note(snac *snac, char *content, char *rcpts, char *in_reply_to);
116d_char *msg_undo(snac *snac, char *object);
115 117
116int activitypub_request(snac *snac, char *url, d_char **data); 118int activitypub_request(snac *snac, char *url, d_char **data);
117int actor_request(snac *snac, char *actor, d_char **data); 119int actor_request(snac *snac, char *actor, d_char **data);