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