#pragma once #include #include namespace ServerRuntime { namespace Access { /** * Information shared with player bans and IP bans * プレイヤーBANとIP BANで共有する情報 */ struct BanMetadata { std::string created; std::string source; std::string expires; std::string reason; }; struct BannedPlayerEntry { std::string xuid; std::string name; BanMetadata metadata; }; struct BannedIpEntry { std::string ip; BanMetadata metadata; }; /** * Dedicated server BAN file manager. * * Files: * - banned-players.json * - banned-ips.json * * This class only handles storage/caching. * Connection-time hooks are wired separately. */ class BanManager { public: /** * **Create Ban Manager** * * Binds the manager to the directory that stores the dedicated-server access files * Dedicated Server のアクセスファイル配置先を設定する */ explicit BanManager(const std::string &baseDirectory = "."); /** * Creates empty JSON array files when the dedicated server starts without persisted access data * BANファイルが無い初回起動時に空JSONを用意する */ bool EnsureBanFilesExist() const; bool Reload(); bool Save() const; bool LoadPlayers(std::vector *outEntries) const; bool LoadIps(std::vector *outEntries) const; bool SavePlayers(const std::vector &entries) const; bool SaveIps(const std::vector &entries) const; const std::vector &GetBannedPlayers() const; const std::vector &GetBannedIps() const; /** * Copies only currently active player BAN entries so expired metadata does not leak into command output * 期限切れを除いた有効なプレイヤーBAN一覧を複製取得する */ bool SnapshotBannedPlayers(std::vector *outEntries) const; /** * Copies only currently active IP BAN entries so expired metadata does not leak into command output * 期限切れを除いた有効なIP BAN一覧を複製取得する */ bool SnapshotBannedIps(std::vector *outEntries) const; bool IsPlayerBannedByXuid(const std::string &xuid) const; bool IsIpBanned(const std::string &ip) const; bool AddPlayerBan(const BannedPlayerEntry &entry); bool AddIpBan(const BannedIpEntry &entry); bool RemovePlayerBanByXuid(const std::string &xuid); bool RemoveIpBan(const std::string &ip); std::string GetBannedPlayersFilePath() const; std::string GetBannedIpsFilePath() const; static BanMetadata BuildDefaultMetadata(const char *source = "Server"); private: static void NormalizeMetadata(BanMetadata *metadata); std::string BuildPath(const char *fileName) const; private: std::string m_baseDirectory; std::vector m_bannedPlayers; std::vector m_bannedIps; }; } }