diff options
| author | 2022-10-01 09:12:33 +0200 | |
|---|---|---|
| committer | 2022-10-01 09:12:33 +0200 | |
| commit | 2c00c7b0b585867495a505a9daf3ab48aa1dfa0b (patch) | |
| tree | ba3d8f3619f80ab269a24da861ebb38c7056581d | |
| parent | New web action 'Follow'. (diff) | |
| download | snac2-2c00c7b0b585867495a505a9daf3ab48aa1dfa0b.tar.gz snac2-2c00c7b0b585867495a505a9daf3ab48aa1dfa0b.tar.xz snac2-2c00c7b0b585867495a505a9daf3ab48aa1dfa0b.zip | |
New web action 'Unfollow'.
| -rw-r--r-- | activitypub.c | 11 | ||||
| -rw-r--r-- | data.c | 21 | ||||
| -rw-r--r-- | html.c | 16 | ||||
| -rw-r--r-- | snac.h | 2 |
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 | ||
| 440 | d_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 | |||
| 440 | d_char *msg_follow(snac *snac, char *actor) | 451 | d_char *msg_follow(snac *snac, char *actor) |
| 441 | /* creates a 'Follow' message */ | 452 | /* creates a 'Follow' message */ |
| 442 | { | 453 | { |
| @@ -693,6 +693,27 @@ int following_check(snac *snac, char *actor) | |||
| 693 | } | 693 | } |
| 694 | 694 | ||
| 695 | 695 | ||
| 696 | int 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 | |||
| 696 | d_char *_muted_fn(snac *snac, char *actor) | 717 | d_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)); |
| @@ -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) { |
| @@ -75,6 +75,7 @@ d_char *local_list(snac *snac, int max); | |||
| 75 | int following_add(snac *snac, char *actor, char *msg); | 75 | int following_add(snac *snac, char *actor, char *msg); |
| 76 | int following_del(snac *snac, char *actor); | 76 | int following_del(snac *snac, char *actor); |
| 77 | int following_check(snac *snac, char *actor); | 77 | int following_check(snac *snac, char *actor); |
| 78 | int following_get(snac *snac, char *actor, d_char **data); | ||
| 78 | 79 | ||
| 79 | void mute(snac *snac, char *actor); | 80 | void mute(snac *snac, char *actor); |
| 80 | void unmute(snac *snac, char *actor); | 81 | void unmute(snac *snac, char *actor); |
| @@ -112,6 +113,7 @@ d_char *msg_admiration(snac *snac, char *object, char *type); | |||
| 112 | d_char *msg_create(snac *snac, char *object); | 113 | d_char *msg_create(snac *snac, char *object); |
| 113 | d_char *msg_follow(snac *snac, char *actor); | 114 | d_char *msg_follow(snac *snac, char *actor); |
| 114 | d_char *msg_note(snac *snac, char *content, char *rcpts, char *in_reply_to); | 115 | d_char *msg_note(snac *snac, char *content, char *rcpts, char *in_reply_to); |
| 116 | d_char *msg_undo(snac *snac, char *object); | ||
| 115 | 117 | ||
| 116 | int activitypub_request(snac *snac, char *url, d_char **data); | 118 | int activitypub_request(snac *snac, char *url, d_char **data); |
| 117 | int actor_request(snac *snac, char *actor, d_char **data); | 119 | int actor_request(snac *snac, char *actor, d_char **data); |