summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--activitypub.c8
-rw-r--r--data.c81
-rw-r--r--html.c7
-rw-r--r--snac.h6
-rw-r--r--upgrade.c45
5 files changed, 84 insertions, 63 deletions
diff --git a/activitypub.c b/activitypub.c
index 7360af1..d22261d 100644
--- a/activitypub.c
+++ b/activitypub.c
@@ -192,12 +192,10 @@ d_char *recipient_list(snac *snac, char *msg, int expand_public)
192 if (expand_public && strcmp(v, public_address) == 0) { 192 if (expand_public && strcmp(v, public_address) == 0) {
193 /* iterate the followers and add them */ 193 /* iterate the followers and add them */
194 xs *fwers = follower_list(snac); 194 xs *fwers = follower_list(snac);
195 char *fw; 195 char *actor;
196 196
197 char *p = fwers; 197 char *p = fwers;
198 while (xs_list_iter(&p, &fw)) { 198 while (xs_list_iter(&p, &actor)) {
199 char *actor = xs_dict_get(fw, "actor");
200
201 if (xs_list_in(list, actor) == -1) 199 if (xs_list_in(list, actor) == -1)
202 list = xs_list_append(list, actor); 200 list = xs_list_append(list, actor);
203 } 201 }
@@ -832,7 +830,7 @@ int process_message(snac *snac, char *msg, char *req)
832 830
833 timeline_add(snac, xs_dict_get(f_msg, "id"), f_msg, NULL, NULL); 831 timeline_add(snac, xs_dict_get(f_msg, "id"), f_msg, NULL, NULL);
834 832
835 follower_add(snac, actor, f_msg); 833 follower_add(snac, actor);
836 834
837 snac_log(snac, xs_fmt("New follower %s", actor)); 835 snac_log(snac, xs_fmt("New follower %s", actor));
838 do_notify = 1; 836 do_notify = 1;
diff --git a/data.c b/data.c
index b3f124e..1b9be2d 100644
--- a/data.c
+++ b/data.c
@@ -15,7 +15,7 @@
15#include <sys/file.h> 15#include <sys/file.h>
16#include <fcntl.h> 16#include <fcntl.h>
17 17
18double db_layout = 2.4; 18double db_layout = 2.5;
19 19
20 20
21int db_upgrade(d_char **error); 21int db_upgrade(d_char **error);
@@ -641,94 +641,73 @@ int object_user_cache_in(snac *snac, const char *id, const char *cachedir)
641} 641}
642 642
643 643
644/** specialized functions **/ 644d_char *object_user_cache_list(snac *snac, const char *cachedir, int max)
645 645/* returns the objects in a cache as a list */
646d_char *_follower_fn(snac *snac, char *actor)
647{ 646{
648 xs *md5 = xs_md5_hex(actor, strlen(actor)); 647 xs *idx = xs_fmt("%s/%s.idx", snac->basedir, cachedir);
649 return xs_fmt("%s/followers/%s.json", snac->basedir, md5); 648 return index_list(idx, max);
650} 649}
651 650
652 651
653int follower_add(snac *snac, char *actor, char *msg) 652/** specialized functions **/
654/* adds a follower */
655{
656 int ret = 201; /* created */
657 xs *fn = _follower_fn(snac, actor);
658 FILE *f;
659 653
660 if ((f = fopen(fn, "w")) != NULL) { 654/** followers **/
661 xs *j = xs_json_dumps_pp(msg, 4);
662 655
663 fwrite(j, 1, strlen(j), f); 656int follower_add(snac *snac, const char *actor)
664 fclose(f); 657/* adds a follower */
665 } 658{
666 else 659 int status = object_user_cache_add(snac, actor, "followers");
667 ret = 500;
668 660
669 snac_debug(snac, 2, xs_fmt("follower_add %s %s", actor, fn)); 661 snac_debug(snac, 2, xs_fmt("follower_add %s %s", actor));
670 662
671 return ret; 663 return status;
672} 664}
673 665
674 666
675int follower_del(snac *snac, char *actor) 667int follower_del(snac *snac, const char *actor)
676/* deletes a follower */ 668/* deletes a follower */
677{ 669{
678 int status = 200; 670 int status = object_user_cache_del(snac, actor, "followers");
679 xs *fn = _follower_fn(snac, actor);
680
681 if (fn != NULL)
682 unlink(fn);
683 else
684 status = 404;
685 671
686 snac_debug(snac, 2, xs_fmt("follower_del %s %s", actor, fn)); 672 snac_debug(snac, 2, xs_fmt("follower_del %s %s", actor));
687 673
688 return status; 674 return status;
689} 675}
690 676
691 677
692int follower_check(snac *snac, char *actor) 678int follower_check(snac *snac, const char *actor)
693/* checks if someone is a follower */ 679/* checks if someone is a follower */
694{ 680{
695 xs *fn = _follower_fn(snac, actor); 681 return object_user_cache_in(snac, actor, "followers");
696
697 return !!(mtime(fn) != 0.0);
698} 682}
699 683
700 684
701d_char *follower_list(snac *snac) 685d_char *follower_list(snac *snac)
702/* returns the list of followers */ 686/* returns the list of followers */
703{ 687{
704 xs *spec = xs_fmt("%s/followers/" "*.json", snac->basedir); 688 xs *list = object_user_cache_list(snac, "followers", XS_ALL);
705 xs *glist = xs_glob(spec, 0, 0); 689 d_char *fwers = xs_list_new();
706 char *p, *v; 690 char *p, *v;
707 d_char *list = xs_list_new();
708 691
709 /* iterate the list of files */ 692 /* resolve the list of md5 to be a list of actors */
710 p = glist; 693 p = list;
711 while (xs_list_iter(&p, &v)) { 694 while (xs_list_iter(&p, &v)) {
712 FILE *f; 695 xs *a_obj = NULL;
713 696
714 /* load the follower data */ 697 if (valid_status(object_get_by_md5(v, &a_obj, NULL))) {
715 if ((f = fopen(v, "r")) != NULL) { 698 char *actor = xs_dict_get(a_obj, "id");
716 xs *j = xs_readall(f);
717 fclose(f);
718 699
719 if (j != NULL) { 700 if (!xs_is_null(actor))
720 xs *o = xs_json_loads(j); 701 fwers = xs_list_append(fwers, actor);
721
722 if (o != NULL)
723 list = xs_list_append(list, o);
724 }
725 } 702 }
726 } 703 }
727 704
728 return list; 705 return fwers;
729} 706}
730 707
731 708
709/** timeline **/
710
732double timeline_mtime(snac *snac) 711double timeline_mtime(snac *snac)
733{ 712{
734 xs *fn = xs_fmt("%s/timeline", snac->basedir); 713 xs *fn = xs_fmt("%s/timeline", snac->basedir);
diff --git a/html.c b/html.c
index b854717..ea154dd 100644
--- a/html.c
+++ b/html.c
@@ -840,13 +840,12 @@ d_char *html_people_list(snac *snac, d_char *os, d_char *list, const char *heade
840{ 840{
841 xs *s = xs_str_new(NULL); 841 xs *s = xs_str_new(NULL);
842 xs *h = xs_fmt("<h2>%s</h2>\n", header); 842 xs *h = xs_fmt("<h2>%s</h2>\n", header);
843 char *p, *v; 843 char *p, *actor_id;
844 844
845 s = xs_str_cat(s, h); 845 s = xs_str_cat(s, h);
846 846
847 p = list; 847 p = list;
848 while (xs_list_iter(&p, &v)) { 848 while (xs_list_iter(&p, &actor_id)) {
849 char *actor_id = xs_dict_get(v, "actor");
850 xs *md5 = xs_md5_hex(actor_id, strlen(actor_id)); 849 xs *md5 = xs_md5_hex(actor_id, strlen(actor_id));
851 xs *actor = NULL; 850 xs *actor = NULL;
852 851
@@ -939,7 +938,7 @@ d_char *html_people(snac *snac)
939 938
940 s = html_user_header(snac, s, 0); 939 s = html_user_header(snac, s, 0);
941 940
942 s = html_people_list(snac, s, wing, L("People you follow"), "i"); 941// s = html_people_list(snac, s, wing, L("People you follow"), "i");
943 942
944 s = html_people_list(snac, s, wers, L("People that follows you"), "e"); 943 s = html_people_list(snac, s, wers, L("People that follows you"), "e");
945 944
diff --git a/snac.h b/snac.h
index 5abf2d1..b8b5215 100644
--- a/snac.h
+++ b/snac.h
@@ -62,9 +62,9 @@ d_char *index_list_desc(const char *fn, int max);
62int object_del(const char *id); 62int object_del(const char *id);
63int object_del_if_unref(const char *id); 63int object_del_if_unref(const char *id);
64 64
65int follower_add(snac *snac, char *actor, char *msg); 65int follower_add(snac *snac, const char *actor);
66int follower_del(snac *snac, char *actor); 66int follower_del(snac *snac, const char *actor);
67int follower_check(snac *snac, char *actor); 67int follower_check(snac *snac, const char *actor);
68d_char *follower_list(snac *snac); 68d_char *follower_list(snac *snac);
69 69
70double timeline_mtime(snac *snac); 70double timeline_mtime(snac *snac);
diff --git a/upgrade.c b/upgrade.c
index 786e0f9..3e6351a 100644
--- a/upgrade.c
+++ b/upgrade.c
@@ -128,6 +128,51 @@ int db_upgrade(d_char **error)
128 128
129 nf = 2.4; 129 nf = 2.4;
130 } 130 }
131 else
132 if (f < 2.5) {
133 /* upgrade followers */
134 xs *users = user_list();
135 char *p, *v;
136
137 xs_debug();
138
139 p = users;
140 while (xs_list_iter(&p, &v)) {
141 snac snac;
142
143 if (user_open(&snac, v)) {
144 xs *spec = xs_fmt("%s/followers/" "*.json", snac.basedir);
145 xs *dir = xs_glob(spec, 0, 0);
146 char *p, *v;
147
148 p = dir;
149 while (xs_list_iter(&p, &v)) {
150 FILE *f;
151
152 if ((f = fopen(v, "r")) != NULL) {
153 xs *s = xs_readall(f);
154 xs *o = xs_json_loads(s);
155 fclose(f);
156
157 char *type = xs_dict_get(o, "type");
158
159 if (!xs_is_null(type) && strcmp(type, "Follow") == 0) {
160 unlink(v);
161
162 char *actor = xs_dict_get(o, "actor");
163
164 if (!xs_is_null(actor))
165 follower_add(&snac, actor);
166 }
167 }
168 }
169
170 user_free(&snac);
171 }
172 }
173
174 nf = 2.5;
175 }
131 176
132 if (f < nf) { 177 if (f < nf) {
133 f = nf; 178 f = nf;