request->method = API_SERVER_METHOD;
request->uri = API_SERVER_URI_GET;
+ char *levelset_identifier = getEscapedJSON(leveldir_current->identifier);
+ char *levelset_name = getEscapedJSON(leveldir_current->name);
+
snprintf(request->body, MAX_HTTP_BODY_SIZE,
"{\n"
"%s"
" \"game_version\": \"%s\",\n"
" \"game_platform\": \"%s\",\n"
" \"levelset_identifier\": \"%s\",\n"
+ " \"levelset_name\": \"%s\",\n"
" \"level_nr\": \"%d\"\n"
"}\n",
getPasswordJSON(setup.api_server_password),
getProgramRealVersionString(),
getProgramPlatformString(),
- levelset.identifier,
+ levelset_identifier,
+ levelset_name,
level_nr);
+ checked_free(levelset_identifier);
+ checked_free(levelset_name);
+
ConvertHttpRequestBodyToServerEncoding(request);
return TRUE;
if (!HTTP_SUCCESS(response->status_code))
{
+ // do not show error message if no scores found for this level set
+ if (response->status_code == 404)
+ return;
+
Error("server failed to handle request: %d %s",
response->status_code,
response->status_text);
struct ApiAddScoreThreadData
{
int level_nr;
+ boolean tape_saved;
char *score_tape_filename;
struct ScoreEntry score_entry;
};
-static void *CreateThreadData_ApiAddScore(int nr, char *score_tape_filename)
+static void *CreateThreadData_ApiAddScore(int nr, boolean tape_saved,
+ char *score_tape_filename)
{
struct ApiAddScoreThreadData *data =
checked_malloc(sizeof(struct ApiAddScoreThreadData));
score_tape_filename = getScoreTapeFilename(score_entry->tape_basename, nr);
data->level_nr = nr;
+ data->tape_saved = tape_saved;
data->score_entry = *score_entry;
data->score_tape_filename = getStringCopy(score_tape_filename);
struct ApiAddScoreThreadData *data = data_raw;
struct ScoreEntry *score_entry = &data->score_entry;
char *score_tape_filename = data->score_tape_filename;
+ boolean tape_saved = data->tape_saved;
int level_nr = data->level_nr;
request->hostname = setup.api_server_hostname;
" \"score\": \"%d\",\n"
" \"time\": \"%d\",\n"
" \"tape_basename\": \"%s\",\n"
+ " \"tape_saved\": \"%d\",\n"
" \"tape\": \"%s\"\n"
"}\n",
getPasswordJSON(setup.api_server_password),
score_entry->score,
score_entry->time,
score_entry->tape_basename,
+ tape_saved,
tape_base64);
checked_free(tape_base64);
return 0;
}
-static void ApiAddScoreAsThread(int nr, char *score_tape_filename)
+static void ApiAddScoreAsThread(int nr, boolean tape_saved,
+ char *score_tape_filename)
{
struct ApiAddScoreThreadData *data =
- CreateThreadData_ApiAddScore(nr, score_tape_filename);
+ CreateThreadData_ApiAddScore(nr, tape_saved, score_tape_filename);
ExecuteAsThread(ApiAddScoreThread,
"ApiAddScore", data,
"upload score to server");
}
-void SaveServerScore(int nr)
+void SaveServerScore(int nr, boolean tape_saved)
{
if (!runtime.use_api_server)
return;
- ApiAddScoreAsThread(nr, NULL);
+ ApiAddScoreAsThread(nr, tape_saved, NULL);
}
-void SaveServerScoreFromFile(int nr, char *score_tape_filename)
+void SaveServerScoreFromFile(int nr, boolean tape_saved,
+ char *score_tape_filename)
{
if (!runtime.use_api_server)
return;
- ApiAddScoreAsThread(nr, score_tape_filename);
+ ApiAddScoreAsThread(nr, tape_saved, score_tape_filename);
}
void LoadLocalAndServerScore(int nr, boolean download_score)
{
int last_added_local = scores.last_added_local;
- LoadScore(nr);
+ // needed if only showing server scores
+ setScoreInfoToDefaults();
+
+ if (!strEqual(setup.scores_in_highscore_list, STR_SCORES_TYPE_SERVER_ONLY))
+ LoadScore(nr);
// restore last added local score entry (before merging server scores)
scores.last_added = scores.last_added_local = last_added_local;
- if (setup.use_api_server && !setup.only_show_local_scores)
+ if (setup.use_api_server &&
+ !strEqual(setup.scores_in_highscore_list, STR_SCORES_TYPE_LOCAL_ONLY))
{
// load server scores from cache file and trigger update from server
LoadServerScore(nr, download_score);
&setup.show_undo_redo_buttons, "show_undo_redo_buttons"
},
{
- TYPE_SWITCH,
- &setup.only_show_local_scores, "only_show_local_scores"
+ TYPE_STRING,
+ &setup.scores_in_highscore_list, "scores_in_highscore_list"
},
{
TYPE_STRING,
si->small_game_graphics = FALSE;
si->show_load_save_buttons = FALSE;
si->show_undo_redo_buttons = FALSE;
- si->only_show_local_scores = FALSE;
+ si->scores_in_highscore_list = getStringCopy(STR_SCORES_TYPE_DEFAULT);
si->graphics_set = getStringCopy(GFX_CLASSIC_SUBDIR);
si->sounds_set = getStringCopy(SND_CLASSIC_SUBDIR);