... while retaining all the functionality of stamps.def. Also fix stamp names encoding only 32 bits of the timestamp, migrate from stamps.def to stamps.json if the latter doesn't exist, delete both on migration to the shared data directory, rescan stamps at startup, and make rescanning a painless process in general by removing invalid entries and adding missing entires at the beginning of the list.
153 lines
4.2 KiB
C++
153 lines
4.2 KiB
C++
#pragma once
|
|
#include "common/String.h"
|
|
#include "common/ExplicitSingleton.h"
|
|
#include "User.h"
|
|
#include <vector>
|
|
#include <cstdint>
|
|
#include <list>
|
|
#include <memory>
|
|
#include <json/json.h>
|
|
|
|
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<Client> {
|
|
private:
|
|
String messageOfTheDay;
|
|
std::vector<std::pair<String, ByteString> > serverNotifications;
|
|
|
|
std::unique_ptr<http::Request> versionCheckRequest;
|
|
std::unique_ptr<http::Request> alternateVersionCheckRequest;
|
|
bool usingAltUpdateServer;
|
|
bool updateAvailable;
|
|
UpdateInfo updateInfo;
|
|
|
|
String lastError;
|
|
bool firstRun;
|
|
|
|
std::vector<ByteString> stampIDs;
|
|
uint64_t lastStampTime = 0;
|
|
int lastStampName = 0;
|
|
|
|
//Auth session
|
|
User authUser;
|
|
|
|
void notifyUpdateAvailable();
|
|
void notifyAuthUserChanged();
|
|
void notifyMessageOfTheDay();
|
|
void notifyNewNotification(std::pair<String, ByteString> notification);
|
|
|
|
// Save stealing info
|
|
Json::Value authors;
|
|
|
|
std::unique_ptr<Prefs> stamps;
|
|
void MigrateStampsDef();
|
|
void WriteStamps();
|
|
|
|
public:
|
|
|
|
std::vector<ClientListener*> 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<String, ByteString> notification);
|
|
std::vector<std::pair<String, ByteString> > 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<ByteString> &GetStamps() const;
|
|
void MoveStampToFront(ByteString stampID);
|
|
|
|
RequestStatus AddComment(int saveID, String comment);
|
|
|
|
std::vector<char> 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<ByteString> * RemoveTag(int saveID, ByteString tag); //TODO RequestStatus
|
|
std::list<ByteString> * AddTag(int saveID, ByteString tag);
|
|
String GetLastError() {
|
|
return lastError;
|
|
}
|
|
RequestStatus ParseServerReturn(ByteString &result, int status, bool json);
|
|
void Tick();
|
|
void CheckUpdate(std::unique_ptr<http::Request> &updateRequest, bool checkSession);
|
|
|
|
String DoMigration(ByteString fromDir, ByteString toDir);
|
|
};
|
|
|
|
bool AddCustomGol(String ruleString, String nameString, unsigned int highColor, unsigned int lowColor);
|