Completed
Push — update/import-sync-detection ( cc9b3b...d0bcf1 )
by
unknown
35:42 queued 28:04
created

Jetpack_Monitor   A

Complexity

Total Complexity 25

Size/Duplication

Total Lines 183
Duplicated Lines 20.22 %

Coupling/Cohesion

Components 1
Dependencies 2

Importance

Changes 0
Metric Value
dl 37
loc 183
rs 10
c 0
b 0
f 0
wmc 25
lcom 1
cbo 2

11 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 4 1
A activate_module() 0 5 2
A jetpack_modules_loaded() 0 5 1
A jetpack_configuration_load() 0 15 5
A jetpack_configuration_screen() 0 33 3
A is_active() 11 11 2
A update_option_receive_jetpack_monitor_notification() 0 16 2
A user_receives_notifications() 0 16 3
A activate_monitor() 13 13 2
A deactivate_monitor() 13 13 2
A monitor_get_last_downtime() 0 20 2

How to fix   Duplicated Code   

Duplicated Code

Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.

Common duplication problems, and corresponding solutions are:

1
<?php
2
/**
3
 * Module Name: Monitor
4
 * Module Description: Jetpack’s downtime monitoring will continuously watch your site, and alert you the moment that downtime is detected.
5
 * Jumpstart Description: Receive immediate notifications if your site goes down, 24/7.
6
 * Sort Order: 28
7
 * Recommendation Order: 10
8
 * First Introduced: 2.6
9
 * Requires Connection: Yes
10
 * Auto Activate: No
11
 * Module Tags: Recommended
12
 * Feature: Security, Jumpstart
13
 * Additional Search Queries: monitor, uptime, downtime, monitoring, maintenance, maintenance mode, offline, site is down, site down, down, repair, error
14
 */
