X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FModel%2FUserItem.php;h=0b0a4d2033273054d23a8dd8fc0324b4910a9faa;hb=7b7132971a64a92a685a5fd860fe4709dce1765a;hp=2d00bf73e2a8b7811c26c117a4dc48b33893368d;hpb=dcf5471e19051e9a6c04f5702028796714d3b7df;p=friendica.git diff --git a/src/Model/UserItem.php b/src/Model/UserItem.php index 2d00bf73e2..0b0a4d2033 100644 --- a/src/Model/UserItem.php +++ b/src/Model/UserItem.php @@ -1,7 +1,22 @@ . + * */ namespace Friendica\Model; @@ -22,10 +37,13 @@ class UserItem const NOTIF_DIRECT_COMMENT = 8; const NOTIF_COMMENT_PARTICIPATION = 16; const NOTIF_ACTIVITY_PARTICIPATION = 32; + const NOTIF_DIRECT_THREAD_COMMENT = 64; const NOTIF_SHARED = 128; /** * Checks an item for notifications and sets the "notification-type" field + * @ToDo: + * - Check for mentions in posts with "uid=0" where the user hadn't interacted before * * @param int $iid Item ID */ @@ -93,10 +111,14 @@ class UserItem $notification_type = $notification_type | self::NOTIF_THREAD_COMMENT; } - if (self::checkDirectComment($item, $uid, $contacts)) { + if (self::checkDirectComment($item, $contacts)) { $notification_type = $notification_type | self::NOTIF_DIRECT_COMMENT; } + if (self::checkDirectCommentedThread($item, $contacts)) { + $notification_type = $notification_type | self::NOTIF_DIRECT_THREAD_COMMENT; + } + if (self::checkCommentedParticipation($item, $contacts)) { $notification_type = $notification_type | self::NOTIF_COMMENT_PARTICIPATION; } @@ -132,7 +154,7 @@ class UserItem return []; } - $owner = DBA::selectFirst('contact', ['url'], ['self' => true, 'uid' => $uid]); + $owner = DBA::selectFirst('contact', ['url', 'alias'], ['self' => true, 'uid' => $uid]); if (!DBA::isResult($owner)) { return []; } @@ -140,30 +162,30 @@ class UserItem // This is our regular URL format $profiles[] = $owner['url']; + // Now the alias + $profiles[] = $owner['alias']; + // Notifications from Diaspora are often with an URL in the Diaspora format $profiles[] = DI::baseUrl() . '/u/' . $user['nickname']; - $profiles2 = []; - - foreach ($profiles AS $profile) { - // Check for invalid profile urls. 13 should be the shortest possible profile length: - // http://a.bc/d - // Additionally check for invalid urls that would return the normalised value "http:" - if ((strlen($profile) >= 13) && (Strings::normaliseLink($profile) != 'http:')) { - if (!in_array($profile, $profiles2)) - $profiles2[] = $profile; - - $profile = Strings::normaliseLink($profile); - if (!in_array($profile, $profiles2)) - $profiles2[] = $profile; - - $profile = str_replace('http://', 'https://', $profile); - if (!in_array($profile, $profiles2)) - $profiles2[] = $profile; + // Validate and add profile links + foreach ($profiles AS $key => $profile) { + // Check for invalid profile urls (without scheme, host or path) and remove them + if (empty(parse_url($profile, PHP_URL_SCHEME)) || empty(parse_url($profile, PHP_URL_HOST)) || empty(parse_url($profile, PHP_URL_PATH))) { + unset($profiles[$key]); + continue; } + + // Add the normalized form + $profile = Strings::normaliseLink($profile); + $profiles[] = $profile; + + // Add the SSL form + $profile = str_replace('http://', 'https://', $profile); + $profiles[] = $profile; } - return $profiles2; + return array_unique($profiles); } /** @@ -248,13 +270,24 @@ class UserItem /** * Check for a direct comment to a post of the given user * @param array $item - * @param int $uid User ID * @param array $contacts Array of contact IDs * @return bool The item is a direct comment to a user comment */ - private static function checkDirectComment(array $item, int $uid, array $contacts) + private static function checkDirectComment(array $item, array $contacts) + { + $condition = ['uri' => $item['thr-parent'], 'uid' => $item['uid'], 'author-id' => $contacts, 'deleted' => false, 'gravity' => GRAVITY_COMMENT]; + return Item::exists($condition); + } + + /** + * Check for a direct comment to the starting post of the given user + * @param array $item + * @param array $contacts Array of contact IDs + * @return bool The user had created this thread + */ + private static function checkDirectCommentedThread(array $item, array $contacts) { - $condition = ['uri' => $item['thr-parent'], 'uid' => [0, $uid], 'author-id' => $contacts, 'deleted' => false, 'gravity' => GRAVITY_COMMENT]; + $condition = ['uri' => $item['thr-parent'], 'uid' => $item['uid'], 'author-id' => $contacts, 'deleted' => false, 'gravity' => GRAVITY_PARENT]; return Item::exists($condition); }