xref: /plugin/ireadit/action/ireadit.php (revision ffa244fd950726988198c0db1e3339e41ac93ed1)
1ce9be9e9SSzymon Olewniczak<?php
2ce9be9e9SSzymon Olewniczak// must be run within DokuWiki
3ce9be9e9SSzymon Olewniczakif (!defined('DOKU_INC')) die();
4ce9be9e9SSzymon Olewniczak
5ce9be9e9SSzymon Olewniczak/**
6ce9be9e9SSzymon Olewniczak * All DokuWiki plugins to extend the parser/rendering mechanism
7ce9be9e9SSzymon Olewniczak * need to inherit from this class
8ce9be9e9SSzymon Olewniczak */
9ce9be9e9SSzymon Olewniczakclass action_plugin_ireadit_ireadit extends DokuWiki_Action_Plugin
10ce9be9e9SSzymon Olewniczak{
11ce9be9e9SSzymon Olewniczak    public function register(Doku_Event_Handler $controller)
12ce9be9e9SSzymon Olewniczak    {
13ce9be9e9SSzymon Olewniczak        $controller->register_hook('TPL_CONTENT_DISPLAY', 'AFTER', $this, 'render_list');
14ce9be9e9SSzymon Olewniczak        $controller->register_hook('ACTION_ACT_PREPROCESS', 'BEFORE', $this, 'handle_ireadit_action');
15ce9be9e9SSzymon Olewniczak        $controller->register_hook('COMMON_WIKIPAGE_SAVE', 'AFTER', $this, 'handle_pagesave_after');
16d2cf7c78SSzymon Olewniczak        $controller->register_hook('INDEXER_VERSION_GET', 'BEFORE', $this, 'set_ireadit_index_version');
17d2cf7c78SSzymon Olewniczak        $controller->register_hook('INDEXER_PAGE_ADD', 'BEFORE', $this, 'add_readers_to_index');
18ce9be9e9SSzymon Olewniczak    }
19ce9be9e9SSzymon Olewniczak
20ce9be9e9SSzymon Olewniczak    public function render_list()
21ce9be9e9SSzymon Olewniczak    {
2249d6b1b0SSzymon Olewniczak        global $INFO, $ACT;
23ce9be9e9SSzymon Olewniczak
24ce9be9e9SSzymon Olewniczak        if ($ACT != 'show') return;
25*ffa244fdSSzymon Olewniczak        if (empty($INFO['meta']['plugin_ireadit=0.2'])) return;
26fcd65f6aSSzymon Olewniczak        $ireadit_data = $INFO['meta']['plugin_ireadit=0.2'];
27ce9be9e9SSzymon Olewniczak
28ce9be9e9SSzymon Olewniczak        echo '<div';
29ce9be9e9SSzymon Olewniczak        if ($this->getConf('print') == 0) {
30ce9be9e9SSzymon Olewniczak            echo' class="no-print"';
31ce9be9e9SSzymon Olewniczak        }
32ce9be9e9SSzymon Olewniczak        echo '>';
33ce9be9e9SSzymon Olewniczak
34d2cf7c78SSzymon Olewniczak        /** @var helper_plugin_ireadit $helper */
35d2cf7c78SSzymon Olewniczak        $helper = $this->loadHelper('ireadit');
36ce9be9e9SSzymon Olewniczak
37d2cf7c78SSzymon Olewniczak        // we use 'lastmod' insetead of 'rev' to get the timestamp also for the current revision
3813f6c799SSzymon Olewniczak        if ($helper->user_can_read_page($ireadit_data, $INFO['id'], $INFO['lastmod'], $INFO['client'])) {
3913f6c799SSzymon Olewniczak            echo '<a href="' . wl($INFO['id'], ['do' => 'ireadit', 'rev' => $INFO['lastmod']]) . '">' . $this->getLang('ireadit') . '</a>';
40ce9be9e9SSzymon Olewniczak        }
41ce9be9e9SSzymon Olewniczak
4213f6c799SSzymon Olewniczak        try {
4313f6c799SSzymon Olewniczak            /** @var \helper_plugin_ireadit_db $db_helper */
4413f6c799SSzymon Olewniczak            $db_helper = plugin_load('helper', 'ireadit_db');
4513f6c799SSzymon Olewniczak            $sqlite = $db_helper->getDB();
4613f6c799SSzymon Olewniczak        } catch (Exception $e) {
4713f6c799SSzymon Olewniczak            msg($e->getMessage(), -1);
4813f6c799SSzymon Olewniczak            return;
4913f6c799SSzymon Olewniczak        }
5013f6c799SSzymon Olewniczak
5113f6c799SSzymon Olewniczak        $res = $sqlite->query('SELECT user, timestamp FROM ireadit
5213f6c799SSzymon Olewniczak                                        WHERE page = ?
5313f6c799SSzymon Olewniczak                                        AND rev = ?
5413f6c799SSzymon Olewniczak                                        ORDER BY timestamp', $INFO['id'], $INFO['lastmod']);
5513f6c799SSzymon Olewniczak        $readers = $sqlite->res2arr($res);
5613f6c799SSzymon Olewniczak
57ce9be9e9SSzymon Olewniczak        if (count($readers) > 0) {
58ce9be9e9SSzymon Olewniczak            echo '<h3>' . $this->getLang('readit_header') . '</h3>';
59ce9be9e9SSzymon Olewniczak            echo '<ul>';
60ce9be9e9SSzymon Olewniczak            foreach ($readers as $reader) {
61ce9be9e9SSzymon Olewniczak                $time = strtotime($reader['timestamp']);
6249d6b1b0SSzymon Olewniczak                echo '<li>' . userlink($reader['user']) . ' - ' . dformat($time) . '</li>';
63ce9be9e9SSzymon Olewniczak            }
64ce9be9e9SSzymon Olewniczak            echo '</ul>';
65ce9be9e9SSzymon Olewniczak        }
6649d6b1b0SSzymon Olewniczak
6749d6b1b0SSzymon Olewniczak        if ($this->getConf('show_not_read_list') && $helper->use_ireadit_here($INFO['id'], $INFO['lastmod'])) {
6849d6b1b0SSzymon Olewniczak            $not_read = array_diff($helper->users_set($ireadit_data), array_column($readers, 'user'));
6949d6b1b0SSzymon Olewniczak            $not_read_userlinks = array_map('userlink', $not_read);
7049d6b1b0SSzymon Olewniczak            sort($not_read_userlinks);
7149d6b1b0SSzymon Olewniczak            if (count($not_read) > 0) {
7249d6b1b0SSzymon Olewniczak                echo '<h3>' . $this->getLang('not_read_header') . '</h3>';
7349d6b1b0SSzymon Olewniczak                echo '<ul>';
7449d6b1b0SSzymon Olewniczak                foreach ($not_read_userlinks as $userlink) {
7549d6b1b0SSzymon Olewniczak                    echo '<li>' . $userlink . '</li>';
7649d6b1b0SSzymon Olewniczak                }
7749d6b1b0SSzymon Olewniczak                echo '</ul>';
7849d6b1b0SSzymon Olewniczak            }
7949d6b1b0SSzymon Olewniczak        }
8049d6b1b0SSzymon Olewniczak
81ce9be9e9SSzymon Olewniczak        echo '</div>';
82ce9be9e9SSzymon Olewniczak    }
83ce9be9e9SSzymon Olewniczak
84ce9be9e9SSzymon Olewniczak    public function handle_ireadit_action(Doku_Event $event)
85ce9be9e9SSzymon Olewniczak    {
8649d6b1b0SSzymon Olewniczak        global $INFO;
87ce9be9e9SSzymon Olewniczak        if ($event->data != 'ireadit') return;
88ce9be9e9SSzymon Olewniczak        if (!$INFO['client']) return;
89*ffa244fdSSzymon Olewniczak        if (empty($INFO['meta']['plugin_ireadit=0.2'])) return;
90fcd65f6aSSzymon Olewniczak        $ireadit_data = $INFO['meta']['plugin_ireadit=0.2'];
91ce9be9e9SSzymon Olewniczak
92d2cf7c78SSzymon Olewniczak        /** @var helper_plugin_ireadit $helper */
93d2cf7c78SSzymon Olewniczak        $helper = $this->loadHelper('ireadit');
94d2cf7c78SSzymon Olewniczak        if ($helper->user_can_read_page($ireadit_data, $INFO['id'], $INFO['lastmod'], $INFO['client'])) {
95692a1450SSzymon Olewniczak            try {
96ce9be9e9SSzymon Olewniczak                /** @var \helper_plugin_ireadit_db $db_helper */
97ce9be9e9SSzymon Olewniczak                $db_helper = plugin_load('helper', 'ireadit_db');
98ce9be9e9SSzymon Olewniczak                $sqlite = $db_helper->getDB();
99692a1450SSzymon Olewniczak            } catch (Exception $e) {
100692a1450SSzymon Olewniczak                msg($e->getMessage(), -1);
101692a1450SSzymon Olewniczak                return;
102692a1450SSzymon Olewniczak            }
103d2cf7c78SSzymon Olewniczak            $sqlite->storeEntry('ireadit', [
104d2cf7c78SSzymon Olewniczak                'page' => $INFO['id'],
105d2cf7c78SSzymon Olewniczak                'rev' => $INFO['lastmod'], // we use 'lastmod' inseted of 'rev' to get the timestamp also for the current revision
106d2cf7c78SSzymon Olewniczak                'user' => $INFO['client'],
107d2cf7c78SSzymon Olewniczak                'timestamp' => date('c')
108d2cf7c78SSzymon Olewniczak            ]);
109d2cf7c78SSzymon Olewniczak        }
11013f6c799SSzymon Olewniczak        $go = wl($INFO['id'], ['rev' => $INFO['lastmod']], true, '&');
11113f6c799SSzymon Olewniczak        send_redirect($go);
112ce9be9e9SSzymon Olewniczak    }
113ce9be9e9SSzymon Olewniczak
114d2cf7c78SSzymon Olewniczak    public function handle_pagesave_after(Doku_Event $event)
115ce9be9e9SSzymon Olewniczak    {
116d2cf7c78SSzymon Olewniczak        global $INFO;
117*ffa244fdSSzymon Olewniczak        if (empty($INFO['meta']['plugin_ireadit=0.2'])) return;
118ce9be9e9SSzymon Olewniczak
119ce9be9e9SSzymon Olewniczak        if ($this->getConf('minor_edit_keeps_readers') &&
120d2cf7c78SSzymon Olewniczak            $event->data['changeType'] == DOKU_CHANGE_TYPE_MINOR_EDIT) {
121d2cf7c78SSzymon Olewniczak            try {
122d2cf7c78SSzymon Olewniczak                /** @var \helper_plugin_ireadit_db $db_helper */
123d2cf7c78SSzymon Olewniczak                $db_helper = plugin_load('helper', 'ireadit_db');
124d2cf7c78SSzymon Olewniczak                $sqlite = $db_helper->getDB();
125d2cf7c78SSzymon Olewniczak            } catch (Exception $e) {
126d2cf7c78SSzymon Olewniczak                msg($e->getMessage(), -1);
127d2cf7c78SSzymon Olewniczak                return;
128ce9be9e9SSzymon Olewniczak            }
129d2cf7c78SSzymon Olewniczak            $sqlite->query('INSERT INTO ireadit (page,rev,user,timestamp)
130d2cf7c78SSzymon Olewniczak                            SELECT page, ?, user, timestamp FROM ireadit WHERE rev=? AND page=?',
131d2cf7c78SSzymon Olewniczak                $event->data['newRevision'], $event->data['oldRevision'], $event->data['id']);
132ce9be9e9SSzymon Olewniczak        }
133ce9be9e9SSzymon Olewniczak    }
134ce9be9e9SSzymon Olewniczak
135ce9be9e9SSzymon Olewniczak    /**
136d2cf7c78SSzymon Olewniczak     * Add a version string to the index so it is rebuilt
137d2cf7c78SSzymon Olewniczak     * whenever the stored data format changes.
138ce9be9e9SSzymon Olewniczak     */
139d2cf7c78SSzymon Olewniczak    public function set_ireadit_index_version(Doku_Event $event) {
140fcd65f6aSSzymon Olewniczak        $event->data['plugin_ireadit'] = '0.2';
141692a1450SSzymon Olewniczak    }
142ce9be9e9SSzymon Olewniczak
143d2cf7c78SSzymon Olewniczak    /**
144d2cf7c78SSzymon Olewniczak     * Add all data of the readers metadata to the metadata index.
145d2cf7c78SSzymon Olewniczak     */
146d2cf7c78SSzymon Olewniczak    public function add_readers_to_index(Doku_Event $event, $param) {
147fcd65f6aSSzymon Olewniczak        $ireadit_data = p_get_metadata($event->data['page'], 'plugin_ireadit=0.2');
148*ffa244fdSSzymon Olewniczak        if (empty($ireadit_data)) return;
149d2cf7c78SSzymon Olewniczak
150d2cf7c78SSzymon Olewniczak        /** @var helper_plugin_ireadit $helper */
151d2cf7c78SSzymon Olewniczak        $helper = $this->loadHelper('ireadit');
152d2cf7c78SSzymon Olewniczak        $event->data['metadata']['ireadit'] = $helper->users_set($ireadit_data);
153ce9be9e9SSzymon Olewniczak    }
154ce9be9e9SSzymon Olewniczak}
155