xref: /plugin/notification/cli.php (revision 36cce49dbfdfbcab08b8abbc360dca3597aa831c)
1*36cce49dSAnna Dabrowska<?php
2*36cce49dSAnna Dabrowska
3*36cce49dSAnna Dabrowskause splitbrain\phpcli\Options;
4*36cce49dSAnna Dabrowska
5*36cce49dSAnna Dabrowskaclass cli_plugin_notification extends DokuWiki_CLI_Plugin
6*36cce49dSAnna Dabrowska{
7*36cce49dSAnna Dabrowska    /** @var helper_plugin_notification_db */
8*36cce49dSAnna Dabrowska    protected $db_helper;
9*36cce49dSAnna Dabrowska
10*36cce49dSAnna Dabrowska    /** @var helper_plugin_notification_cron */
11*36cce49dSAnna Dabrowska    protected $cron_helper;
12*36cce49dSAnna Dabrowska
13*36cce49dSAnna Dabrowska    /**
14*36cce49dSAnna Dabrowska     * Initialize helper plugin
15*36cce49dSAnna Dabrowska     */
16*36cce49dSAnna Dabrowska    public function __construct()
17*36cce49dSAnna Dabrowska    {
18*36cce49dSAnna Dabrowska        parent::__construct();
19*36cce49dSAnna Dabrowska        $this->db_helper = plugin_load('helper', 'notification_db');
20*36cce49dSAnna Dabrowska        $this->cron_helper = plugin_load('helper', 'notification_cron');
21*36cce49dSAnna Dabrowska    }
22*36cce49dSAnna Dabrowska
23*36cce49dSAnna Dabrowska    /**
24*36cce49dSAnna Dabrowska     * Register options and arguments on the given $options object
25*36cce49dSAnna Dabrowska     *
26*36cce49dSAnna Dabrowska     * @param Options $options
27*36cce49dSAnna Dabrowska     * @return void
28*36cce49dSAnna Dabrowska     * @throws \splitbrain\phpcli\Exception
29*36cce49dSAnna Dabrowska     */
30*36cce49dSAnna Dabrowska    protected function setup(Options $options)
31*36cce49dSAnna Dabrowska    {
32*36cce49dSAnna Dabrowska        $options->setHelp('Bulk notification dispatcher');
33*36cce49dSAnna Dabrowska        $options->registerCommand('send', 'Send all due notifications');
34*36cce49dSAnna Dabrowska    }
35*36cce49dSAnna Dabrowska
36*36cce49dSAnna Dabrowska    /**
37*36cce49dSAnna Dabrowska     * Your main program
38*36cce49dSAnna Dabrowska     *
39*36cce49dSAnna Dabrowska     * Arguments and options have been parsed when this is run
40*36cce49dSAnna Dabrowska     *
41*36cce49dSAnna Dabrowska     * @param Options $options
42*36cce49dSAnna Dabrowska     * @return void
43*36cce49dSAnna Dabrowska     */
44*36cce49dSAnna Dabrowska    protected function main(Options $options)
45*36cce49dSAnna Dabrowska    {
46*36cce49dSAnna Dabrowska        $cmd = $options->getCmd();
47*36cce49dSAnna Dabrowska        switch ($cmd) {
48*36cce49dSAnna Dabrowska            case 'send':
49*36cce49dSAnna Dabrowska                $this->sendNotifications();
50*36cce49dSAnna Dabrowska                break;
51*36cce49dSAnna Dabrowska            default:
52*36cce49dSAnna Dabrowska                $this->error('No command provided');
53*36cce49dSAnna Dabrowska                exit(1);
54*36cce49dSAnna Dabrowska        }
55*36cce49dSAnna Dabrowska    }
56*36cce49dSAnna Dabrowska
57*36cce49dSAnna Dabrowska    /**
58*36cce49dSAnna Dabrowska     * Check and send notifications
59*36cce49dSAnna Dabrowska     */
60*36cce49dSAnna Dabrowska    protected function sendNotifications()
61*36cce49dSAnna Dabrowska    {
62*36cce49dSAnna Dabrowska        $sqlite = $this->db_helper->getDB();
63*36cce49dSAnna Dabrowska
64*36cce49dSAnna Dabrowska        // get users from DB
65*36cce49dSAnna Dabrowska        $sql = 'SELECT user FROM cron_check';
66*36cce49dSAnna Dabrowska        $result = $sqlite->query($sql);
67*36cce49dSAnna Dabrowska        $rows = $sqlite->res2arr($result);
68*36cce49dSAnna Dabrowska        if (!is_array($rows)) {
69*36cce49dSAnna Dabrowska            $this->info('Exiting: no users to notify found.');
70*36cce49dSAnna Dabrowska            return;
71*36cce49dSAnna Dabrowska        }
72*36cce49dSAnna Dabrowska        // gather new notifications per user
73*36cce49dSAnna Dabrowska        foreach ($rows as $row) {
74*36cce49dSAnna Dabrowska            $user = $row['user'];
75*36cce49dSAnna Dabrowska
76*36cce49dSAnna Dabrowska            // update timestamp of cron check
77*36cce49dSAnna Dabrowska            $sqlite->query('UPDATE cron_check SET timestamp=? WHERE user=?',  date('c'), $user);
78*36cce49dSAnna Dabrowska
79*36cce49dSAnna Dabrowska            $notification_data = $this->cron_helper->getNotificationData($user);
80*36cce49dSAnna Dabrowska
81*36cce49dSAnna Dabrowska            //no notifications - nothing to send
82*36cce49dSAnna Dabrowska            if (empty($notification_data['notifications'])) {
83*36cce49dSAnna Dabrowska                $this->info('No notifications at all for user ' . $user);
84*36cce49dSAnna Dabrowska                continue;
85*36cce49dSAnna Dabrowska            }
86*36cce49dSAnna Dabrowska
87*36cce49dSAnna Dabrowska            $new_notifications = $this->cron_helper->getNewNotifications($user, $notification_data);
88*36cce49dSAnna Dabrowska            //  send email
89*36cce49dSAnna Dabrowska            // no notifications left - nothing to send
90*36cce49dSAnna Dabrowska            if (!$new_notifications) {
91*36cce49dSAnna Dabrowska                $this->info('No new notifications for user ' . $user);
92*36cce49dSAnna Dabrowska                continue;
93*36cce49dSAnna Dabrowska            }
94*36cce49dSAnna Dabrowska
95*36cce49dSAnna Dabrowska            list($text, $html) = $this->cron_helper->composeEmail($new_notifications);
96*36cce49dSAnna Dabrowska            if ($this->cron_helper->sendMail($user, $text, $html)) {
97*36cce49dSAnna Dabrowska                $this->cron_helper->storeSentNotifications($user, $new_notifications);
98*36cce49dSAnna Dabrowska                $this->info('Sent notification to ' . $user);
99*36cce49dSAnna Dabrowska            } else {
100*36cce49dSAnna Dabrowska                $this->error('Failed sending notification to ' . $user);
101*36cce49dSAnna Dabrowska            }
102*36cce49dSAnna Dabrowska        }
103*36cce49dSAnna Dabrowska    }
104*36cce49dSAnna Dabrowska}
105