mirror of
https://codeberg.org/grunfink/snac2.git
synced 2024-11-22 13:25:04 +00:00
More work in msg_note().
This commit is contained in:
parent
0b6540f503
commit
6144e0eeeb
2 changed files with 93 additions and 63 deletions
151
activitypub.c
151
activitypub.c
|
@ -73,13 +73,14 @@ int actor_request(snac *snac, char *actor, d_char **data)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void timeline_request(snac *snac, char *id, char *referrer)
|
int timeline_request(snac *snac, char *id, char *referrer)
|
||||||
/* ensures that an entry and its ancestors are in the timeline */
|
/* ensures that an entry and its ancestors are in the timeline */
|
||||||
{
|
{
|
||||||
|
int status = 0;
|
||||||
|
|
||||||
if (!xs_is_null(id)) {
|
if (!xs_is_null(id)) {
|
||||||
/* is the admired object already there? */
|
/* is the admired object already there? */
|
||||||
if (!timeline_here(snac, id)) {
|
if (!timeline_here(snac, id)) {
|
||||||
int status;
|
|
||||||
xs *object = NULL;
|
xs *object = NULL;
|
||||||
|
|
||||||
/* no; download it */
|
/* no; download it */
|
||||||
|
@ -97,6 +98,8 @@ void timeline_request(snac *snac, char *id, char *referrer)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -140,6 +143,65 @@ int send_to_actor(snac *snac, char *actor, char *msg, d_char **payload, int *p_s
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
d_char *recipient_list(snac *snac, char *msg, int expand_public)
|
||||||
|
/* returns the list of recipients for a message */
|
||||||
|
{
|
||||||
|
d_char *list = xs_list_new();
|
||||||
|
char *to = xs_dict_get(msg, "to");
|
||||||
|
char *cc = xs_dict_get(msg, "cc");
|
||||||
|
int n;
|
||||||
|
|
||||||
|
char *lists[] = { to, cc, NULL };
|
||||||
|
for (n = 0; lists[n]; n++) {
|
||||||
|
char *l = lists[n];
|
||||||
|
char *v;
|
||||||
|
|
||||||
|
if (xs_type(l) == XSTYPE_STRING) {
|
||||||
|
if (xs_list_in(list, l) == -1)
|
||||||
|
list = xs_list_append(list, l);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
while (xs_list_iter(&l, &v)) {
|
||||||
|
if (expand_public && strcmp(v, public_address) == 0) {
|
||||||
|
/* iterate the followers and add them */
|
||||||
|
xs *fwers = follower_list(snac);
|
||||||
|
char *fw;
|
||||||
|
|
||||||
|
char *p = fwers;
|
||||||
|
while (xs_list_iter(&p, &fw)) {
|
||||||
|
char *actor = xs_dict_get(fw, "actor");
|
||||||
|
|
||||||
|
if (xs_list_in(list, actor) == -1)
|
||||||
|
list = xs_list_append(list, actor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if (xs_list_in(list, v) == -1)
|
||||||
|
list = xs_list_append(list, v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int is_msg_public(snac *snac, char *msg)
|
||||||
|
/* checks if a message is public */
|
||||||
|
{
|
||||||
|
int ret = 0;
|
||||||
|
xs *rcpts = recipient_list(snac, msg, 0);
|
||||||
|
char *p, *v;
|
||||||
|
|
||||||
|
p = rcpts;
|
||||||
|
while (!ret && xs_list_iter(&p, &v)) {
|
||||||
|
if (strcmp(v, public_address) == 0)
|
||||||
|
ret = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/** messages **/
|
/** messages **/
|
||||||
|
|
||||||
d_char *msg_base(snac *snac, char *type, char *id, char *actor, char *date, char *object)
|
d_char *msg_base(snac *snac, char *type, char *id, char *actor, char *date, char *object)
|
||||||
|
@ -323,7 +385,7 @@ d_char *msg_note(snac *snac, char *content, char *rcpts, char *in_reply_to)
|
||||||
{
|
{
|
||||||
xs *ntid = tid(0);
|
xs *ntid = tid(0);
|
||||||
xs *id = xs_fmt("%s/p/%s", snac->actor, ntid);
|
xs *id = xs_fmt("%s/p/%s", snac->actor, ntid);
|
||||||
xs *ctxt = xs_fmt("%s#ctxt", id);
|
xs *ctxt = NULL;
|
||||||
xs *fc1 = NULL;
|
xs *fc1 = NULL;
|
||||||
xs *to = NULL;
|
xs *to = NULL;
|
||||||
xs *cc = xs_list_new();
|
xs *cc = xs_list_new();
|
||||||
|
@ -341,6 +403,27 @@ d_char *msg_note(snac *snac, char *content, char *rcpts, char *in_reply_to)
|
||||||
not_really_markdown(content, &fc1);
|
not_really_markdown(content, &fc1);
|
||||||
|
|
||||||
if (in_reply_to != NULL) {
|
if (in_reply_to != NULL) {
|
||||||
|
xs *p_msg = NULL;
|
||||||
|
|
||||||
|
/* demand this thing */
|
||||||
|
timeline_request(snac, in_reply_to, NULL);
|
||||||
|
|
||||||
|
if ((p_msg = timeline_find(snac, in_reply_to)) != NULL) {
|
||||||
|
/* add this author as recipient */
|
||||||
|
char *v;
|
||||||
|
|
||||||
|
if ((v = xs_dict_get(p_msg, "attributedTo")) && xs_list_in(to, v) == -1)
|
||||||
|
to = xs_list_append(to, v);
|
||||||
|
|
||||||
|
if ((v = xs_dict_get(p_msg, "context")))
|
||||||
|
ctxt = xs_dup(v);
|
||||||
|
|
||||||
|
/* if this message is public, ours will also be */
|
||||||
|
if (is_msg_public(snac, p_msg) &&
|
||||||
|
xs_list_in(to, (char *)public_address) == -1)
|
||||||
|
to = xs_list_append(to, public_address);
|
||||||
|
}
|
||||||
|
|
||||||
irt = xs_dup(in_reply_to);
|
irt = xs_dup(in_reply_to);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -349,6 +432,9 @@ d_char *msg_note(snac *snac, char *content, char *rcpts, char *in_reply_to)
|
||||||
if (tag == NULL)
|
if (tag == NULL)
|
||||||
tag = xs_list_new();
|
tag = xs_list_new();
|
||||||
|
|
||||||
|
if (ctxt == NULL)
|
||||||
|
ctxt = xs_fmt("%s#ctxt", id);
|
||||||
|
|
||||||
/* add all mentions to the cc */
|
/* add all mentions to the cc */
|
||||||
p = tag;
|
p = tag;
|
||||||
while (xs_list_iter(&p, &v)) {
|
while (xs_list_iter(&p, &v)) {
|
||||||
|
@ -526,65 +612,6 @@ void process_queue(snac *snac)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
d_char *recipient_list(snac *snac, char *msg, int expand_public)
|
|
||||||
/* returns the list of recipients for a message */
|
|
||||||
{
|
|
||||||
d_char *list = xs_list_new();
|
|
||||||
char *to = xs_dict_get(msg, "to");
|
|
||||||
char *cc = xs_dict_get(msg, "cc");
|
|
||||||
int n;
|
|
||||||
|
|
||||||
char *lists[] = { to, cc, NULL };
|
|
||||||
for (n = 0; lists[n]; n++) {
|
|
||||||
char *l = lists[n];
|
|
||||||
char *v;
|
|
||||||
|
|
||||||
if (xs_type(l) == XSTYPE_STRING) {
|
|
||||||
if (xs_list_in(list, l) == -1)
|
|
||||||
list = xs_list_append(list, l);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
while (xs_list_iter(&l, &v)) {
|
|
||||||
if (expand_public && strcmp(v, public_address) == 0) {
|
|
||||||
/* iterate the followers and add them */
|
|
||||||
xs *fwers = follower_list(snac);
|
|
||||||
char *fw;
|
|
||||||
|
|
||||||
char *p = fwers;
|
|
||||||
while (xs_list_iter(&p, &fw)) {
|
|
||||||
char *actor = xs_dict_get(fw, "actor");
|
|
||||||
|
|
||||||
if (xs_list_in(list, actor) == -1)
|
|
||||||
list = xs_list_append(list, actor);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
if (xs_list_in(list, v) == -1)
|
|
||||||
list = xs_list_append(list, v);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return list;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int is_msg_public(snac *snac, char *msg)
|
|
||||||
/* checks if a message is public */
|
|
||||||
{
|
|
||||||
int ret = 0;
|
|
||||||
xs *rcpts = recipient_list(snac, msg, 0);
|
|
||||||
char *p, *v;
|
|
||||||
|
|
||||||
p = rcpts;
|
|
||||||
while (!ret && xs_list_iter(&p, &v)) {
|
|
||||||
if (strcmp(v, public_address) == 0)
|
|
||||||
ret = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void post(snac *snac, char *msg)
|
void post(snac *snac, char *msg)
|
||||||
/* enqueues a message to all its recipients */
|
/* enqueues a message to all its recipients */
|
||||||
{
|
{
|
||||||
|
|
5
main.c
5
main.c
|
@ -168,6 +168,7 @@ int main(int argc, char *argv[])
|
||||||
xs *content = NULL;
|
xs *content = NULL;
|
||||||
xs *msg = NULL;
|
xs *msg = NULL;
|
||||||
xs *c_msg = NULL;
|
xs *c_msg = NULL;
|
||||||
|
char *in_reply_to = GET_ARGV();
|
||||||
|
|
||||||
if (strcmp(url, "-") == 0) {
|
if (strcmp(url, "-") == 0) {
|
||||||
/* get the content from an editor */
|
/* get the content from an editor */
|
||||||
|
@ -189,7 +190,7 @@ int main(int argc, char *argv[])
|
||||||
else
|
else
|
||||||
content = xs_dup(url);
|
content = xs_dup(url);
|
||||||
|
|
||||||
msg = msg_note(&snac, content, NULL, NULL);
|
msg = msg_note(&snac, content, NULL, in_reply_to);
|
||||||
|
|
||||||
c_msg = msg_create(&snac, msg);
|
c_msg = msg_create(&snac, msg);
|
||||||
|
|
||||||
|
@ -200,6 +201,8 @@ int main(int argc, char *argv[])
|
||||||
|
|
||||||
post(&snac, c_msg);
|
post(&snac, c_msg);
|
||||||
|
|
||||||
|
timeline_add(&snac, xs_dict_get(msg, "id"), msg, in_reply_to, NULL);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue