#pragma once #include #include #include #include #include #include #include struct ScanRecord { std::string ts; std::string url; std::string label; int count = 0; bool changed = false; }; // Thread-safe replacement for the python `state` dict. Shared between the // SniperEngine worker thread and the Discord bot command handlers. class SniperState { public: std::atomic running{false}; std::atomic total_scans{0}; std::atomic total_changes{0}; void setLastOffers(const std::string& url, std::vector offers); std::optional> getLastOffers(const std::string& url); std::map stockCounts(); void addHistory(ScanRecord rec); std::vector getHistory(); void clearOffers(); void resetCounters(); void resetHistory(); private: std::mutex mtx_; std::map> last_offers_; std::deque history_; static constexpr size_t kMaxHistory = 200; };