xref: /plugin/notification/cli.php (revision 6cdebc539ff0654a6c1d30517990fc9fc0a7a4d7)
136cce49dSAnna Dabrowska<?php
236cce49dSAnna Dabrowska
3*6cdebc53SAnna Dabrowskause dokuwiki\Extension\CLIPlugin;
4*6cdebc53SAnna Dabrowskause splitbrain\phpcli\Exception;
536cce49dSAnna Dabrowskause splitbrain\phpcli\Options;
636cce49dSAnna Dabrowska
7*6cdebc53SAnna 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
30*6cdebc53SAnna 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    {
4836cce49dSAnna Dabrowska        $cmd = $options->getCmd();
4936cce49dSAnna Dabrowska        switch ($cmd) {
5036cce49dSAnna Dabrowska            case 'send':
5136cce49dSAnna Dabrowska                $this->sendNotifications();
5236cce49dSAnna Dabrowska                break;
5336cce49dSAnna Dabrowska            default:
5436cce49dSAnna Dabrowska                $this->error('No command provided');
5536cce49dSAnna Dabrowska                exit(1);
5636cce49dSAnna Dabrowska        }
5736cce49dSAnna Dabrowska    }
5836cce49dSAnna Dabrowska
5936cce49dSAnna Dabrowska    /**
6036cce49dSAnna Dabrowska     * Check and send notifications
6136cce49dSAnna Dabrowska     */
6236cce49dSAnna Dabrowska    protected function sendNotifications()
6336cce49dSAnna Dabrowska    {
6436cce49dSAnna Dabrowska        $sqlite = $this->db_helper->getDB();
6536cce49dSAnna Dabrowska
6636cce49dSAnna Dabrowska        // get users from DB
6736cce49dSAnna Dabrowska        $sql = 'SELECT user FROM cron_check';
6836cce49dSAnna Dabrowska        $result = $sqlite->query($sql);
6936cce49dSAnna Dabrowska        $rows = $sqlite->res2arr($result);
7036cce49dSAnna Dabrowska        if (!is_array($rows)) {
7136cce49dSAnna Dabrowska            $this->info('Exiting: no users to notify found.');
7236cce49dSAnna Dabrowska            return;
7336cce49dSAnna Dabrowska        }
7436cce49dSAnna Dabrowska        // gather new notifications per user
7536cce49dSAnna Dabrowska        foreach ($rows as $row) {
7636cce49dSAnna Dabrowska            $user = $row['user'];
7736cce49dSAnna Dabrowska
7836cce49dSAnna Dabrowska            // update timestamp of cron check
7936cce49dSAnna Dabrowska            $sqlite->query('UPDATE cron_check SET timestamp=? WHERE user=?', date('c'), $user);
8036cce49dSAnna Dabrowska
8136cce49dSAnna Dabrowska            $notification_data = $this->cron_helper->getNotificationData($user);
8236cce49dSAnna Dabrowska
8336cce49dSAnna Dabrowska            //no notifications - nothing to send
8436cce49dSAnna Dabrowska            if (empty($notification_data['notifications'])) {
8536cce49dSAnna Dabrowska                $this->info('No notifications at all for user ' . $user);
8636cce49dSAnna Dabrowska                continue;
8736cce49dSAnna Dabrowska            }
8836cce49dSAnna Dabrowska
8936cce49dSAnna Dabrowska            $new_notifications = $this->cron_helper->getNewNotifications($user, $notification_data);
9036cce49dSAnna Dabrowska            //  send email
9136cce49dSAnna Dabrowska            // no notifications left - nothing to send
9236cce49dSAnna Dabrowska            if (!$new_notifications) {
9336cce49dSAnna Dabrowska                $this->info('No new notifications for user ' . $user);
9436cce49dSAnna Dabrowska                continue;
9536cce49dSAnna Dabrowska            }
9636cce49dSAnna Dabrowska
9736cce49dSAnna Dabrowska            list($text, $html) = $this->cron_helper->composeEmail($new_notifications);
9836cce49dSAnna Dabrowska            if ($this->cron_helper->sendMail($user, $text, $html)) {
9936cce49dSAnna Dabrowska                $this->cron_helper->storeSentNotifications($user, $new_notifications);
10036cce49dSAnna Dabrowska                $this->info('Sent notification to ' . $user);
10136cce49dSAnna Dabrowska            } else {
10236cce49dSAnna Dabrowska                $this->error('Failed sending notification to ' . $user);
10336cce49dSAnna Dabrowska            }
10436cce49dSAnna Dabrowska        }
10536cce49dSAnna Dabrowska    }
10636cce49dSAnna Dabrowska}
107