summary refs log tree commit diff
path: root/src/LWeb.h
diff options
context:
space:
mode:
authorWlodekM <[email protected]>2024-06-16 10:35:45 +0300
committerWlodekM <[email protected]>2024-06-16 10:35:45 +0300
commitabef6da56913f1c55528103e60a50451a39628b1 (patch)
treeb3c8092471ecbb73e568cd0d336efa0e7871ee8d /src/LWeb.h
initial commit
Diffstat (limited to 'src/LWeb.h')
-rw-r--r--src/LWeb.h136
1 files changed, 136 insertions, 0 deletions
diff --git a/src/LWeb.h b/src/LWeb.h
new file mode 100644
index 0000000..b9edd9a
--- /dev/null
+++ b/src/LWeb.h
@@ -0,0 +1,136 @@
+#ifndef CC_LWEB_H
+#define CC_LWEB_H
+#include "Bitmap.h"
+#include "Constants.h"
+/* Implements asynchronous web tasks for the launcher.
+	Copyright 2014-2023 ClassiCube | Licensed under BSD-3
+*/
+
+struct HttpRequest;
+struct JsonContext;
+typedef void (*JsonOnValue)(struct JsonContext* ctx, const cc_string* v);
+typedef void (*JsonOnNew)(struct JsonContext* ctx);
+
+/* State for parsing JSON text */
+struct JsonContext {
+	char* cur;        /* Pointer to current character in JSON stream being inspected. */
+	int left;         /* Number of characters left to be inspected. */
+	cc_bool failed;   /* Whether there was an error parsing the JSON. */
+	cc_string curKey; /* Key/Name of current member */
+	int depth;        /* Object/Array depth (e.g. { { { is depth 3 */
+	
+	JsonOnNew OnNewArray;  /* Invoked when start of an array is read. */
+	JsonOnNew OnNewObject; /* Invoked when start of an object is read. */
+	JsonOnValue OnValue;   /* Invoked on each member value in an object/array. */
+	cc_string _tmp; /* temp value used for reading string values */
+	char _tmpBuffer[STRING_SIZE];
+};
+/* Initialises state of JSON parser. */
+void Json_Init(struct JsonContext* ctx, STRING_REF char* str, int len);
+/* Parses the JSON text, invoking callbacks when value/array/objects are read. */
+/* NOTE: DO NOT persist the value argument in OnValue. */
+cc_bool Json_Parse(struct JsonContext* ctx);
+
+/* Represents all known details about a server. */
+struct ServerInfo {
+	cc_string hash, name, ip, mppass, software;
+	int players, maxPlayers, port, uptime;
+	cc_bool featured;
+	char country[2];
+	int _order; /* (internal) order in servers table after filtering */
+	char _hashBuffer[32],   _nameBuffer[STRING_SIZE];
+	char _ipBuffer[16],     _mppassBuffer[STRING_SIZE];
+	char _softBuffer[STRING_SIZE];
+};
+
+/* Represents a country flag */
+struct Flag {
+	struct Bitmap bmp;
+	char country[2]; /* ISO 3166-1 alpha-2 */
+	void* meta; /* Backend specific meta */
+};
+
+struct LWebTask {
+	cc_bool completed; /* Whether the task has finished executing. */
+	cc_bool working;   /* Whether the task is currently in progress, or is scheduled to be. */
+	cc_bool success;   /* Whether the task completed successfully. */
+	
+	int reqID; /* Unique request identifier for this web task. */
+	/* Called when task successfully downloaded/uploaded data. */
+	void (*Handle)(cc_uint8* data, cc_uint32 len);
+};
+typedef void (*LWebTask_ErrorCallback)(struct HttpRequest* req);
+
+void LWebTask_Tick(struct LWebTask* task, LWebTask_ErrorCallback errorCallback);
+void LWebTasks_Init(void);
+
+
+extern struct GetTokenTaskData {
+	struct LWebTask Base;
+	cc_string token;    /* Random CSRF token for logging in. */
+	cc_string username; /* Username if session is already logged in. */
+	cc_bool   error;    /* Whether a signin error occurred */
+} GetTokenTask;
+void GetTokenTask_Run(void);
+
+extern struct SignInTaskData {
+	struct LWebTask Base;
+	cc_string username; /* Username to sign in as. Changed to case correct username. */
+	const char* error;  /* If sign in fails, the reason why. */
+	cc_bool needMFA;    /* need login code for multifactor authentication */
+} SignInTask;
+void SignInTask_Run(const cc_string* user, const cc_string* pass, const cc_string* mfaCode);
+
+
+extern struct FetchServerData {
+	struct LWebTask Base;
+	struct ServerInfo server; /* Details about the given server on success. */
+} FetchServerTask;
+void FetchServerTask_Run(const cc_string* hash);
+
+
+extern struct FetchServersData {
+	struct LWebTask Base;
+	struct ServerInfo* servers; /* List of all public servers on server list. */
+	cc_uint16* orders;          /* Order of each server (after sorting) */
+	int numServers;             /* Number of public servers. */
+} FetchServersTask;
+void FetchServersTask_Run(void);
+void FetchServersTask_ResetOrder(void);
+#define Servers_Get(i) (&FetchServersTask.servers[FetchServersTask.orders[i]])
+
+
+extern struct CheckUpdateData {
+	struct LWebTask Base;
+	/* Unix timestamp latest commit/dev build and release were at. */
+	cc_uint64 devTimestamp, relTimestamp;
+	/* Version of latest release. */
+	cc_string latestRelease;
+} CheckUpdateTask; /* TODO: Work out the JSON for this.. */
+void CheckUpdateTask_Run(void);
+
+
+extern struct FetchUpdateData {
+	struct LWebTask Base;
+	/* Unix timestamp downloaded build was originally built at. */
+	cc_uint64 timestamp;
+} FetchUpdateTask;
+void FetchUpdateTask_Run(cc_bool release, int buildIndex);
+
+
+extern struct FetchFlagsData { 
+	struct LWebTask Base;
+	/* Number of flags downloaded. */
+	int count;
+} FetchFlagsTask;
+
+/* Asynchronously downloads the flag associated with the given server's country. */
+void FetchFlagsTask_Add(const struct ServerInfo* server);
+/* Gets the country flag associated with the given server's country. */
+struct Flag* Flags_Get(const struct ServerInfo* server);
+/* Frees all flag bitmaps. */
+void Flags_Free(void);
+
+void Session_Load(void);
+void Session_Save(void);
+#endif