xref: /plugin/structnotification/action/notification.php (revision 922aade72833a1850ff96fdccd4da59286e31af8)
1a1f4c7baSSzymon Olewniczak<?php
2a1f4c7baSSzymon Olewniczak/**
3a1f4c7baSSzymon Olewniczak * DokuWiki Plugin structnotification (Action Component)
4a1f4c7baSSzymon Olewniczak *
5a1f4c7baSSzymon Olewniczak * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
6a1f4c7baSSzymon Olewniczak * @author  Szymon Olewniczak <it@rid.pl>
7a1f4c7baSSzymon Olewniczak */
8a1f4c7baSSzymon Olewniczak
9a1f4c7baSSzymon Olewniczak// must be run within Dokuwiki
10*922aade7SSzymon Olewniczakuse dokuwiki\plugin\struct\meta\Search;
11*922aade7SSzymon Olewniczakuse dokuwiki\plugin\struct\meta\Value;
12*922aade7SSzymon Olewniczak
13a1f4c7baSSzymon Olewniczakif (!defined('DOKU_INC')) {
14a1f4c7baSSzymon Olewniczak    die();
15a1f4c7baSSzymon Olewniczak}
16a1f4c7baSSzymon Olewniczak
17a1f4c7baSSzymon Olewniczakclass action_plugin_structnotification_notification extends DokuWiki_Action_Plugin
18a1f4c7baSSzymon Olewniczak{
19a1f4c7baSSzymon Olewniczak
20a1f4c7baSSzymon Olewniczak    /**
21a1f4c7baSSzymon Olewniczak     * Registers a callback function for a given event
22a1f4c7baSSzymon Olewniczak     *
23a1f4c7baSSzymon Olewniczak     * @param Doku_Event_Handler $controller DokuWiki's event controller object
24a1f4c7baSSzymon Olewniczak     *
25a1f4c7baSSzymon Olewniczak     * @return void
26a1f4c7baSSzymon Olewniczak     */
27a1f4c7baSSzymon Olewniczak    public function register(Doku_Event_Handler $controller)
28a1f4c7baSSzymon Olewniczak    {
29*922aade7SSzymon Olewniczak        $controller->register_hook('PLUGIN_NOTIFICATION_REGISTER_SOURCE', 'AFTER', $this, 'add_notifications_source');
30*922aade7SSzymon Olewniczak        $controller->register_hook('PLUGIN_NOTIFICATION_GATHER', 'AFTER', $this, 'add_notifications');
31*922aade7SSzymon Olewniczak        $controller->register_hook('PLUGIN_NOTIFICATION_CACHE_DEPENDENCIES', 'AFTER', $this, 'add_notification_cache_dependencies');
32a1f4c7baSSzymon Olewniczak
33*922aade7SSzymon Olewniczak
34*922aade7SSzymon Olewniczak    }
35*922aade7SSzymon Olewniczak
36*922aade7SSzymon Olewniczak    public function add_notifications_source(Doku_Event $event)
37*922aade7SSzymon Olewniczak    {
38*922aade7SSzymon Olewniczak        $event->data[] = 'structnotification';
39*922aade7SSzymon Olewniczak    }
40*922aade7SSzymon Olewniczak
41*922aade7SSzymon Olewniczak    public function add_notification_cache_dependencies(Doku_Event $event)
42*922aade7SSzymon Olewniczak    {
43*922aade7SSzymon Olewniczak        if (!in_array('structnotification', $event->data['plugins'])) return;
44*922aade7SSzymon Olewniczak
45*922aade7SSzymon Olewniczak        try {
46*922aade7SSzymon Olewniczak            /** @var \helper_plugin_structnotification_db $db_helper */
47*922aade7SSzymon Olewniczak            $db_helper = plugin_load('helper', 'structnotification_db');
48*922aade7SSzymon Olewniczak            $sqlite = $db_helper->getDB();
49*922aade7SSzymon Olewniczak            $event->data['dependencies'][] = $sqlite->getAdapter()->getDbFile();
50*922aade7SSzymon Olewniczak        } catch (Exception $e) {
51*922aade7SSzymon Olewniczak            msg($e->getMessage(), -1);
52*922aade7SSzymon Olewniczak            return;
53*922aade7SSzymon Olewniczak        }
54*922aade7SSzymon Olewniczak    }
55*922aade7SSzymon Olewniczak
56*922aade7SSzymon Olewniczak    protected function getValueByLabel($values, $label)
57*922aade7SSzymon Olewniczak    {
58*922aade7SSzymon Olewniczak        /* @var Value $value */
59*922aade7SSzymon Olewniczak        foreach ($values as $value) {
60*922aade7SSzymon Olewniczak            $colLabel = $value->getColumn()->getLabel();
61*922aade7SSzymon Olewniczak            if ($colLabel == $label) {
62*922aade7SSzymon Olewniczak                return $value->getRawValue();
63*922aade7SSzymon Olewniczak            }
64*922aade7SSzymon Olewniczak        }
65*922aade7SSzymon Olewniczak        //nothing found
66*922aade7SSzymon Olewniczak        throw new Exception("column: $label not found in values");
67*922aade7SSzymon Olewniczak    }
68*922aade7SSzymon Olewniczak
69*922aade7SSzymon Olewniczak
70*922aade7SSzymon Olewniczak    public function add_notifications(Doku_Event $event)
71*922aade7SSzymon Olewniczak    {
72*922aade7SSzymon Olewniczak        if (!in_array('structnotification', $event->data['plugins'])) return;
73*922aade7SSzymon Olewniczak
74*922aade7SSzymon Olewniczak        try {
75*922aade7SSzymon Olewniczak            /** @var \helper_plugin_structnotification_db$db_helper */
76*922aade7SSzymon Olewniczak            $db_helper = plugin_load('helper', 'structnotification_db');
77*922aade7SSzymon Olewniczak            $sqlite = $db_helper->getDB();
78*922aade7SSzymon Olewniczak        } catch (Exception $e) {
79*922aade7SSzymon Olewniczak            msg($e->getMessage(), -1);
80*922aade7SSzymon Olewniczak            return;
81*922aade7SSzymon Olewniczak        }
82*922aade7SSzymon Olewniczak
83*922aade7SSzymon Olewniczak        $user = $event->data['user'];
84*922aade7SSzymon Olewniczak
85*922aade7SSzymon Olewniczak        $q = 'SELECT * FROM predicate';
86*922aade7SSzymon Olewniczak        $res = $sqlite->query($q);
87*922aade7SSzymon Olewniczak
88*922aade7SSzymon Olewniczak        $predicates = $sqlite->res2arr($res);
89*922aade7SSzymon Olewniczak
90*922aade7SSzymon Olewniczak        foreach ($predicates as $predicate) {
91*922aade7SSzymon Olewniczak            $schema = $predicate['schema'];
92*922aade7SSzymon Olewniczak            $field = $predicate['field'];
93*922aade7SSzymon Olewniczak            $operator = $predicate['operator'];
94*922aade7SSzymon Olewniczak            $days = $predicate['days'];
95*922aade7SSzymon Olewniczak            $users_and_groups = $predicate['users_and_groups'];
96*922aade7SSzymon Olewniczak            $message = $predicate['message'];
97*922aade7SSzymon Olewniczak
98*922aade7SSzymon Olewniczak            $users_set = $this->users_set($users_and_groups);
99*922aade7SSzymon Olewniczak            if (!isset($users_set[$user])) continue;
100*922aade7SSzymon Olewniczak
101*922aade7SSzymon Olewniczak            try {
102*922aade7SSzymon Olewniczak                $search = new Search();
103*922aade7SSzymon Olewniczak                $search->addSchema($schema);
104*922aade7SSzymon Olewniczak                $search->addColumn('*');
105*922aade7SSzymon Olewniczak                $result = $search->execute();
106*922aade7SSzymon Olewniczak                $result_pids = $search->getPids();
107*922aade7SSzymon Olewniczak
108*922aade7SSzymon Olewniczak                /* @var Value[] $row */
109*922aade7SSzymon Olewniczak                for ($i=0; $i<count($result); $i++) {
110*922aade7SSzymon Olewniczak                    $values = $result[$i];
111*922aade7SSzymon Olewniczak                    $pid = $result_pids[$i];
112*922aade7SSzymon Olewniczak                    $rawDate = $this->getValueByLabel($values, $field);
113*922aade7SSzymon Olewniczak                    if ($this->predicateTrue($rawDate, $operator, $days)) {
114*922aade7SSzymon Olewniczak                        $message_html = p_render('xhtml',p_get_instructions($message), $info);
115*922aade7SSzymon Olewniczak                        $event->data['notifications'][] = [
116*922aade7SSzymon Olewniczak                            'plugin' => 'structnotification',
117*922aade7SSzymon Olewniczak                            'id' => $predicate['id'] . ':'. $schema . ':' . $pid . ':'  . $rawDate,
118*922aade7SSzymon Olewniczak                            'full' => $message_html,
119*922aade7SSzymon Olewniczak                            'brief' => $message_html,
120*922aade7SSzymon Olewniczak                            'timestamp' => (int) strtotime($rawDate)
121*922aade7SSzymon Olewniczak                        ];
122*922aade7SSzymon Olewniczak                    }
123*922aade7SSzymon Olewniczak                }
124*922aade7SSzymon Olewniczak            } catch (Exception $e) {
125*922aade7SSzymon Olewniczak                msg($e->getMessage(), -1);
126*922aade7SSzymon Olewniczak                return;
127*922aade7SSzymon Olewniczak            }
128*922aade7SSzymon Olewniczak        }
129a1f4c7baSSzymon Olewniczak    }
130a1f4c7baSSzymon Olewniczak
131a1f4c7baSSzymon Olewniczak    /**
132*922aade7SSzymon Olewniczak     * @param array $users
133*922aade7SSzymon Olewniczak     * @param array $groups
134*922aade7SSzymon Olewniczak     * @return array
135a1f4c7baSSzymon Olewniczak     */
136*922aade7SSzymon Olewniczak    protected function users_set($user_and_groups) {
137*922aade7SSzymon Olewniczak        /** @var DokuWiki_Auth_Plugin $auth */
138*922aade7SSzymon Olewniczak        global $auth;
139*922aade7SSzymon Olewniczak
140*922aade7SSzymon Olewniczak        $user_and_groups_set = array_map('trim', explode(',', $user_and_groups));
141*922aade7SSzymon Olewniczak        $users = [];
142*922aade7SSzymon Olewniczak        $groups = [];
143*922aade7SSzymon Olewniczak        foreach ($user_and_groups_set as $user_or_group) {
144*922aade7SSzymon Olewniczak            if ($user_or_group[0] == '@') {
145*922aade7SSzymon Olewniczak                $groups[] = substr($user_or_group, 1);
146*922aade7SSzymon Olewniczak            } else {
147*922aade7SSzymon Olewniczak                $users[] = $user_or_group;
148a1f4c7baSSzymon Olewniczak            }
149a1f4c7baSSzymon Olewniczak        }
150*922aade7SSzymon Olewniczak        $set = [];
151*922aade7SSzymon Olewniczak
152*922aade7SSzymon Olewniczak        $all_users = $auth->retrieveUsers();
153*922aade7SSzymon Olewniczak        foreach ($all_users as $user => $info) {
154*922aade7SSzymon Olewniczak            if (in_array($user, $users)) {
155*922aade7SSzymon Olewniczak                $set[$user] = $info;
156*922aade7SSzymon Olewniczak            } elseif (array_intersect($groups, $info['grps'])) {
157*922aade7SSzymon Olewniczak                $set[$user] = $info;
158*922aade7SSzymon Olewniczak            }
159*922aade7SSzymon Olewniczak        }
160*922aade7SSzymon Olewniczak
161*922aade7SSzymon Olewniczak        return $set;
162*922aade7SSzymon Olewniczak    }
163*922aade7SSzymon Olewniczak
164*922aade7SSzymon Olewniczak    protected function predicateTrue($date, $operator, $days) {
165*922aade7SSzymon Olewniczak        $date = date('Y-m-d', strtotime($date));
166*922aade7SSzymon Olewniczak
167*922aade7SSzymon Olewniczak        switch ($operator) {
168*922aade7SSzymon Olewniczak            case 'before':
169*922aade7SSzymon Olewniczak                $days = date('Y-m-d', strtotime("+$days days"));
170*922aade7SSzymon Olewniczak                return $days >= $date;
171*922aade7SSzymon Olewniczak            case 'after':
172*922aade7SSzymon Olewniczak                $days = date('Y-m-d', strtotime("-$days days"));
173*922aade7SSzymon Olewniczak                return $date <= $days;
174*922aade7SSzymon Olewniczak            default:
175*922aade7SSzymon Olewniczak                return false;
176*922aade7SSzymon Olewniczak        }
177a1f4c7baSSzymon Olewniczak    }
178a1f4c7baSSzymon Olewniczak
179a1f4c7baSSzymon Olewniczak}
180a1f4c7baSSzymon Olewniczak
181