From de9d546d70cfcbf3b2450b70039470c9a68ecdc6 Mon Sep 17 00:00:00 2001 From: violette Date: Mon, 12 Jan 2026 06:03:04 +0100 Subject: Added emoji categories. --- activitypub.c | 2 +- format.c | 20 +++++++++++++++++++- mastoapi.c | 32 +++++++++++++++++++++++--------- snac.h | 1 + 4 files changed, 44 insertions(+), 11 deletions(-) diff --git a/activitypub.c b/activitypub.c index 829f6d5..1992b13 100644 --- a/activitypub.c +++ b/activitypub.c @@ -1611,7 +1611,7 @@ xs_dict *msg_emoji_init(snac *snac, const char *mid, const char *eid_o) xs *dict = xs_dict_new(); xs *icon = xs_dict_new(); xs *accounts = xs_list_new(); - xs *emjs = emojis(); + xs *emjs = emojis_rm_categories(); /* may be a default emoji */ xs *eidd = xs_dup(eid); diff --git a/format.c b/format.c index 803e5a5..95c1b12 100644 --- a/format.c +++ b/format.c @@ -79,6 +79,24 @@ xs_dict *emojis(void) return d; } + +xs_dict *emojis_rm_categories() { + xs *emjs = emojis(); + char *res = xs_dict_new(); + const char *k, *v; + xs_dict_foreach(emjs, k, v) { + if (xs_type(v) == XSTYPE_DICT) { + const char *v2; + xs_dict_foreach(v, k, v2) + res = xs_dict_append(res, k, v2); + } + else + res = xs_dict_append(res, k, v); + } + return res; +} + + /* Non-whitespace without trailing comma, period or closing paren */ #define NOSPACE "([^[:space:],.)]+|[,.)]+[^[:space:],.)])+" @@ -405,7 +423,7 @@ xs_str *not_really_markdown(const char *content, xs_list **attach, xs_list **tag { /* traditional emoticons */ - xs *d = emojis(); + xs *d = emojis_rm_categories(); int c = 0; const char *k, *v; diff --git a/mastoapi.c b/mastoapi.c index 8187115..dd80abc 100644 --- a/mastoapi.c +++ b/mastoapi.c @@ -2647,19 +2647,33 @@ int mastoapi_get_handler(const xs_dict *req, const char *q_path, if (strcmp(cmd, "/v1/custom_emojis") == 0) { /** **/ xs *emo = emojis(); xs *list = xs_list_new(); - int c = 0; const xs_str *k; const xs_val *v; - while(xs_dict_next(emo, &k, &v, &c)) { + xs_dict_foreach(emo, k, v) { xs *current = xs_dict_new(); - if (xs_startswith(v, "https://") && xs_startswith((xs_mime_by_ext(v)), "image/")) { + if ((xs_startswith(v, "https://") && xs_startswith((xs_mime_by_ext(v)), "image/")) || xs_type(v) == XSTYPE_DICT) { /* remove first and last colon */ - xs *shortcode = xs_replace(k, ":", ""); - current = xs_dict_append(current, "shortcode", shortcode); - current = xs_dict_append(current, "url", v); - current = xs_dict_append(current, "static_url", v); - current = xs_dict_append(current, "visible_in_picker", xs_stock(XSTYPE_TRUE)); - list = xs_list_append(list, current); + if (xs_type(v) == XSTYPE_DICT) { + const char *v2; + const char *cat = k; + xs_dict_foreach(v, k, v2) { + xs *shortcode = xs_replace(k, ":", ""); + current = xs_dict_append(current, "shortcode", shortcode); + current = xs_dict_append(current, "url", v2); + current = xs_dict_append(current, "static_url", v2); + current = xs_dict_append(current, "visible_in_picker", xs_stock(XSTYPE_TRUE)); + current = xs_dict_append(current, "category", cat); + list = xs_list_append(list, current); + } + } + else { + xs *shortcode = xs_replace(k, ":", ""); + current = xs_dict_append(current, "shortcode", shortcode); + current = xs_dict_append(current, "url", v); + current = xs_dict_append(current, "static_url", v); + current = xs_dict_append(current, "visible_in_picker", xs_stock(XSTYPE_TRUE)); + list = xs_list_append(list, current); + } } } *body = xs_json_dumps(list, 0); diff --git a/snac.h b/snac.h index e5efc0b..d57391f 100644 --- a/snac.h +++ b/snac.h @@ -412,6 +412,7 @@ int activitypub_post_handler(const xs_dict *req, const char *q_path, char **body, int *b_size, char **ctype); xs_dict *emojis(void); +xs_dict *emojis_rm_categories(void); xs_str *format_text_with_emoji(snac *user, const char *text, int ems, const char *proxy); xs_str *not_really_markdown(const char *content, xs_list **attach, xs_list **tag); xs_str *sanitize(const char *content); -- cgit v1.2.3