Fix language support and compatibility with windows.

This commit is contained in:
Dima yawaflua Andreev
2024-11-17 21:39:20 +02:00
parent becea81c9b
commit b1c0d94a22
6 changed files with 51 additions and 30 deletions

View File

@@ -24,28 +24,29 @@ add_executable(tzeva_adom main.cpp
models/AlertMessage_OREF.cpp models/AlertMessage_OREF.cpp
utils/OREFToTzevaAdom.cpp utils/OREFToTzevaAdom.cpp
models/OrefAlertResponse.cpp models/OrefAlertResponse.cpp
utils/check_file_exists.h
) )
find_package(PkgConfig REQUIRED) find_package(PkgConfig REQUIRED)
pkg_check_modules(GLIB REQUIRED glib-2.0) pkg_check_modules(GLIB REQUIRED glib-2.0)
pkg_check_modules(NOTIFY REQUIRED libnotify) pkg_check_modules(NOTIFY REQUIRED libnotify)
pkg_check_modules(SDL REQUIRED libnotify) pkg_check_modules(SDL REQUIRED libnotify)
find_package(fmt REQUIRED) pkg_check_modules(SDL2 REQUIRED libnotify)
pkg_check_modules(SDL2_mixer REQUIRED libnotify)
pkg_check_modules(fmt REQUIRED fmt)
pkg_check_modules(boost_filesystem REQUIRED)
include_directories(lang) include_directories(lang)
include_directories(${GLIB_INCLUDE_DIRS}) include_directories(${GLIB_INCLUDE_DIRS})
include_directories(${NOTIFY_INCLUDE_DIRS}) include_directories(${NOTIFY_INCLUDE_DIRS})
include_directories(${CURL_INCLUDE_DIRS}) include_directories(${CURL_INCLUDE_DIRS})
include_directories(${fmt_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS})
find_package(SDL2 REQUIRED)
find_package(SDL2_mixer REQUIRED)
include_directories(${SDL2_INCLUDE_DIRS} ${SDL2_MIXER_INCLUDE_DIRS})
find_package(Boost REQUIRED COMPONENTS filesystem)
include_directories(${Boost_INCLUDE_DIRS})
# Линкуем библиотеки # Линкуем библиотеки
target_include_directories(tzeva_adom PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} "lang/") target_include_directories(tzeva_adom PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} "lang/")
target_link_libraries(tzeva_adom PRIVATE SDL2 SDL2_mixer ${Boost_LIBRARIES} CURL::libcurl nlohmann_json::nlohmann_json ${GLIB_LIBRARIES} fmt::fmt ${NOTIFY_LIBRARIES} ${CURL_LIBRARIES}) target_link_libraries(tzeva_adom PRIVATE SDL2 SDL2_mixer ${SDL2_LIBRARIES} ${SDL2_MIXER_LIBRARIES} ${fmt_LIBRARIES} ${Boost_LIBRARIES} CURL::libcurl nlohmann_json::nlohmann_json ${GLIB_LIBRARIES} ${NOTIFY_LIBRARIES} ${CURL_LIBRARIES})
add_custom_command(TARGET tzeva_adom POST_BUILD add_custom_command(TARGET tzeva_adom POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_directory COMMAND ${CMAKE_COMMAND} -E copy_directory

View File

@@ -14,5 +14,5 @@
"true": "כן", "true": "כן",
"false": "לא", "false": "לא",
"threat": "איום: ", "threat": "איום: ",
"cities": סדר: " "cities": עירים: "
} }

View File

