static void UpdateScreenMenuGadgets(int, boolean);
static boolean OfferUploadTapes(void);
+static void execOfferUploadTapes(void);
static struct GadgetInfo *screen_gadget[NUM_SCREEN_GADGETS];
OpenDoor(DOOR_CLOSE_1 | DOOR_OPEN_2);
SyncEmscriptenFilesystem();
+
+ // needed once to upload tapes (after program start or after user change)
+ CheckUploadTapes();
}
static void gotoTopLevelDir(void)
SaveLevelSetup_LastSeries();
SaveLevelSetup_SeriesInfo();
+#if defined(PLATFORM_EMSCRIPTEN)
+ Request("Close the browser window to quit!", REQ_CONFIRM);
+#else
if (!setup.ask_on_quit_program ||
Request("Do you really want to quit?", REQ_ASK | REQ_STAY_CLOSED))
SetGameStatus(GAME_MODE_QUIT);
+#endif
}
}
}
// change name functions
// ============================================================================
-static void RenamePlayerOnServerExt(struct HttpRequest *request,
- struct HttpResponse *response,
- char *player_name_raw,
- char *player_uuid_raw)
+struct ApiRenamePlayerThreadData
+{
+ char *player_name;
+ char *player_uuid;
+};
+
+static void *CreateThreadData_ApiRenamePlayer(void)
{
+ struct ApiRenamePlayerThreadData *data =
+ checked_malloc(sizeof(struct ApiRenamePlayerThreadData));
+
+ data->player_name = getStringCopy(setup.player_name);
+ data->player_uuid = getStringCopy(setup.player_uuid);
+
+ return data;
+}
+
+static void FreeThreadData_ApiRenamePlayer(void *data_raw)
+{
+ struct ApiRenamePlayerThreadData *data = data_raw;
+
+ checked_free(data->player_name);
+ checked_free(data->player_uuid);
+ checked_free(data);
+}
+
+static boolean SetRequest_ApiRenamePlayer(struct HttpRequest *request,
+ void *data_raw)
+{
+ struct ApiRenamePlayerThreadData *data = data_raw;
+ char *player_name_raw = data->player_name;
+ char *player_uuid_raw = data->player_uuid;
+
request->hostname = setup.api_server_hostname;
request->port = API_SERVER_PORT;
request->method = API_SERVER_METHOD;
"{\n"
"%s"
" \"game_version\": \"%s\",\n"
+ " \"game_platform\": \"%s\",\n"
" \"name\": \"%s\",\n"
" \"uuid\": \"%s\"\n"
"}\n",
getPasswordJSON(setup.api_server_password),
getProgramRealVersionString(),
+ getProgramPlatformString(),
player_name,
player_uuid);
ConvertHttpRequestBodyToServerEncoding(request);
+ return TRUE;
+}
+
+static void HandleResponse_ApiRenamePlayer(struct HttpResponse *response,
+ void *data_raw)
+{
+ // nothing to do here
+}
+
+#if defined(PLATFORM_EMSCRIPTEN)
+static void Emscripten_ApiRenamePlayer_Loaded(unsigned handle, void *data_raw,
+ void *buffer, unsigned int size)
+{
+ struct HttpResponse *response = GetHttpResponseFromBuffer(buffer, size);
+
+ if (response != NULL)
+ {
+ HandleResponse_ApiRenamePlayer(response, data_raw);
+
+ checked_free(response);
+ }
+ else
+ {
+ Error("server response too large to handle (%d bytes)", size);
+ }
+
+ FreeThreadData_ApiRenamePlayer(data_raw);
+}
+
+static void Emscripten_ApiRenamePlayer_Failed(unsigned handle, void *data_raw,
+ int code, const char *status)
+{
+ Error("server failed to handle request: %d %s", code, status);
+
+ FreeThreadData_ApiRenamePlayer(data_raw);
+}
+
+static void Emscripten_ApiRenamePlayer_Progress(unsigned handle, void *data_raw,
+ int bytes, int size)
+{
+ // nothing to do here
+}
+
+static void Emscripten_ApiRenamePlayer_HttpRequest(struct HttpRequest *request,
+ void *data_raw)
+{
+ if (!SetRequest_ApiRenamePlayer(request, data_raw))
+ {
+ FreeThreadData_ApiRenamePlayer(data_raw);
+
+ return;
+ }
+
+ emscripten_async_wget2_data(request->uri,
+ request->method,
+ request->body,
+ data_raw,
+ TRUE,
+ Emscripten_ApiRenamePlayer_Loaded,
+ Emscripten_ApiRenamePlayer_Failed,
+ Emscripten_ApiRenamePlayer_Progress);
+}
+
+#else
+
+static void ApiRenamePlayer_HttpRequestExt(struct HttpRequest *request,
+ struct HttpResponse *response,
+ void *data_raw)
+{
+ if (!SetRequest_ApiRenamePlayer(request, data_raw))
+ return;
+
if (!DoHttpRequest(request, response))
{
Error("HTTP request failed: %s", GetHttpError());
return;
}
+
+ HandleResponse_ApiRenamePlayer(response, data_raw);
}
-static void RenamePlayerOnServer(char *player_name, char *player_uuid)
+static void ApiRenamePlayer_HttpRequest(struct HttpRequest *request,
+ struct HttpResponse *response,
+ void *data_raw)
{
- struct HttpRequest *request = checked_calloc(sizeof(struct HttpRequest));
- struct HttpResponse *response = checked_calloc(sizeof(struct HttpResponse));
-
- RenamePlayerOnServerExt(request, response, player_name, player_uuid);
+ ApiRenamePlayer_HttpRequestExt(request, response, data_raw);
- checked_free(request);
- checked_free(response);
+ FreeThreadData_ApiRenamePlayer(data_raw);
}
+#endif
-struct RenamePlayerOnServerThreadData
-{
- char *player_name;
- char *player_uuid;
-};
-
-static int RenamePlayerOnServerThread(void *data_raw)
+static int ApiRenamePlayerThread(void *data_raw)
{
- struct RenamePlayerOnServerThreadData *data = data_raw;
+ struct HttpRequest *request = checked_calloc(sizeof(struct HttpRequest));
+ struct HttpResponse *response = checked_calloc(sizeof(struct HttpResponse));
- RenamePlayerOnServer(data->player_name, data->player_uuid);
+#if defined(PLATFORM_EMSCRIPTEN)
+ Emscripten_ApiRenamePlayer_HttpRequest(request, data_raw);
+#else
+ ApiRenamePlayer_HttpRequest(request, response, data_raw);
+#endif
- checked_free(data->player_name);
- checked_free(data->player_uuid);
- checked_free(data);
+ checked_free(request);
+ checked_free(response);
return 0;
}
-static void RenamePlayerOnServerAsThread(void)
+static void ApiRenamePlayerAsThread(void)
{
- struct RenamePlayerOnServerThreadData *data =
- checked_malloc(sizeof(struct RenamePlayerOnServerThreadData));
-
- data->player_name = getStringCopy(setup.player_name);
- data->player_uuid = getStringCopy(setup.player_uuid);
+ struct ApiRenamePlayerThreadData *data = CreateThreadData_ApiRenamePlayer();
- ExecuteAsThread(RenamePlayerOnServerThread,
- "RenamePlayerOnServer", data,
+ ExecuteAsThread(ApiRenamePlayerThread,
+ "ApiRenamePlayer", data,
"rename player on server");
}
// temporarily change active user to edited user
user.nr = type_name_nr;
- // load setup of edited user (unless creating user with current setup)
- if (!create_user ||
- !Request("Use current setup values for the new player?", REQ_ASK))
+ if (create_user &&
+ Request("Use current setup values for the new player?", REQ_ASK))
+ {
+ // use current setup values for new user, but create new player UUID
+ setup.player_uuid = getStringCopy(getUUID());
+ }
+ else
+ {
+ // load setup for existing user (or start with defaults for new user)
LoadSetup();
+ }
}
char *setup_filename = getSetupFilename();
SaveSetup();
// change name of edited user on score server
- RenamePlayerOnServerAsThread();
+ ApiRenamePlayerAsThread();
if (game_status == GAME_MODE_PSEUDO_TYPENAMES || reset_setup)
{
execSetupGame_setNetworkServerText();
+ if (!setup.provide_uploading_tapes)
+ setHideSetupEntry(execOfferUploadTapes);
+
setup_mode = SETUP_MODE_GAME;
DrawSetupScreen();
{ TYPE_PLAYER, &setup.network_player_nr,"Preferred Network Player:" },
{ TYPE_TEXT_INPUT, execGadgetNetworkServer, "Network Server Hostname:" },
{ TYPE_STRING, &network_server_text, "" },
- { TYPE_SWITCH, &setup.api_server, "Use Highscore Server:" },
+ { TYPE_SWITCH, &setup.use_api_server, "Use Highscore Server:" },
{ TYPE_SWITCH, &setup.only_show_local_scores, "Only Show Local Scores:" },
{ TYPE_ENTER_LIST, execOfferUploadTapes, "Upload All Tapes to Server" },
{ TYPE_SWITCH, &setup.multiple_users, "Multiple Users/Teams:" },
ToggleNetworkModeIfNeeded();
// API server mode may have changed at this point
- if (si->value == &setup.api_server)
- runtime.api_server = setup.api_server;
+ if (si->value == &setup.use_api_server)
+ runtime.use_api_server = setup.use_api_server;
// game speed list may have changed at this point
if (si->value == &setup.game_speed_extended)
int num_tapes_uploaded = UploadTapes();
char message[100];
- sprintf(message, "%d tapes uploaded!", num_tapes_uploaded);
+ if (num_tapes_uploaded < 0)
+ {
+ Request("Cannot upload tapes to score server!", REQ_CONFIRM);
+
+ return FALSE;
+ }
+
+ if (num_tapes_uploaded == 0)
+ sprintf(message, "No tapes uploaded!");
+ else if (num_tapes_uploaded == 1)
+ sprintf(message, "1 tape uploaded!");
+ else
+ sprintf(message, "%d tapes uploaded!", num_tapes_uploaded);
Request(message, REQ_CONFIRM);
- return (num_tapes_uploaded > 0);
+ // after all tapes have been uploaded, remove entry from setup menu
+ setup.provide_uploading_tapes = FALSE;
+
+ SaveSetup();
+
+ return TRUE;
}
void CheckUploadTapes(void)
if (!setup.ask_for_uploading_tapes)
return;
+ // after asking for uploading all tapes once, do not ask again
+ setup.ask_for_uploading_tapes = FALSE;
+
if (directoryExists(getTapeDir(NULL)))
{
boolean tapes_uploaded = OfferUploadTapes();
Request("You can upload your tapes from the setup menu later!",
REQ_CONFIRM);
}
-
- setup.ask_for_uploading_tapes = FALSE;
+ else
+ {
+ // if tapes directory does not exist yet, never offer uploading all tapes
+ setup.provide_uploading_tapes = FALSE;
+ }
SaveSetup();
}