more complete handling of unfollow

This commit is contained in:
Mike Macgirvin 2024-01-01 08:02:52 +11:00
parent 5c3efea888
commit 459611b889
3 changed files with 57 additions and 16 deletions

View file

@ -2236,16 +2236,17 @@ class Activity
}
public static function unfollow($channel, $act)
public static function unfollowActor($channel, $actor)
{
/* actor is unfollowing $channel */
if (! $actor) {
return;
}
$actorId = is_string($actor) ? $actor : $actor['id'];
$person_obj = $act->actor;
if (is_array($person_obj)) {
if ($actorId) {
$r = q(
"select * from abook left join xchan on abook_xchan = xchan_hash where abook_xchan = '%s' and abook_channel = %d limit 1",
dbesc($person_obj['id']),
dbesc($actorId),
intval($channel['channel_id'])
);
if ($r) {

View file

@ -375,6 +375,12 @@ class Inbox extends Controller
break;
case 'Reject':
if (is_array($AS->obj) && array_key_exists('type', $AS->obj) && $AS->obj['type'] === 'Follow'
&& isset($AS->obj['object'])) {
// do unfollow activity
Activity::unfollowActor($channel, $AS->obj['object']);
}
break;
default:
break;
}
@ -424,10 +430,27 @@ class Inbox extends Controller
}
}
if ($AS->type === 'Undo') {
if ($AS->obj && is_array($AS->obj) && array_key_exists('type', $AS->obj) && $AS->obj['type'] === 'Follow') {
// do unfollow activity
Activity::unfollow($channel, $AS);
return true;
if ($AS->obj && is_array($AS->obj)) {
if (array_key_exists('type', $AS->obj) && $AS->obj['type'] === 'Follow') {
// do unfollow activity
Activity::unfollowActor($channel, $AS->actor['id']);
return true;
}
if (array_key_exists('type', $AS->obj) && $AS->obj['type'] === 'Accept') {
// do a deep dive
if (isset($AS->obj['object'])) {
$originalActivity = $AS->obj['object'];
if (is_string($AS->obj['object'])) {
$originalActivity = Activity::fetch($AS->obj['object']);
}
if ($originalActivity && isset($originalActivity['type']) && $originalActivity['type'] === 'Follow'
&& isset($originalActivity['object'])) {
$person = is_string($originalActivity['object']) ? $originalActivity['object'] : $originalActivity['object']['id'];
Activity::unfollowActor($channel, $person);
return true;
}
}
}
}
}
if ($AS->type === 'Accept') {
@ -438,7 +461,7 @@ class Inbox extends Controller
if ($AS->type === 'Leave') {
if ($AS->obj && is_array($AS->obj) && array_key_exists('type', $AS->obj) && $AS->obj['type'] === 'Group') {
// do unfollow activity
Activity::unfollow($channel, $AS);
Activity::unfollowActor($channel, $AS->obj['id']);
return true;
}
}

View file

@ -327,10 +327,27 @@ class Outbox extends Controller
}
}
if ($AS->type === 'Undo') {
if ($AS->obj && is_array($AS->obj) && array_key_exists('type', $AS->obj) && $AS->obj['type'] === 'Follow') {
// do unfollow activity
Activity::unfollow($channel, $AS);
return true;
if ($AS->obj && is_array($AS->obj)) {
if (array_key_exists('type', $AS->obj) && $AS->obj['type'] === 'Follow') {
// do unfollow activity
Activity::unfollowActor($channel, $AS->actor['id']);
return true;
}
if (array_key_exists('type', $AS->obj) && $AS->obj['type'] === 'Accept') {
// do a deep dive
if (isset($AS->obj['object'])) {
$originalActivity = $AS->obj['object'];
if (is_string($AS->obj['object'])) {
$originalActivity = Activity::fetch($AS->obj['object']);
}
if ($originalActivity && isset($originalActivity['type']) && $originalActivity['type'] === 'Follow'
&& isset($originalActivity['object'])) {
$person = is_string($originalActivity['object']) ? $originalActivity['object'] : $originalActivity['object']['id'];
Activity::unfollowActor($channel, $person);
return true;
}
}
}
}
}
if ($AS->type === 'Accept') {
@ -341,7 +358,7 @@ class Outbox extends Controller
if ($AS->type === 'Leave') {
if ($AS->obj && is_array($AS->obj) && array_key_exists('type', $AS->obj) && $AS->obj['type'] === 'Group') {
// do unfollow activity
Activity::unfollow($channel, $AS);
Activity::unfollowActor($channel, $AS->obj['id']);
return true;
}
}