@@ -4,12 +4,13 @@
#include <thread> #include <thread>
#include <curl/curl.h> #include <curl/curl.h>
#include <atomic> #include <atomic>
#include <nlohmann/json.hpp> #include <nlohmann/json.hpp>
#include "spdlog/spdlog.h" #include "spdlog/spdlog.h"
#include <string_view> #include <string_view>
#include <libnotify/notify.h> #include <libnotify/notify.h>
#include <boost/date_time/posix_time/posix_time.hpp> #include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/filesystem.hpp> #include "utils/check_file_exists.h"
#include <boost/algorithm/string/split.hpp> #include <boost/algorithm/string/split.hpp>
#include "CONFIG.cpp" #include "CONFIG.cpp"
@@ -18,6 +19,7 @@
#include "models/OrefAlertResponse.cpp" #include "models/OrefAlertResponse.cpp"
#include "utils/image_downloader.cpp" #include "utils/image_downloader.cpp"
#include "utils/localization_manager.h" #include "utils/localization_manager.h"
#include <fmt/ranges.h>
class AlertResponse; class AlertResponse;
@@ -27,7 +29,7 @@ int64_t lastId = 0;
json cities_n_areas_list; json cities_n_areas_list;
bool is_cities_loaded = false; bool is_cities_loaded = false;
bool is_test = false; bool is_test = false;
std::string this_path = boost::filesystem::current_path().c_str(); std::string this_path = std::filesystem::current_path().c_str();
std::string lang = "en"; std::string lang = "en";
std::vector<tzeva_adom::Alert> test_alert_variable; std::vector<tzeva_adom::Alert> test_alert_variable;
bool is_oref = false; bool is_oref = false;
@@ -59,9 +61,9 @@ void process_alert(const std::string& data) {
std::unique_ptr<tzeva_adom::IAlertResponse> first_alert; std::unique_ptr<tzeva_adom::IAlertResponse> first_alert;
if (is_oref) { if (is_oref) {
spdlog::debug("OREF_alertDate: {}", response[0]["alertDate"]); spdlog::debug("OREF_alertDate: {}", response[0]["alertDate"].get<std::string>());
spdlog::debug("OREF_title: {}", response[0]["title"]); spdlog::debug("OREF_title: {}", response[0]["title"].get<std::string>());
spdlog::debug("OREF_data: {}", response[0]["data"]); spdlog::debug("OREF_data: {}", response[0]["data"].get<std::string>());
spdlog::debug("OREF_category: {}",std::to_string(response[0]["category"].get<int>())); spdlog::debug("OREF_category: {}",std::to_string(response[0]["category"].get<int>()));
spdlog::debug("OREF selected, create oref object"); spdlog::debug("OREF selected, create oref object");
auto response_oref = response.at(0); auto response_oref = response.at(0);
@@ -96,7 +98,7 @@ void process_alert(const std::string& data) {
spdlog::debug("Cities: {}", cities); spdlog::debug("Cities: {}", cities);
std::string icon_url = boost::filesystem::current_path().c_str()+fmt::format("/threat{}.{}", std::to_string(threat), threat == 0 ? "png" : "svg"); std::string icon_url = this_path+fmt::format("/threat{}.{}", std::to_string(threat), threat == 0 ? "png" : "svg");
spdlog::debug("Threat: {}", first_alert->get_threat()); spdlog::debug("Threat: {}", first_alert->get_threat());
spdlog::debug("Threat name: {}", localization_manager.getString(fmt::format("threat_{}", threat))); spdlog::debug("Threat name: {}", localization_manager.getString(fmt::format("threat_{}", threat)));
@@ -104,17 +106,19 @@ void process_alert(const std::string& data) {
spdlog::debug("Icon path: {}", icon_url); spdlog::debug("Icon path: {}", icon_url);
std::string localised_cities_names = ""; std::string localised_cities_names = "";
for (auto city: first_alert->get_cities_arr()) { if (lang != "he")
localised_cities_names += fmt::format("{} ", cities_n_areas_list["cities"][city][lang]); for (auto city: first_alert->get_cities_arr())
} localised_cities_names += fmt::format("{} ", cities_n_areas_list["cities"][city][lang].get<std::string>());
else
localised_cities_names = first_alert->get_cities();
spdlog::debug("Init notification"); spdlog::debug("Init notification");
notify_init(localization_manager.getString(fmt::format("threat_{}", std::to_string(threat))).c_str()); notify_init(localization_manager.getString(fmt::format("threat_{}", std::to_string(threat))).c_str());
NotifyNotification* n = notify_notification_new (localization_manager.getString(fmt::format("threat_{}", std::to_string(threat))).c_str(), NotifyNotification* n = notify_notification_new (localization_manager.getString(fmt::format("threat_{}", std::to_string(threat))).c_str(),
fmt::format( fmt::format(
"{}: {}\n"\ "{} {}\n"\
"{}: {}\n"\ "{} {}\n"\
"{}: {}", "{} {}",
localization_manager.getString("cities"), localization_manager.getString("cities"),
localised_cities_names, localised_cities_names,
localization_manager.getString("threat"), localization_manager.getString("threat"),
@@ -154,10 +158,10 @@ void fetch_alerts_history(std::atomic<bool>& running) {
curl = curl_easy_init(); curl = curl_easy_init();
// Parse cities and areas names on he, ru and en // Parse cities and areas names on he, ru and en
if (is_oref && lang == "he") { // if (is_oref && lang == "he") {
spdlog::error("Lang is not supported. Use TZEVA_ADOM"); // spdlog::error("Lang is not supported. Use TZEVA_ADOM");
return; // return;
} // }
if (!is_cities_loaded) { if (!is_cities_loaded) {
std::string readBuffer; std::string readBuffer;
//Only tzeva_adom variable of cities list, because thats easier to work, than oref variable(without linq) //Only tzeva_adom variable of cities list, because thats easier to work, than oref variable(without linq)
@@ -240,7 +244,7 @@ int main(int argc, char** argv) {
" -d --debug: Show debug messages\n"\ " -d --debug: Show debug messages\n"\
" -t --test: Create test alert end exit\n"\ " -t --test: Create test alert end exit\n"\
" -l --lang: Choose language: ru, en, he\n"\ " -l --lang: Choose language: ru, en, he\n"\
" -o --oref: Use OREF uri`s for alerts"\ " -o --oref: Use OREF api`s for alerts"\
""); "");
return 0; return 0;
} }
@@ -251,10 +255,10 @@ int main(int argc, char** argv) {
last_flag = argv[i]; last_flag = argv[i];
} }
spdlog::debug("Path: {}", boost::filesystem::current_path().c_str()); spdlog::debug("Path: {}", this_path);
for (int i = 0; i <= 5; i++) { for (int i = 0; i <= 5; i++) {
if (!boost::filesystem::exists(this_path+fmt::format("/threat{}.{}", std::to_string(i), i == 0 ? "png" : "svg"))) { if (!file_exists(this_path+fmt::format("/threat{}.{}", std::to_string(i), i == 0 ? "png" : "svg"))) {
tzeva_adom::download_file( tzeva_adom::download_file(
fmt::format( fmt::format(
THREAT_IMAGES_URL, THREAT_IMAGES_URL,
@@ -267,7 +271,7 @@ int main(int argc, char** argv) {
localization_manager = tzeva_adom::LocalizationManager(); localization_manager = tzeva_adom::LocalizationManager();
localization_manager.setCurrentLanguage(lang); localization_manager.setCurrentLanguage(lang);
//Download tzeva-adom bell sound //Download tzeva-adom bell sound
if (!boost::filesystem::exists(this_path+fmt::format("/bell.mp3"))) { if (!file_exists(this_path+fmt::format("/bell.mp3"))) {
tzeva_adom::download_file( tzeva_adom::download_file(
BELL_SOUND_URL, BELL_SOUND_URL,
fmt::format("bell.mp3") fmt::format("bell.mp3")

View File

@@ -16,7 +16,7 @@
#include <nlohmann/json.hpp> #include <nlohmann/json.hpp>
#include "models/Interfaces/IAlertResponse.cpp" #include "models/Interfaces/IAlertResponse.cpp"
#include "models/Interfaces/IAlert.cpp" #include "models/Interfaces/IAlert.cpp"
#include <fmt/ranges.h>
namespace tzeva_adom { namespace tzeva_adom {
using nlohmann::json; using nlohmann::json;
@@ -127,7 +127,8 @@ namespace tzeva_adom {
std::vector<std::string> get_cities_arr() override { std::vector<std::string> get_cities_arr() override {
std::vector<std::string> cities_to_return = {} ; std::vector<std::string> cities_to_return = {} ;
for (auto alert : alerts) { for (auto alert : alerts) {
cities_to_return.push_back(fmt::format("{}", fmt::join(alert.get_cities(), ""))); for (auto city : alert.get_cities())
cities_to_return.push_back(city);
} }
return cities_to_return; return cities_to_return;
} }

14
utils/check_file_exists.h Normal file
View File

@@ -0,0 +1,14 @@
//
// Created by yawaflua on 15/11/2024.
//
#ifndef CHECK_FILE_EXISTS_H
#define CHECK_FILE_EXISTS_H
inline bool file_exists (const std::string& name) {
struct stat buffer;
return (stat (name.c_str(), &buffer) == 0);
}
#endif //CHECK_FILE_EXISTS_H

View File

@@ -6,6 +6,7 @@
#include <fstream> #include <fstream>
#include <iostream> #include <iostream>
#include <nlohmann/json.hpp> // Подключение библиотеки JSON #include <nlohmann/json.hpp> // Подключение библиотеки JSON
#include <fmt/format.h>
namespace tzeva_adom { namespace tzeva_adom {
class LocalizationManager { class LocalizationManager {