diff --git a/activitypub.c b/activitypub.c
index 51a2cfa..13415df 100644
--- a/activitypub.c
+++ b/activitypub.c
@@ -368,6 +368,31 @@ void process_tags(snac *snac, const char *content, xs_str **n_content, xs_list *
xs_val *v;
int n = 0;
+ /* create a default server for incomplete mentions */
+ xs *def_srv = NULL;
+
+ if (xs_list_len(tl)) {
+ /* if there are any mentions, get the server from
+ the first one, which is the inReplyTo author */
+ p = tl;
+ while (xs_list_iter(&p, &v)) {
+ const char *type = xs_dict_get(v, "type");
+ const char *name = xs_dict_get(v, "name");
+
+ if (type && name && strcmp(type, "Mention") == 0) {
+ xs *l = xs_split(name, "@");
+
+ def_srv = xs_dup(xs_list_get(l, -1));
+
+ break;
+ }
+ }
+ }
+
+ if (xs_is_null(def_srv))
+ /* use this same server */
+ def_srv = xs_dup(xs_dict_get(srv_config, "host"));
+
split = xs_regex_split(content, "(@[A-Za-z0-9_]+(@[A-Za-z0-9\\.-]+)?|[0-9]+;|#[^ ,\\.:;<]+)");
p = split;
@@ -375,57 +400,36 @@ void process_tags(snac *snac, const char *content, xs_str **n_content, xs_list *
if ((n & 0x1)) {
if (*v == '@') {
xs *link = NULL;
+ xs *wuid = NULL;
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);
+ without server; add the default one */
+ wuid = xs_fmt("%s@%s", v, def_srv);
- while (xs_list_iter(&p2, &v2)) {
- const char *type = xs_dict_get(v2, "type");
-
- if (type && strcmp(type, "Mention") == 0) {
- const char *name = xs_dict_get(v2, "name");
- const char *href = xs_dict_get(v2, "href");
-
- if (name && href && (xs_startswith(name, pname) ||
- xs_startswith(name, pname + 1))) {
- /* good enough :shrug2: */
- link = xs_fmt(
- "%s", href, name);
-
- break;
- }
- }
- }
-
- snac_debug(snac, 2, xs_fmt(
- "mention without server '%s' (%s)", v, link ? link : "none"));
+ snac_debug(snac, 2, xs_fmt("mention without server '%s' '%s'", v, wuid));
}
- else {
- /* query the webfinger about this fellow */
- xs *v2 = xs_strip_chars_i(xs_dup(v), "@.");
- xs *actor = NULL;
- xs *uid = NULL;
- int status;
+ else
+ wuid = xs_dup(v);
- status = webfinger_request(v2, &actor, &uid);
+ /* query the webfinger about this fellow */
+ xs *actor = NULL;
+ xs *uid = NULL;
+ int status;
- if (valid_status(status)) {
- xs *d = xs_dict_new();
- xs *n = xs_fmt("@%s", uid);
+ status = webfinger_request(wuid, &actor, &uid);
- d = xs_dict_append(d, "type", "Mention");
- d = xs_dict_append(d, "href", actor);
- d = xs_dict_append(d, "name", n);
+ if (valid_status(status)) {
+ xs *d = xs_dict_new();
+ xs *n = xs_fmt("@%s", uid);
- tl = xs_list_append(tl, d);
+ d = xs_dict_append(d, "type", "Mention");
+ d = xs_dict_append(d, "href", actor);
+ d = xs_dict_append(d, "name", n);
- link = xs_fmt("%s", actor, n);
- }
+ tl = xs_list_append(tl, d);
+
+ link = xs_fmt("%s", actor, n);
}
if (!xs_is_null(link))
diff --git a/webfinger.c b/webfinger.c
index c7b73f7..c743455 100644
--- a/webfinger.c
+++ b/webfinger.c
@@ -30,10 +30,7 @@ int webfinger_request(const char *qs, char **actor, char **user)
}
else {
/* it's a user */
- xs *s = xs_dup(qs);
-
- if (xs_startswith(s, "@"))
- s = xs_crop_i(s, 1, 0);
+ xs *s = xs_strip_chars_i(xs_dup(qs), "@.");
l = xs_split_n(s, "@", 1);