www.gusucode.com > Flarum开源的PHP国外手机版论坛 0.1 Beta2 源码程序 > Flarum_v0.1.beta2/extensions/lock/src/Listeners/NotifyDiscussionLocked.php

    <?php 
/*
 * This file is part of Flarum.
 *
 * (c) Toby Zerner <toby.zerner@gmail.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Flarum\Lock\Listeners;

use Flarum\Events\RegisterPostTypes;
use Flarum\Events\RegisterNotificationTypes;
use Flarum\Lock\Posts\DiscussionLockedPost;
use Flarum\Lock\Notifications\DiscussionLockedBlueprint;
use Flarum\Lock\Events\DiscussionWasLocked;
use Flarum\Lock\Events\DiscussionWasUnlocked;
use Flarum\Core\Notifications\NotificationSyncer;
use Flarum\Core\Discussions\Discussion;
use Flarum\Core\Users\User;
use Illuminate\Contracts\Events\Dispatcher;

class NotifyDiscussionLocked
{
    protected $notifications;

    public function __construct(NotificationSyncer $notifications)
    {
        $this->notifications = $notifications;
    }

    public function subscribe(Dispatcher $events)
    {
        $events->listen(RegisterPostTypes::class, [$this, 'registerPostType']);
        $events->listen(RegisterNotificationTypes::class, [$this, 'registerNotificationType']);
        $events->listen(DiscussionWasLocked::class, [$this, 'whenDiscussionWasLocked']);
        $events->listen(DiscussionWasUnlocked::class, [$this, 'whenDiscussionWasUnlocked']);
    }

    public function registerPostType(RegisterPostTypes $event)
    {
        $event->register('Flarum\Lock\Posts\DiscussionLockedPost');
    }

    public function registerNotificationType(RegisterNotificationTypes $event)
    {
        $event->register(
            'Flarum\Lock\Notifications\DiscussionLockedBlueprint',
            'Flarum\Api\Serializers\DiscussionBasicSerializer',
            ['alert']
        );
    }

    public function whenDiscussionWasLocked(DiscussionWasLocked $event)
    {
        $this->stickyChanged($event->discussion, $event->user, true);
    }

    public function whenDiscussionWasUnlocked(DiscussionWasUnlocked $event)
    {
        $this->stickyChanged($event->discussion, $event->user, false);
    }

    protected function stickyChanged(Discussion $discussion, User $user, $isLocked)
    {
        $post = DiscussionLockedPost::reply(
            $discussion->id,
            $user->id,
            $isLocked
        );

        $post = $discussion->mergePost($post);

        if ($discussion->start_user_id !== $user->id) {
            $notification = new DiscussionLockedBlueprint($post);

            $this->notifications->sync($notification, $post->exists ? [$discussion->startUser] : []);
        }
    }
}