diff --git a/activitypub.c b/activitypub.c
index b322a40..51a2cfa 100644
--- a/activitypub.c
+++ b/activitypub.c
@@ -368,36 +368,69 @@ void process_tags(snac *snac, const char *content, xs_str **n_content, xs_list *
xs_val *v;
int n = 0;
- split = xs_regex_split(content, "(@[A-Za-z0-9_]+@[A-Za-z0-9\\.-]+|[0-9]+;|#[^ ,\\.:;<]+)");
+ split = xs_regex_split(content, "(@[A-Za-z0-9_]+(@[A-Za-z0-9\\.-]+)?|[0-9]+;|#[^ ,\\.:;<]+)");
p = split;
while (xs_list_iter(&p, &v)) {
if ((n & 0x1)) {
if (*v == '@') {
- /* query the webfinger about this fellow */
- xs *v2 = xs_strip_chars_i(xs_dup(v), "@.");
- xs *actor = NULL;
- xs *uid = NULL;
- int status;
+ xs *link = NULL;
- status = webfinger_request(v2, &actor, &uid);
+ if (strchr(v + 1, '@') == NULL) {
+ /* only one @? it's a dumb Mastodon-like mention
+ without server; check if there is anybody
+ whose name starts with this in the tag list */
+ xs_list *p2 = tl;
+ xs_dict *v2;
+ xs *pname = xs_fmt("%s@", v);
- if (valid_status(status)) {
- xs *d = xs_dict_new();
- xs *n = xs_fmt("@%s", uid);
- xs *l = xs_fmt("%s", actor, n);
+ while (xs_list_iter(&p2, &v2)) {
+ const char *type = xs_dict_get(v2, "type");
- d = xs_dict_append(d, "type", "Mention");
- d = xs_dict_append(d, "href", actor);
- d = xs_dict_append(d, "name", n);
+ if (type && strcmp(type, "Mention") == 0) {
+ const char *name = xs_dict_get(v2, "name");
+ const char *href = xs_dict_get(v2, "href");
- tl = xs_list_append(tl, d);
+ if (name && href && (xs_startswith(name, pname) ||
+ xs_startswith(name, pname + 1))) {
+ /* good enough :shrug2: */
+ link = xs_fmt(
+ "%s", href, name);
- /* add the code */
- nc = xs_str_cat(nc, l);
+ break;
+ }
+ }
+ }
+
+ snac_debug(snac, 2, xs_fmt(
+ "mention without server '%s' (%s)", v, link ? link : "none"));
}
+ else {
+ /* query the webfinger about this fellow */
+ xs *v2 = xs_strip_chars_i(xs_dup(v), "@.");
+ xs *actor = NULL;
+ xs *uid = NULL;
+ int status;
+
+ status = webfinger_request(v2, &actor, &uid);
+
+ if (valid_status(status)) {
+ xs *d = xs_dict_new();
+ xs *n = xs_fmt("@%s", uid);
+
+ d = xs_dict_append(d, "type", "Mention");
+ d = xs_dict_append(d, "href", actor);
+ d = xs_dict_append(d, "name", n);
+
+ tl = xs_list_append(tl, d);
+
+ link = xs_fmt("%s", actor, n);
+ }
+ }
+
+ if (!xs_is_null(link))
+ nc = xs_str_cat(nc, link);
else
- /* store as is */
nc = xs_str_cat(nc, v);
}
else