ThreadCatalogModel.cpp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. #include "ThreadCatalogModel.h"
  2. #include <AK/JsonArray.h>
  3. #include <AK/JsonObject.h>
  4. #include <AK/JsonValue.h>
  5. #include <LibCore/CHttpRequest.h>
  6. #include <LibCore/CNetworkJob.h>
  7. #include <LibCore/CNetworkResponse.h>
  8. #include <stdio.h>
  9. ThreadCatalogModel::ThreadCatalogModel()
  10. {
  11. update();
  12. }
  13. ThreadCatalogModel::~ThreadCatalogModel()
  14. {
  15. }
  16. void ThreadCatalogModel::update()
  17. {
  18. CHttpRequest request;
  19. request.set_hostname("a.4cdn.org");
  20. request.set_path("/g/catalog.json");
  21. auto* job = request.schedule();
  22. job->on_finish = [job, this](bool success) {
  23. auto* response = job->response();
  24. dbg() << "job finished! success=" << success << ", response=" << response;
  25. dbg() << "payload size: " << response->payload().size();
  26. auto json = JsonValue::from_string(response->payload());
  27. if (json.is_array()) {
  28. JsonArray new_catalog;
  29. for (auto& page : json.as_array().values()) {
  30. if (!page.is_object())
  31. continue;
  32. auto threads_value = page.as_object().get("threads");
  33. if (!threads_value.is_array())
  34. continue;
  35. for (auto& thread : threads_value.as_array().values()) {
  36. new_catalog.append(thread);
  37. }
  38. }
  39. m_catalog = move(new_catalog);
  40. }
  41. did_update();
  42. };
  43. }
  44. int ThreadCatalogModel::row_count(const GModelIndex&) const
  45. {
  46. return m_catalog.size();
  47. }
  48. String ThreadCatalogModel::column_name(int column) const
  49. {
  50. switch (column) {
  51. case Column::ThreadNumber:
  52. return "#";
  53. case Column::Text:
  54. return "Text";
  55. case Column::ReplyCount:
  56. return "Replies";
  57. case Column::ImageCount:
  58. return "Images";
  59. case Column::PostTime:
  60. return "Time";
  61. default:
  62. ASSERT_NOT_REACHED();
  63. }
  64. }
  65. GModel::ColumnMetadata ThreadCatalogModel::column_metadata(int column) const
  66. {
  67. switch (column) {
  68. case Column::ThreadNumber:
  69. return { 70, TextAlignment::CenterRight };
  70. case Column::Text:
  71. return { 290, TextAlignment::CenterLeft };
  72. case Column::ReplyCount:
  73. return { 45, TextAlignment::CenterRight };
  74. case Column::ImageCount:
  75. return { 40, TextAlignment::CenterRight };
  76. case Column::PostTime:
  77. return { 120, TextAlignment::CenterLeft };
  78. default:
  79. ASSERT_NOT_REACHED();
  80. }
  81. }
  82. GVariant ThreadCatalogModel::data(const GModelIndex& index, Role role) const
  83. {
  84. auto& thread = m_catalog.at(index.row()).as_object();
  85. if (role == Role::Display) {
  86. switch (index.column()) {
  87. case Column::ThreadNumber:
  88. return thread.get("no").to_u32();
  89. case Column::Text:
  90. return thread.get("com").to_string();
  91. case Column::ReplyCount:
  92. return thread.get("replies").to_u32();
  93. case Column::ImageCount:
  94. return thread.get("images").to_u32();
  95. case Column::PostTime:
  96. return thread.get("now").to_string();
  97. default:
  98. ASSERT_NOT_REACHED();
  99. }
  100. }
  101. return {};
  102. }