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}