xref: /plugin/acknowledge/action/notification.php (revision 4bf952c9005c7028e75b1ab7185e9d7f7b566d80)
1*4bf952c9SAnna Dabrowska<?php
2*4bf952c9SAnna Dabrowska
3*4bf952c9SAnna Dabrowska/**
4*4bf952c9SAnna Dabrowska * DokuWiki Plugin acknowledge (Notification Action Component)
5*4bf952c9SAnna Dabrowska *
6*4bf952c9SAnna Dabrowska * Integration with the notification plugin.
7*4bf952c9SAnna Dabrowska *
8*4bf952c9SAnna Dabrowska * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
9*4bf952c9SAnna Dabrowska * @author  Anna Dabrowska <dokuwiki@cosmocode.de>
10*4bf952c9SAnna Dabrowska */
11*4bf952c9SAnna Dabrowska
12*4bf952c9SAnna Dabrowskause dokuwiki\Extension\ActionPlugin;
13*4bf952c9SAnna Dabrowskause dokuwiki\Extension\EventHandler;
14*4bf952c9SAnna Dabrowskause dokuwiki\Extension\Event;
15*4bf952c9SAnna Dabrowskause dokuwiki\Extension\AuthPlugin;
16*4bf952c9SAnna Dabrowska
17*4bf952c9SAnna Dabrowskaclass action_plugin_acknowledge_notification extends ActionPlugin
18*4bf952c9SAnna Dabrowska{
19*4bf952c9SAnna Dabrowska    /** @inheritDoc */
20*4bf952c9SAnna Dabrowska    public function register(EventHandler $controller)
21*4bf952c9SAnna Dabrowska    {
22*4bf952c9SAnna Dabrowska        $controller->register_hook('PLUGIN_NOTIFICATION_REGISTER_SOURCE', 'AFTER', $this, 'registerSource');
23*4bf952c9SAnna Dabrowska        $controller->register_hook('PLUGIN_NOTIFICATION_GATHER', 'AFTER', $this, 'gatherNotifications');
24*4bf952c9SAnna Dabrowska        $controller->register_hook('PLUGIN_NOTIFICATION_CACHE_DEPENDENCIES', 'AFTER', $this, 'cacheDependencies');
25*4bf952c9SAnna Dabrowska    }
26*4bf952c9SAnna Dabrowska
27*4bf952c9SAnna Dabrowska    /**
28*4bf952c9SAnna Dabrowska     * Announce acknowledge as a notification source.
29*4bf952c9SAnna Dabrowska     *
30*4bf952c9SAnna Dabrowska     * @param Event $event PLUGIN_NOTIFICATION_REGISTER_SOURCE
31*4bf952c9SAnna Dabrowska     * @return void
32*4bf952c9SAnna Dabrowska     */
33*4bf952c9SAnna Dabrowska    public function registerSource(Event $event)
34*4bf952c9SAnna Dabrowska    {
35*4bf952c9SAnna Dabrowska        if (!$this->getConf('notification_integration')) return;
36*4bf952c9SAnna Dabrowska        $event->data[] = 'acknowledge';
37*4bf952c9SAnna Dabrowska    }
38*4bf952c9SAnna Dabrowska
39*4bf952c9SAnna Dabrowska    /**
40*4bf952c9SAnna Dabrowska     * Gather pending acknowledgements for the given user.
41*4bf952c9SAnna Dabrowska     *
42*4bf952c9SAnna Dabrowska     * @param Event $event PLUGIN_NOTIFICATION_GATHER
43*4bf952c9SAnna Dabrowska     * @return void
44*4bf952c9SAnna Dabrowska     */
45*4bf952c9SAnna Dabrowska    public function gatherNotifications(Event $event)
46*4bf952c9SAnna Dabrowska    {
47*4bf952c9SAnna Dabrowska        if (!$this->getConf('notification_integration')) return;
48*4bf952c9SAnna Dabrowska        if (!in_array('acknowledge', $event->data['plugins'])) return;
49*4bf952c9SAnna Dabrowska
50*4bf952c9SAnna Dabrowska        /** @var AuthPlugin $auth */
51*4bf952c9SAnna Dabrowska        global $auth;
52*4bf952c9SAnna Dabrowska
53*4bf952c9SAnna Dabrowska        // resolve the target user's groups from auth (cron runs need this)
54*4bf952c9SAnna Dabrowska        $user = $event->data['user'];
55*4bf952c9SAnna Dabrowska        $userData = $auth->getUserData($user);
56*4bf952c9SAnna Dabrowska        if ($userData === false) return;
57*4bf952c9SAnna Dabrowska        $groups = $userData['grps'] ?? [];
58*4bf952c9SAnna Dabrowska
59*4bf952c9SAnna Dabrowska        /** @var helper_plugin_acknowledge $helper */
60*4bf952c9SAnna Dabrowska        $helper = plugin_load('helper', 'acknowledge');
61*4bf952c9SAnna Dabrowska
62*4bf952c9SAnna Dabrowska        $rows = $helper->getUserAcknowledgements($user, $groups, 'due');
63*4bf952c9SAnna Dabrowska        if (!$rows) return;
64*4bf952c9SAnna Dabrowska
65*4bf952c9SAnna Dabrowska        foreach ($rows as $row) {
66*4bf952c9SAnna Dabrowska            $page = $row['page'];
67*4bf952c9SAnna Dabrowska
68*4bf952c9SAnna Dabrowska            // don't notify about pages that cannot be acknowledged yet (approve check)
69*4bf952c9SAnna Dabrowska            if ($helper->isBlockedByApprove($page)) continue;
70*4bf952c9SAnna Dabrowska
71*4bf952c9SAnna Dabrowska            $event->data['notifications'][] = [
72*4bf952c9SAnna Dabrowska                'plugin' => 'acknowledge',
73*4bf952c9SAnna Dabrowska                'id' => $page . ':' . $row['lastmod'], // notification is bound to id and rev
74*4bf952c9SAnna Dabrowska                'full' => sprintf($this->getLang('notification'), $this->buildPageLink($page)),
75*4bf952c9SAnna Dabrowska                'brief' => $this->buildPageLink($page),
76*4bf952c9SAnna Dabrowska                'timestamp' => (int) $row['lastmod'],
77*4bf952c9SAnna Dabrowska            ];
78*4bf952c9SAnna Dabrowska        }
79*4bf952c9SAnna Dabrowska    }
80*4bf952c9SAnna Dabrowska
81*4bf952c9SAnna Dabrowska    /**
82*4bf952c9SAnna Dabrowska     * @param Event $event PLUGIN_NOTIFICATION_CACHE_DEPENDENCIES
83*4bf952c9SAnna Dabrowska     * @return void
84*4bf952c9SAnna Dabrowska     */
85*4bf952c9SAnna Dabrowska    public function cacheDependencies(Event $event)
86*4bf952c9SAnna Dabrowska    {
87*4bf952c9SAnna Dabrowska        if (!$this->getConf('notification_integration')) return;
88*4bf952c9SAnna Dabrowska        if (!in_array('acknowledge', $event->data['plugins'])) return;
89*4bf952c9SAnna Dabrowska        $event->data['_nocache'] = true;
90*4bf952c9SAnna Dabrowska    }
91*4bf952c9SAnna Dabrowska
92*4bf952c9SAnna Dabrowska    /**
93*4bf952c9SAnna Dabrowska     * Build the wiki link
94*4bf952c9SAnna Dabrowska     *
95*4bf952c9SAnna Dabrowska     * @param string $page Page ID
96*4bf952c9SAnna Dabrowska     * @return string HTML anchor
97*4bf952c9SAnna Dabrowska     */
98*4bf952c9SAnna Dabrowska    protected function buildPageLink($page)
99*4bf952c9SAnna Dabrowska    {
100*4bf952c9SAnna Dabrowska        if (useHeading('content')) {
101*4bf952c9SAnna Dabrowska            $heading = p_get_first_heading($page);
102*4bf952c9SAnna Dabrowska            $title = blank($heading) ? noNSorNS($page) : $heading;
103*4bf952c9SAnna Dabrowska        } else {
104*4bf952c9SAnna Dabrowska            $title = noNSorNS($page);
105*4bf952c9SAnna Dabrowska        }
106*4bf952c9SAnna Dabrowska
107*4bf952c9SAnna Dabrowska        return '<a class="wikilink1" href="' . wl($page, '', true) . '">' . hsc($title) . '</a>';
108*4bf952c9SAnna Dabrowska    }
109*4bf952c9SAnna Dabrowska}
110