Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 35
0.00% covered (danger)
0.00%
0 / 6
CRAP
0.00% covered (danger)
0.00%
0 / 1
Jetpack_Monitor
0.00% covered (danger)
0.00%
0 / 32
0.00% covered (danger)
0.00%
0 / 6
132
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 2
0.00% covered (danger)
0.00%
0 / 1
2
 activate_module
0.00% covered (danger)
0.00%
0 / 2
0.00% covered (danger)
0.00%
0 / 1
6
 jetpack_modules_loaded
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 update_option_receive_jetpack_monitor_notification
0.00% covered (danger)
0.00%
0 / 10
0.00% covered (danger)
0.00%
0 / 1
6
 user_receives_notifications
0.00% covered (danger)
0.00%
0 / 11
0.00% covered (danger)
0.00%
0 / 1
12
 monitor_get_last_downtime
0.00% covered (danger)
0.00%
0 / 6
0.00% covered (danger)
0.00%
0 / 1
6
1<?php // phpcs:ignore WordPress.Files.FileName.InvalidClassFileName
2/**
3 * Module Name: Downtime Monitor
4 * Module Description: Get instant alerts if your site goes down and know when it’s back online.
5 * Sort Order: 28
6 * Recommendation Order: 10
7 * First Introduced: 2.6
8 * Requires Connection: Yes
9 * Requires User Connection: Yes
10 * Auto Activate: No
11 * Module Tags: Recommended
12 * Feature: Security
13 * Additional Search Queries: monitor, uptime, downtime, monitoring, maintenance, maintenance mode, offline, site is down, site down, down, repair, error
14 *
15 * @package automattic/jetpack
16 */
17
18use Automattic\Jetpack\Connection\Manager as Connection_Manager;
19
20if ( ! defined( 'ABSPATH' ) ) {
21    exit( 0 );
22}
23
24/**
25 * Class Jetpack_Monitor
26 *
27 * @phan-constructor-used-for-side-effects
28 */
29class Jetpack_Monitor {
30
31    /**
32     * Name of the module.
33     *
34     * @var string Name of module.
35     */
36    public $module = 'monitor';
37
38    /**
39     * Constructor.
40     */
41    public function __construct() {
42        add_action( 'jetpack_modules_loaded', array( $this, 'jetpack_modules_loaded' ) );
43        add_action( 'jetpack_activate_module_monitor', array( $this, 'activate_module' ) );
44    }
45
46    /**
47     * Runs upon module activation.
48     *
49     * @return void
50     */
51    public function activate_module() {
52        if ( ( new Connection_Manager( 'jetpack' ) )->is_user_connected() ) {
53            self::update_option_receive_jetpack_monitor_notification( true );
54        }
55    }
56
57    /**
58     * Runs on the jetpack_modules_loaded hook to enable configuation.
59     *
60     * @return void
61     */
62    public function jetpack_modules_loaded() {
63        Jetpack::enable_module_configurable( $this->module );
64    }
65
66    /**
67     * Whether to receive the notifications.
68     *
69     * @param bool $value `true` to enable notifications, `false` to disable them.
70     *
71     * @return bool
72     */
73    public function update_option_receive_jetpack_monitor_notification( $value ) {
74        $xml = new Jetpack_IXR_Client(
75            array(
76                'user_id' => get_current_user_id(),
77            )
78        );
79        $xml->query( 'jetpack.monitor.setNotifications', (bool) $value );
80
81        if ( $xml->isError() ) {
82            wp_die( sprintf( '%s: %s', esc_html( $xml->getErrorCode() ), esc_html( $xml->getErrorMessage() ) ) );
83        }
84
85        // To be used only in Jetpack_Core_Json_Api_Endpoints::get_remote_value.
86        update_option( 'monitor_receive_notifications', (bool) $value );
87
88        return true;
89    }
90
91    /**
92     * Checks the status of notifications for current Jetpack site user.
93     *
94     * @since 2.8
95     * @since 4.1.0 New parameter $die_on_error.
96     *
97     * @param bool $die_on_error Whether to issue a wp_die when an error occurs or return a WP_Error object.
98     *
99     * @return boolean|WP_Error
100     */
101    public static function user_receives_notifications( $die_on_error = true ) {
102        $xml = new Jetpack_IXR_Client(
103            array(
104                'user_id' => get_current_user_id(),
105            )
106        );
107        $xml->query( 'jetpack.monitor.isUserInNotifications' );
108
109        if ( $xml->isError() ) {
110            if ( $die_on_error ) {
111                wp_die( sprintf( '%s: %s', esc_html( $xml->getErrorCode() ), esc_html( $xml->getErrorMessage() ) ), 400 );
112            } else {
113                return new WP_Error( $xml->getErrorCode(), $xml->getErrorMessage(), array( 'status' => 400 ) );
114            }
115        }
116        return $xml->getResponse();
117    }
118
119    /**
120     * Returns date of the last downtime.
121     *
122     * @since 4.0.0
123     * @return string date in YYYY-MM-DD HH:mm:ss format
124     */
125    public function monitor_get_last_downtime() {
126        $xml = new Jetpack_IXR_Client();
127
128        $xml->query( 'jetpack.monitor.getLastDowntime' );
129
130        if ( $xml->isError() ) {
131            return new WP_Error( 'monitor-downtime', $xml->getErrorMessage() );
132        }
133
134        set_transient( 'monitor_last_downtime', $xml->getResponse(), 10 * MINUTE_IN_SECONDS );
135
136        return $xml->getResponse();
137    }
138}
139
140new Jetpack_Monitor();