diff options
| author | 2022-09-20 09:39:28 +0200 | |
|---|---|---|
| committer | 2022-09-20 09:39:28 +0200 | |
| commit | 839cb552f4a42bea5018ce150e85920dbac3f456 (patch) | |
| tree | 0ce9d561561f358635c5d3f4311d512a28ac90b1 /data.c | |
| parent | JSON tweaks. (diff) | |
| download | snac2-839cb552f4a42bea5018ce150e85920dbac3f456.tar.gz snac2-839cb552f4a42bea5018ce150e85920dbac3f456.tar.xz snac2-839cb552f4a42bea5018ce150e85920dbac3f456.zip | |
Added some follower functions.
Diffstat (limited to 'data.c')
| -rw-r--r-- | data.c | 109 |
1 files changed, 104 insertions, 5 deletions
| @@ -4,6 +4,7 @@ | |||
| 4 | #include "xs.h" | 4 | #include "xs.h" |
| 5 | #include "xs_io.h" | 5 | #include "xs_io.h" |
| 6 | #include "xs_json.h" | 6 | #include "xs_json.h" |
| 7 | #include "xs_openssl.h" | ||
| 7 | 8 | ||
| 8 | #include "snac.h" | 9 | #include "snac.h" |
| 9 | 10 | ||
| @@ -16,13 +17,17 @@ int srv_open(char *basedir) | |||
| 16 | int ret = 0; | 17 | int ret = 0; |
| 17 | xs *cfg_file = NULL; | 18 | xs *cfg_file = NULL; |
| 18 | FILE *f; | 19 | FILE *f; |
| 20 | d_char *error = NULL; | ||
| 19 | 21 | ||
| 20 | srv_basedir = xs_str_new(basedir); | 22 | srv_basedir = xs_str_new(basedir); |
| 21 | 23 | ||
| 24 | if (xs_endswith(srv_basedir, "/")) | ||
| 25 | srv_basedir = xs_crop(srv_basedir, 0, -1); | ||
| 26 | |||
| 22 | cfg_file = xs_fmt("%s/server.json", basedir); | 27 | cfg_file = xs_fmt("%s/server.json", basedir); |
| 23 | 28 | ||
| 24 | if ((f = fopen(cfg_file, "r")) == NULL) | 29 | if ((f = fopen(cfg_file, "r")) == NULL) |
| 25 | srv_log(xs_fmt("error opening '%s'", cfg_file)); | 30 | error = xs_fmt("error opening '%s'", cfg_file); |
| 26 | else { | 31 | else { |
| 27 | xs *cfg_data; | 32 | xs *cfg_data; |
| 28 | 33 | ||
| @@ -33,7 +38,7 @@ int srv_open(char *basedir) | |||
| 33 | srv_config = xs_json_loads(cfg_data); | 38 | srv_config = xs_json_loads(cfg_data); |
| 34 | 39 | ||
| 35 | if (srv_config == NULL) | 40 | if (srv_config == NULL) |
| 36 | srv_log(xs_fmt("cannot parse '%s'", cfg_file)); | 41 | error = xs_fmt("cannot parse '%s'", cfg_file); |
| 37 | else { | 42 | else { |
| 38 | char *host; | 43 | char *host; |
| 39 | char *prefix; | 44 | char *prefix; |
| @@ -44,7 +49,7 @@ int srv_open(char *basedir) | |||
| 44 | dbglvl = xs_dict_get(srv_config, "dbglevel"); | 49 | dbglvl = xs_dict_get(srv_config, "dbglevel"); |
| 45 | 50 | ||
| 46 | if (host == NULL || prefix == NULL) | 51 | if (host == NULL || prefix == NULL) |
| 47 | srv_log(xs_str_new("cannot get server data")); | 52 | error = xs_str_new("cannot get server data"); |
| 48 | else { | 53 | else { |
| 49 | srv_baseurl = xs_fmt("https://%s%s", host, prefix); | 54 | srv_baseurl = xs_fmt("https://%s%s", host, prefix); |
| 50 | 55 | ||
| @@ -52,7 +57,7 @@ int srv_open(char *basedir) | |||
| 52 | 57 | ||
| 53 | if ((dbglvl = getenv("DEBUG")) != NULL) { | 58 | if ((dbglvl = getenv("DEBUG")) != NULL) { |
| 54 | dbglevel = atoi(dbglvl); | 59 | dbglevel = atoi(dbglvl); |
| 55 | srv_log(xs_fmt("DEBUG level set to %d from environment", dbglevel)); | 60 | error = xs_fmt("DEBUG level set to %d from environment", dbglevel); |
| 56 | } | 61 | } |
| 57 | 62 | ||
| 58 | ret = 1; | 63 | ret = 1; |
| @@ -60,6 +65,9 @@ int srv_open(char *basedir) | |||
| 60 | } | 65 | } |
| 61 | } | 66 | } |
| 62 | 67 | ||
| 68 | if (ret == 0 && error != NULL) | ||
| 69 | srv_log(error); | ||
| 70 | |||
| 63 | return ret; | 71 | return ret; |
| 64 | } | 72 | } |
| 65 | 73 | ||
| @@ -144,7 +152,7 @@ d_char *user_list(void) | |||
| 144 | globbuf.gl_offs = 1; | 152 | globbuf.gl_offs = 1; |
| 145 | 153 | ||
| 146 | list = xs_list_new(); | 154 | list = xs_list_new(); |
| 147 | spec = xs_fmt("%s/user/*", srv_basedir); /**/ | 155 | spec = xs_fmt("%s/user/" "*", srv_basedir); |
| 148 | 156 | ||
| 149 | if (glob(spec, 0, NULL, &globbuf) == 0) { | 157 | if (glob(spec, 0, NULL, &globbuf) == 0) { |
| 150 | int n; | 158 | int n; |
| @@ -161,3 +169,94 @@ d_char *user_list(void) | |||
| 161 | return list; | 169 | return list; |
| 162 | } | 170 | } |
| 163 | 171 | ||
| 172 | |||
| 173 | float mtime(char *fn) | ||
| 174 | /* returns the mtime of a file or directory, or 0.0 */ | ||
| 175 | { | ||
| 176 | struct stat st; | ||
| 177 | float r = 0.0; | ||
| 178 | |||
| 179 | if (stat(fn, &st) != -1) | ||
| 180 | r = (float)st.st_mtim.tv_sec; | ||
| 181 | |||
| 182 | return r; | ||
| 183 | } | ||
| 184 | |||
| 185 | |||
| 186 | d_char *_follower_fn(snac *snac, char *actor) | ||
| 187 | { | ||
| 188 | xs *md5 = xs_md5_hex(actor, strlen(actor)); | ||
| 189 | return xs_fmt("%s/followers/%s.json", snac->basedir, md5); | ||
| 190 | } | ||
| 191 | |||
| 192 | |||
| 193 | int follower_add(snac *snac, char *actor, char *msg) | ||
| 194 | /* adds a follower */ | ||
| 195 | { | ||
| 196 | int ret = 201; /* created */ | ||
| 197 | xs *fn = _follower_fn(snac, actor); | ||
| 198 | FILE *f; | ||
| 199 | |||
| 200 | if ((f = fopen(fn, "w")) != NULL) { | ||
| 201 | xs *j = xs_json_dumps_pp(msg, 4); | ||
| 202 | |||
| 203 | fwrite(j, 1, strlen(j), f); | ||
| 204 | fclose(f); | ||
| 205 | } | ||
| 206 | else | ||
| 207 | ret = 500; | ||
| 208 | |||
| 209 | snac_debug(snac, 2, xs_fmt("follower_add %s %s", actor, fn)); | ||
| 210 | |||
| 211 | return ret; | ||
| 212 | } | ||
| 213 | |||
| 214 | |||
| 215 | int follower_del(snac *snac, char *actor) | ||
| 216 | /* deletes a follower */ | ||
| 217 | { | ||
| 218 | xs *fn = _follower_fn(snac, actor); | ||
| 219 | |||
| 220 | unlink(fn); | ||
| 221 | |||
| 222 | snac_debug(snac, 2, xs_fmt("follower_del %s %s", actor, fn)); | ||
| 223 | |||
| 224 | return 200; | ||
| 225 | } | ||
| 226 | |||
| 227 | |||
| 228 | int follower_check(snac *snac, char *actor) | ||
| 229 | /* checks if someone is a follower */ | ||
| 230 | { | ||
| 231 | xs *fn = _follower_fn(snac, actor); | ||
| 232 | |||
| 233 | return !!(mtime(fn) != 0.0); | ||
| 234 | } | ||
| 235 | |||
| 236 | |||
| 237 | d_char *follower_list(snac *snac) | ||
| 238 | /* returns the list of followers */ | ||
| 239 | { | ||
| 240 | d_char *list; | ||
| 241 | xs *spec; | ||
| 242 | glob_t globbuf; | ||
| 243 | |||
| 244 | list = xs_list_new(); | ||
| 245 | spec = xs_fmt("%s/followers/" "*.json", snac->basedir); | ||
| 246 | |||
| 247 | if (glob(spec, 0, NULL, &globbuf) == 0) { | ||
| 248 | int n; | ||
| 249 | char *p; | ||
| 250 | |||
| 251 | for (n = 0; (p = globbuf.gl_pathv[n]) != NULL; n++) { | ||
| 252 | FILE *f; | ||
| 253 | |||
| 254 | if ((f = fopen(p, "r")) != NULL) { | ||
| 255 | } | ||
| 256 | } | ||
| 257 | } | ||
| 258 | |||
| 259 | globfree(&globbuf); | ||
| 260 | |||
| 261 | return list; | ||
| 262 | } | ||