main.c 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. /* snac - A simple, minimalistic ActivityPub instance */
  2. /* copyright (c) 2022 grunfink - MIT license */
  3. #include "xs.h"
  4. #include "xs_encdec.h"
  5. #include "xs_json.h"
  6. #include "snac.h"
  7. int usage(void)
  8. {
  9. printf("usage:\n");
  10. return 1;
  11. }
  12. int main(int argc, char *argv[])
  13. {
  14. char *cmd;
  15. char *basedir;
  16. char *user;
  17. char *url;
  18. int argi = 1;
  19. snac snac;
  20. argc--;
  21. if (argc < argi)
  22. return usage();
  23. cmd = argv[argi++];
  24. if (strcmp(cmd, "init") == 0) {
  25. return 0;
  26. }
  27. if (argc < argi)
  28. return usage();
  29. basedir = argv[argi++];
  30. if (!srv_open(basedir)) {
  31. srv_log(xs_fmt("error opening database at %s", basedir));
  32. return 1;
  33. }
  34. if (strcmp(cmd, "httpd") == 0) {
  35. httpd();
  36. return 0;
  37. }
  38. if (argc < argi)
  39. return usage();
  40. user = argv[argi++];
  41. if (strcmp(cmd, "webfinger") == 0) {
  42. xs *actor = NULL;
  43. xs *uid = NULL;
  44. int status;
  45. status = webfinger_request(user, &actor, &uid);
  46. printf("status: %d\n", status);
  47. if (actor != NULL)
  48. printf("actor: %s\n", actor);
  49. if (uid != NULL)
  50. printf("uid: %s\n", uid);
  51. return 0;
  52. }
  53. if (argc < argi)
  54. return usage();
  55. url = argv[argi++];
  56. if (!user_open(&snac, user)) {
  57. printf("error in user '%s'\n", user);
  58. return 1;
  59. }
  60. if (strcmp(cmd, "request") == 0) {
  61. int status;
  62. xs *data = NULL;
  63. status = activitypub_request(&snac, url, &data);
  64. printf("status: %d\n", status);
  65. if (valid_status(status)) {
  66. xs *j = xs_json_dumps_pp(data, 4);
  67. printf("%s\n", j);
  68. }
  69. }
  70. return 0;
  71. }
  72. #if 0
  73. {
  74. snac snac;
  75. printf("%s\n", tid(0));
  76. srv_open("/home/angel/lib/snac/comam.es/");
  77. user_open(&snac, "mike");
  78. xs *headers = xs_dict_new();
  79. int status;
  80. d_char *payload;
  81. int p_size;
  82. xs *response;
  83. response = http_signed_request(&snac, "GET", "https://mastodon.social/users/VictorMoral",
  84. headers, NULL, 0, &status, &payload, &p_size);
  85. {
  86. xs *j1 = xs_json_dumps_pp(response, 4);
  87. printf("response:\n%s\n", j1);
  88. printf("payload:\n%s\n", payload);
  89. }
  90. {
  91. xs *list = queue(&snac);
  92. char *p, *fn;
  93. p = list;
  94. while (xs_list_iter(&p, &fn)) {
  95. xs *obj;
  96. obj = dequeue(&snac, fn);
  97. printf("%s\n", xs_dict_get(obj, "actor"));
  98. }
  99. }
  100. #if 0
  101. {
  102. xs *list = follower_list(&snac);
  103. char *p, *obj;
  104. p = list;
  105. while (xs_list_iter(&p, &obj)) {
  106. char *actor = xs_dict_get(obj, "actor");
  107. printf("%s\n", actor);
  108. }
  109. }
  110. {
  111. xs *list = timeline_list(&snac);
  112. char *p, *fn;
  113. p = list;
  114. while (xs_list_iter(&p, &fn)) {
  115. xs *tle = timeline_get(&snac, fn);
  116. printf("%s\n", xs_dict_get(tle, "id"));
  117. }
  118. }
  119. {
  120. xs *list = user_list();
  121. char *p, *uid;
  122. p = list;
  123. while (xs_list_iter(&p, &uid)) {
  124. if (user_open(&snac, uid)) {
  125. printf("%s (%s)\n", uid, xs_dict_get(snac.config, "name"));
  126. user_free(&snac);
  127. }
  128. }
  129. }
  130. #endif
  131. return 0;
  132. }
  133. #endif