15
16
class Jetpack_Monitor {
17
18
	public $module = 'monitor';
19
20
	function __construct() {
21
		add_action( 'jetpack_modules_loaded', array( $this, 'jetpack_modules_loaded' ) );
22
		add_action( 'jetpack_activate_module_monitor', array( $this, 'activate_module' ) );
23
	}
24
25
	public function activate_module() {
26
		if ( Jetpack::is_user_connected() ) {
27
			self::update_option_receive_jetpack_monitor_notification( true );
28
		}
29
	}
30
31
	public function jetpack_modules_loaded() {
32
		Jetpack::enable_module_configurable( $this->module );
33
		Jetpack::module_configuration_load( $this->module, array( $this, 'jetpack_configuration_load' ) );
34
		Jetpack::module_configuration_screen( $this->module, array( $this, 'jetpack_configuration_screen' ) );
35
	}
36
37
	public function jetpack_configuration_load() {
38
		if ( Jetpack::is_user_connected() && ! self::is_active() ) {
39
			Jetpack::deactivate_module( $this->module );
40
			Jetpack::state( 'message', 'module_deactivated' );
41
			wp_safe_redirect( Jetpack::admin_url( 'page=jetpack' ) );
42
			die();
43
		}
44
		if ( ! empty( $_POST['action'] ) && $_POST['action'] == 'monitor-save' ) {
45
			check_admin_referer( 'monitor-settings' );
46
			$this->update_option_receive_jetpack_monitor_notification( isset( $_POST['receive_jetpack_monitor_notification'] ) );
47
			Jetpack::state( 'message', 'module_configured' );
48
			wp_safe_redirect( Jetpack::module_configuration_url( $this->module ) );
49
			exit;
50
		}
51
	}
52
53
	public function jetpack_configuration_screen() {
54
		?>
55
		<p><?php esc_html_e( 'Nobody likes downtime, and that\'s why Downtime Monitor is on the job, keeping tabs on your site by checking it every five minutes. As soon as any downtime is detected, you will receive an email notification alerting you to the issue. That way you can act quickly, to get your site back online again!', 'jetpack' ); ?>
56
		<p><?php esc_html_e( 'We’ll also let you know as soon as your site is up and running, so you can keep an eye on total downtime.', 'jetpack'); ?></p>
57
		<div class="narrow">
58
		<?php if ( Jetpack::is_user_connected() && current_user_can( 'manage_options' ) ) : ?>
59
			<?php $user_email = Jetpack::get_connected_user_email(); ?>
60
			<form method="post" id="monitor-settings">
61
				<input type="hidden" name="action" value="monitor-save" />
62
				<?php wp_nonce_field( 'monitor-settings' ); ?>
63
64
				<table id="menu" class="form-table">
65
						<tr>
66
						<th scope="row">
67
							<?php _e( 'Notifications', 'jetpack' ); ?>
68
						</th>
69
						<td>
70
							<label for="receive_jetpack_monitor_notification">
71
									<input type="checkbox" name="receive_jetpack_monitor_notification" id="receive_jetpack_monitor_notification" value="receive_jetpack_monitor_notification"<?php checked( self::user_receives_notifications() ); ?> />
72
								<span><?php _e( 'Receive Monitor Email Notifications.' , 'jetpack'); ?></span>
73
							</label>
74
							<p class="description"><?php printf( __( 'Emails will be sent to %s (<a href="%s">Edit</a>)', 'jetpack' ), $user_email, 'https://wordpress.com/settings/account/'); ?></p>
75
						</td>
76
					</tr>
77
				</table>
78
				<?php submit_button(); ?>
79
			</form>
80
		<?php else : ?>
81
			<p><?php _e( 'This profile is not currently linked to a WordPress.com Profile.', 'jetpack' ); ?></p>
82
		<?php endif; ?>
83
		</div>
84
		<?php
85
	}
86
87 View Code Duplication
	public function is_active() {
88
		Jetpack::load_xml_rpc_client();
89
		$xml = new Jetpack_IXR_Client( array(
90
			'user_id' => get_current_user_id()
91
		) );
92
		$xml->query( 'jetpack.monitor.isActive' );
93
		if ( $xml->isError() ) {
94
			wp_die( sprintf( '%s: %s', $xml->getErrorCode(), $xml->getErrorMessage() ) );
95
		}
96
		return $xml->getResponse();
97
	}
98
99
	public function update_option_receive_jetpack_monitor_notification( $value ) {
100
		Jetpack::load_xml_rpc_client();
101
		$xml = new Jetpack_IXR_Client( array(
102
			'user_id' => get_current_user_id()
103
		) );
104
		$xml->query( 'jetpack.monitor.setNotifications', (bool) $value );
105
106
		if ( $xml->isError() ) {
107
			wp_die( sprintf( '%s: %s', $xml->getErrorCode(), $xml->getErrorMessage() ) );
108
		}
109
110
		// To be used only in Jetpack_Core_Json_Api_Endpoints::get_remote_value.
111
		update_option( 'monitor_receive_notifications', (bool) $value );
112
113
		return true;
114
	}
115
116
	/**
117
	 * Checks the status of notifications for current Jetpack site user.
118
	 *
119
	 * @since 2.8
120
	 * @since 4.1.0 New parameter $die_on_error.
121
	 *
122
	 * @param bool $die_on_error Whether to issue a wp_die when an error occurs or return a WP_Error object.
123
	 *
124
	 * @return boolean|WP_Error
125
	 */
126
	static function user_receives_notifications( $die_on_error = true ) {
127
		Jetpack::load_xml_rpc_client();
128
		$xml = new Jetpack_IXR_Client( array(
129
			'user_id' => get_current_user_id()
130
		) );
131
		$xml->query( 'jetpack.monitor.isUserInNotifications' );
132
133
		if ( $xml->isError() ) {
134
			if ( $die_on_error ) {
135
				wp_die( sprintf( '%s: %s', $xml->getErrorCode(), $xml->getErrorMessage() ) );
136
			} else {
137
				return new WP_Error( $xml->getErrorCode(), $xml->getErrorMessage(), array( 'status' => 400 ) );
138
			}
139
		}
140
		return $xml->getResponse();
141
	}
142
143 View Code Duplication
	public function activate_monitor() {
144
		Jetpack::load_xml_rpc_client();
145
		$xml = new Jetpack_IXR_Client( array(
146
			'user_id' => get_current_user_id()
147
		) );
148
149
		$xml->query( 'jetpack.monitor.activate' );
150
151
		if ( $xml->isError() ) {
152
			wp_die( sprintf( '%s: %s', $xml->getErrorCode(), $xml->getErrorMessage() ) );
153
		}
154
		return true;
155
	}
156
157 View Code Duplication
	public function deactivate_monitor() {
158
		Jetpack::load_xml_rpc_client();
159
		$xml = new Jetpack_IXR_Client( array(
160
			'user_id' => get_current_user_id()
161
		) );
162
163
		$xml->query( 'jetpack.monitor.deactivate' );
164
165
		if ( $xml->isError() ) {
166
			wp_die( sprintf( '%s: %s', $xml->getErrorCode(), $xml->getErrorMessage() ) );
167
		}
168
		return true;
169
	}
170
171
	/*
172
	 * Returns date of the last downtime.
173
	 *
174
	 * @since 4.0.0
175
	 * @return date in YYYY-MM-DD HH:mm:ss format
176
	 */
177
	public function monitor_get_last_downtime() {
178
//		if ( $last_down = get_transient( 'monitor_last_downtime' ) ) {
179
//			return $last_down;
180
//		}
181
182
		Jetpack::load_xml_rpc_client();
183
		$xml = new Jetpack_IXR_Client( array(
184
			'user_id' => get_current_user_id()
185
		) );
186
187
		$xml->query( 'jetpack.monitor.getLastDowntime' );
188
189
		if ( $xml->isError() ) {
190
			return new WP_Error( 'monitor-downtime', $xml->getErrorMessage() );
191
		}
192
193
		set_transient( 'monitor_last_downtime', $xml->getResponse(), 10 * MINUTE_IN_SECONDS );
194
195
		return $xml->getResponse();
196
	}
197
198
}
199
200
new Jetpack_Monitor;
201