#pragma once #include "common/String.h" #include "common/ExplicitSingleton.h" #include "User.h" #include #include #include #include #include class SaveInfo; class SaveFile; class SaveComment; class GameSave; class VideoBuffer; enum LoginStatus { LoginOkay, LoginError }; enum RequestStatus { RequestOkay, RequestFailure }; class UpdateInfo { public: enum BuildType { Stable, Beta, Snapshot }; ByteString File; String Changelog; int Major; int Minor; int Build; int Time; BuildType Type; UpdateInfo() : File(""), Changelog(""), Major(0), Minor(0), Build(0), Time(0), Type(Stable) {} UpdateInfo(int major, int minor, int build, ByteString file, String changelog, BuildType type) : File(file), Changelog(changelog), Major(major), Minor(minor), Build(build), Time(0), Type(type) {} UpdateInfo(int time, ByteString file, String changelog, BuildType type) : File(file), Changelog(changelog), Major(0), Minor(0), Build(0), Time(time), Type(type) {} }; class Prefs; class RequestListener; class ClientListener; namespace http { class Request; } class Client: public ExplicitSingleton { private: String messageOfTheDay; std::vector > serverNotifications; std::unique_ptr versionCheckRequest; std::unique_ptr alternateVersionCheckRequest; bool usingAltUpdateServer; bool updateAvailable; UpdateInfo updateInfo; String lastError; bool firstRun; std::vector stampIDs; uint64_t lastStampTime = 0; int lastStampName = 0; //Auth session User authUser; void notifyUpdateAvailable(); void notifyAuthUserChanged(); void notifyMessageOfTheDay(); void notifyNewNotification(std::pair notification); // Save stealing info Json::Value authors; std::unique_ptr stamps; void MigrateStampsDef(); void WriteStamps(); public: std::vector listeners; // Save stealing info void MergeStampAuthorInfo(Json::Value linksToAdd); void MergeAuthorInfo(Json::Value linksToAdd); void OverwriteAuthorInfo(Json::Value overwrite) { authors = overwrite; } Json::Value GetAuthorInfo() { return authors; } void SaveAuthorInfo(Json::Value *saveInto); void ClearAuthorInfo() { authors.clear(); } bool IsAuthorsEmpty() { return authors.size() == 0; } UpdateInfo GetUpdateInfo(); Client(); ~Client(); ByteString FileOpenDialogue(); //std::string FileSaveDialogue(); void AddServerNotification(std::pair notification); std::vector > GetServerNotifications(); void SetMessageOfTheDay(String message); String GetMessageOfTheDay(); void Initialize(); bool IsFirstRun(); void AddListener(ClientListener * listener); void RemoveListener(ClientListener * listener); RequestStatus ExecVote(int saveID, int direction); RequestStatus UploadSave(SaveInfo & save); SaveFile * GetStamp(ByteString stampID); void DeleteStamp(ByteString stampID); ByteString AddStamp(GameSave * saveData); void RescanStamps(); const std::vector &GetStamps() const; void MoveStampToFront(ByteString stampID); RequestStatus AddComment(int saveID, String comment); std::vector GetSaveData(int saveID, int saveDate); LoginStatus Login(ByteString username, ByteString password, User & user); SaveInfo * GetSave(int saveID, int saveDate); SaveFile * LoadSaveFile(ByteString filename); RequestStatus DeleteSave(int saveID); RequestStatus ReportSave(int saveID, String message); RequestStatus UnpublishSave(int saveID); RequestStatus PublishSave(int saveID); RequestStatus FavouriteSave(int saveID, bool favourite); void SetAuthUser(User user); User GetAuthUser(); std::list * RemoveTag(int saveID, ByteString tag); //TODO RequestStatus std::list * AddTag(int saveID, ByteString tag); String GetLastError() { return lastError; } RequestStatus ParseServerReturn(ByteString &result, int status, bool json); void Tick(); void CheckUpdate(std::unique_ptr &updateRequest, bool checkSession); String DoMigration(ByteString fromDir, ByteString toDir); }; bool AddCustomGol(String ruleString, String nameString, unsigned int highColor, unsigned int lowColor);