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)
if (expand_public && strcmp(v, public_address) == 0) {
/* iterate the followers and add them */
xs *fwers = follower_list(snac);
- char *fw;
+ char *actor;
char *p = fwers;
- while (xs_list_iter(&p, &fw)) {
- char *actor = xs_dict_get(fw, "actor");
-
+ while (xs_list_iter(&p, &actor)) {
if (xs_list_in(list, actor) == -1)
list = xs_list_append(list, actor);
}
@@ -832,7 +830,7 @@ int process_message(snac *snac, char *msg, char *req)
timeline_add(snac, xs_dict_get(f_msg, "id"), f_msg, NULL, NULL);
- follower_add(snac, actor, f_msg);
+ follower_add(snac, actor);
snac_log(snac, xs_fmt("New follower %s", actor));
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 @@
#include <sys/file.h>
#include <fcntl.h>
-double db_layout = 2.4;
+double db_layout = 2.5;
int db_upgrade(d_char **error);
@@ -641,94 +641,73 @@ int object_user_cache_in(snac *snac, const char *id, const char *cachedir)
}
-/** specialized functions **/
-
-d_char *_follower_fn(snac *snac, char *actor)
+d_char *object_user_cache_list(snac *snac, const char *cachedir, int max)
+/* returns the objects in a cache as a list */
{
- xs *md5 = xs_md5_hex(actor, strlen(actor));
- return xs_fmt("%s/followers/%s.json", snac->basedir, md5);
+ xs *idx = xs_fmt("%s/%s.idx", snac->basedir, cachedir);
+ return index_list(idx, max);
}
-int follower_add(snac *snac, char *actor, char *msg)
-/* adds a follower */
-{
- int ret = 201; /* created */
- xs *fn = _follower_fn(snac, actor);
- FILE *f;
+/** specialized functions **/
- if ((f = fopen(fn, "w")) != NULL) {
- xs *j = xs_json_dumps_pp(msg, 4);
+/** followers **/
- fwrite(j, 1, strlen(j), f);
- fclose(f);
- }
- else
- ret = 500;
+int follower_add(snac *snac, const char *actor)
+/* adds a follower */
+{
+ int status = object_user_cache_add(snac, actor, "followers");
- snac_debug(snac, 2, xs_fmt("follower_add %s %s", actor, fn));
+ snac_debug(snac, 2, xs_fmt("follower_add %s %s", actor));
- return ret;
+ return status;
}
-int follower_del(snac *snac, char *actor)
+int follower_del(snac *snac, const char *actor)
/* deletes a follower */
{
- int status = 200;
- xs *fn = _follower_fn(snac, actor);
-
- if (fn != NULL)
- unlink(fn);
- else
- status = 404;
+ int status = object_user_cache_del(snac, actor, "followers");
- snac_debug(snac, 2, xs_fmt("follower_del %s %s", actor, fn));
+ snac_debug(snac, 2, xs_fmt("follower_del %s %s", actor));
return status;
}
-int follower_check(snac *snac, char *actor)
+int follower_check(snac *snac, const char *actor)
/* checks if someone is a follower */
{
- xs *fn = _follower_fn(snac, actor);
-
- return !!(mtime(fn) != 0.0);
+ return object_user_cache_in(snac, actor, "followers");
}
d_char *follower_list(snac *snac)
/* returns the list of followers */
{
- xs *spec = xs_fmt("%s/followers/" "*.json", snac->basedir);
- xs *glist = xs_glob(spec, 0, 0);
+ xs *list = object_user_cache_list(snac, "followers", XS_ALL);
+ d_char *fwers = xs_list_new();
char *p, *v;
- d_char *list = xs_list_new();
- /* iterate the list of files */
- p = glist;
+ /* resolve the list of md5 to be a list of actors */
+ p = list;
while (xs_list_iter(&p, &v)) {
- FILE *f;
+ xs *a_obj = NULL;
- /* load the follower data */
- if ((f = fopen(v, "r")) != NULL) {
- xs *j = xs_readall(f);
- fclose(f);
+ if (valid_status(object_get_by_md5(v, &a_obj, NULL))) {
+ char *actor = xs_dict_get(a_obj, "id");
- if (j != NULL) {
- xs *o = xs_json_loads(j);
-
- if (o != NULL)
- list = xs_list_append(list, o);
- }
+ if (!xs_is_null(actor))
+ fwers = xs_list_append(fwers, actor);
}
}
- return list;
+ return fwers;
}
+/** timeline **/
+
double timeline_mtime(snac *snac)
{
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
{
xs *s = xs_str_new(NULL);
xs *h = xs_fmt("<h2>%s</h2>\n", header);
- char *p, *v;
+ char *p, *actor_id;
s = xs_str_cat(s, h);
p = list;
- while (xs_list_iter(&p, &v)) {
- char *actor_id = xs_dict_get(v, "actor");
+ while (xs_list_iter(&p, &actor_id)) {
xs *md5 = xs_md5_hex(actor_id, strlen(actor_id));
xs *actor = NULL;
@@ -939,7 +938,7 @@ d_char *html_people(snac *snac)
s = html_user_header(snac, s, 0);
- s = html_people_list(snac, s, wing, L("People you follow"), "i");
+// s = html_people_list(snac, s, wing, L("People you follow"), "i");
s = html_people_list(snac, s, wers, L("People that follows you"), "e");
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);
int object_del(const char *id);
int object_del_if_unref(const char *id);
-int follower_add(snac *snac, char *actor, char *msg);
-int follower_del(snac *snac, char *actor);
-int follower_check(snac *snac, char *actor);
+int follower_add(snac *snac, const char *actor);
+int follower_del(snac *snac, const char *actor);
+int follower_check(snac *snac, const char *actor);
d_char *follower_list(snac *snac);
double 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)
nf = 2.4;
}
+ else
+ if (f < 2.5) {
+ /* upgrade followers */
+ xs *users = user_list();
+ char *p, *v;
+
+ xs_debug();
+
+ p = users;
+ while (xs_list_iter(&p, &v)) {
+ snac snac;
+
+ if (user_open(&snac, v)) {
+ xs *spec = xs_fmt("%s/followers/" "*.json", snac.basedir);
+ xs *dir = xs_glob(spec, 0, 0);
+ char *p, *v;
+
+ p = dir;
+ while (xs_list_iter(&p, &v)) {
+ FILE *f;
+
+ if ((f = fopen(v, "r")) != NULL) {
+ xs *s = xs_readall(f);
+ xs *o = xs_json_loads(s);
+ fclose(f);
+
+ char *type = xs_dict_get(o, "type");
+
+ if (!xs_is_null(type) && strcmp(type, "Follow") == 0) {
+ unlink(v);
+
+ char *actor = xs_dict_get(o, "actor");
+
+ if (!xs_is_null(actor))
+ follower_add(&snac, actor);
+ }
+ }
+ }
+
+ user_free(&snac);
+ }
+ }
+
+ nf = 2.5;
+ }
if (f < nf) {
f = nf;