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