commit 748d604

default  ·  2024-09-18 10:12:58 +0000 UTC
parent 5f5d4be
Started support for CSV data export.
4 files changed,  +92, -0
M data.c
M main.c
M snac.h
M data.c
+23, -0
 1@@ -1574,6 +1574,29 @@ int is_muted(snac *snac, const char *actor)
 2 }
 3 
 4 
 5+xs_list *muted_list(snac *user)
 6+/* returns the list (actor URLs) of the muted morons */
 7+{
 8+    xs_list *l = xs_list_new();
 9+    xs *spec = xs_fmt("%s/muted/" "*", user->basedir);
10+    xs *files = xs_glob(spec, 0, 0);
11+    const char *fn;
12+
13+    xs_list_foreach(files, fn) {
14+        FILE *f;
15+
16+        if ((f = fopen(fn, "r")) != NULL) {
17+            xs *actor = xs_strip_i(xs_readline(f));
18+            fclose(f);
19+
20+            l = xs_list_append(l, actor);
21+        }
22+    }
23+
24+    return l;
25+}
26+
27+
28 /** bookmarking **/
29 
30 int is_bookmarked(snac *user, const char *id)
M main.c
+5, -0
 1@@ -267,6 +267,11 @@ int main(int argc, char *argv[])
 2         return 0;
 3     }
 4 
 5+    if (strcmp(cmd, "export_csv") == 0) { /** **/
 6+        export_csv(&snac);
 7+        return 0;
 8+    }
 9+
10     if ((url = GET_ARGV()) == NULL)
11         return usage();
12 
M snac.h
+3, -0
 1@@ -165,6 +165,7 @@ xs_list *following_list(snac *snac);
 2 void mute(snac *snac, const char *actor);
 3 void unmute(snac *snac, const char *actor);
 4 int is_muted(snac *snac, const char *actor);
 5+xs_list *muted_list(snac *user);
 6 
 7 int is_bookmarked(snac *user, const char *id);
 8 int bookmark(snac *user, const char *id);
 9@@ -387,6 +388,8 @@ void mastoapi_purge(void);
10 
11 void verify_links(snac *user);
12 
13+void export_csv(snac *user);
14+void import_csv(snac *user);
15 
16 typedef enum {
17 #define HTTP_STATUS(code, name, text) HTTP_STATUS_ ## name = code,
+61, -0
 1@@ -565,3 +565,64 @@ void verify_links(snac *user)
 2             rename(bfn, fn);
 3     }
 4 }
 5+
 6+
 7+void export_csv(snac *user)
 8+/* exports user data to current directory in a way that pleases Mastodon */
 9+{
10+    FILE *f;
11+    const char *fn;
12+
13+    fn = "bookmarks.csv";
14+    if ((f = fopen(fn, "w")) != NULL) {
15+        snac_log(user, xs_fmt("Creating %s...", fn));
16+
17+        xs *l = bookmark_list(user);
18+        const char *md5;
19+
20+        xs_list_foreach(l, md5) {
21+            xs *post = NULL;
22+
23+            if (valid_status(object_get_by_md5(md5, &post))) {
24+                const char *id = xs_dict_get(post, "id");
25+
26+                if (xs_type(id) == XSTYPE_STRING)
27+                    fprintf(f, "%s\n", id);
28+            }
29+        }
30+
31+        fclose(f);
32+    }
33+    else
34+        snac_log(user, xs_fmt("Cannot create file %s", fn));
35+
36+    fn = "blocked_accounts.csv";
37+    if ((f = fopen(fn, "w")) != NULL) {
38+        snac_log(user, xs_fmt("Creating %s...", fn));
39+
40+        xs *l = muted_list(user);
41+        const char *actor;
42+
43+        xs_list_foreach(l, actor) {
44+            xs *uid = NULL;
45+            int status;
46+
47+            if (valid_status((status = webfinger_request(actor, NULL, &uid)))) {
48+                fprintf(f, "%s\n", uid);
49+            }
50+            else
51+                snac_log(user, xs_fmt("Error resolving muted user %s %d", actor, status));
52+        }
53+
54+        fclose(f);
55+    }
56+    else
57+        snac_log(user, xs_fmt("Cannot create file %s", fn));
58+}
59+
60+
61+void import_csv(snac *user)
62+/* import CSV files from Mastodon */
63+{
64+    (void)user;
65+}