mirror of
https://codeberg.org/grunfink/snac2.git
synced 2024-11-14 17:45:04 +00:00
Upgraded followers to the new db.
This commit is contained in:
parent
9c136dacdf
commit
07fec71273
5 changed files with 92 additions and 71 deletions
|
@ -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;
|
||||
|
|
97
data.c
97
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)
|
|||
}
|
||||
|
||||
|
||||
d_char *object_user_cache_list(snac *snac, const char *cachedir, int max)
|
||||
/* returns the objects in a cache as a list */
|
||||
{
|
||||
xs *idx = xs_fmt("%s/%s.idx", snac->basedir, cachedir);
|
||||
return index_list(idx, max);
|
||||
}
|
||||
|
||||
|
||||
/** specialized functions **/
|
||||
|
||||
d_char *_follower_fn(snac *snac, char *actor)
|
||||
{
|
||||
xs *md5 = xs_md5_hex(actor, strlen(actor));
|
||||
return xs_fmt("%s/followers/%s.json", snac->basedir, md5);
|
||||
}
|
||||
/** followers **/
|
||||
|
||||
|
||||
int follower_add(snac *snac, char *actor, char *msg)
|
||||
int follower_add(snac *snac, const char *actor)
|
||||
/* adds a follower */
|
||||
{
|
||||
int ret = 201; /* created */
|
||||
xs *fn = _follower_fn(snac, actor);
|
||||
FILE *f;
|
||||
int status = object_user_cache_add(snac, actor, "followers");
|
||||
|
||||
if ((f = fopen(fn, "w")) != NULL) {
|
||||
xs *j = xs_json_dumps_pp(msg, 4);
|
||||
|
||||
fwrite(j, 1, strlen(j), f);
|
||||
fclose(f);
|
||||
}
|
||||
else
|
||||
ret = 500;
|
||||
|
||||
snac_debug(snac, 2, xs_fmt("follower_add %s %s", actor, fn));
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
int follower_del(snac *snac, char *actor)
|
||||
/* deletes a follower */
|
||||
{
|
||||
int status = 200;
|
||||
xs *fn = _follower_fn(snac, actor);
|
||||
|
||||
if (fn != NULL)
|
||||
unlink(fn);
|
||||
else
|
||||
status = 404;
|
||||
|
||||
snac_debug(snac, 2, xs_fmt("follower_del %s %s", actor, fn));
|
||||
snac_debug(snac, 2, xs_fmt("follower_add %s %s", actor));
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
int follower_check(snac *snac, char *actor)
|
||||
int follower_del(snac *snac, const char *actor)
|
||||
/* deletes a follower */
|
||||
{
|
||||
int status = object_user_cache_del(snac, actor, "followers");
|
||||
|
||||
snac_debug(snac, 2, xs_fmt("follower_del %s %s", actor));
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
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);
|
||||
|
|
7
html.c
7
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");
|
||||
|
||||
|
|
6
snac.h
6
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);
|
||||
|
|
45
upgrade.c
45
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;
|
||||
|
|
Loading…
Reference in a new issue