Skip to content

Commit

Permalink
deps/rc_client: Add rc_client_get_rich_presence_strings()
Browse files Browse the repository at this point in the history
  • Loading branch information
stenzek committed Aug 25, 2024
1 parent b378ffb commit a2aa040
Show file tree
Hide file tree
Showing 6 changed files with 106 additions and 0 deletions.
6 changes: 6 additions & 0 deletions dep/rcheevos/include/rc_client.h
Original file line number Diff line number Diff line change
Expand Up @@ -596,6 +596,12 @@ RC_EXPORT int RC_CCONV rc_client_has_rich_presence(rc_client_t* client);
*/
RC_EXPORT size_t RC_CCONV rc_client_get_rich_presence_message(rc_client_t* client, char buffer[], size_t buffer_size);

/**
* Returns a list of all possible rich presence strings.
* The list is terminated by NULL.
*/
RC_EXPORT int RC_CCONV rc_client_get_rich_presence_strings(rc_client_t* client, const char** buffer, size_t buffer_size, size_t* count);

/*****************************************************************************\
| Processing |
\*****************************************************************************/
Expand Down
1 change: 1 addition & 0 deletions dep/rcheevos/include/rc_runtime.h
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,7 @@ RC_EXPORT int RC_CCONV rc_runtime_format_lboard_value(char* buffer, int size, in

RC_EXPORT int RC_CCONV rc_runtime_activate_richpresence(rc_runtime_t* runtime, const char* script, lua_State* L, int funcs_idx);
RC_EXPORT int RC_CCONV rc_runtime_get_richpresence(const rc_runtime_t* runtime, char* buffer, size_t buffersize, rc_runtime_peek_t peek, void* peek_ud, lua_State* L);
RC_EXPORT int RC_CCONV rc_runtime_get_richpresence_strings(const rc_runtime_t* runtime, const char** buffer, size_t buffersize, size_t* count);

enum {
RC_RUNTIME_EVENT_ACHIEVEMENT_ACTIVATED, /* from WAITING, PAUSED, or PRIMED to ACTIVE */
Expand Down
1 change: 1 addition & 0 deletions dep/rcheevos/include/rc_runtime_types.h
Original file line number Diff line number Diff line change
Expand Up @@ -432,6 +432,7 @@ RC_EXPORT int RC_CCONV rc_evaluate_richpresence(rc_richpresence_t* richpresence,
RC_EXPORT void RC_CCONV rc_update_richpresence(rc_richpresence_t* richpresence, rc_peek_t peek, void* peek_ud, lua_State* L);
RC_EXPORT int RC_CCONV rc_get_richpresence_display_string(rc_richpresence_t* richpresence, char* buffer, size_t buffersize, rc_peek_t peek, void* peek_ud, lua_State* L);
RC_EXPORT void RC_CCONV rc_reset_richpresence(rc_richpresence_t* self);
RC_EXPORT int RC_CCONV rc_get_richpresence_strings(rc_richpresence_t* richpresence, const char** buffer, size_t buffersize, size_t* count);

RC_END_C_DECLS

Expand Down
12 changes: 12 additions & 0 deletions dep/rcheevos/src/rc_client.c
Original file line number Diff line number Diff line change
Expand Up @@ -4694,6 +4694,18 @@ size_t rc_client_get_rich_presence_message(rc_client_t* client, char buffer[], s
return result;
}

int rc_client_get_rich_presence_strings(rc_client_t* client, const char** buffer, size_t buffer_size, size_t* count) {
int result;

if (!client || !buffer)
return RC_INVALID_STATE;

rc_mutex_lock(&client->state.mutex);
result = rc_runtime_get_richpresence_strings(&client->game->runtime, buffer, buffer_size, count);
rc_mutex_unlock(&client->state.mutex);
return result;
}

/* ===== Processing ===== */

void rc_client_set_event_handler(rc_client_t* client, rc_client_event_handler_t handler)
Expand Down
75 changes: 75 additions & 0 deletions dep/rcheevos/src/rcheevos/richpresence.c
Original file line number Diff line number Diff line change
Expand Up @@ -827,3 +827,78 @@ void rc_reset_richpresence(rc_richpresence_t* self) {
for (variable = self->variables; variable; variable = variable->next)
rc_reset_value(variable);
}

static int rc_get_richpresence_strings_has_string(const char** buffer, size_t written, const char* search) {
for (size_t i = 0; i < written; i++) {
if (buffer[i] == search)
return 1;
}

return 0;
}

static int rc_get_richpresence_strings_recurse(const rc_richpresence_lookup_item_t* item, const char** buffer, size_t buffersize, size_t* written) {
size_t len;
int err;

if (!rc_get_richpresence_strings_has_string(buffer, *written, item->label)) {
if (*written == buffersize)
return RC_INSUFFICIENT_BUFFER;

buffer[(*written)++] = item->label;
}

if (item->left && (err = rc_get_richpresence_strings_recurse(item->left, buffer, buffersize, written)) != RC_OK)
return err;
if (item->right && (err = rc_get_richpresence_strings_recurse(item->right, buffer, buffersize, written)) != RC_OK)
return err;

return RC_OK;
}

int rc_get_richpresence_strings(rc_richpresence_t* richpresence, const char** buffer, size_t buffersize, size_t* count) {
const rc_richpresence_display_t* display;
const rc_richpresence_display_part_t* part;
size_t written;
size_t len;
int err;

written = 0;
for (display = richpresence->first_display; display; display = display->next) {
for (part = display->display; part; part = part->next) {
switch (part->display_type) {
case RC_FORMAT_STRING:
if (!rc_get_richpresence_strings_has_string(buffer, written, part->text)) {
if (written == buffersize)
return RC_INSUFFICIENT_BUFFER;

buffer[written++] = part->text;
}
break;

case RC_FORMAT_LOOKUP:
if (part->lookup->default_label && !rc_get_richpresence_strings_has_string(buffer, written, part->lookup->default_label)) {
if (written == buffersize)
return RC_INSUFFICIENT_BUFFER;

buffer[written++] = part->lookup->default_label;
}

if ((err = rc_get_richpresence_strings_recurse(part->lookup->root, buffer, buffersize, &written)) != RC_OK)
return err;

break;

default:
break;
}
}
}

if (written == buffersize)
return RC_INSUFFICIENT_BUFFER;

*count = written;
buffer[written++] = NULL; /* terminate list */
return RC_OK;
}
11 changes: 11 additions & 0 deletions dep/rcheevos/src/rcheevos/runtime.c
Original file line number Diff line number Diff line change
Expand Up @@ -537,6 +537,17 @@ int rc_runtime_get_richpresence(const rc_runtime_t* self, char* buffer, size_t b
return 0;
}

int rc_runtime_get_richpresence_strings(const rc_runtime_t* self, const char** buffer, size_t buffersize, size_t* count) {
int err = RC_INVALID_STATE;
if (self->richpresence && self->richpresence->richpresence)
err = rc_get_richpresence_strings(self->richpresence->richpresence, buffer, buffersize, count);

if (err != RC_OK)
*buffer = '\0';

return err;
}

void rc_runtime_do_frame(rc_runtime_t* self, rc_runtime_event_handler_t event_handler, rc_runtime_peek_t peek, void* ud, lua_State* L) {
rc_runtime_event_t runtime_event;
int i;
Expand Down

0 comments on commit a2aa040

Please sign in to comment.