/*
*
* _____ _ _
* / ___|| | | |
* \ `--. | |_ _ __ __ _ | |_ ___ ___
* `--. \| __|| '__| / _` || __| / _ \ / __|
* /\__/ /| |_ | | | (_| || |_ | (_) |\__ \
* \____/ \__||_| \__,_| \__| \___/ |___/
*
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Copyright (C) 2025 Armen Deroian
*
*/
#ifndef SERVER_H_
#define SERVER_H_
#include "spdlog/spdlog.h"
#include "utils/io/FileUtils.h"
#include <array>
#include <atomic>
namespace stratos {
class PropertiesConfig;
class NetworkManager;
class Server final {
public:
static constexpr float TARGET_TICKS_PER_SECOND = 20.0f;
static constexpr float TARGET_SECONDS_PER_TICK = 1.0f / TARGET_TICKS_PER_SECOND;
static constexpr float TARGET_MILLIS_PER_TICK = TARGET_SECONDS_PER_TICK * 1000.0f;
Server(const std::shared_ptr<spdlog::logger>& logger, Path root);
~Server();
[[nodiscard]] std::shared_ptr<spdlog::logger> getLogger() const;
[[nodiscard]] bool isRunning() const;
[[nodiscard]] unsigned int getTick() const;
[[nodiscard]] float getCurrentTPS() const;
[[nodiscard]] float getCurrentLoad() const;
[[nodiscard]] float getAverageTPS() const;
[[nodiscard]] float getAverageLoad() const;
[[nodiscard]] const Path& getServerDirectory() const;
[[nodiscard]] const std::unique_ptr<PropertiesConfig>& getServerProperties() const;
[[nodiscard]] std::string getAddress() const;
[[nodiscard]] int getPort() const;
[[nodiscard]] std::string getName() const;
[[nodiscard]] std::string getMotd() const;
[[nodiscard]] bool isOnlineMode() const;
[[nodiscard]] int getMaxPlayers() const;
[[nodiscard]] int getOnlinePlayers() const;
void start();
void shutdown();
void tickProcessor();
long tick(const long& tickTime);
private:
static std::unique_ptr<Server> _instance;
std::shared_ptr<spdlog::logger> logger;
Path root;
std::unique_ptr<PropertiesConfig> serverConfig;
std::unique_ptr<NetworkManager> network;
std::atomic<bool> running = false;
long startTime;
// Server TPS
unsigned int tickCounter;
float currentTPS;
float currentUse;
std::array<float, 20> averageTPS;
std::array<float, 20> averageUse;
std::string address;
int port;
std::string name;
std::string motd;
bool onlineMode;
int maxPlayers;
int onlinePlayers = 0;
};
extern std::unique_ptr<Server> server;
} // namespace stratos
#endif //SERVER_H_