From 1fe77c0905a87fcb4cca057153d5ec986da10285 Mon Sep 17 00:00:00 2001 From: "Torsten (PC)" Date: Wed, 14 Jan 2026 14:36:57 +0100 Subject: [PATCH] fix --- .gitignore | 5 + CMakeLists.txt | 49 +++++++++ daemon.conf | 7 ++ lib/uSockets.a | Bin 0 -> 208246 bytes src/character_creation_worker.cpp | 157 +++++++++++++++++++++++++++ src/character_creation_worker.h | 64 +++++++++++ src/config.cpp | 39 +++++++ src/config.h | 14 +++ src/connection_guard.h | 24 +++++ src/connection_pool.cpp | 49 +++++++++ src/connection_pool.h | 31 ++++++ src/database.cpp | 107 +++++++++++++++++++ src/database.h | 28 +++++ src/main.cpp | 63 +++++++++++ src/message_broker.cpp | 43 ++++++++ src/message_broker.h | 29 +++++ src/produce_worker.cpp | 172 ++++++++++++++++++++++++++++++ src/produce_worker.h | 70 ++++++++++++ src/websocket_server.cpp | 149 ++++++++++++++++++++++++++ src/websocket_server.h | 50 +++++++++ src/worker.h | 117 ++++++++++++++++++++ 21 files changed, 1267 insertions(+) create mode 100644 CMakeLists.txt create mode 100644 daemon.conf create mode 100644 lib/uSockets.a create mode 100644 src/character_creation_worker.cpp create mode 100644 src/character_creation_worker.h create mode 100644 src/config.cpp create mode 100644 src/config.h create mode 100644 src/connection_guard.h create mode 100644 src/connection_pool.cpp create mode 100644 src/connection_pool.h create mode 100644 src/database.cpp create mode 100644 src/database.h create mode 100644 src/main.cpp create mode 100644 src/message_broker.cpp create mode 100644 src/message_broker.h create mode 100644 src/produce_worker.cpp create mode 100644 src/produce_worker.h create mode 100644 src/websocket_server.cpp create mode 100644 src/websocket_server.h create mode 100644 src/worker.h diff --git a/.gitignore b/.gitignore index 0fa1bee..7e0c390 100644 --- a/.gitignore +++ b/.gitignore @@ -17,3 +17,8 @@ frontend/dist frontend/dist/* frontedtree.txt backend/dist/ +build +build/* +.vscode +.vscode/* +.clang-format diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..eab6b24 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,49 @@ +cmake_minimum_required(VERSION 3.20) +project(YourPartDaemon VERSION 1.0 LANGUAGES CXX) + +set(CMAKE_CXX_STANDARD 20) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_C_COMPILER "gcc-13") +set(CMAKE_CPP_COMPILER "g++-13") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -flto=auto") +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -flto") + +find_package(PostgreSQL REQUIRED) +find_package(Threads REQUIRED) +find_package(PkgConfig REQUIRED) +pkg_check_modules(LIBPQXX REQUIRED libpqxx) + +include_directories(${LIBPQXX_INCLUDE_DIRS}) +link_directories(${LIBPQXX_LIBRARY_DIRS}) +add_definitions(${LIBPQXX_CFLAGS_OTHER}) + +set(SOURCES + src/main.cpp + src/config.cpp + src/connection_pool.cpp + src/database.cpp + src/character_creation_worker.cpp + src/produce_worker.cpp + src/message_broker.cpp + src/websocket_server.cpp +) + +set(HEADERS + src/config.h + src/database.h + src/connection_pool.h + src/worker.h + src/character_creation_worker.h + src/produce_worker.h + src/message_broker.h + src/websocket_server.h +) + +add_executable(yourpart-daemon ${SOURCES} ${HEADERS}) +find_package(nlohmann_json CONFIG REQUIRED) + +target_include_directories(yourpart-daemon PRIVATE ${PostgreSQL_INCLUDE_DIRS}) +target_link_libraries(yourpart-daemon PRIVATE ${PostgreSQL_LIBRARIES} Threads::Threads z ssl crypto ${CMAKE_SOURCE_DIR}/lib/uSockets.a ${LIBPQXX_LIBRARIES}) + +install(TARGETS yourpart-daemon DESTINATION /usr/local/bin) +install(FILES daemon.conf DESTINATION /etc/yourpart/) diff --git a/daemon.conf b/daemon.conf new file mode 100644 index 0000000..9cf670f --- /dev/null +++ b/daemon.conf @@ -0,0 +1,7 @@ +DB_HOST=localhost +DB_PORT=5432 +DB_NAME=yp3 +DB_USER=yourpart +DB_PASSWORD=hitomisan +THREAD_COUNT=4 +WEBSOCKET_PORT=4551 \ No newline at end of file diff --git a/lib/uSockets.a b/lib/uSockets.a new file mode 100644 index 0000000000000000000000000000000000000000..34ea5652d340bb96df0eb120bf89b339c4792bc8 GIT binary patch literal 208246 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%0D7lD`<4aGxc>~d3_)lmYBCSv6kQprho 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⋙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 bM9e{YR#;?s`@|R#6cD3i6d2#e0@wc=O5MWT literal 0 HcmV?d00001 diff --git a/src/character_creation_worker.cpp b/src/character_creation_worker.cpp new file mode 100644 index 0000000..7f381c8 --- /dev/null +++ b/src/character_creation_worker.cpp @@ -0,0 +1,157 @@ +#include "character_creation_worker.h" +#include "connection_guard.h" +#include +#include +#include + +CharacterCreationWorker::CharacterCreationWorker(ConnectionPool &pool, MessageBroker &broker) + : Worker(pool, broker, "CharacterCreationWorker") + , gen(std::random_device{}()) + , dist(2, 3) +{ +} + +CharacterCreationWorker::~CharacterCreationWorker() { +} + +void CharacterCreationWorker::run() { + while (runningWorker) { + setCurrentStep("Check if previous day character was created"); + if (!isPreviousDayCharacterCreated()) { + setCurrentStep("Create characters for today"); + createCharactersForToday(); + } + setCurrentStep("Sleep for 60 seconds"); + for (int i = 0; i < 60 && runningWorker; ++i) { + std::this_thread::sleep_for(std::chrono::seconds(1)); + setCurrentStep("signalActivity()"); + signalActivity(); + } + setCurrentStep("Loop done"); + } +} + +bool CharacterCreationWorker::isPreviousDayCharacterCreated() { + try { + setCurrentStep("Get Database Connection"); + ConnectionGuard connGuard(pool); + auto &db = connGuard.get(); + + setCurrentStep("Execute Query"); + auto results = db.query(QUERY_IS_PREVIOUS_DAY_CHARACTER_CREATED); + + if (!results.empty()) { + std::string created_at_str = results[0].at("created_at"); + return true; + } + } catch (const std::exception &e) { + std::cerr << "[CharacterCreationWorker] Fehler in isPreviousDayCharacterCreated: " + << e.what() << std::endl; + } + setCurrentStep("No previous day character found"); + return false; +} + +void CharacterCreationWorker::createCharactersForToday() { + loadNames(); + if (first_name_cache.empty() || last_name_cache.empty()) { + std::cerr << "Fehler: Namen konnten nicht geladen werden." << std::endl; + return; + } + + auto town_ids = getTownRegionIds(); + for (auto region_id : town_ids) { + createCharactersForRegion(region_id); + } +} + +void CharacterCreationWorker::createCharactersForRegion(int region_id) { + std::vector nobility_stands = {1, 2, 3}; + std::vector genders = {"male", "female"}; + for (auto nobility : nobility_stands) { + for (auto &gender : genders) { + int num_chars = dist(gen); + for (int i = 0; i < num_chars; ++i) { + createCharacter(region_id, gender, nobility); + } + } + } +} + +void CharacterCreationWorker::createCharacter(int region_id, + const std::string &gender, + int title_of_nobility) { + int first_name_id = getRandomFromSet(first_name_cache[gender]); + if (first_name_id == -1) { + std::cerr << "Fehler: Kein passender Vorname gefunden." << std::endl; + return; + } + int last_name_id = getRandomFromSet(last_name_cache); + if (last_name_id == -1) { + std::cerr << "Fehler: Kein passender Nachname gefunden." << std::endl; + return; + } + try { + ConnectionGuard connGuard(pool); + auto &db = connGuard.get(); + + db.prepare("insert_character", QUERY_INSERT_CHARACTER); + db.execute("insert_character", {std::to_string(region_id), + std::to_string(first_name_id), + std::to_string(last_name_id), + gender, + std::to_string(title_of_nobility)}); + } catch (const std::exception &e) { + std::cerr << "[CharacterCreationWorker] Fehler in createCharacter: " + << e.what() << std::endl; + } +} + +std::vector CharacterCreationWorker::getTownRegionIds() { + try { + ConnectionGuard connGuard(pool); + auto &db = connGuard.get(); + + auto rows = db.query(QUERY_GET_TOWN_REGION_IDS); + + std::vector ids; + ids.reserve(rows.size()); + for (const auto &row : rows) { + ids.push_back(std::stoi(row.at("id"))); + } + return ids; + } catch (const std::exception &e) { + std::cerr << "[CharacterCreationWorker] Fehler in getTownRegionIds: " + << e.what() << std::endl; + } + return {}; +} + +void CharacterCreationWorker::loadNames() { + try { + ConnectionGuard connGuard(pool); + auto &db = connGuard.get(); + + auto firstNameRows = db.query(QUERY_LOAD_FIRST_NAMES); + for (const auto &row : firstNameRows) { + first_name_cache[row.at("gender")].insert(std::stoi(row.at("id"))); + } + + auto lastNameRows = db.query(QUERY_LOAD_LAST_NAMES); + for (const auto &row : lastNameRows) { + last_name_cache.insert(std::stoi(row.at("id"))); + } + } catch (const std::exception &e) { + std::cerr << "[CharacterCreationWorker] Fehler in loadNames: " + << e.what() << std::endl; + } +} + +int CharacterCreationWorker::getRandomFromSet(const std::unordered_set &name_set) { + if (name_set.empty()) { + return -1; + } + auto it = name_set.begin(); + std::advance(it, std::uniform_int_distribution(0, name_set.size() - 1)(gen)); + return *it; +} diff --git a/src/character_creation_worker.h b/src/character_creation_worker.h new file mode 100644 index 0000000..0b7367e --- /dev/null +++ b/src/character_creation_worker.h @@ -0,0 +1,64 @@ +#pragma once + +#include "worker.h" +#include +#include +#include +#include +#include + +class CharacterCreationWorker : public Worker { +public: + CharacterCreationWorker(ConnectionPool &pool, MessageBroker &broker); + ~CharacterCreationWorker() override; + +protected: + void run() override; + +private: + std::mt19937 gen; + std::uniform_int_distribution dist; + std::unordered_map> first_name_cache; + std::unordered_set last_name_cache; + + bool isPreviousDayCharacterCreated(); + void createCharactersForToday(); + void createCharactersForRegion(int region_id); + void createCharacter(int region_id, const std::string &gender, int title_of_nobility); + std::vector getTownRegionIds(); + void loadNames(); + int getRandomFromSet(const std::unordered_set &name_set); + + static constexpr const char *QUERY_IS_PREVIOUS_DAY_CHARACTER_CREATED = R"( + SELECT created_at + FROM falukant_data."character" + WHERE user_id IS NULL + ORDER BY created_at DESC + LIMIT 1; + )"; + + static constexpr const char *QUERY_GET_TOWN_REGION_IDS = R"( + SELECT fdr.id + FROM falukant_data.region fdr + JOIN falukant_type.region ftr ON fdr.region_type_id = ftr.id + WHERE ftr.label_tr = 'city'; + )"; + + static constexpr const char *QUERY_LOAD_FIRST_NAMES = R"( + SELECT id, gender + FROM falukant_predefine.firstname; + )"; + + static constexpr const char *QUERY_LOAD_LAST_NAMES = R"( + SELECT id + FROM falukant_predefine.lastname; + )"; + + static constexpr const char *QUERY_INSERT_CHARACTER = R"( + INSERT INTO falukant_data."character"( + user_id, region_id, first_name, last_name, + birthdate, gender, created_at, updated_at, title_of_nobility + ) + VALUES ($1, $2, $3, $4, NOW(), $5, NOW(), NOW(), $6); + )"; +}; diff --git a/src/config.cpp b/src/config.cpp new file mode 100644 index 0000000..bfaf6c1 --- /dev/null +++ b/src/config.cpp @@ -0,0 +1,39 @@ +#include "config.h" +#include +#include +#include + +Config::Config(const std::string &filepath) +{ + load(filepath); +} + +void Config::load(const std::string &filepath) +{ + std::ifstream file(filepath); + if (!file) + { + throw std::runtime_error("Konfigurationsdatei konnte nicht geöffnet werden."); + } + + std::string line; + while (std::getline(file, line)) + { + std::istringstream iss(line); + std::string key, value; + if (std::getline(iss, key, '=') && std::getline(iss, value)) + { + config_map[key] = value; + } + } +} + +std::string Config::get(const std::string &key) const +{ + auto it = config_map.find(key); + if (it != config_map.end()) + { + return it->second; + } + throw std::runtime_error("Konfigurationsschlüssel nicht gefunden: " + key); +} diff --git a/src/config.h b/src/config.h new file mode 100644 index 0000000..14d240d --- /dev/null +++ b/src/config.h @@ -0,0 +1,14 @@ +#pragma once +#include +#include + +class Config +{ +public: + Config(const std::string &filepath); + std::string get(const std::string &key) const; + +private: + std::map config_map; + void load(const std::string &filepath); +}; diff --git a/src/connection_guard.h b/src/connection_guard.h new file mode 100644 index 0000000..dc14c8f --- /dev/null +++ b/src/connection_guard.h @@ -0,0 +1,24 @@ +#pragma once + +#include "connection_pool.h" +#include + +class ConnectionGuard { +public: + ConnectionGuard(ConnectionPool &pool) + : pool(pool), connection(pool.getConnection()) {} + + ~ConnectionGuard() { + if (connection) { + pool.releaseConnection(connection); + } + } + + Database &get() { + return *connection; + } + +private: + ConnectionPool &pool; + std::shared_ptr connection; +}; diff --git a/src/connection_pool.cpp b/src/connection_pool.cpp new file mode 100644 index 0000000..b815eae --- /dev/null +++ b/src/connection_pool.cpp @@ -0,0 +1,49 @@ +#include "connection_pool.h" +#include +#include "connection_guard.h" + +ConnectionPool::ConnectionPool(const std::string &host, const std::string &port, + const std::string &name, const std::string &user, + const std::string &password, int pool_size) + : host(host), port(port), name(name), user(user), password(password) { + createPool(pool_size); +} + +void ConnectionPool::createPool(int pool_size) { + std::string conninfo = "host=" + host + " port=" + port + " dbname=" + name + + " user=" + user + " password=" + password; + + for (int i = 0; i < pool_size; ++i) { + auto conn = std::make_shared(conninfo); + pool.push(conn); + } +} + +std::shared_ptr ConnectionPool::getConnection() { + std::unique_lock lock(pool_mutex); + pool_cv.wait(lock, [this]() { return !pool.empty(); }); + auto conn = pool.front(); + pool.pop(); + if (!conn->isValid()) { + std::cerr << "[ConnectionPool] Ungültige Verbindung. Erstelle neu.\n"; + std::string conninfo = "host=" + host + + " port=" + port + + " dbname=" + name + + " user=" + user + + " password=" + password; + conn = std::make_shared(conninfo); + if (!conn->isValid()) { + std::cerr << "[ConnectionPool] Erneut fehlgeschlagen.\n"; + return nullptr; + } + } + return conn; +} + +void ConnectionPool::releaseConnection(std::shared_ptr conn) { + { + std::lock_guard lock(pool_mutex); + pool.push(conn); + } + pool_cv.notify_one(); +} diff --git a/src/connection_pool.h b/src/connection_pool.h new file mode 100644 index 0000000..590c8c9 --- /dev/null +++ b/src/connection_pool.h @@ -0,0 +1,31 @@ +#pragma once + +#include +#include +#include +#include +#include "database.h" + +class ConnectionPool { +public: + ConnectionPool(const std::string &host, const std::string &port, + const std::string &name, const std::string &user, + const std::string &password, int pool_size); + + std::shared_ptr getConnection(); + void releaseConnection(std::shared_ptr conn); + +private: + std::queue> pool; + std::mutex pool_mutex; + std::condition_variable pool_cv; + + std::string host; + std::string port; + std::string name; + std::string user; + std::string password; + + void createPool(int pool_size); + void refreshConnection(std::shared_ptr &conn); +}; diff --git a/src/database.cpp b/src/database.cpp new file mode 100644 index 0000000..c3dd39b --- /dev/null +++ b/src/database.cpp @@ -0,0 +1,107 @@ +#include "database.h" + +Database::Database(const std::string &conninfo) +{ + try { + connection_ = std::make_unique(conninfo); + if (!connection_->is_open()) { + throw std::runtime_error("Konnte DB-Verbindung nicht öffnen!"); + } + } catch (const std::exception &e) { + std::cerr << "[Database] Fehler beim Verbinden: " << e.what() << std::endl; + throw; + } +} + +std::vector> +Database::query(const std::string &sql) +{ + std::vector> rows; + try { + pqxx::work txn(*connection_); + pqxx::result r = txn.exec(sql); + txn.commit(); + for (auto row : r) { + std::map oneRow; + for (auto f = 0u; f < row.size(); f++) { + std::string colName = r.column_name(f); + std::string value = row[f].c_str() ? row[f].c_str() : ""; + oneRow[colName] = value; + } + rows.push_back(std::move(oneRow)); + } + } catch (const std::exception &ex) { + std::cerr << "[Database] query-Fehler: " << ex.what() << "\nSQL: " << sql << std::endl; + } + return rows; +} + +void Database::prepare(const std::string &stmtName, const std::string &sql) +{ + try { + pqxx::work txn(*connection_); + txn.conn().prepare(stmtName, sql); + txn.commit(); + } catch (const std::exception &ex) { + std::cerr << "[Database] prepare-Fehler: " << ex.what() + << "\nSQL: " << sql << std::endl; + } +} + +#include +#include +#include +#include +#include +#include + +std::vector> +Database::execute(const std::string &stmtName, const std::vector ¶ms) +{ + std::vector> rows; + + try { + pqxx::work txn(*connection_); + pqxx::prepare::invocation inv = txn.prepared(stmtName); + + // Parameter einzeln hinzufügen + for (auto &p : params) { + inv(p); + } + + // Ausführung + pqxx::result r = inv.exec(); + txn.commit(); + + // Ergebnis verarbeiten + for (const auto &row : r) { + std::unordered_map mapRow; + for (pqxx::row::size_type i = 0; i < row.size(); ++i) { + std::string colName = r.column_name(i); + mapRow[colName] = row[i].c_str() ? row[i].c_str() : ""; + } + rows.push_back(std::move(mapRow)); + } + } + catch (const std::exception &ex) { + std::cerr << "[Database] execute-Fehler: " << ex.what() + << "\nStatement: " << stmtName << std::endl; + } + + return rows; +} + +bool Database::isValid() const { + try { + if (!connection_ || !connection_->is_open()) { + return false; + } + pqxx::work txn(*connection_); + txn.exec("SELECT 1"); // Einfacher Ping + txn.commit(); + return true; + } catch (const std::exception &ex) { + std::cerr << "[Database] Verbindung ungültig: " << ex.what() << "\n"; + return false; + } +} diff --git a/src/database.h b/src/database.h new file mode 100644 index 0000000..30fd07c --- /dev/null +++ b/src/database.h @@ -0,0 +1,28 @@ +#pragma once +#include +#include +#include +#include +#include +#include +#include +#include +#include + +class Database +{ +public: + Database(const std::string &conninfo); + + std::vector> query(const std::string &sql); + void prepare(const std::string &stmtName, const std::string &sql); + std::vector> execute( + const std::string &stmtName, + const std::vector ¶ms = {} + ); + bool isOpen() const { return connection_ && connection_->is_open(); } + bool isValid() const; + +private: + std::unique_ptr connection_; +}; diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..dfa9c39 --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,63 @@ +#include "character_creation_worker.h" +#include "produce_worker.h" +#include "connection_pool.h" +#include "websocket_server.h" +#include "message_broker.h" +#include "config.h" +#include +#include +#include +#include + +std::atomic keepRunning(true); + +void handleSignal(int signal) { + if (signal == SIGINT || signal == SIGTERM) { + std::cerr << "Signal erhalten: " << signal << ". Beende Anwendung..." << std::endl; + keepRunning.store(false, std::memory_order_relaxed); + } +} + +int main() { + std::signal(SIGINT, handleSignal); + std::signal(SIGTERM, handleSignal); + + try { + Config config("/etc/yourpart/daemon.conf"); + ConnectionPool pool( + config.get("DB_HOST"), + config.get("DB_PORT"), + config.get("DB_NAME"), + config.get("DB_USER"), + config.get("DB_PASSWORD"), + 10 + ); + + int websocketPort = std::stoi(config.get("WEBSOCKET_PORT")); + MessageBroker broker; + WebSocketServer websocketServer(websocketPort, pool, broker); + CharacterCreationWorker creationWorker(pool, broker); + ProduceWorker produceWorker(pool, broker); + + broker.start(); + websocketServer.run(); + creationWorker.startWorkerThread(); + produceWorker.startWorkerThread(); + creationWorker.enableWatchdog(); + produceWorker.enableWatchdog(); + + while (keepRunning) { + std::this_thread::sleep_for(std::chrono::milliseconds(500)); + } + + creationWorker.stopWorkerThread(); + produceWorker.stopWorkerThread(); + websocketServer.stop(); + broker.stop(); + } catch (const std::exception &e) { + std::cerr << "Fehler: " << e.what() << std::endl; + return 1; + } + + return 0; +} diff --git a/src/message_broker.cpp b/src/message_broker.cpp new file mode 100644 index 0000000..7809aa4 --- /dev/null +++ b/src/message_broker.cpp @@ -0,0 +1,43 @@ +#include "message_broker.h" +#include + +void MessageBroker::publish(const std::string &message) { + std::lock_guard lock(mutex); + messageQueue.push(message); + cv.notify_all(); +} + +void MessageBroker::subscribe(const MessageCallback &callback) { + std::lock_guard lock(mutex); + subscribers.push_back(callback); +} + +void MessageBroker::start() { + running = true; + brokerThread = std::thread([this]() { processMessages(); }); +} + +void MessageBroker::stop() { + running = false; + cv.notify_all(); + if (brokerThread.joinable()) { + brokerThread.join(); + } +} + +void MessageBroker::processMessages() { + while (running) { + std::unique_lock lock(mutex); + cv.wait(lock, [this]() { return !messageQueue.empty() || !running; }); + if (!running) break; + while (!messageQueue.empty()) { + std::string message = std::move(messageQueue.front()); + messageQueue.pop(); + lock.unlock(); + for (const auto &callback : subscribers) { + callback(message); + } + lock.lock(); + } + } +} diff --git a/src/message_broker.h b/src/message_broker.h new file mode 100644 index 0000000..04e32bf --- /dev/null +++ b/src/message_broker.h @@ -0,0 +1,29 @@ +#pragma once +#include +#include +#include +#include +#include +#include +#include +#include + +class MessageBroker { +public: + using MessageCallback = std::function; + + void publish(const std::string &message); + void subscribe(const MessageCallback &callback); + void start(); + void stop(); + +private: + std::queue messageQueue; + std::vector subscribers; + std::mutex mutex; + std::condition_variable cv; + std::atomic running{false}; + std::thread brokerThread; + + void processMessages(); +}; diff --git a/src/produce_worker.cpp b/src/produce_worker.cpp new file mode 100644 index 0000000..df749ea --- /dev/null +++ b/src/produce_worker.cpp @@ -0,0 +1,172 @@ +#include "produce_worker.h" +#include "connection_guard.h" // Include for ConnectionGuard +#include +#include +#include +#include + +ProduceWorker::ProduceWorker(ConnectionPool &pool, MessageBroker &broker) + : Worker(pool, broker, "ProduceWorker") +{ +} + +ProduceWorker::~ProduceWorker() { +} + +void ProduceWorker::run() { + auto lastIterationTime = std::chrono::steady_clock::now(); + while (runningWorker) { + setCurrentStep("Check runningWorker Variable"); + { + std::lock_guard lock(activityMutex); + if (!runningWorker) { + break; + } + } + setCurrentStep("Calculate elapsed time"); + auto now = std::chrono::steady_clock::now(); + auto elapsed = std::chrono::duration_cast(now - lastIterationTime); + if (elapsed < std::chrono::milliseconds(200)) { + std::this_thread::sleep_for(std::chrono::milliseconds(200) - elapsed); + } + lastIterationTime = std::chrono::steady_clock::now(); + setCurrentStep("Process Productions"); + processProductions(); + setCurrentStep("Signal Activity"); + signalActivity(); + setCurrentStep("Loop Done"); + } +} + +void ProduceWorker::processProductions() { + try { + setCurrentStep("Get Database Connection"); + ConnectionGuard connGuard(pool); + auto &db = connGuard.get(); + + setCurrentStep("Fetch Finished Productions"); + auto finishedProductions = getFinishedProductions(db); + + setCurrentStep("Process Finished Productions"); + for (const auto &production : finishedProductions) { + if (production.find("branch_id") == production.end() || + production.find("product_id") == production.end() || + production.find("quantity") == production.end() || + production.find("quality") == production.end() || + production.find("user_id") == production.end()) { + continue; + } + + int branchId = std::stoi(production.at("branch_id")); + int productId = std::stoi(production.at("product_id")); + int quantity = std::stoi(production.at("quantity")); + int quality = std::stoi(production.at("quality")); + int userId = std::stoi(production.at("user_id")); + + if (addToInventory(db, branchId, productId, quantity, quality, userId)) { + } + deleteProduction(db, production.at("production_id")); + } + } catch (const std::exception &e) { + std::cerr << "[ProduceWorker] Fehler in processProductions: " << e.what() << std::endl; + } +} + +std::vector> ProduceWorker::getFinishedProductions(Database &db) { + try { + db.prepare("get_finished_productions", QUERY_GET_FINISHED_PRODUCTIONS); + return db.execute("get_finished_productions"); + } catch (const std::exception &e) { + std::cerr << "[ProduceWorker] Fehler beim Abrufen abgeschlossener Produktionen: " + << e.what() << std::endl; + } + return {}; +} + +bool ProduceWorker::addToInventory(Database &db, + int branchId, + int productId, + int quantity, + int quality, + int userId) +{ + try { + db.prepare("get_stocks", QUERY_GET_AVAILABLE_STOCKS); + auto stocks = db.execute("get_stocks", {std::to_string(branchId)}); + int remainingQuantity = quantity; + for (const auto &stock : stocks) { + int stockId = std::stoi(stock.at("id")); + int totalCapacity = std::stoi(stock.at("total_capacity")); + int filledCapacity = std::stoi(stock.at("filled")); + int freeCapacity = totalCapacity - filledCapacity; + + if (freeCapacity <= 0) { + continue; + } + + int toStore = std::min(remainingQuantity, freeCapacity); + if (!storeInStock(db, stockId, productId, toStore, quality)) { + return false; + } + remainingQuantity -= toStore; + sendProductionReadyEvent(userId, productId, quantity, quality, branchId); + if (remainingQuantity <= 0) { + break; + } + } + return (remainingQuantity == 0); + } catch (const std::exception &e) { + std::cerr << "[ProduceWorker] Fehler in addToInventory: " << e.what() << std::endl; + } + return false; +} + +bool ProduceWorker::storeInStock(Database &db, + int stockId, + int productId, + int quantity, + int quality) +{ + try { + db.prepare("insert_inventory", QUERY_INSERT_INVENTORY); + db.execute("insert_inventory", {std::to_string(stockId), + std::to_string(productId), + std::to_string(quantity), + std::to_string(quality)}); + return true; + } catch (const std::exception &e) { + std::cerr << "[ProduceWorker] Fehler in storeInStock: " << e.what() << std::endl; + } + return false; +} + +void ProduceWorker::deleteProduction(Database &db, const std::string &productionId) { + try { + db.prepare("delete_production", QUERY_DELETE_PRODUCTION); + db.execute("delete_production", {productionId}); + } catch (const std::exception &e) { + std::cerr << "[ProduceWorker] Fehler beim Löschen der Produktion: " << e.what() << std::endl; + } +} + +void ProduceWorker::sendProductionReadyEvent(int userId, + int productId, + int quantity, + int quality, + int branchId) +{ + try { + nlohmann::json message = { + {"event", "production_ready"}, + {"user_id", userId}, + {"product_id", productId}, + {"quantity", quantity}, + {"quality", quality}, + {"branch_id", branchId} + }; + broker.publish(message.dump()); + } catch (const std::exception &e) { + std::cerr << "[ProduceWorker] Fehler beim Senden des Production Ready Events: " + << e.what() << std::endl; + } +} diff --git a/src/produce_worker.h b/src/produce_worker.h new file mode 100644 index 0000000..d3737bc --- /dev/null +++ b/src/produce_worker.h @@ -0,0 +1,70 @@ +#pragma once + +#include "worker.h" +#include +#include +#include + + +class ProduceWorker : public Worker +{ +public: + explicit ProduceWorker(ConnectionPool &pool, MessageBroker &broker); + ~ProduceWorker() override; + +protected: + void run() override; // überschreibt Worker::run() + +private: + // Fachlogik + void processProductions(); + std::vector> getFinishedProductions(Database &db); + bool addToInventory(Database &db, int branchId, int productId, int quantity, int quality, int userId); + bool storeInStock(Database &db, int stockId, int productId, int quantity, int quality); + void deleteProduction(Database &db, const std::string &productionId); + void sendProductionReadyEvent(int userId, int productId, int quantity, int quality, int branchId); + + static constexpr const char *QUERY_GET_FINISHED_PRODUCTIONS = R"( + SELECT + p.id AS production_id, + p.branch_id, + p.product_id, + p.quantity, + p.start_timestamp, + pr.production_time, + k.character_id, + k.knowledge AS quality, + br.region_id, + br.falukant_user_id user_id + FROM falukant_data.production p + JOIN falukant_type.product pr ON p.product_id = pr.id + JOIN falukant_data.branch br ON p.branch_id = br.id + JOIN falukant_data.character c ON c.user_id = br.falukant_user_id + JOIN falukant_data.knowledge k ON p.product_id = k.product_id AND k.character_id = c.id + JOIN falukant_data.stock s ON s.branch_id = br.id + WHERE p.start_timestamp + interval '1 minute' * pr.production_time <= NOW() + ORDER BY p.start_timestamp; + )"; + + static constexpr const char *QUERY_GET_AVAILABLE_STOCKS = R"( + SELECT stock.id, stock.quantity AS total_capacity, ( + SELECT COALESCE(SUM(inventory.quantity), 0) + FROM falukant_data.inventory + WHERE inventory.stock_id = stock.id + ) AS filled, stock.branch_id + FROM falukant_data.stock stock + JOIN falukant_data.branch branch + ON stock.branch_id = branch.id + WHERE branch.id = $1 + ORDER BY total_capacity DESC; + )"; + + static constexpr const char *QUERY_DELETE_PRODUCTION = R"( + DELETE FROM falukant_data.production WHERE id = $1; + )"; + + static constexpr const char *QUERY_INSERT_INVENTORY = R"( + INSERT INTO falukant_data.inventory (stock_id, product_id, quantity, quality, produced_at) + VALUES ($1, $2, $3, $4, NOW()); + )"; +}; diff --git a/src/websocket_server.cpp b/src/websocket_server.cpp new file mode 100644 index 0000000..c99be9a --- /dev/null +++ b/src/websocket_server.cpp @@ -0,0 +1,149 @@ +#include "websocket_server.h" +#include "connection_guard.h" +#include +#include +#include +#include +#include +#include + +using json = nlohmann::json; + +WebSocketServer::WebSocketServer(int port, ConnectionPool &pool, MessageBroker &broker) + : port(port), pool(pool), broker(broker) {} + +void WebSocketServer::run() { + running = true; + broker.subscribe([this](const std::string &message) { + std::lock_guard lock(queueMutex); + messageQueue.push(message); + queueCV.notify_one(); + }); + serverThread = std::thread([this]() { startServer(); }); + messageProcessingThread = std::thread([this]() { processMessageQueue(); }); + pingThread = std::thread([this]() { pingClients(); }); +} + +void WebSocketServer::stop() { + running = false; + if (serverThread.joinable()) serverThread.join(); + if (messageProcessingThread.joinable()) messageProcessingThread.join(); + if (pingThread.joinable()) pingThread.join(); +} + +void WebSocketServer::startServer() { + uWS::App() + .ws("/*", { + .open = [this](uWS::WebSocket *ws) { + ws->getUserData()->pongReceived = true; + }, + .message = [this](uWS::WebSocket *ws, std::string_view message, uWS::OpCode opCode) { + handleWebSocketMessage(ws, message, opCode); + }, + .close = [this](uWS::WebSocket *ws, int /*code*/, std::string_view /*message*/) { + handleWebSocketClose(ws); + } + }) + .listen(port, [this](auto *token) { + if (token) { + std::cout << "WebSocket-Server läuft auf Port " << port << std::endl; + } else { + std::cerr << "WebSocket-Server konnte nicht gestartet werden!\n"; + running = false; + } + }) + .run(); +} + +void WebSocketServer::pingClients() { + while (running) { + std::this_thread::sleep_for(std::chrono::seconds(30)); + + std::unique_lock lock(connectionsMutex); + for (auto &[userId, ws] : connections) { + if (!ws->getUserData()->pongReceived) { + ws->close(); + } else { + ws->getUserData()->pongReceived = false; + ws->send("ping", uWS::OpCode::TEXT); + } + } + } +} + +void WebSocketServer::processMessageQueue() { + while (running) { + std::unique_lock lock(queueMutex); + queueCV.wait(lock, [this]() { return !messageQueue.empty() || !running; }); + while (!messageQueue.empty()) { + std::string message = std::move(messageQueue.front()); + messageQueue.pop(); + lock.unlock(); + handleBrokerMessage(message); + lock.lock(); + } + } +} + +void WebSocketServer::handleBrokerMessage(const std::string &message) { + try { + json parsedMessage = json::parse(message); + if (parsedMessage.contains("user_id")) { + int falukantUserId = parsedMessage["user_id"]; + std::shared_lock lock(connectionsMutex); + auto userId = getUserIdFromFalukantUserId(falukantUserId); + auto it = connections.find(userId); + if (it != connections.end()) { + it->second->send(message, uWS::OpCode::TEXT); + std::cout << "[WebSocketServer] Nachricht an User-ID: " << userId << " gesendet.\n"; + } else { + std::cerr << "[WebSocketServer] Keine Verbindung für User-ID: " << userId << "\n"; + } + } else { + std::cerr << "[WebSocketServer] Ungültige Nachricht: " << message << "\n"; + } + } catch (const std::exception &e) { + std::cerr << "[WebSocketServer] Fehler beim Verarbeiten der Nachricht: " << e.what() << "\n"; + } +} + +void WebSocketServer::handleWebSocketMessage(uWS::WebSocket *ws, std::string_view message, uWS::OpCode opCode) { + if (message == "pong") { + ws->getUserData()->pongReceived = true; + return; + } + + json parsedMessage = json::parse(message); + if (parsedMessage.contains("event") && parsedMessage["event"] == "setUserId") { + std::string userId = parsedMessage["data"]["userId"]; + std::unique_lock lock(connectionsMutex); + connections[userId] = ws; + ws->getUserData()->userId = userId; + } +} + +void WebSocketServer::handleWebSocketClose(uWS::WebSocket *ws) { + std::unique_lock lock(connectionsMutex); + auto userId = ws->getUserData()->userId; + if (!userId.empty()) { + connections.erase(userId); + } +} + +std::string WebSocketServer::getUserIdFromFalukantUserId(int & userId) { + ConnectionGuard guard(pool); + auto &db = guard.get(); + std::string query = R"( + SELECT u.hashed_id + FROM community.user u + JOIN falukant_data.falukant_user fu ON u.id = fu.user_id + WHERE fu.id = $1 + )"; + db.prepare("get_user_id", query); + auto users = db.execute("get_user_id", {std::to_string(userId)}); + if (!users.empty()) { + return users[0]["hashed_id"]; + } else { + return ""; + } +} diff --git a/src/websocket_server.h b/src/websocket_server.h new file mode 100644 index 0000000..10a11b9 --- /dev/null +++ b/src/websocket_server.h @@ -0,0 +1,50 @@ +#pragma once + +#include "message_broker.h" +#include "connection_pool.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include + +struct WebSocketUserData { + std::string userId; + bool pongReceived = true; +}; + +class WebSocketServer { +public: + WebSocketServer(int port, ConnectionPool &pool, MessageBroker &broker); + void run(); + void stop(); + +private: + void startServer(); + void processMessageQueue(); + void pingClients(); + void handleBrokerMessage(const std::string &message); + void handleWebSocketMessage(uWS::WebSocket *ws, std::string_view message, uWS::OpCode opCode); + void handleWebSocketClose(uWS::WebSocket *ws); + std::string getUserIdFromFalukantUserId(int &userId); + + int port; + ConnectionPool &pool; + MessageBroker &broker; + + std::atomic running{false}; + std::thread serverThread; + std::thread messageProcessingThread; + std::thread pingThread; + + std::unordered_map *> connections; + std::shared_mutex connectionsMutex; + + std::queue messageQueue; + std::mutex queueMutex; + std::condition_variable queueCV; +}; diff --git a/src/worker.h b/src/worker.h new file mode 100644 index 0000000..4f2a5c5 --- /dev/null +++ b/src/worker.h @@ -0,0 +1,117 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include + +#include "connection_pool.h" +#include "message_broker.h" +#include "database.h" + +class Worker { +public: + Worker(ConnectionPool &pool, MessageBroker &broker, std::string name) + : pool(pool), + broker(broker), + workerName(std::move(name)), + runningWorker(false), + runningWatchdog(false) + {} + + virtual ~Worker() { + stopWorkerThread(); + stopWatchdogThread(); + } + + void startWorkerThread() { + if (runningWorker.load()) { + std::cerr << "[" << workerName << "] Worker thread already running, skipping start.\n"; + return; + } + runningWorker.store(true); + workerThread = std::thread([this]() { run(); }); + } + + void stopWorkerThread() { + runningWorker.store(false); + if (workerThread.joinable()) { + workerThread.join(); + } + } + + void enableWatchdog() { + if (runningWatchdog.load()) { + std::cerr << "[" << workerName << "] Watchdog already enabled, skipping.\n"; + return; + } + runningWatchdog.store(true); + watchdogThread = std::thread([this]() { watchdog(); }); + } + + void stopWatchdogThread() { + runningWatchdog.store(false); + if (watchdogThread.joinable()) { + watchdogThread.join(); + } + } + + std::string getCurrentStep() { + std::lock_guard lock(stepMutex); + return currentStep; + } + +protected: + virtual void run() = 0; + + void watchdog() { + try { + while (runningWatchdog.load()) { + std::this_thread::sleep_for(watchdogInterval); + bool isActive = false; + { + std::lock_guard lock(activityMutex); + isActive = active; + active = false; + } + if (!isActive) { + std::cerr << "[" << workerName << "] Watchdog: Keine Aktivität! Starte Worker neu...\n"; + std::cerr << "[" << workerName << "] Letzte Aktivität: " << getCurrentStep() << "\n"; + stopWorkerThread(); + startWorkerThread(); + } + } + } catch (const std::exception &e) { + std::cerr << "[" << workerName << "] Watchdog: Ausnahme gefangen: " << e.what() << "\n"; + } catch (...) { + std::cerr << "[" << workerName << "] Watchdog: Unbekannte Ausnahme gefangen.\n"; + } + } + + void signalActivity() { + std::lock_guard lock(activityMutex); + active = true; + } + + void setCurrentStep(const std::string &step) { + std::lock_guard lock(stepMutex); + currentStep = step; + } + +protected: + ConnectionPool &pool; + MessageBroker &broker; + std::string workerName; + std::atomic runningWorker; + std::atomic runningWatchdog; + std::atomic active{false}; + std::thread workerThread; + std::thread watchdogThread; + std::mutex activityMutex; + std::chrono::seconds watchdogInterval{10}; + std::mutex stepMutex; + std::string currentStep; +};