diff options
Diffstat (limited to 'utils.c')
| -rw-r--r-- | utils.c | 55 |
1 files changed, 43 insertions, 12 deletions
| @@ -446,7 +446,8 @@ int deluser(snac *user) | |||
| 446 | void verify_links(snac *user) | 446 | void verify_links(snac *user) |
| 447 | /* verifies a user's links */ | 447 | /* verifies a user's links */ |
| 448 | { | 448 | { |
| 449 | const xs_dict *p = xs_dict_get(user->config, "metadata"); | 449 | xs *metadata = NULL; |
| 450 | const xs_dict *md = xs_dict_get(user->config, "metadata"); | ||
| 450 | const char *k, *v; | 451 | const char *k, *v; |
| 451 | int changed = 0; | 452 | int changed = 0; |
| 452 | 453 | ||
| @@ -454,8 +455,30 @@ void verify_links(snac *user) | |||
| 454 | headers = xs_dict_append(headers, "accept", "text/html"); | 455 | headers = xs_dict_append(headers, "accept", "text/html"); |
| 455 | headers = xs_dict_append(headers, "user-agent", USER_AGENT " (link verify)"); | 456 | headers = xs_dict_append(headers, "user-agent", USER_AGENT " (link verify)"); |
| 456 | 457 | ||
| 458 | if (xs_type(md) == XSTYPE_DICT) | ||
| 459 | metadata = xs_dup(md); | ||
| 460 | else | ||
| 461 | if (xs_type(md) == XSTYPE_STRING) { | ||
| 462 | /* convert to dict for easier iteration */ | ||
| 463 | metadata = xs_dict_new(); | ||
| 464 | xs *l = xs_split(md, "\n"); | ||
| 465 | const char *ll; | ||
| 466 | |||
| 467 | xs_list_foreach(l, ll) { | ||
| 468 | xs *kv = xs_split_n(ll, "=", 1); | ||
| 469 | const char *k = xs_list_get(kv, 0); | ||
| 470 | const char *v = xs_list_get(kv, 1); | ||
| 471 | |||
| 472 | if (k && v) { | ||
| 473 | xs *kk = xs_strip_i(xs_dup(k)); | ||
| 474 | xs *vv = xs_strip_i(xs_dup(v)); | ||
| 475 | metadata = xs_dict_set(metadata, kk, vv); | ||
| 476 | } | ||
| 477 | } | ||
| 478 | } | ||
| 479 | |||
| 457 | int c = 0; | 480 | int c = 0; |
| 458 | while (p && xs_dict_next(p, &k, &v, &c)) { | 481 | while (metadata && xs_dict_next(metadata, &k, &v, &c)) { |
| 459 | /* not an https link? skip */ | 482 | /* not an https link? skip */ |
| 460 | if (!xs_startswith(v, "https:/" "/")) | 483 | if (!xs_startswith(v, "https:/" "/")) |
| 461 | continue; | 484 | continue; |
| @@ -571,9 +594,9 @@ void export_csv(snac *user) | |||
| 571 | /* exports user data to current directory in a way that pleases Mastodon */ | 594 | /* exports user data to current directory in a way that pleases Mastodon */ |
| 572 | { | 595 | { |
| 573 | FILE *f; | 596 | FILE *f; |
| 574 | const char *fn; | 597 | xs *fn = NULL; |
| 575 | 598 | ||
| 576 | fn = "bookmarks.csv"; | 599 | fn = xs_fmt("%s/export/bookmarks.csv", user->basedir); |
| 577 | if ((f = fopen(fn, "w")) != NULL) { | 600 | if ((f = fopen(fn, "w")) != NULL) { |
| 578 | snac_log(user, xs_fmt("Creating %s...", fn)); | 601 | snac_log(user, xs_fmt("Creating %s...", fn)); |
| 579 | 602 | ||
| @@ -596,7 +619,8 @@ void export_csv(snac *user) | |||
| 596 | else | 619 | else |
| 597 | snac_log(user, xs_fmt("Cannot create file %s", fn)); | 620 | snac_log(user, xs_fmt("Cannot create file %s", fn)); |
| 598 | 621 | ||
| 599 | fn = "blocked_accounts.csv"; | 622 | xs_free(fn); |
| 623 | fn = xs_fmt("%s/export/blocked_accounts.csv", user->basedir); | ||
| 600 | if ((f = fopen(fn, "w")) != NULL) { | 624 | if ((f = fopen(fn, "w")) != NULL) { |
| 601 | snac_log(user, xs_fmt("Creating %s...", fn)); | 625 | snac_log(user, xs_fmt("Creating %s...", fn)); |
| 602 | 626 | ||
| @@ -615,7 +639,8 @@ void export_csv(snac *user) | |||
| 615 | else | 639 | else |
| 616 | snac_log(user, xs_fmt("Cannot create file %s", fn)); | 640 | snac_log(user, xs_fmt("Cannot create file %s", fn)); |
| 617 | 641 | ||
| 618 | fn = "lists.csv"; | 642 | xs_free(fn); |
| 643 | fn = xs_fmt("%s/export/lists.csv", user->basedir); | ||
| 619 | if ((f = fopen(fn, "w")) != NULL) { | 644 | if ((f = fopen(fn, "w")) != NULL) { |
| 620 | snac_log(user, xs_fmt("Creating %s...", fn)); | 645 | snac_log(user, xs_fmt("Creating %s...", fn)); |
| 621 | 646 | ||
| @@ -647,7 +672,8 @@ void export_csv(snac *user) | |||
| 647 | else | 672 | else |
| 648 | snac_log(user, xs_fmt("Cannot create file %s", fn)); | 673 | snac_log(user, xs_fmt("Cannot create file %s", fn)); |
| 649 | 674 | ||
| 650 | fn = "following_accounts.csv"; | 675 | xs_free(fn); |
| 676 | fn = xs_fmt("%s/export/following_accounts.csv", user->basedir); | ||
| 651 | if ((f = fopen(fn, "w")) != NULL) { | 677 | if ((f = fopen(fn, "w")) != NULL) { |
| 652 | snac_log(user, xs_fmt("Creating %s...", fn)); | 678 | snac_log(user, xs_fmt("Creating %s...", fn)); |
| 653 | 679 | ||
| @@ -670,10 +696,12 @@ void export_csv(snac *user) | |||
| 670 | } | 696 | } |
| 671 | 697 | ||
| 672 | 698 | ||
| 673 | void import_blocked_accounts_csv(snac *user, const char *fn) | 699 | void import_blocked_accounts_csv(snac *user, const char *ifn) |
| 674 | /* imports a Mastodon CSV file of blocked accounts */ | 700 | /* imports a Mastodon CSV file of blocked accounts */ |
| 675 | { | 701 | { |
| 676 | FILE *f; | 702 | FILE *f; |
| 703 | xs *l = xs_split(ifn, "/"); | ||
| 704 | xs *fn = xs_fmt("%s/import/%s", user->basedir, xs_list_get(l, -1)); | ||
| 677 | 705 | ||
| 678 | if ((f = fopen(fn, "r")) != NULL) { | 706 | if ((f = fopen(fn, "r")) != NULL) { |
| 679 | snac_log(user, xs_fmt("Importing from %s...", fn)); | 707 | snac_log(user, xs_fmt("Importing from %s...", fn)); |
| @@ -705,10 +733,12 @@ void import_blocked_accounts_csv(snac *user, const char *fn) | |||
| 705 | } | 733 | } |
| 706 | 734 | ||
| 707 | 735 | ||
| 708 | void import_following_accounts_csv(snac *user, const char *fn) | 736 | void import_following_accounts_csv(snac *user, const char *ifn) |
| 709 | /* imports a Mastodon CSV file of accounts to follow */ | 737 | /* imports a Mastodon CSV file of accounts to follow */ |
| 710 | { | 738 | { |
| 711 | FILE *f; | 739 | FILE *f; |
| 740 | xs *l = xs_split(ifn, "/"); | ||
| 741 | xs *fn = xs_fmt("%s/import/%s", user->basedir, xs_list_get(l, -1)); | ||
| 712 | 742 | ||
| 713 | if ((f = fopen(fn, "r")) != NULL) { | 743 | if ((f = fopen(fn, "r")) != NULL) { |
| 714 | snac_log(user, xs_fmt("Importing from %s...", fn)); | 744 | snac_log(user, xs_fmt("Importing from %s...", fn)); |
| @@ -764,10 +794,12 @@ void import_following_accounts_csv(snac *user, const char *fn) | |||
| 764 | } | 794 | } |
| 765 | 795 | ||
| 766 | 796 | ||
| 767 | void import_list_csv(snac *user, const char *fn) | 797 | void import_list_csv(snac *user, const char *ifn) |
| 768 | /* imports a Mastodon CSV file list */ | 798 | /* imports a Mastodon CSV file list */ |
| 769 | { | 799 | { |
| 770 | FILE *f; | 800 | FILE *f; |
| 801 | xs *l = xs_split(ifn, "/"); | ||
| 802 | xs *fn = xs_fmt("%s/import/%s", user->basedir, xs_list_get(l, -1)); | ||
| 771 | 803 | ||
| 772 | if ((f = fopen(fn, "r")) != NULL) { | 804 | if ((f = fopen(fn, "r")) != NULL) { |
| 773 | snac_log(user, xs_fmt("Importing from %s...", fn)); | 805 | snac_log(user, xs_fmt("Importing from %s...", fn)); |
| @@ -825,7 +857,6 @@ void import_csv(snac *user) | |||
| 825 | /* import CSV files from Mastodon */ | 857 | /* import CSV files from Mastodon */ |
| 826 | { | 858 | { |
| 827 | FILE *f; | 859 | FILE *f; |
| 828 | const char *fn; | ||
| 829 | 860 | ||
| 830 | import_blocked_accounts_csv(user, "blocked_accounts.csv"); | 861 | import_blocked_accounts_csv(user, "blocked_accounts.csv"); |
| 831 | 862 | ||
| @@ -833,7 +864,7 @@ void import_csv(snac *user) | |||
| 833 | 864 | ||
| 834 | import_list_csv(user, "lists.csv"); | 865 | import_list_csv(user, "lists.csv"); |
| 835 | 866 | ||
| 836 | fn = "bookmarks.csv"; | 867 | xs *fn = xs_fmt("%s/import/bookmarks.csv", user->basedir); |
| 837 | if ((f = fopen(fn, "r")) != NULL) { | 868 | if ((f = fopen(fn, "r")) != NULL) { |
| 838 | snac_log(user, xs_fmt("Importing from %s...", fn)); | 869 | snac_log(user, xs_fmt("Importing from %s...", fn)); |
| 839 | 870 | ||