X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FModel%2FUserItem.php;h=0b0a4d2033273054d23a8dd8fc0324b4910a9faa;hb=33eda87bc45fe2b7cd9c001bd76cb0821bd9303e;hp=fb89a9bc503e04f08d94a126bbaf314db434d58d;hpb=45b747f13bd276a2245f6481c5377c1138b2d96d;p=friendica.git diff --git a/src/Model/UserItem.php b/src/Model/UserItem.php index fb89a9bc50..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; } @@ -125,38 +147,35 @@ class UserItem $notification_data = ['uid' => $uid, 'profiles' => []]; Hook::callAll('check_item_notification', $notification_data); - $raw_profiles = $notification_data['profiles']; + $profiles = $notification_data['profiles']; $user = DBA::selectFirst('user', ['nickname'], ['uid' => $uid]); if (!DBA::isResult($user)) { 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 []; } // This is our regular URL format - $raw_profiles[] = $owner['url']; + $profiles[] = $owner['url']; - // Notifications from Diaspora are often with an URL in the Diaspora format - $raw_profiles[] = DI::baseUrl() . '/u/' . $user['nickname']; + // Now the alias + $profiles[] = $owner['alias']; - $profiles = []; + // Notifications from Diaspora are often with an URL in the Diaspora format + $profiles[] = DI::baseUrl() . '/u/' . $user['nickname']; // Validate and add profile links - foreach ($raw_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:')) { + 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 profile - $profiles[] = $profile; - // Add the normalized form $profile = Strings::normaliseLink($profile); $profiles[] = $profile; @@ -251,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); }