Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions include/rc_api_editor.h
Original file line number Diff line number Diff line change
Expand Up @@ -213,6 +213,8 @@ typedef struct rc_api_update_leaderboard_request_t {
const char* format;
/* Whether or not lower scores are better for the leaderboard */
uint32_t lower_is_better;
/* The leaderboard state (promoted, unpromoted) */
uint32_t state;
}
rc_api_update_leaderboard_request_t;

Expand Down
5 changes: 5 additions & 0 deletions include/rc_api_runtime.h
Original file line number Diff line number Diff line change
Expand Up @@ -93,13 +93,18 @@ typedef struct rc_api_leaderboard_definition_t {
const char* description;
/* The definition of the leaderboard to be passed to rc_runtime_activate_lboard */
const char* definition;
/* The leaderboard state (promoted, unpromoted) */
uint8_t state;
/* Non-zero if lower values are better for this leaderboard */
uint8_t lower_is_better;
/* Non-zero if the leaderboard should not be displayed in a list of leaderboards */
uint8_t hidden;
}
rc_api_leaderboard_definition_t;

#define RC_LEADERBOARD_STATE_ACTIVE 1
#define RC_LEADERBOARD_STATE_UNPROMOTED 2

/* An achievement definition */
typedef struct rc_api_achievement_definition_t {
/* The unique identifier of the achievement */
Expand Down
35 changes: 34 additions & 1 deletion include/rc_client.h
Original file line number Diff line number Diff line change
Expand Up @@ -616,6 +616,18 @@ enum {
*/
RC_EXPORT rc_client_achievement_list_t* RC_CCONV rc_client_create_achievement_list(rc_client_t* client, int category, int grouping);

typedef struct rc_client_achievement_list_params_t {
uint32_t subset_id;
uint32_t grouping;
uint32_t category;
} rc_client_achievement_list_params_t;

/**
* Creates a list of achievements matching the specified category and grouping.
* Returns an allocated list that must be free'd by calling rc_client_destroy_achievement_list.
*/
RC_EXPORT rc_client_achievement_list_t* RC_CCONV rc_client_create_subset_achievement_list(rc_client_t* client, const rc_client_achievement_list_params_t* params);

/**
* Destroys a list allocated by rc_client_create_achievement_list.
*/
Expand Down Expand Up @@ -645,6 +657,13 @@ enum {
NUM_RC_CLIENT_LEADERBOARD_FORMATS = 3
};

enum {
RC_CLIENT_LEADERBOARD_CATEGORY_NONE = 0,
RC_CLIENT_LEADERBOARD_CATEGORY_PROMOTED = (1 << 0),
RC_CLIENT_LEADERBOARD_CATEGORY_UNPROMOTED = (1 << 1),
RC_CLIENT_LEADERBOARD_CATEGORY_PROMOTED_AND_UNPROMOTED = RC_CLIENT_LEADERBOARD_CATEGORY_PROMOTED | RC_CLIENT_LEADERBOARD_CATEGORY_UNPROMOTED
};

#define RC_CLIENT_LEADERBOARD_DISPLAY_SIZE 24

typedef struct rc_client_leaderboard_t {
Expand All @@ -655,6 +674,7 @@ typedef struct rc_client_leaderboard_t {
uint8_t state;
uint8_t format;
uint8_t lower_is_better;
uint8_t category;
} rc_client_leaderboard_t;

/**
Expand Down Expand Up @@ -687,7 +707,8 @@ enum {
RC_CLIENT_LEADERBOARD_BUCKET_ACTIVE = 2,
RC_CLIENT_LEADERBOARD_BUCKET_UNSUPPORTED = 3,
RC_CLIENT_LEADERBOARD_BUCKET_ALL = 4,
NUM_RC_CLIENT_LEADERBOARD_BUCKETS = 5
RC_CLIENT_LEADERBOARD_BUCKET_UNPROMOTED = 5,
NUM_RC_CLIENT_LEADERBOARD_BUCKETS = 6
};

enum {
Expand All @@ -701,6 +722,18 @@ enum {
*/
RC_EXPORT rc_client_leaderboard_list_t* RC_CCONV rc_client_create_leaderboard_list(rc_client_t* client, int grouping);

typedef struct rc_client_leaderboard_list_params_t {
uint32_t subset_id;
uint32_t grouping;
uint32_t category;
} rc_client_leaderboard_list_params_t;

/**
* Creates a list of leaderboards matching the specified parameters.
* Returns an allocated list that must be free'd by calling rc_client_destroy_leaderboard_list.
*/
RC_EXPORT rc_client_leaderboard_list_t* RC_CCONV rc_client_create_subset_leaderboard_list(rc_client_t* client, const rc_client_leaderboard_list_params_t* params);

/**
* Destroys a list allocated by rc_client_create_leaderboard_list.
*/
Expand Down
20 changes: 16 additions & 4 deletions src/rapi/rc_api_editor.c
Original file line number Diff line number Diff line change
Expand Up @@ -304,7 +304,7 @@ void rc_api_destroy_update_code_notes_response(rc_api_update_code_notes_response

/* --- Update Achievement --- */

static const char* rc_type_string(uint32_t type) {
static const char* rc_achievement_type_string(uint32_t type) {
switch (type) {
case RC_ACHIEVEMENT_TYPE_MISSABLE: return "missable";
case RC_ACHIEVEMENT_TYPE_PROGRESSION: return "progression";
Expand Down Expand Up @@ -350,7 +350,7 @@ int rc_api_init_update_achievement_request_hosted(rc_api_request_t* request,
rc_url_builder_append_unum_param(&builder, "f", api_params->category);
if (api_params->badge)
rc_url_builder_append_str_param(&builder, "b", api_params->badge);
rc_url_builder_append_str_param(&builder, "x", rc_type_string(api_params->type));
rc_url_builder_append_str_param(&builder, "x", rc_achievement_type_string(api_params->type));

/* Evaluate the signature. */
md5_init(&md5);
Expand Down Expand Up @@ -391,6 +391,7 @@ int rc_api_process_update_achievement_server_response(rc_api_update_achievement_
rc_json_field_t fields[] = {
RC_JSON_NEW_FIELD("Success"),
RC_JSON_NEW_FIELD("Error"),
RC_JSON_NEW_FIELD("Code"),
RC_JSON_NEW_FIELD("AchievementID")
};

Expand All @@ -401,7 +402,7 @@ int rc_api_process_update_achievement_server_response(rc_api_update_achievement_
if (result != RC_OK || !response->response.succeeded)
return result;

if (!rc_json_get_required_unum(&response->achievement_id, &response->response, &fields[2], "AchievementID"))
if (!rc_json_get_required_unum(&response->achievement_id, &response->response, &fields[3], "AchievementID"))
return RC_MISSING_VALUE;

return RC_OK;
Expand All @@ -413,6 +414,14 @@ void rc_api_destroy_update_achievement_response(rc_api_update_achievement_respon

/* --- Update Leaderboard --- */

static const char* rc_leaderboard_state_string(uint32_t type) {
switch (type) {
case RC_LEADERBOARD_STATE_ACTIVE: return "active";
case RC_LEADERBOARD_STATE_UNPROMOTED: return "unpromoted";
default: return "";
}
}

int rc_api_init_update_leaderboard_request(rc_api_request_t* request, const rc_api_update_leaderboard_request_t* api_params) {
return rc_api_init_update_leaderboard_request_hosted(request, api_params, &g_host);
}
Expand Down Expand Up @@ -459,6 +468,8 @@ int rc_api_init_update_leaderboard_request_hosted(rc_api_request_t* request,
rc_url_builder_append_str_param(&builder, "l", api_params->value_definition);
rc_url_builder_append_num_param(&builder, "w", api_params->lower_is_better);
rc_url_builder_append_str_param(&builder, "f", api_params->format);
rc_url_builder_append_str_param(&builder, "m",
rc_leaderboard_state_string(api_params->state ? api_params->state : RC_LEADERBOARD_STATE_ACTIVE));

/* Evaluate the signature. */
md5_init(&md5);
Expand Down Expand Up @@ -499,6 +510,7 @@ int rc_api_process_update_leaderboard_server_response(rc_api_update_leaderboard_
rc_json_field_t fields[] = {
RC_JSON_NEW_FIELD("Success"),
RC_JSON_NEW_FIELD("Error"),
RC_JSON_NEW_FIELD("Code"),
RC_JSON_NEW_FIELD("LeaderboardID")
};

Expand All @@ -509,7 +521,7 @@ int rc_api_process_update_leaderboard_server_response(rc_api_update_leaderboard_
if (result != RC_OK || !response->response.succeeded)
return result;

if (!rc_json_get_required_unum(&response->leaderboard_id, &response->response, &fields[2], "LeaderboardID"))
if (!rc_json_get_required_unum(&response->leaderboard_id, &response->response, &fields[3], "LeaderboardID"))
return RC_MISSING_VALUE;

return RC_OK;
Expand Down
12 changes: 11 additions & 1 deletion src/rapi/rc_api_runtime.c
Original file line number Diff line number Diff line change
Expand Up @@ -236,7 +236,8 @@ static int rc_api_process_fetch_game_data_leaderboards(rc_api_response_t* respon
RC_JSON_NEW_FIELD("Mem"),
RC_JSON_NEW_FIELD("Format"),
RC_JSON_NEW_FIELD("LowerIsBetter"),
RC_JSON_NEW_FIELD("Hidden")
RC_JSON_NEW_FIELD("Hidden"),
RC_JSON_NEW_FIELD("State")
};

memset(&iterator, 0, sizeof(iterator));
Expand Down Expand Up @@ -269,6 +270,13 @@ static int rc_api_process_fetch_game_data_leaderboards(rc_api_response_t* respon
leaderboard->format = RC_FORMAT_VALUE;
}

leaderboard->state = RC_LEADERBOARD_STATE_ACTIVE;
if (leaderboard_fields[7].value_start &&
leaderboard_fields[7].value_end - leaderboard_fields[7].value_start == 12 &&
memcmp(leaderboard_fields[7].value_start + 1, "unpromoted", 10) == 0) {
leaderboard->state = RC_LEADERBOARD_STATE_UNPROMOTED;
}

++leaderboard;
}

Expand Down Expand Up @@ -396,6 +404,8 @@ int rc_api_init_fetch_game_sets_request_hosted(rc_api_request_t* request,
else
rc_url_builder_append_str_param(&builder, "m", api_params->game_hash);

rc_url_builder_append_unum_param(&builder, "v", 2); /* indicate we want unpromoted leaderboards */

request->post_data = rc_url_builder_finalize(&builder);
request->content_type = RC_CONTENT_TYPE_URLENCODED;
}
Expand Down
Loading
Loading