<classname>wcf\system\user\notification\object\type\LikeUserNotificationObjectType</classname>
<category>com.woltlab.wcf.page</category>
</type>
+ <type>
+ <name>com.woltlab.wcf.articleComment.like.notification</name>
+ <definitionname>com.woltlab.wcf.notification.objectType</definitionname>
+ <classname>wcf\system\user\notification\object\type\LikeUserNotificationObjectType</classname>
+ <category>com.woltlab.wcf.page</category>
+ <supportsReactions>1</supportsReactions>
+ </type>
+ <type>
+ <name>com.woltlab.wcf.articleComment.response.like.notification</name>
+ <definitionname>com.woltlab.wcf.notification.objectType</definitionname>
+ <classname>wcf\system\user\notification\object\type\LikeUserNotificationObjectType</classname>
+ <category>com.woltlab.wcf.page</category>
+ <supportsReactions>1</supportsReactions>
+ </type>
<type>
<name>com.woltlab.wcf.article.recentActivityEvent</name>
<definitionname>com.woltlab.wcf.user.recentActivityEvent</definitionname>
<preset>1</preset>
<options>module_like,module_article</options>
</event>
+ <event>
+ <name>like</name>
+ <objecttype>com.woltlab.wcf.articleComment.like.notification</objecttype>
+ <classname>wcf\system\user\notification\event\ArticleCommentLikeUserNotificationEvent</classname>
+ <preset>1</preset>
+ <options>module_like,module_article</options>
+ </event>
+ <event>
+ <name>like</name>
+ <objecttype>com.woltlab.wcf.articleComment.response.like.notification</objecttype>
+ <classname>wcf\system\user\notification\event\ArticleCommentResponseLikeUserNotificationEvent</classname>
+ <preset>1</preset>
+ <options>module_like,module_article</options>
+ </event>
<event>
<name>registration</name>
--- /dev/null
+<?php
+
+namespace wcf\system\user\notification\event;
+
+use wcf\system\cache\runtime\ViewableArticleContentRuntimeCache;
+use wcf\system\user\notification\event\AbstractSharedUserNotificationEvent;
+use wcf\system\user\notification\event\ITestableUserNotificationEvent;
+use wcf\system\user\notification\event\TReactionUserNotificationEvent;
+use wcf\system\user\notification\event\TTestableCommentLikeUserNotificationEvent;
+use wcf\system\user\notification\object\LikeUserNotificationObject;
+
+/**
+ * User notification event for article comment likes.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2022 WoltLab GmbH
+ * @license WoltLab License <http://www.woltlab.com/license-agreement.html>
+ * @package WoltLabSuite\Core\System\User\Notification\Event
+ * @since 5.5
+ *
+ * @method LikeUserNotificationObject getUserNotificationObject()
+ */
+class ArticleCommentLikeUserNotificationEvent extends AbstractSharedUserNotificationEvent implements
+ ITestableUserNotificationEvent
+{
+ use TTestableCommentLikeUserNotificationEvent;
+ use TTestableArticleCommentUserNotificationEvent;
+ use TReactionUserNotificationEvent;
+
+ /**
+ * @inheritDoc
+ */
+ protected $stackable = true;
+
+ /**
+ * @inheritDoc
+ */
+ protected function prepare()
+ {
+ ViewableArticleContentRuntimeCache::getInstance()->cacheObjectID($this->additionalData['objectID']);
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function getTitle()
+ {
+ $count = \count($this->getAuthors());
+ if ($count > 1) {
+ return $this->getLanguage()->getDynamicVariable('wcf.user.notification.articleComment.like.title.stacked', [
+ 'count' => $count,
+ 'timesTriggered' => $this->notification->timesTriggered,
+ ]);
+ }
+
+ return $this->getLanguage()->get('wcf.user.notification.articleComment.like.title');
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function getMessage()
+ {
+ $article = ViewableArticleContentRuntimeCache::getInstance()->getObject($this->additionalData['objectID']);
+ $authors = \array_values($this->getAuthors());
+ $count = \count($authors);
+
+ if ($count > 1) {
+ return $this->getLanguage()->getDynamicVariable('wcf.user.notification.articleComment.like.message.stacked', [
+ 'author' => $this->author,
+ 'authors' => $authors,
+ 'commentID' => $this->getCommentID(),
+ 'count' => $count,
+ 'others' => $count - 1,
+ 'article' => $article,
+ 'reactions' => $this->getReactionsForAuthors(),
+ ]);
+ }
+
+ return $this->getLanguage()->getDynamicVariable('wcf.user.notification.articleComment.like.message', [
+ 'author' => $this->author,
+ 'commentID' => $this->getCommentID(),
+ 'article' => $article,
+ 'reactions' => $this->getReactionsForAuthors(),
+ ]);
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function getEmailMessage($notificationType = 'instant')
+ {
+ // not supported
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function getLink()
+ {
+ return ViewableArticleContentRuntimeCache::getInstance()->getObject($this->additionalData['objectID'])->getLink() . '#comment' . $this->getCommentID();
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function getEventHash()
+ {
+ return \sha1($this->eventID . '-' . $this->getCommentID());
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function supportsEmailNotification()
+ {
+ return false;
+ }
+
+ /**
+ * Returns the liked comment's id.
+ *
+ * @return int
+ */
+ protected function getCommentID()
+ {
+ // this is the `wcfN_like.objectID` value
+ return $this->getUserNotificationObject()->objectID;
+ }
+}
--- /dev/null
+<?php
+
+namespace wcf\system\user\notification\event;
+
+use wcf\system\cache\runtime\UserRuntimeCache;
+use wcf\system\cache\runtime\ViewableArticleContentRuntimeCache;
+use wcf\system\user\notification\event\AbstractSharedUserNotificationEvent;
+use wcf\system\user\notification\event\ITestableUserNotificationEvent;
+use wcf\system\user\notification\event\TReactionUserNotificationEvent;
+use wcf\system\user\notification\event\TTestableCommentResponseLikeUserNotificationEvent;
+use wcf\system\user\notification\object\LikeUserNotificationObject;
+use wcf\system\WCF;
+
+/**
+ * User notification event for article comment response likes.
+ *
+ * @author Marcel Werk
+ * @copyright 2001-2022 WoltLab GmbH
+ * @license WoltLab License <http://www.woltlab.com/license-agreement.html>
+ * @package WoltLabSuite\Core\System\User\Notification\Event
+ * @since 5.5
+ *
+ * @method LikeUserNotificationObject getUserNotificationObject()
+ */
+class ArticleCommentResponseLikeUserNotificationEvent extends AbstractSharedUserNotificationEvent implements
+ ITestableUserNotificationEvent
+{
+ use TTestableCommentResponseLikeUserNotificationEvent;
+ use TTestableArticleCommentUserNotificationEvent;
+ use TReactionUserNotificationEvent;
+
+ /**
+ * @inheritDoc
+ */
+ protected $stackable = true;
+
+ /**
+ * @inheritDoc
+ */
+ protected function prepare()
+ {
+ ViewableArticleContentRuntimeCache::getInstance()->cacheObjectID($this->additionalData['objectID']);
+ UserRuntimeCache::getInstance()->cacheObjectID($this->additionalData['commentUserID']);
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function getTitle()
+ {
+ $count = \count($this->getAuthors());
+ if ($count > 1) {
+ return $this->getLanguage()->getDynamicVariable(
+ 'wcf.user.notification.articleComment.response.like.title.stacked',
+ [
+ 'count' => $count,
+ 'timesTriggered' => $this->notification->timesTriggered,
+ ]
+ );
+ }
+
+ return $this->getLanguage()->get('wcf.user.notification.articleComment.response.like.title');
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function getMessage()
+ {
+ $article = ViewableArticleContentRuntimeCache::getInstance()->getObject($this->additionalData['objectID']);
+ $authors = \array_values($this->getAuthors());
+ $count = \count($authors);
+ $commentUser = null;
+ if ($this->additionalData['commentUserID'] != WCF::getUser()->userID) {
+ $commentUser = UserRuntimeCache::getInstance()->getObject($this->additionalData['commentUserID']);
+ }
+
+ if ($count > 1) {
+ return $this->getLanguage()->getDynamicVariable(
+ 'wcf.user.notification.articleComment.response.like.message.stacked',
+ [
+ 'author' => $this->author,
+ 'authors' => $authors,
+ 'commentID' => $this->additionalData['commentID'],
+ 'commentUser' => $commentUser,
+ 'count' => $count,
+ 'others' => $count - 1,
+ 'article' => $article,
+ 'responseID' => $this->getUserNotificationObject()->objectID,
+ 'reactions' => $this->getReactionsForAuthors(),
+ ]
+ );
+ }
+
+ return $this->getLanguage()->getDynamicVariable('wcf.user.notification.articleComment.response.like.message', [
+ 'author' => $this->author,
+ 'commentID' => $this->additionalData['commentID'],
+ 'article' => $article,
+ 'responseID' => $this->getUserNotificationObject()->objectID,
+ 'reactions' => $this->getReactionsForAuthors(),
+ ]);
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function getEmailMessage($notificationType = 'instant')
+ {
+ // not supported
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function getLink()
+ {
+ return ViewableArticleContentRuntimeCache::getInstance()->getObject($this->additionalData['objectID'])->getLink()
+ . '#comment' . $this->additionalData['commentID'] . '/response' . $this->getUserNotificationObject()->objectID;
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function getEventHash()
+ {
+ return \sha1($this->eventID . '-' . $this->getUserNotificationObject()->objectID);
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function supportsEmailNotification()
+ {
+ return false;
+ }
+}
<item name="wcf.user.notification.articleComment.message.stacked"><![CDATA[{@'wcf.user.notification.stacked.authorList'|language} haben Kommentare zu dem Artikel <strong>{$article->getTitle()}</strong> verfasst.]]></item>
<item name="wcf.user.notification.articleComment.mail.plaintext"><![CDATA[{@$authorList} {if $count == 1 && $guestTimesTriggered < 2 && (!$event->getAuthor()->userID || $guestTimesTriggered == 0)}hat einen Kommentar{else}haben Kommentare{/if} zu dem Artikel „{@$article->getTitle()}“ [URL:{@$article->getLink()}#comment{@$commentID}] verfasst{if $count == 1 && !$guestTimesTriggered}:{else}.{/if}]]></item>
<item name="wcf.user.notification.articleComment.mail.html"><![CDATA[<p>{@$authorList} {if $count == 1 && $guestTimesTriggered < 2 && (!$event->getAuthor()->userID || $guestTimesTriggered == 0)}hat einen Kommentar{else}haben Kommentare{/if} zu dem Artikel <a href="{$article->getLink()}#comment{@$commentID}">{$article->getTitle()}</a> verfasst:</p>]]></item>
+ <item name="wcf.user.notification.articleComment.like.title"><![CDATA[Reaktion auf einen Kommentar (Artikel)]]></item>
+ <item name="wcf.user.notification.articleComment.like.title.stacked"><![CDATA[{#$count} Benutzer haben auf {if LANGUAGE_USE_INFORMAL_VARIANT}deinen{else}Ihren{/if} Kommentar reagiert (Artikel)]]></item>
+ <item name="wcf.user.notification.articleComment.like.message"><![CDATA[<strong>{$author}</strong> hat auf {if LANGUAGE_USE_INFORMAL_VARIANT}deinen{else}Ihren{/if} Kommentar zum Artikel <strong>{$article->getTitle()}</strong> reagiert ({@$__wcf->getReactionHandler()->renderInlineList($reactions)}).]]></item>
+ <item name="wcf.user.notification.articleComment.like.message.stacked"><![CDATA[{@'wcf.user.notification.stacked.authorList'|language} haben auf {if LANGUAGE_USE_INFORMAL_VARIANT}deinen{else}Ihren{/if} Kommentar zum Artikel <strong>{$article->getTitle()}</strong> reagiert ({@$__wcf->getReactionHandler()->renderInlineList($reactions)}).]]></item>
<item name="wcf.user.notification.articleComment.response.title"><![CDATA[Neue Antwort (Artikel)]]></item>
<item name="wcf.user.notification.articleComment.response.title.stacked"><![CDATA[{#$timesTriggered} neue Antworten (Artikel)]]></item>
<item name="wcf.user.notification.articleComment.response.message"><![CDATA[{if $author->userID}<strong>{$author}</strong>{else}Ein Gast{/if} hat eine Antwort zu einem Kommentar in dem Artikel <strong>{$article->getTitle()}</strong> verfasst.]]></item>
<item name="wcf.user.notification.articleComment.response.message.stacked"><![CDATA[{@'wcf.user.notification.stacked.authorList'|language} haben Antworten zu einem Kommentar in dem Artikel <strong>{$article->getTitle()}</strong> verfasst.]]></item>
<item name="wcf.user.notification.articleComment.response.mail.plaintext"><![CDATA[{@$authorList} {if $count == 1 && $guestTimesTriggered < 2 && (!$event->getAuthor()->userID || $guestTimesTriggered == 0)}hat eine Antwort{else}haben Antworten{/if} zu einem Kommentar in dem Artikel „{@$article->getTitle()}“ [URL:{@$article->getLink()}#comments/comment{@$commentID}/response{@$responseID}] verfasst{if $count == 1 && !$guestTimesTriggered}:{else}.{/if}]]></item>
<item name="wcf.user.notification.articleComment.response.mail.html"><![CDATA[<p>{@$authorList} {if $count == 1 && $guestTimesTriggered < 2 && (!$event->getAuthor()->userID || $guestTimesTriggered == 0)}hat eine Antwort{else}haben Antworten{/if} zu einem Kommentar in dem Artikel <a href="{$article->getLink()}#comments/comment{@$commentID}/response{@$responseID}">{$article->getTitle()}</a> verfasst{if $count == 1 && !$guestTimesTriggered}:{else}.{/if}</p>]]></item>
+ <item name="wcf.user.notification.articleComment.response.like.title"><![CDATA[Reaktion auf eine Antwort eines Kommentars (Artikel)]]></item>
+ <item name="wcf.user.notification.articleComment.response.like.title.stacked"><![CDATA[{#$count} Benutzer haben auf {if LANGUAGE_USE_INFORMAL_VARIANT}deine{else}Ihre{/if} Antwort auf einen Kommentar reagiert (Artikel)]]></item>
+ <item name="wcf.user.notification.articleComment.response.like.message"><![CDATA[<strong>{$author}</strong> hat auf {if LANGUAGE_USE_INFORMAL_VARIANT}deine{else}Ihre{/if} Antwort auf einen Kommentar zum Artikel <strong>{$article->getTitle()}</strong> reagiert ({@$__wcf->getReactionHandler()->renderInlineList($reactions)}).]]></item>
+ <item name="wcf.user.notification.articleComment.response.like.message.stacked"><![CDATA[{@'wcf.user.notification.stacked.authorList'|language} haben auf {if LANGUAGE_USE_INFORMAL_VARIANT}deine{else}Ihre{/if} Antwort auf einen Kommentar zum Artikel <strong>{$article->getTitle()}</strong> reagiert ({@$__wcf->getReactionHandler()->renderInlineList($reactions)}).]]></item>
<item name="wcf.user.notification.articleComment.responseOwner.title"><![CDATA[Neue Antwort (Artikel)]]></item>
<item name="wcf.user.notification.articleComment.responseOwner.title.stacked"><![CDATA[{#$timesTriggered} neue Antworten (Artikel)]]></item>
<item name="wcf.user.notification.articleComment.responseOwner.message"><![CDATA[{if $author->userID}<strong>{$author}</strong>{else}Ein Gast{/if} hat eine Antwort zum Kommentar von <strong>{$commentAuthor}</strong> zu {if LANGUAGE_USE_INFORMAL_VARIANT}deinem{else}Ihrem{/if} Artikel <strong>{$article->getTitle()}</strong> verfasst.]]></item>
<item name="wcf.user.notification.com.woltlab.wcf.articleComment.response.notification.commentResponseOwner"><![CDATA[Neue Antwort auf einen Kommentar zu {if LANGUAGE_USE_INFORMAL_VARIANT}deinem{else}Ihrem{/if} Artikel]]></item>
<item name="wcf.user.notification.com.woltlab.wcf.articleComment.response.notification.commentResponse"><![CDATA[Neue Antwort auf einen Kommentar von {if LANGUAGE_USE_INFORMAL_VARIANT}dir{else}Ihnen{/if}]]></item>
<item name="wcf.user.notification.com.woltlab.wcf.articleComment.notification.comment"><![CDATA[Neuer Kommentar zu {if LANGUAGE_USE_INFORMAL_VARIANT}deinem{else}Ihrem{/if} Artikel und Artikeln aus abonnierten Kategorien]]></item>
+ <item name="wcf.user.notification.com.woltlab.wcf.articleComment.like.notification.like"><![CDATA[Reaktion auf {if LANGUAGE_USE_INFORMAL_VARIANT}deinen{else}Ihren{/if} Artikel-Kommentar]]></item>
+ <item name="wcf.user.notification.com.woltlab.wcf.articleComment.response.like.notification.like"><![CDATA[Reaktion auf {if LANGUAGE_USE_INFORMAL_VARIANT}deine{else}Ihre{/if} Antwort auf einen Artikel-Kommentar]]></item>
<item name="wcf.user.notification.userRegistration.title"><![CDATA[Neue Benutzer-Registrierung]]></item>
<item name="wcf.user.notification.userRegistration.title.stacked"><![CDATA[{#$count} neue Benutzer-Registrierungen]]></item>
<item name="wcf.user.notification.userRegistration.message"><![CDATA[<strong>{$author}</strong> hat sich registriert.]]></item>
<item name="wcf.user.notification.articleComment.message.stacked"><![CDATA[{@'wcf.user.notification.stacked.authorList'|language} commented on the article <strong>{$article->getTitle()}</strong>.]]></item>
<item name="wcf.user.notification.articleComment.mail.plaintext"><![CDATA[{@$authorList} commented on the article “{@$article->getTitle()}” [URL:{@$article->getLink()}#comment{@$commentID}]{if $count == 1 && !$guestTimesTriggered}:{else}.{/if}]]></item>
<item name="wcf.user.notification.articleComment.mail.html"><![CDATA[<p>{@$authorList} commented on the article <a href="{$article->getLink()}#comments/comment{@$commentID}">{$article->getTitle()}</a>:</p>]]></item>
+ <item name="wcf.user.notification.articleComment.like.title"><![CDATA[Reaction to a comment (Article)]]></item>
+ <item name="wcf.user.notification.articleComment.like.title.stacked"><![CDATA[{#$count} users reacted to your comment (Article)]]></item>
+ <item name="wcf.user.notification.articleComment.like.message"><![CDATA[<strong>{$author}</strong> reacted to your comment on the article <strong>{$article->getTitle()}</strong> ({@$__wcf->getReactionHandler()->renderInlineList($reactions)}).]]></item>
+ <item name="wcf.user.notification.articleComment.like.message.stacked"><![CDATA[{@'wcf.user.notification.stacked.authorList'|language} reacted to your comment on the article <strong>{$article->getTitle()}</strong> ({@$__wcf->getReactionHandler()->renderInlineList($reactions)}).]]></item>
<item name="wcf.user.notification.articleComment.response.title"><![CDATA[New Reply (Article)]]></item>
<item name="wcf.user.notification.articleComment.response.title.stacked"><![CDATA[{#$timesTriggered} new Replies (Article)]]></item>
<item name="wcf.user.notification.articleComment.response.message"><![CDATA[{if $author->userID}<strong>{$author}</strong>{else}A guest{/if} replied to a comment on the article <strong>{$article->getTitle()}</strong>.]]></item>
<item name="wcf.user.notification.articleComment.response.message.stacked"><![CDATA[{@'wcf.user.notification.stacked.authorList'|language} replied to a comment on the article <strong>{$article->getTitle()}</strong>.]]></item>
<item name="wcf.user.notification.articleComment.response.mail.plaintext"><![CDATA[{@$authorList} replied to a comment on the article “{@$article->getTitle()}” [URL:{@$article->getLink()}#comments/comment{@$commentID}/response{@$responseID}]{if $count == 1 && !$guestTimesTriggered}:{else}.{/if}]]></item>
<item name="wcf.user.notification.articleComment.response.mail.html"><![CDATA[<p>{@$authorList} replied to a comment on the article <a href="{$article->getLink()}#comments/comment{@$commentID}/response{@$responseID}">{$article->getTitle()}</a>:</p>]]></item>
+ <item name="wcf.user.notification.articleComment.response.like.title"><![CDATA[Reaction to your reply to a comment (Article)]]></item>
+ <item name="wcf.user.notification.articleComment.response.like.title.stacked"><![CDATA[{#$count} users reacted to your reply to a comment (Article)]]></item>
+ <item name="wcf.user.notification.articleComment.response.like.message"><![CDATA[<strong>{$author}</strong> reacted to your reply to a comment on the article <strong>{$article->getTitle()}</strong> ({@$__wcf->getReactionHandler()->renderInlineList($reactions)}).]]></item>
+ <item name="wcf.user.notification.articleComment.response.like.message.stacked"><![CDATA[{@'wcf.user.notification.stacked.authorList'|language} reacted to your reply to a comment on the article <strong>{$article->getTitle()}</strong> ({@$__wcf->getReactionHandler()->renderInlineList($reactions)}).]]></item>
<item name="wcf.user.notification.articleComment.responseOwner.title"><![CDATA[New Reply (Article)]]></item>
<item name="wcf.user.notification.articleComment.responseOwner.title.stacked"><![CDATA[{#$timesTriggered} new Replies (Article)]]></item>
<item name="wcf.user.notification.articleComment.responseOwner.message"><![CDATA[{if $author->userID}<strong>{$author}</strong>{else}A guest{/if} replied to a comment by <strong>{$commentAuthor}</strong> on your article <strong>{$article->getTitle()}</strong>.]]></item>
<item name="wcf.user.notification.com.woltlab.wcf.articleComment.response.notification.commentResponseOwner"><![CDATA[Notify me of new replies to comments on my articles]]></item>
<item name="wcf.user.notification.com.woltlab.wcf.articleComment.response.notification.commentResponse"><![CDATA[Notify me of new replies to my comments]]></item>
<item name="wcf.user.notification.com.woltlab.wcf.articleComment.notification.comment"><![CDATA[Notify me of new comments on my articles and on articles in subscribed categories]]></item>
+ <item name="wcf.user.notification.com.woltlab.wcf.articleComment.like.notification.like"><![CDATA[Notify me when someone reacted to my article comments]]></item>
+ <item name="wcf.user.notification.com.woltlab.wcf.articleComment.response.like.notification.like"><![CDATA[Notify me when someone reacted to my replies to article comments]]></item>
<item name="wcf.user.notification.pageComment.responseOwner.title"><![CDATA[New reply (Page)]]></item>
<item name="wcf.user.notification.userRegistration.title"><![CDATA[New user registration]]></item>
<item name="wcf.user.notification.userRegistration.title.stacked"><![CDATA[{#$count} new user registrations]]></item>