xref: /plugin/notification/cli.php (revision 2e23e155a125b744875dc1e0594c98d1d4d991b2)
136cce49dSAnna Dabrowska<?php
236cce49dSAnna Dabrowska
36cdebc53SAnna Dabrowskause dokuwiki\Extension\CLIPlugin;
46cdebc53SAnna Dabrowskause splitbrain\phpcli\Exception;
536cce49dSAnna Dabrowskause splitbrain\phpcli\Options;
636cce49dSAnna Dabrowska
76cdebc53SAnna Dabrowskaclass cli_plugin_notification extends CLIPlugin
836cce49dSAnna Dabrowska{
936cce49dSAnna Dabrowska    /** @var helper_plugin_notification_db */
1036cce49dSAnna Dabrowska    protected $db_helper;
1136cce49dSAnna Dabrowska
1236cce49dSAnna Dabrowska    /** @var helper_plugin_notification_cron */
1336cce49dSAnna Dabrowska    protected $cron_helper;
1436cce49dSAnna Dabrowska
1536cce49dSAnna Dabrowska    /**
1636cce49dSAnna Dabrowska     * Initialize helper plugin
1736cce49dSAnna Dabrowska     */
1836cce49dSAnna Dabrowska    public function __construct()
1936cce49dSAnna Dabrowska    {
2036cce49dSAnna Dabrowska        parent::__construct();
2136cce49dSAnna Dabrowska        $this->db_helper = plugin_load('helper', 'notification_db');
2236cce49dSAnna Dabrowska        $this->cron_helper = plugin_load('helper', 'notification_cron');
2336cce49dSAnna Dabrowska    }
2436cce49dSAnna Dabrowska
2536cce49dSAnna Dabrowska    /**
2636cce49dSAnna Dabrowska     * Register options and arguments on the given $options object
2736cce49dSAnna Dabrowska     *
2836cce49dSAnna Dabrowska     * @param Options $options
2936cce49dSAnna Dabrowska     * @return void
306cdebc53SAnna Dabrowska     * @throws Exception
3136cce49dSAnna Dabrowska     */
3236cce49dSAnna Dabrowska    protected function setup(Options $options)
3336cce49dSAnna Dabrowska    {
3436cce49dSAnna Dabrowska        $options->setHelp('Bulk notification dispatcher');
3536cce49dSAnna Dabrowska        $options->registerCommand('send', 'Send all due notifications');
3636cce49dSAnna Dabrowska    }
3736cce49dSAnna Dabrowska
3836cce49dSAnna Dabrowska    /**
3936cce49dSAnna Dabrowska     * Your main program
4036cce49dSAnna Dabrowska     *
4136cce49dSAnna Dabrowska     * Arguments and options have been parsed when this is run
4236cce49dSAnna Dabrowska     *
4336cce49dSAnna Dabrowska     * @param Options $options
4436cce49dSAnna Dabrowska     * @return void
4536cce49dSAnna Dabrowska     */
4636cce49dSAnna Dabrowska    protected function main(Options $options)
4736cce49dSAnna Dabrowska    {
48*2e23e155SSzymon Olewniczak        auth_setup(); // make sure ACLs are initialized
4936cce49dSAnna Dabrowska        $cmd = $options->getCmd();
5036cce49dSAnna Dabrowska        switch ($cmd) {
5136cce49dSAnna Dabrowska            case 'send':
5236cce49dSAnna Dabrowska                $this->sendNotifications();
5336cce49dSAnna Dabrowska                break;
5436cce49dSAnna Dabrowska            default:
5536cce49dSAnna Dabrowska                $this->error('No command provided');
5636cce49dSAnna Dabrowska                exit(1);
5736cce49dSAnna Dabrowska        }
5836cce49dSAnna Dabrowska    }
5936cce49dSAnna Dabrowska
6036cce49dSAnna Dabrowska    /**
6136cce49dSAnna Dabrowska     * Check and send notifications
6236cce49dSAnna Dabrowska     */
6336cce49dSAnna Dabrowska    protected function sendNotifications()
6436cce49dSAnna Dabrowska    {
6536cce49dSAnna Dabrowska        $sqlite = $this->db_helper->getDB();
6636cce49dSAnna Dabrowska
6736cce49dSAnna Dabrowska        // get users from DB
6836cce49dSAnna Dabrowska        $sql = 'SELECT user FROM cron_check';
6936cce49dSAnna Dabrowska        $result = $sqlite->query($sql);
7036cce49dSAnna Dabrowska        $rows = $sqlite->res2arr($result);
7136cce49dSAnna Dabrowska        if (!is_array($rows)) {
7236cce49dSAnna Dabrowska            $this->info('Exiting: no users to notify found.');
7336cce49dSAnna Dabrowska            return;
7436cce49dSAnna Dabrowska        }
7536cce49dSAnna Dabrowska        // gather new notifications per user
7636cce49dSAnna Dabrowska        foreach ($rows as $row) {
7736cce49dSAnna Dabrowska            $user = $row['user'];
7836cce49dSAnna Dabrowska
7936cce49dSAnna Dabrowska            // update timestamp of cron check
8036cce49dSAnna Dabrowska            $sqlite->query('UPDATE cron_check SET timestamp=? WHERE user=?', date('c'), $user);
8136cce49dSAnna Dabrowska
8236cce49dSAnna Dabrowska            $notification_data = $this->cron_helper->getNotificationData($user);
8336cce49dSAnna Dabrowska
8436cce49dSAnna Dabrowska            //no notifications - nothing to send
8536cce49dSAnna Dabrowska            if (empty($notification_data['notifications'])) {
8636cce49dSAnna Dabrowska                $this->info('No notifications at all for user ' . $user);
8736cce49dSAnna Dabrowska                continue;
8836cce49dSAnna Dabrowska            }
8936cce49dSAnna Dabrowska
9036cce49dSAnna Dabrowska            $new_notifications = $this->cron_helper->getNewNotifications($user, $notification_data);
9136cce49dSAnna Dabrowska            //  send email
9236cce49dSAnna Dabrowska            // no notifications left - nothing to send
9336cce49dSAnna Dabrowska            if (!$new_notifications) {
9436cce49dSAnna Dabrowska                $this->info('No new notifications for user ' . $user);
9536cce49dSAnna Dabrowska                continue;
9636cce49dSAnna Dabrowska            }
9736cce49dSAnna Dabrowska
9836cce49dSAnna Dabrowska            list($text, $html) = $this->cron_helper->composeEmail($new_notifications);
9936cce49dSAnna Dabrowska            if ($this->cron_helper->sendMail($user, $text, $html)) {
10036cce49dSAnna Dabrowska                $this->cron_helper->storeSentNotifications($user, $new_notifications);
10136cce49dSAnna Dabrowska                $this->info('Sent notification to ' . $user);
10236cce49dSAnna Dabrowska            } else {
10336cce49dSAnna Dabrowska                $this->error('Failed sending notification to ' . $user);
10436cce49dSAnna Dabrowska            }
10536cce49dSAnna Dabrowska        }
10636cce49dSAnna Dabrowska    }
10736cce49dSAnna Dabrowska}
108