From fe9735fe58ad9777832ee0e722efa5a267bd3aa9 Mon Sep 17 00:00:00 2001 From: PoliEcho Date: Wed, 9 Apr 2025 23:43:00 +0200 Subject: [PATCH] add main komes reading --- Makefile | 2 +- src/helper_funcs.cpp | 28 +++++++++++ src/helper_funcs.h | 2 + src/komens.cpp | 109 ++++++++++++++++++++++++++++++++----------- src/net.cpp | 4 +- src/net.h | 2 +- 6 files changed, 115 insertions(+), 32 deletions(-) diff --git a/Makefile b/Makefile index 34a873a..eb5c679 100644 --- a/Makefile +++ b/Makefile @@ -29,7 +29,7 @@ $(BIN_PATH)/bakatui: $(OBJ_FILES) $(CPPC) $(CPPC_FLAGS) $^ -o $@ -$(OBJ_PATH)/%.o: $(SRC_PATH)/%.cpp +$(OBJ_PATH)/%.o: $(SRC_PATH)/%.cpp $(SRC_PATH)/%.h $(CPPC) $(CPPC_FLAGS) -c $< -o $@ diff --git a/src/helper_funcs.cpp b/src/helper_funcs.cpp index cc3424b..00f43bd 100644 --- a/src/helper_funcs.cpp +++ b/src/helper_funcs.cpp @@ -3,6 +3,7 @@ #include "main.h" #include "memory.h" #include "net.h" +#include #include #include #include @@ -12,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -242,3 +244,29 @@ void move_panel_relative(PANEL *panel, int dy, int dx) { move_panel(panel, new_y, new_x); } + +std::string html_to_string(std::string html) { + { // fix new lines + const std::string search = "
"; + const std::string replace = "\n"; + + size_t pos = 0; + while ((pos = html.find(search, pos)) != std::string::npos) { + html.replace(pos, search.length(), replace); + pos += replace.length(); + } + } + + { + std::regex linkPattern("(.*?)"); + html = std::regex_replace(html, linkPattern, + "\033]8;;$1\033\\$3\033]8;;\033\\"); + } + + { + std::regex tag("<[^>]*>"); + html = std::regex_replace(html, tag, ""); + } + + return html; +} \ No newline at end of file diff --git a/src/helper_funcs.h b/src/helper_funcs.h index a31be6d..12ad8cb 100644 --- a/src/helper_funcs.h +++ b/src/helper_funcs.h @@ -33,4 +33,6 @@ wchar_t *char_to_wchar(const char *src); std::wstring string_to_wstring(const std::string &str); std::string wstring_to_string(const std::wstring &wstr); +std::string html_to_string(std::string html); + #endif \ No newline at end of file diff --git a/src/komens.cpp b/src/komens.cpp index 64317dc..3ef991b 100644 --- a/src/komens.cpp +++ b/src/komens.cpp @@ -1,6 +1,7 @@ #include "komens.h" #include "helper_funcs.h" #include "memory.h" +#include "net.h" #include #include #include @@ -10,19 +11,27 @@ #include #include #include +#include #include +#define WIN_HIGHT 40 +#define DEFAULT_OFSET 4 + using nlohmann::json; std::vector komens_allocated; +void insert_content(WINDOW *content_window, size_t i, json &resp_from_api); + void komens_page() { current_allocated = &komens_allocated; json resp_from_api; { - std::ifstream f("test-data/komens.json"); + /*std::ifstream f("test-data/komens.json"); resp_from_api = json::parse(f); - f.close(); + f.close();*/ + const std::string endpoint = "/api/3/komens/messages/received"; + resp_from_api = bakaapi::get_data_from_endpoint(endpoint, POST); } /* Initialize curses */ @@ -43,52 +52,87 @@ void komens_page() { char **title_bufs = new char *[num_of_komens]; char **name_bufs = new char *[num_of_komens]; - char tmp_buf[1500]; - for (size_t i = 0; i < num_of_komens; i++) { - wcstombs(tmp_buf, - string_to_wstring( - resp_from_api["Messages"][i]["Title"].get()) - .c_str(), - sizeof(tmp_buf)); - title_bufs[i] = new char[strlen(tmp_buf) + 1]; - strlcpy(title_bufs[i], tmp_buf, strlen(tmp_buf) + 1); - wcstombs( - tmp_buf, - string_to_wstring( - resp_from_api["Messages"][i]["Sender"]["Name"].get()) - .c_str(), - sizeof(tmp_buf)); + size_t max_item_lenght; + { + size_t max_title_lenght = 0; + size_t max_name_lenght = 0; + size_t tmp_lenght; + char tmp_buf[1500]; + for (size_t i = 0; i < num_of_komens; i++) { + wcstombs(tmp_buf, + string_to_wstring( + resp_from_api["Messages"][i]["Title"].get()) + .c_str(), + sizeof(tmp_buf)); - name_bufs[i] = new char[strlen(tmp_buf) + 1]; - strlcpy(name_bufs[i], tmp_buf, strlen(tmp_buf) + 1); + tmp_lenght = + resp_from_api["Messages"][i]["Title"].get().length(); - komens_items[i] = new_item(title_bufs[i], name_bufs[i]); + if (tmp_lenght > max_title_lenght) { + max_title_lenght = tmp_lenght; + } + + title_bufs[i] = new char[strlen(tmp_buf) + 1]; + strlcpy(title_bufs[i], tmp_buf, strlen(tmp_buf) + 1); + wcstombs( + tmp_buf, + string_to_wstring( + resp_from_api["Messages"][i]["Sender"]["Name"].get()) + .c_str(), + sizeof(tmp_buf)); + + tmp_lenght = resp_from_api["Messages"][i]["Sender"]["Name"] + .get() + .length(); + + if (tmp_lenght > max_name_lenght) { + max_name_lenght = tmp_lenght; + } + + name_bufs[i] = new char[strlen(tmp_buf) + 1]; + strlcpy(name_bufs[i], tmp_buf, strlen(tmp_buf) + 1); + + komens_items[i] = new_item(title_bufs[i], name_bufs[i]); + } + max_item_lenght = max_title_lenght + max_name_lenght; } komens_items[num_of_komens] = nullptr; MENU *komens_choise_menu = new_menu(komens_items); - komens_allocated.push_back({MENU_TYPE, komens_choise_menu, 0}); + komens_allocated.push_back({MENU_TYPE, komens_choise_menu, 1}); - WINDOW *komens_choise_menu_win = newwin(40, 100, 4, 4); - komens_allocated.push_back({WINDOW_TYPE, komens_choise_menu_win, 0}); + WINDOW *komens_choise_menu_win = + newwin(WIN_HIGHT, max_item_lenght + 1, DEFAULT_OFSET, DEFAULT_OFSET); + komens_allocated.push_back({WINDOW_TYPE, komens_choise_menu_win, 1}); set_menu_win(komens_choise_menu, komens_choise_menu_win); set_menu_sub(komens_choise_menu, - derwin(komens_choise_menu_win, 30, 98, 3, 1)); - set_menu_format(komens_choise_menu, 35, 1); + derwin(komens_choise_menu_win, WIN_HIGHT - 10, max_item_lenght, + DEFAULT_OFSET - 1, DEFAULT_OFSET - 3)); + set_menu_format(komens_choise_menu, WIN_HIGHT - 5, 1); set_menu_mark(komens_choise_menu, " * "); box(komens_choise_menu_win, 0, 0); - wprint_in_middle(komens_choise_menu_win, 1, 0, 40, L"Komens", COLOR_PAIR(1)); + wprint_in_middle(komens_choise_menu_win, 1, 0, max_item_lenght, L"Komens", + COLOR_PAIR(1)); mvwaddch(komens_choise_menu_win, 2, 0, ACS_LTEE); - mvwhline(komens_choise_menu_win, 2, 1, ACS_HLINE, 38); - mvwaddch(komens_choise_menu_win, 2, 39, ACS_RTEE); + mvwhline(komens_choise_menu_win, 2, 1, ACS_HLINE, max_item_lenght - 1); + mvwaddch(komens_choise_menu_win, 2, max_item_lenght, ACS_RTEE); post_menu(komens_choise_menu); wrefresh(komens_choise_menu_win); + WINDOW *content_window = + newwin(WIN_HIGHT, COLS - max_item_lenght - DEFAULT_OFSET - 1, + DEFAULT_OFSET, DEFAULT_OFSET + max_item_lenght + 1); + komens_allocated.push_back({WINDOW_TYPE, content_window, 1}); + box(content_window, 0, 0); + insert_content(content_window, item_index(current_item(komens_choise_menu)), + resp_from_api); + wrefresh(content_window); + attron(COLOR_PAIR(COLOR_BLUE)); mvprintw(LINES - 2, 0, "Use PageUp and PageDown to scoll down or up a page of items"); @@ -111,7 +155,16 @@ void komens_page() { menu_driver(komens_choise_menu, REQ_UP_ITEM); break; } + insert_content(content_window, item_index(current_item(komens_choise_menu)), + resp_from_api); + wrefresh(content_window); wrefresh(komens_choise_menu_win); } delete_all(&komens_allocated); +} + +void insert_content(WINDOW *content_window, size_t i, json &resp_from_api) { + wclear(content_window); + mvwprintw(content_window, 0, 0, "%s", + html_to_string(resp_from_api.at("Messages")[i]["Text"]).c_str()); } \ No newline at end of file diff --git a/src/net.cpp b/src/net.cpp index bededd3..1bbc684 100644 --- a/src/net.cpp +++ b/src/net.cpp @@ -153,7 +153,7 @@ void is_access_token_empty() { } // supports all endpoints that only require access_token -json get_data_from_endpoint(std::string &endpoint, metod metod, +json get_data_from_endpoint(const std::string &endpoint, metod metod, std::string additional_data) { is_access_token_empty(); access_token_refreshed: @@ -163,7 +163,7 @@ access_token_refreshed: req_data.append(std::format("&{}", additional_data)); } - auto [response, http_code] = send_curl_request(endpoint, GET, req_data); + auto [response, http_code] = send_curl_request(endpoint, metod, req_data); if (http_code != 200) { refresh_access_token(); diff --git a/src/net.h b/src/net.h index 9654734..247c70d 100644 --- a/src/net.h +++ b/src/net.h @@ -17,7 +17,7 @@ extern CURL *curl; namespace bakaapi { void login(std::string username, std::string password); void refresh_access_token(); -json get_data_from_endpoint(std::string &endpoint, metod metod, +json get_data_from_endpoint(const std::string &endpoint, metod metod, std::string additional_data = ""); } // namespace bakaapi #endif \ No newline at end of file