*/ abstract class Notification { use Date; public $type; public $control; public $color; public $current_interval = 0; public $intervals = array(); public $is_active = true; public $next_exec_time = ''; /** * Construct method * * @author Jewel Theme */ public function __construct() { $this->init(); } /** * Init method * * @author Jewel Theme */ final public function init() { $data = $this->get(); if (false !== $data) { // Found Data from Database. $this->is_active = isset($data['is_active']) ? $data['is_active'] : true; $this->intervals = isset($data['intervals']) ? $data['intervals'] : array(); $this->current_interval = isset($data['current_interval']) ? $data['current_interval'] : 0; } else { // No Data From Database, So Build & Save it. $this->build(); $this->save(); } if ($this->is_active && !empty($this->intervals)) { $intervals = wp_list_filter($this->intervals, array('fired' => false)); if (!empty($intervals)) { $first = array_shift($intervals); $this->next_exec_time = $first['date']; } } return $this; } /** * build method * * @author Jewel Theme */ final public function build() { foreach ($this->get_intervals() as $index => $day) { $data = array( 'days' => $day, 'fired' => false, ); if (0 === $index) { $data['date'] = gmdate('Y-m-d', time() + (DAY_IN_SECONDS * $day)); } else { $data['date'] = $this->date_increment($this->intervals[$index - 1]['date'], $day); } $this->intervals[] = $data; } return $this->intervals; } /** * Final method fire * * @param [type] $trigger_time . * @param [type] $notification_type . * * @author Jewel Theme */ final public function fire($trigger_time, $notification_type) { update_option("jltma_{$notification_type}_last_interact", $trigger_time); // Current Interval is completed . $this->intervals[$this->current_interval]['fired'] = true; // Set the next interval as Current Interval . $this->current_interval++; // Return if notification is inactive . if (!$this->is_active) { return $this; } if ($this->current_interval >= count($this->intervals)) { // Stop the Notification if We reach the end interval . $this->is_active = false; } else { // Delay the next intervals if needed . $this->maybe_delay($trigger_time); } return $this; } /** * delay method * * @param [type] $trigger_time . * * @author Jewel Theme */ final public function maybe_delay($trigger_time) { $diff = abs($this->date_diff($this->next_exec_time, $trigger_time)); if (!$diff) { return $this; } foreach ($this->intervals as &$interval) { if ($interval['fired']) { continue; } $interval['date'] = $this->date_increment($interval['date'], $diff); } return $this; } /** * Save method * * @author Jewel Theme */ final public function save() { update_option( $this->get_key(), array( 'is_active' => $this->is_active, 'intervals' => $this->intervals, 'current_interval' => $this->current_interval, ) ); } /** * Get method * * @author Jewel Theme */ final public function get() { return get_option($this->get_key()); } /** * Delete method * * @author Jewel Theme */ final public function delete() { delete_option($this->get_key()); } /** * Get ID * * @author Jewel Theme */ final public function get_id() { $calss_name = (new ReflectionClass($this))->getShortName(); return strtolower($calss_name); } /** * Get intervals method * * @author Jewel Theme */ final public function get_intervals() { $interval = (array) $this->intervals(); sort($interval); return $interval; } /** * Get key method * * @author Jewel Theme */ abstract public function get_key(); /** * Get intervals method * * @author Jewel Theme */ abstract public function intervals(); }