the browser-facing portion of osu!
at master 70 lines 2.4 kB view raw
1<?php 2 3// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the GNU Affero General Public License v3.0. 4// See the LICENCE file in the repository root for full licence text. 5 6namespace App\Jobs\Notifications; 7 8use App\Models\BeatmapDiscussionPost; 9use App\Models\Notification; 10use App\Models\User; 11use App\Models\UserNotificationOption; 12 13abstract class BeatmapsetDiscussionPostNotification extends BroadcastNotificationBase 14{ 15 const NOTIFICATION_OPTION_NAME = UserNotificationOption::BEATMAPSET_MODDING; 16 17 protected $beatmapsetDiscussionPost; 18 19 public static function getMailLink(Notification $notification): string 20 { 21 return route('beatmapsets.discussion', ['beatmapset' => $notification->notifiable_id]).'#/'.$notification->details['discussion_id']; 22 } 23 24 public function __construct(BeatmapDiscussionPost $beatmapsetDiscussionPost, ?User $source = null) 25 { 26 parent::__construct($source); 27 28 $this->beatmapsetDiscussionPost = $beatmapsetDiscussionPost; 29 } 30 31 public function getDetails(): array 32 { 33 $beatmapset = $this->beatmapsetDiscussionPost->beatmapset; 34 $discussion = $this->beatmapsetDiscussionPost->beatmapDiscussion; 35 36 return [ 37 'content' => truncate($this->beatmapsetDiscussionPost->message, static::CONTENT_TRUNCATE), 38 'title' => $beatmapset->title, 39 'title_unicode' => $beatmapset->title_unicode, 40 'post_id' => $this->beatmapsetDiscussionPost->getKey(), 41 'discussion_id' => $discussion->getKey(), 42 'beatmap_id' => $discussion->beatmap_id, 43 'cover_url' => $beatmapset->coverURL('card'), 44 ]; 45 } 46 47 public function getListeningUserIds(): array 48 { 49 $userIds = $this->beatmapsetDiscussionPost->beatmapset->watches()->pluck('user_id'); 50 51 $discussion = $this->beatmapsetDiscussionPost->beatmapDiscussion; 52 if ($discussion->canBeResolved() && $discussion->user_id !== null) { 53 $userIds->push($discussion->user_id); 54 } 55 56 return $userIds->all(); 57 } 58 59 public function getNotifiable() 60 { 61 return $this->beatmapsetDiscussionPost->beatmapset; 62 } 63 64 public function handle() 65 { 66 $this->beatmapsetDiscussionPost->beatmapset->watches()->update(['last_notified' => $this->getTimestamp()]); 67 68 parent::handle(); 69 } 70}