Commit | Line | Data |
---|---|---|
285b1d92 | 1 | <?php |
a9229942 | 2 | |
285b1d92 | 3 | namespace wcf\system\comment\manager; |
a9229942 | 4 | |
0d76d267 | 5 | use wcf\data\comment\Comment; |
a9229942 | 6 | use wcf\data\comment\response\CommentResponse; |
8700ed2c | 7 | use wcf\data\object\type\ObjectTypeCache; |
1bb574b9 | 8 | use wcf\data\user\ignore\UserIgnore; |
a80b5a3e | 9 | use wcf\data\user\UserProfile; |
a8c5936e | 10 | use wcf\system\cache\runtime\UserProfileRuntimeCache; |
b1d5f7cc | 11 | use wcf\system\cache\runtime\UserRuntimeCache; |
ccb44776 MS |
12 | use wcf\system\cache\runtime\ViewableCommentResponseRuntimeCache; |
13 | use wcf\system\cache\runtime\ViewableCommentRuntimeCache; | |
8700ed2c | 14 | use wcf\system\like\IViewableLikeProvider; |
285b1d92 MW |
15 | use wcf\system\WCF; |
16 | ||
17 | /** | |
18 | * User profile comment manager implementation. | |
a9229942 TD |
19 | * |
20 | * @author Alexander Ebert | |
21 | * @copyright 2001-2019 WoltLab GmbH | |
22 | * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php> | |
285b1d92 | 23 | */ |
248f7c99 C |
24 | class UserProfileCommentManager extends AbstractCommentManager implements |
25 | IViewableLikeProvider, | |
26 | ICommentPermissionManager | |
a9229942 TD |
27 | { |
28 | /** | |
29 | * @inheritDoc | |
30 | */ | |
31 | protected $permissionAdd = 'user.profileComment.canAddComment'; | |
32 | ||
33 | /** | |
34 | * @inheritDoc | |
35 | */ | |
36 | protected $permissionAddWithoutModeration = 'user.profileComment.canAddCommentWithoutModeration'; | |
37 | ||
38 | /** | |
39 | * @inheritDoc | |
40 | */ | |
41 | protected $permissionCanModerate = 'mod.profileComment.canModerateComment'; | |
42 | ||
43 | /** | |
44 | * @inheritDoc | |
45 | */ | |
46 | protected $permissionDelete = 'user.profileComment.canDeleteComment'; | |
47 | ||
48 | /** | |
49 | * @inheritDoc | |
50 | */ | |
51 | protected $permissionEdit = 'user.profileComment.canEditComment'; | |
52 | ||
53 | /** | |
54 | * @inheritDoc | |
55 | */ | |
56 | protected $permissionModDelete = 'mod.profileComment.canDeleteComment'; | |
57 | ||
58 | /** | |
59 | * @inheritDoc | |
60 | */ | |
61 | protected $permissionModEdit = 'mod.profileComment.canEditComment'; | |
62 | ||
63 | /** | |
64 | * @inheritDoc | |
65 | */ | |
66 | public function isAccessible($objectID, $validateWritePermission = false) | |
67 | { | |
68 | // check object id | |
69 | $userProfile = UserProfileRuntimeCache::getInstance()->getObject($objectID); | |
70 | if ($userProfile === null) { | |
71 | return false; | |
72 | } | |
73 | ||
74 | // check visibility | |
75 | if ($userProfile->isProtected()) { | |
76 | return false; | |
77 | } | |
78 | ||
79 | // check target user settings | |
80 | if ($validateWritePermission) { | |
81 | if ( | |
82 | !$userProfile->isAccessible('canWriteProfileComments') | |
83 | && $userProfile->userID != WCF::getUser()->userID | |
84 | ) { | |
85 | return false; | |
86 | } | |
87 | ||
1bb574b9 | 88 | if ($userProfile->isIgnoredUser(WCF::getUser()->userID, UserIgnore::TYPE_BLOCK_DIRECT_CONTACT)) { |
a9229942 TD |
89 | return false; |
90 | } | |
91 | } | |
92 | ||
93 | return true; | |
94 | } | |
95 | ||
a80b5a3e | 96 | #[\Override] |
248f7c99 | 97 | public function canModerateObject(int $objectTypeID, int $objectID, UserProfile $user): bool |
a80b5a3e C |
98 | { |
99 | $userProfile = UserProfileRuntimeCache::getInstance()->getObject($objectID); | |
100 | if ($userProfile === null) { | |
101 | return false; | |
102 | } | |
103 | ||
104 | /** @see UserProfile::isProtected() */ | |
248f7c99 C |
105 | if ( |
106 | !( | |
4d57ad25 | 107 | $user->getPermission('admin.general.canViewPrivateUserOptions') |
4d41fef2 C |
108 | || $userProfile->isAccessible('canViewProfile', $user->userID) |
109 | || $userProfile->userID === $user->userID | |
4d57ad25 | 110 | ) |
248f7c99 C |
111 | ) { |
112 | return false; | |
113 | } | |
4d57ad25 | 114 | |
248f7c99 | 115 | return (bool)$user->getPermission($this->permissionCanModerate); |
a80b5a3e C |
116 | } |
117 | ||
a9229942 TD |
118 | /** |
119 | * @inheritDoc | |
120 | */ | |
121 | public function getLink($objectTypeID, $objectID) | |
122 | { | |
b1d5f7cc MW |
123 | $user = UserRuntimeCache::getInstance()->getObject($objectID); |
124 | if ($user) { | |
125 | return $user->getLink(); | |
126 | } | |
127 | ||
128 | return ''; | |
a9229942 TD |
129 | } |
130 | ||
131 | /** | |
132 | * @inheritDoc | |
133 | */ | |
134 | public function getCommentLink(Comment $comment) | |
135 | { | |
136 | return $this->getLink($comment->objectTypeID, $comment->objectID) . '#wall/comment' . $comment->commentID; | |
137 | } | |
138 | ||
139 | /** | |
140 | * @inheritDoc | |
141 | */ | |
142 | public function getResponseLink(CommentResponse $response) | |
143 | { | |
144 | return $this->getLink($response->getComment()->objectTypeID, $response->getComment()->objectID) | |
145 | . '#wall/comment' . $response->commentID . '/response' . $response->responseID; | |
146 | } | |
147 | ||
148 | /** | |
149 | * @inheritDoc | |
150 | */ | |
151 | public function getTitle($objectTypeID, $objectID, $isResponse = false) | |
152 | { | |
153 | if ($isResponse) { | |
154 | return WCF::getLanguage()->get('wcf.user.profile.content.wall.commentResponse'); | |
155 | } | |
156 | ||
157 | return WCF::getLanguage()->getDynamicVariable('wcf.user.profile.content.wall.comment'); | |
158 | } | |
159 | ||
160 | /** | |
161 | * @inheritDoc | |
162 | */ | |
163 | public function updateCounter($objectID, $value) | |
164 | { | |
165 | // does nothing | |
166 | } | |
167 | ||
168 | /** | |
169 | * @inheritDoc | |
170 | */ | |
171 | public function canDeleteComment(Comment $comment) | |
172 | { | |
173 | if ( | |
174 | $comment->objectID == WCF::getUser()->userID | |
175 | && WCF::getSession()->getPermission('user.profileComment.canDeleteCommentInOwnProfile') | |
176 | ) { | |
177 | return true; | |
178 | } | |
179 | ||
180 | return parent::canDeleteComment($comment); | |
181 | } | |
182 | ||
183 | /** | |
184 | * @inheritDoc | |
185 | */ | |
186 | public function canDeleteResponse(CommentResponse $response) | |
187 | { | |
188 | if ( | |
189 | $response->getComment()->objectID == WCF::getUser()->userID | |
190 | && WCF::getSession()->getPermission('user.profileComment.canDeleteCommentInOwnProfile') | |
191 | ) { | |
192 | return true; | |
193 | } | |
194 | ||
195 | return parent::canDeleteResponse($response); | |
196 | } | |
197 | ||
198 | /** | |
199 | * @inheritDoc | |
200 | */ | |
201 | public function prepare(array $likes) | |
202 | { | |
203 | if (!WCF::getSession()->getPermission('user.profile.canViewUserProfile')) { | |
204 | return; | |
205 | } | |
206 | ||
207 | $commentLikeObjectType = ObjectTypeCache::getInstance() | |
208 | ->getObjectTypeByName('com.woltlab.wcf.like.likeableObject', 'com.woltlab.wcf.comment'); | |
209 | ||
210 | $commentIDs = $responseIDs = []; | |
211 | foreach ($likes as $like) { | |
212 | if ($like->objectTypeID == $commentLikeObjectType->objectTypeID) { | |
213 | $commentIDs[] = $like->objectID; | |
214 | } else { | |
215 | $responseIDs[] = $like->objectID; | |
216 | } | |
217 | } | |
218 | ||
219 | // fetch response | |
220 | $userIDs = $responses = []; | |
221 | if (!empty($responseIDs)) { | |
ccb44776 | 222 | $responses = ViewableCommentResponseRuntimeCache::getInstance()->getObjects($responseIDs); |
a9229942 TD |
223 | |
224 | foreach ($responses as $response) { | |
225 | $commentIDs[] = $response->commentID; | |
226 | if ($response->userID) { | |
227 | $userIDs[] = $response->userID; | |
228 | } | |
229 | } | |
230 | } | |
231 | ||
232 | // fetch comments | |
ccb44776 | 233 | $comments = ViewableCommentRuntimeCache::getInstance()->getObjects($commentIDs); |
a9229942 TD |
234 | |
235 | // fetch users | |
236 | $users = []; | |
237 | foreach ($comments as $comment) { | |
238 | $userIDs[] = $comment->objectID; | |
239 | if ($comment->userID) { | |
240 | $userIDs[] = $comment->userID; | |
241 | } | |
242 | } | |
243 | if (!empty($userIDs)) { | |
244 | $users = UserProfileRuntimeCache::getInstance()->getObjects(\array_unique($userIDs)); | |
245 | } | |
246 | ||
247 | // set message | |
248 | foreach ($likes as $like) { | |
249 | if ($like->objectTypeID == $commentLikeObjectType->objectTypeID) { | |
250 | // comment like | |
251 | if (isset($comments[$like->objectID])) { | |
252 | $comment = $comments[$like->objectID]; | |
253 | ||
254 | if (isset($users[$comment->objectID]) && !$users[$comment->objectID]->isProtected()) { | |
255 | $like->setIsAccessible(); | |
256 | ||
257 | // short output | |
258 | $text = WCF::getLanguage()->getDynamicVariable( | |
259 | 'wcf.like.title.com.woltlab.wcf.user.profileComment', | |
260 | [ | |
261 | 'commentAuthor' => $comment->userID ? $users[$comment->userID] : null, | |
262 | 'comment' => $comment, | |
263 | 'user' => $users[$comment->objectID], | |
264 | 'reaction' => $like, | |
265 | // @deprecated 5.3 Use `$reaction` instead | |
266 | 'like' => $like, | |
267 | ] | |
268 | ); | |
269 | $like->setTitle($text); | |
270 | ||
271 | // output | |
272 | $like->setDescription($comment->getExcerpt()); | |
273 | } | |
274 | } | |
275 | } else { | |
276 | // response like | |
277 | if (isset($responses[$like->objectID])) { | |
278 | $response = $responses[$like->objectID]; | |
279 | $comment = $comments[$response->commentID]; | |
280 | ||
281 | if (isset($users[$comment->objectID]) && !$users[$comment->objectID]->isProtected()) { | |
282 | $like->setIsAccessible(); | |
283 | ||
284 | // short output | |
285 | $text = WCF::getLanguage()->getDynamicVariable( | |
286 | 'wcf.like.title.com.woltlab.wcf.user.profileComment.response', | |
287 | [ | |
288 | 'responseAuthor' => $response->userID ? $users[$response->userID] : null, | |
289 | 'commentAuthor' => $comment->userID ? $users[$comment->userID] : null, | |
290 | 'user' => $users[$comment->objectID], | |
291 | 'reaction' => $like, | |
292 | // @deprecated 5.3 Use `$reaction` instead | |
293 | 'like' => $like, | |
294 | 'response' => $response, | |
295 | ] | |
296 | ); | |
297 | $like->setTitle($text); | |
298 | ||
299 | // output | |
300 | $like->setDescription($response->getExcerpt()); | |
301 | } | |
302 | } | |
303 | } | |
304 | } | |
305 | } | |
285b1d92 | 306 | } |