-static int ApiRenamePlayerThread(void *data_raw)
-{
- struct HttpRequest *request = checked_calloc(sizeof(struct HttpRequest));
- struct HttpResponse *response = checked_calloc(sizeof(struct HttpResponse));
-
- program.api_thread_count++;
-
-#if defined(PLATFORM_EMSCRIPTEN)
- Emscripten_ApiRenamePlayer_HttpRequest(request, data_raw);
-#else
- ApiRenamePlayer_HttpRequest(request, response, data_raw);
-#endif
-
- program.api_thread_count--;
-
- checked_free(request);
- checked_free(response);
-
- return 0;
-}
-
-static void ApiRenamePlayerAsThread(void)
-{
- struct ApiRenamePlayerThreadData *data = CreateThreadData_ApiRenamePlayer();
-
- ExecuteAsThread(ApiRenamePlayerThread,
- "ApiRenamePlayer", data,
- "rename player on server");
-}
-
-
-// ============================================================================
-// reset player UUID API functions
-// ============================================================================
-
-struct ApiResetUUIDThreadData
-{
- char *player_name;
- char *player_uuid_old;
- char *player_uuid_new;
-};
-
-static void *CreateThreadData_ApiResetUUID(char *uuid_new)
-{
- struct ApiResetUUIDThreadData *data =
- checked_malloc(sizeof(struct ApiResetUUIDThreadData));
-
- data->player_name = getStringCopy(setup.player_name);
- data->player_uuid_old = getStringCopy(setup.player_uuid);
- data->player_uuid_new = getStringCopy(uuid_new);
-
- return data;
-}
-
-static void FreeThreadData_ApiResetUUID(void *data_raw)
-{
- struct ApiResetUUIDThreadData *data = data_raw;
-
- checked_free(data->player_name);
- checked_free(data->player_uuid_old);
- checked_free(data->player_uuid_new);
- checked_free(data);
-}
-
-static boolean SetRequest_ApiResetUUID(struct HttpRequest *request,
- void *data_raw)
-{
- struct ApiResetUUIDThreadData *data = data_raw;
- char *player_name_raw = data->player_name;
- char *player_uuid_old_raw = data->player_uuid_old;
- char *player_uuid_new_raw = data->player_uuid_new;
-
- request->hostname = setup.api_server_hostname;
- request->port = API_SERVER_PORT;
- request->method = API_SERVER_METHOD;
- request->uri = API_SERVER_URI_RESETUUID;
-
- char *player_name = getEscapedJSON(player_name_raw);
- char *player_uuid_old = getEscapedJSON(player_uuid_old_raw);
- char *player_uuid_new = getEscapedJSON(player_uuid_new_raw);
-
- snprintf(request->body, MAX_HTTP_BODY_SIZE,
- "{\n"
- "%s"
- " \"game_version\": \"%s\",\n"
- " \"game_platform\": \"%s\",\n"
- " \"name\": \"%s\",\n"
- " \"uuid_old\": \"%s\",\n"
- " \"uuid_new\": \"%s\"\n"
- "}\n",
- getPasswordJSON(setup.api_server_password),
- getProgramRealVersionString(),
- getProgramPlatformString(),
- player_name,
- player_uuid_old,
- player_uuid_new);
-
- checked_free(player_name);
- checked_free(player_uuid_old);
- checked_free(player_uuid_new);
-
- ConvertHttpRequestBodyToServerEncoding(request);
-
- return TRUE;
-}
-
-static void HandleResponse_ApiResetUUID(struct HttpResponse *response,
- void *data_raw)
-{
- struct ApiResetUUIDThreadData *data = data_raw;
-
- // upgrade player UUID in server setup file
- setup.player_uuid = getStringCopy(data->player_uuid_new);
- setup.player_version = 2;
-
- SaveSetup_ServerSetup();
-}
-
-#if defined(PLATFORM_EMSCRIPTEN)
-static void Emscripten_ApiResetUUID_Loaded(unsigned handle, void *data_raw,
- void *buffer, unsigned int size)
-{
- struct HttpResponse *response = GetHttpResponseFromBuffer(buffer, size);
-
- if (response != NULL)
- {
- HandleResponse_ApiResetUUID(response, data_raw);
-
- checked_free(response);
- }
- else
- {
- Error("server response too large to handle (%d bytes)", size);
- }
-
- FreeThreadData_ApiResetUUID(data_raw);
-}
-
-static void Emscripten_ApiResetUUID_Failed(unsigned handle, void *data_raw,
- int code, const char *status)
-{
- Error("server failed to handle request: %d %s", code, status);
-
- FreeThreadData_ApiResetUUID(data_raw);
-}
-
-static void Emscripten_ApiResetUUID_Progress(unsigned handle, void *data_raw,
- int bytes, int size)
-{
- // nothing to do here
-}
-
-static void Emscripten_ApiResetUUID_HttpRequest(struct HttpRequest *request,
- void *data_raw)
-{
- if (!SetRequest_ApiResetUUID(request, data_raw))
- {
- FreeThreadData_ApiResetUUID(data_raw);
-
- return;
- }
-
- emscripten_async_wget2_data(request->uri,
- request->method,
- request->body,
- data_raw,
- TRUE,
- Emscripten_ApiResetUUID_Loaded,
- Emscripten_ApiResetUUID_Failed,
- Emscripten_ApiResetUUID_Progress);
-}
-
-#else
-
-static void ApiResetUUID_HttpRequestExt(struct HttpRequest *request,
- struct HttpResponse *response,
- void *data_raw)
-{
- if (!SetRequest_ApiResetUUID(request, data_raw))
- return;
-
- if (!DoHttpRequest(request, response))
- {
- Error("HTTP request failed: %s", GetHttpError());
-
- return;
- }
-
- if (!HTTP_SUCCESS(response->status_code))
- {
- Error("server failed to handle request: %d %s",
- response->status_code,
- response->status_text);
-
- return;
- }
-
- HandleResponse_ApiResetUUID(response, data_raw);
-}
-
-static void ApiResetUUID_HttpRequest(struct HttpRequest *request,
- struct HttpResponse *response,
- void *data_raw)
-{
- ApiResetUUID_HttpRequestExt(request, response, data_raw);
-
- FreeThreadData_ApiResetUUID(data_raw);
-}
-#endif
-
-static int ApiResetUUIDThread(void *data_raw)
-{
- struct HttpRequest *request = checked_calloc(sizeof(struct HttpRequest));
- struct HttpResponse *response = checked_calloc(sizeof(struct HttpResponse));
-
- program.api_thread_count++;
-
-#if defined(PLATFORM_EMSCRIPTEN)
- Emscripten_ApiResetUUID_HttpRequest(request, data_raw);
-#else
- ApiResetUUID_HttpRequest(request, response, data_raw);
-#endif
-
- program.api_thread_count--;
-
- checked_free(request);
- checked_free(response);
-
- return 0;
-}
-
-static void ApiResetUUIDAsThread(char *uuid_new)
-{
- struct ApiResetUUIDThreadData *data = CreateThreadData_ApiResetUUID(uuid_new);
-
- ExecuteAsThread(ApiResetUUIDThread,
- "ApiResetUUID", data,
- "reset UUID on server");
-}
-
-
-// ============================================================================
-// type name functions
-// ============================================================================
-
-static TreeInfo *type_name_node = NULL;
-static char type_name_last[MAX_PLAYER_NAME_LEN + 1] = { 0 };
-static int type_name_nr = 0;
-
-static int getPlayerNameColor(char *name)
-{
- return (strEqual(name, EMPTY_PLAYER_NAME) ? FC_BLUE : FC_RED);
-}
-
-static void drawTypeNameText(char *name, struct TextPosInfo *pos,
- boolean active)
-{
- char text[MAX_PLAYER_NAME_LEN + 2] = { 0 };
- boolean multiple_users = (game_status == GAME_MODE_PSEUDO_TYPENAMES);
- int sx = (multiple_users ? amSX + pos->x : mSX + ALIGNED_TEXT_XPOS(pos));
- int sy = (multiple_users ? amSY + pos->y : mSY + ALIGNED_TEXT_YPOS(pos));
- int font_nr = (active ? FONT_ACTIVE(pos->font) : pos->font);
- int font_width = getFontWidth(font_nr);
-
- DrawBackgroundForFont(sx, sy, pos->width, pos->height, font_nr);
-
- sprintf(text, "%s%c", name, (active ? '_' : '\0'));
-
- pos->width = strlen(text) * font_width;
- sx = (multiple_users ? amSX + pos->x : mSX + ALIGNED_TEXT_XPOS(pos));
-
- DrawText(sx, sy, text, font_nr);
-}
-
-static void getTypeNameValues(char *name, struct TextPosInfo *pos, int *xpos)
-{
- struct MainControlInfo *mci = getMainControlInfo(MAIN_CONTROL_NAME);
-
- *pos = *mci->pos_input;
-
- if (game_status == GAME_MODE_PSEUDO_TYPENAMES)
- {
- TreeInfo *ti = player_name_current;
- int first_entry = ti->cl_first;
- int entry_pos = first_entry + ti->cl_cursor;
- TreeInfo *node_first = getTreeInfoFirstGroupEntry(ti);
- int xpos = MENU_SCREEN_START_XPOS;
- int ypos = MENU_SCREEN_START_YPOS + ti->cl_cursor;
-
- type_name_node = getTreeInfoFromPos(node_first, entry_pos);
- type_name_nr = entry_pos;
-
- strcpy(name, type_name_node->name);
-
- pos->x = xpos * 32;
- pos->y = ypos * 32;
- pos->width = MAX_PLAYER_NAME_LEN * 32;
- }
- else
- {
- type_name_nr = user.nr;
-
- strcpy(name, setup.player_name);
- }
-
- strcpy(type_name_last, name);
-
- if (strEqual(name, EMPTY_PLAYER_NAME))
- strcpy(name, "");
-
- *xpos = strlen(name);
-}
-
-static void setTypeNameValues_Name(char *name, struct TextPosInfo *pos)
-{
- // change name of edited user in global list of user names
- setString(&global.user_names[type_name_nr], name);
-
- if (game_status == GAME_MODE_PSEUDO_TYPENAMES)
- {
- TreeInfo *node = type_name_node;
-
- // change name of edited user in local menu tree structure
- setString(&node->name, name);
- setString(&node->name_sorting, name);
-
- node->color = getPlayerNameColor(name);
- pos->font = MENU_CHOOSE_TREE_FONT(node->color);
- }
-}
-
-static void setTypeNameValues(char *name, struct TextPosInfo *pos,
- boolean changed)
-{
- boolean reset_setup = strEqual(name, "");
- boolean remove_user = strEqual(name, EMPTY_PLAYER_NAME);
- boolean create_user = strEqual(type_name_last, EMPTY_PLAYER_NAME);
-
- if (!changed)
- strcpy(name, type_name_last);
-
- if (strEqual(name, ""))
- strcpy(name, EMPTY_PLAYER_NAME);
-
- setTypeNameValues_Name(name, pos);
-
- // if player name not changed, no further action required
- if (strEqual(name, type_name_last))
- return;
-
- // redraw player name before (possibly) opening request dialogs
- drawTypeNameText(name, pos, FALSE);
-
- int last_user_nr = user.nr;
-
- if (game_status == GAME_MODE_PSEUDO_TYPENAMES)
- {
- // save setup of currently active user (may differ from edited user)
- SaveSetup();