MediaWiki:CheckServerStatusBeforeSending.js

出典: 謎の百科事典もどき『エンペディア(Enpedia)』
ナビゲーションに移動 検索に移動

注意: 保存後、変更を確認するにはブラウザーのキャッシュを消去する必要がある場合があります。

  • Firefox / Safari: Shift を押しながら 再読み込み をクリックするか、Ctrl-F5 または Ctrl-R を押してください (Mac では ⌘-R)
  • Google Chrome: Ctrl-Shift-R を押してください (Mac では ⌘-Shift-R)
  • Internet Explorer / Microsoft Edge: Ctrl を押しながら 最新の情報に更新 をクリックするか、Ctrl-F5 を押してください
  • Opera: Ctrl-F5を押してください
/**
 * Copyright (C) 2015-2024 rxy.
 * Author: rxy ( https://rxy.jp/ )
 * License: MIT
 * License detail: http://opensource.org/licenses/MIT
 * Version: 2.0.0.0
 */
var status_check_enabled = ( typeof cssbs_settings.enabled === "undefined" ) ? true : cssbs_settings.enabled ;
var status_check_enable_http_header = ( typeof cssbs_settings.check_http_header_status === "undefined" ) ? false : cssbs_settings.check_http_header_status;
$(function() {
	var wasCheck = false;
	var buttonsDisabled = false;

	function ckstatus( wasCheckArg ){
		if( wasCheckArg ){
			return;
		}
		$.ajaxSetup( { timeout: 2000 } );
		$.getJSON( "/epstatus/", { 'ckhtst': status_check_enable_http_header } )
		.done(function( data ) {
			var disableButtonsType = false;
			switch( data.status ){
				case 'up':
					if ( buttonsDisabled === true ){ removeDisabled(); }
					break;
				case 'down':
					disableButtonsType = 'down_notice';
					break;
				case 'maintenance':
					disableButtonsType = 'maintenance_notice';
					break;
				case 'error_http_500':
				case 'error_http_503':
					disableButtonsType = data.status;
					break;
				default:
					alert('CSSBS: Unknown error occurred.');
			}
			if ( disableButtonsType !== false ) {
				disableButtons(
					disableButtonsType,
					data.reason,
					Date.parse(data.current_date),
					data.start_date,
					data.end_date
				);
			}
		})
		.fail(function(){
			disableButtons(
				'down',
				null,
				Date.now(),
				null,
				null
			);
		});
	}

	function disableButtons(type, argReason, cDate, sDate, eDate){
		$( '.editButtons > span[data-ooui]' ).each(function(){
			OO.ui.infuse( this ).setDisabled( true );
		});
		buttonsDisabled = true;
		var cdatefmt = new Date(cDate);
		var $reason_li = '';
		switch( type ){
			case 'down_notice':
				$reason_li = $(
					'<li>',
					{
						id: 'server_status_msg_description',
						'data-cssbs-type': 'down_notice',
						text: 'サーバーはサービスの停止を計画しています。',
					}
				);
				break;
			case 'down':
				$reason_li = $(
					'<li>',
					{
						id: 'server_status_msg_description',
						'data-cssbs-type': 'down',
						text: 'サーバーへの接続に失敗しました。状態通知システムに異常が発生しているか、サーバー自体がダウンしている可能性があります。',
					}
				);
				break;
			case 'maintenance_notice':
				break;
			case 'error_http_500':
				break;
			case 'error_http_503':
				break;
		}
		if ( argReason !== null && argReason !== '' ){
			$reason_li.append( '<li>', { id: 'server_status_msg_reason' } );
		}
		if ( $( '.editOptions' ).has( '#server_status_msg' ).length === 0 ){
			$( '.editButtons' ).after(
				$(
					'<div>',
					{
						id: 'server_status_msg',
						style: 'border:solid 1px #ff8888;background-color:#ffdddd; margin: 0.25rem 0;'
					}
				).append(
					$( '<ul>' ).append(
						$(
							'<li>',
							{
								text: '編集内容が失われる可能性があるため、「保存」や「プレビュー」等のボタンを無効化しました。'
							}
						),
						$reason_li,
						$( '<li>', { id: 'server_status_msg_ck-current-date' } )
					),
					$(
						'<input>',
						{
							id: 'ckstatus',
							type: 'button',
							value: '再確認',
						}
					),
					$(
						'<input>',
						{
							id: 'enablebuttons',
							type: 'button',
							value: '無視してボタンを有効化',
						}
					)
				)
			);
		} else if ( type !== $( '#server_status_msg_description' ).data( 'cssbs-type' ) ){
			$( '#server_status_msg_description' ).replaceWith( $reason_li );
		}
		if ( sDate !== null && sDate !== '' && $( '#server_status_msg' ).has( '#server_status_msg_sdate' ).length === 0 ){
			$( '#server_status_msg > ul' ).append( $( '<li>', { id: 'server_status_msg_sdate'} ) );
		}
		if ( eDate !== null && eDate !== '' && $( '#server_status_msg' ).has( '#server_status_msg_edate' ).length === 0 ){
			$( '#server_status_msg > ul' ).append( $( '<li>', { id: 'server_status_msg_edate'} ) );
		}
		if ( argReason !== null && argReason !== '' ){
			$( '#server_status_msg_reason' ).text('理由:' + argReason);
		} else if ( $( '#server_status_msg' ).has( '#server_status_msg_reason' ).length > 0 ){
			$( '#server_status_msg_reason' ).remove();
		}
		$( '#server_status_msg_ck-current-date' ).text('最終確認日時:' + cdatefmt.toLocaleString('ja-JP') + ' (日本標準時)');
		if ( sDate !== null && sDate !== '' ){
			var sdatefmt = new Date(sDate);
			$( '#server_status_msg_sdate' ).text('開始予定日時:' + sdatefmt.toLocaleString('ja-JP') + ' (日本標準時)');
		} else if ( $( '#server_status_msg' ).has( '#server_status_msg_sdate' ).length > 0 ){
			$( '#server_status_msg_sdate' ).remove();
		}
		if ( eDate !== null && eDate !== '' ){
			var edatefmt = new Date(eDate);
			$( '#server_status_msg_edate' ).text('終了予定日時:' + edatefmt.toLocaleString('ja-JP') + ' (日本標準時)');
		} else if ( $( '#server_status_msg' ).has( '#server_status_msg_edate' ).length > 0 ){
			$( '#server_status_msg_edate' ).remove();
		}
	}

	function removeDisabled(){
		$( '.editButtons > span[data-ooui]' ).each(function(){
			OO.ui.infuse( this ).setDisabled( false );
		});
		buttonsDisabled = false;
		$( '#server_status_msg' ).remove();
	}

	function wasCheckClear(){
		wasCheck = false;
	}

	if ( status_check_enabled && ( mw.config.get( 'wgAction' ) == 'edit' || mw.config.get( 'wgAction' ) == 'submit' ) ){
		$( ".editButtons > input" ).mouseenter(function(){
			ckstatus(wasCheck);
			wasCheck = true;
		});
		$( ".editOptions input" ).focus(function(){
			ckstatus(wasCheck);
			wasCheck = true;
		});
		$( '.editOptions' ).on( 'click', 'input#ckstatus', function(){
			ckstatus(false);
		}).on( 'click', 'input#enablebuttons', function(){
			if (confirm("警告を無視することにより編集内容が失われる可能性があります。\n続行する前にローカル(メモ帳等)へのコピーを強くお勧めします。\nそれでも続行しますか?")){
				wasCheck = true;
				removeDisabled();
			}
		});
		setInterval( wasCheckClear, 30000 );
	}
});