main.c 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  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. return 0;
  70. }
  71. if (strcmp(cmd, "actor") == 0) {
  72. int status;
  73. xs *data = NULL;
  74. status = actor_request(&snac, url, &data);
  75. printf("status: %d\n", status);
  76. return 0;
  77. }
  78. return 0;
  79. }
  80. #if 0
  81. {
  82. snac snac;
  83. printf("%s\n", tid(0));
  84. srv_open("/home/angel/lib/snac/comam.es/");
  85. user_open(&snac, "mike");
  86. xs *headers = xs_dict_new();
  87. int status;
  88. d_char *payload;
  89. int p_size;
  90. xs *response;
  91. response = http_signed_request(&snac, "GET", "https://mastodon.social/users/VictorMoral",
  92. headers, NULL, 0, &status, &payload, &p_size);
  93. {
  94. xs *j1 = xs_json_dumps_pp(response, 4);
  95. printf("response:\n%s\n", j1);
  96. printf("payload:\n%s\n", payload);
  97. }
  98. {
  99. xs *list = queue(&snac);
  100. char *p, *fn;
  101. p = list;
  102. while (xs_list_iter(&p, &fn)) {
  103. xs *obj;
  104. obj = dequeue(&snac, fn);
  105. printf("%s\n", xs_dict_get(obj, "actor"));
  106. }
  107. }
  108. #if 0
  109. {
  110. xs *list = follower_list(&snac);
  111. char *p, *obj;
  112. p = list;
  113. while (xs_list_iter(&p, &obj)) {
  114. char *actor = xs_dict_get(obj, "actor");
  115. printf("%s\n", actor);
  116. }
  117. }
  118. {
  119. xs *list = timeline_list(&snac);
  120. char *p, *fn;
  121. p = list;
  122. while (xs_list_iter(&p, &fn)) {
  123. xs *tle = timeline_get(&snac, fn);
  124. printf("%s\n", xs_dict_get(tle, "id"));
  125. }
  126. }
  127. {
  128. xs *list = user_list();
  129. char *p, *uid;
  130. p = list;
  131. while (xs_list_iter(&p, &uid)) {
  132. if (user_open(&snac, uid)) {
  133. printf("%s (%s)\n", uid, xs_dict_get(snac.config, "name"));
  134. user_free(&snac);
  135. }
  136. }
  137. }
  138. #endif
  139. return 0;
  140. }
  141. #endif