|
|
|
@ -46,6 +46,7 @@ static struct json_object_field status_layout[] = {
|
|
|
|
|
JSON_FIELD_DATETIME( published, false ),
|
|
|
|
|
|
|
|
|
|
JSON_FIELD_INTEGER( in_reply_to, false ),
|
|
|
|
|
JSON_FIELD_INTEGER( quote_id, false ),
|
|
|
|
|
JSON_FIELD_INTEGER( repost_id, false ),
|
|
|
|
|
JSON_FIELD_INTEGER( root_status_id, false ),
|
|
|
|
|
JSON_FIELD_INTEGER( reposted_status_id, false ),
|
|
|
|
@ -57,6 +58,7 @@ static struct json_object_field status_layout[] = {
|
|
|
|
|
JSON_FIELD_ARRAY_OF_INTS( likes, false ),
|
|
|
|
|
JSON_FIELD_ARRAY_OF_INTS( replies, false ),
|
|
|
|
|
JSON_FIELD_ARRAY_OF_INTS( reposts, false ),
|
|
|
|
|
JSON_FIELD_ARRAY_OF_INTS( quotes, false ),
|
|
|
|
|
JSON_FIELD_ARRAY_OF_INTS( mentions, false ),
|
|
|
|
|
JSON_FIELD_ARRAY_OF_TYPE( emoji, false, emoji_type ),
|
|
|
|
|
|
|
|
|
@ -229,7 +231,31 @@ void status_add_mention( struct status* s, int id )
|
|
|
|
|
}
|
|
|
|
|
void status_add_repost( struct status* s, struct status* repost )
|
|
|
|
|
{
|
|
|
|
|
// TODO: implement
|
|
|
|
|
if( repost->id == 0 ) { return; }
|
|
|
|
|
|
|
|
|
|
for( int i = 0; i < s->reposts.count; ++i ) {
|
|
|
|
|
if( s->reposts.items[i] == repost->id ) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int id = repost->id;
|
|
|
|
|
array_append( &s->reposts, sizeof(id), &id );
|
|
|
|
|
status_save(s);
|
|
|
|
|
}
|
|
|
|
|
void status_add_quote( struct status* s, struct status* quote )
|
|
|
|
|
{
|
|
|
|
|
if( quote->id == 0 ) { return; }
|
|
|
|
|
|
|
|
|
|
for( int i = 0; i < s->quotes.count; ++i ) {
|
|
|
|
|
if( s->quotes.items[i] == quote->id ) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int id = quote->id;
|
|
|
|
|
array_append( &s->quotes, sizeof(id), &id );
|
|
|
|
|
status_save(s);
|
|
|
|
|
}
|
|
|
|
|
bool status_sync_from_activity_pub( struct status* s, struct ap_object* act )
|
|
|
|
|
{
|
|
|
|
@ -260,6 +286,14 @@ bool status_sync_from_activity_pub( struct status* s, struct ap_object* act )
|
|
|
|
|
status_free(parent);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if( act->quote_url ) {
|
|
|
|
|
struct status* parent = status_from_uri_or_fetch( act->quote_url );
|
|
|
|
|
if( parent ) {
|
|
|
|
|
status_make_quote_of( s, parent->id );
|
|
|
|
|
// DO NOT SAVE parent! This is done inside status_make_quote_of
|
|
|
|
|
status_free(parent);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for( int i = 0; i < s->emoji.count; ++i ) {
|
|
|
|
|
emoji_free( s->emoji.items[i] );
|
|
|
|
@ -588,6 +622,7 @@ void status_free( struct status* s )
|
|
|
|
|
free(s->likes.items);
|
|
|
|
|
free(s->replies.items);
|
|
|
|
|
free(s->reposts.items);
|
|
|
|
|
free(s->quotes.items);
|
|
|
|
|
free(s->mentions.items);
|
|
|
|
|
|
|
|
|
|
for( int i = 0; i < s->emoji.count; ++i ) {
|
|
|
|
@ -634,26 +669,45 @@ void status_make_reply_to( struct status* s, int in_reply_to_id )
|
|
|
|
|
struct status* in_reply_to = status_from_id( in_reply_to_id );
|
|
|
|
|
if( !in_reply_to ) {
|
|
|
|
|
s->in_reply_to = 0;
|
|
|
|
|
} else {
|
|
|
|
|
// Setup this status's reply fields
|
|
|
|
|
s->in_reply_to = in_reply_to_id;
|
|
|
|
|
s->root_status_id = in_reply_to->root_status_id;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Record in parent as reply
|
|
|
|
|
status_add_reply( in_reply_to, s );
|
|
|
|
|
// Setup this status's reply fields
|
|
|
|
|
s->in_reply_to = in_reply_to_id;
|
|
|
|
|
s->root_status_id = in_reply_to->root_status_id;
|
|
|
|
|
|
|
|
|
|
// Mention the account that made the post being replied to
|
|
|
|
|
status_add_mention( s, in_reply_to->account_id );
|
|
|
|
|
// Record in parent as reply
|
|
|
|
|
status_add_reply( in_reply_to, s );
|
|
|
|
|
|
|
|
|
|
// Mention everytone else in that post
|
|
|
|
|
for( int i = 0; i < in_reply_to->mentions.count; ++i ) {
|
|
|
|
|
status_add_mention( s, in_reply_to->mentions.items[i] );
|
|
|
|
|
}
|
|
|
|
|
// Mention the account that made the post being replied to
|
|
|
|
|
status_add_mention( s, in_reply_to->account_id );
|
|
|
|
|
|
|
|
|
|
status_save(in_reply_to);
|
|
|
|
|
// Mention everyone else in that post
|
|
|
|
|
for( int i = 0; i < in_reply_to->mentions.count; ++i ) {
|
|
|
|
|
status_add_mention( s, in_reply_to->mentions.items[i] );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
status_save(in_reply_to);
|
|
|
|
|
status_free(in_reply_to);
|
|
|
|
|
}
|
|
|
|
|
void status_make_quote_of( struct status* s, int id_quote_of )
|
|
|
|
|
{
|
|
|
|
|
struct status* quoted_post = status_from_id( id_quote_of );
|
|
|
|
|
if( !quoted_post ) {
|
|
|
|
|
s->quote_id = 0;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Set quoted id
|
|
|
|
|
s->quote_id = id_quote_of;
|
|
|
|
|
|
|
|
|
|
// Record quote in parent
|
|
|
|
|
status_add_quote( quoted_post, s );
|
|
|
|
|
|
|
|
|
|
// Save and cleanup
|
|
|
|
|
status_save( quoted_post );
|
|
|
|
|
status_free( quoted_post );
|
|
|
|
|
}
|
|
|
|
|
void status_get_context( struct status* s, void* ancestors_ptr, void* replies_ptr )
|
|
|
|
|
{
|
|
|
|
|
struct array_of_status {
|
|
|
|
|