コンテンツにスキップ

利用者:Yuukin0248/addAFDtoDailyLog.js

お知らせ: 保存した後、ブラウザのキャッシュをクリアしてページを再読み込みする必要があります。

多くの WindowsLinux のブラウザ

  • Ctrl を押しながら F5 を押す。

Mac における Safari

  • Shift を押しながら、更新ボタン をクリックする。

Mac における ChromeFirefox

  • Cmd Shift を押しながら R を押す。

詳細についてはWikipedia:キャッシュを消すをご覧ください。

/**
 * addAFDtoDailyLog.js
 * 閲覧中の削除依頼サブページが日次ログページに掲載されていない場合
 * 半自動でその日の日次ログページに追加
 */

// <nowiki>

{
  /** エラー表示 */
  const handleError = function (err, msg) {
    mw.notify(msg + '詳細はコンソールを参照。');
    console.log('error: ', err);
  };

  /** 参照読み込みされているかどうか判定 */
  const isTranscluded = function (pageName) {
    const params = {
      action: 'query',
      titles: pageName,
      prop: 'transcludedin',
      tinamespace: '4',
      format: 'json',
    };
    return new mw.Api().get(params).then(
      function (data) {
        const pages = data.query.pages;
        for (const key in pages) {
          return typeof pages[key].transcludedin !== 'undefined';
        }
      },
      (err) => handleError(err, 'このページを参照読み込みしているページの取得に失敗しました。')
    );
  };

  /** 日次ログページの末尾に削除依頼サブページを追加 */
  const addToDailyLog = function (dailyPage, pageName) {
    const params = {
      action: 'edit',
      title: dailyPage,
      nocreate: true,
      appendtext: `\n{{${pageName}}}`,
      summary: `[[${pageName}]]を追加 ([[利用者:Yuukin0248/addAFDtoDailyLog.js|スクリプト]]使用)`,
      format: 'json',
    };
    return new mw.Api().postWithToken('csrf', params);
  };

  /** 日次ログページに追加したことを削除依頼サブページに報告 */
  const informAFDPage = function (dailyPage, pageName) {
    const params = {
      action: 'edit',
      title: pageName,
      nocreate: true,
      appendtext: `\n* {{報告}} [[${dailyPage}]]に追加しました。--~~~~`,
      summary: '日次ログへの追加を報告 ([[利用者:Yuukin0248/addAFDtoDailyLog.js|スクリプト]]使用)',
      format: 'json',
    };
    return new mw.Api().postWithToken('csrf', params);
  };

  const { wgAction, wgPageName, wgPostEdit } = mw.config.get(['wgAction', 'wgPageName', 'wgPostEdit']);

  // 削除依頼サブページを閲覧中であれば
  if (wgAction === 'view' && /^Wikipedia:削除依頼\/[^ログ]/.test(wgPageName)) {
    // 依存関係を読み込み、画面表示が完了するのを待つ
    $.when($.ready, mw.loader.using(['mediawiki.api', 'oojs-ui'])).then(async function () {
      // 依頼直後か、依頼がクローズされていなくて参照読み込み数が0ならば
      if (wgPostEdit === 'created' || (!$('.xfd-closed').length && !(await isTranscluded(wgPageName)))) {
        const now = new Date();
        const dailyPage = `Wikipedia:削除依頼/ログ/${now.getFullYear()}${now.getMonth() + 1}${now.getDate()}日`;

        // 確認メッセージを表示
        new OO.ui.confirm(`この削除依頼は日付別ログに掲載されていません。「${dailyPage}」に自動で追加しますか?`)
          // 「はい」が選択されたら、日次ログに追加する関数を実行
          .then((confirmed) => (confirmed ? addToDailyLog(dailyPage, wgPageName) : false))
          // res は JQuery.Promise (truthy) か false
          .then(
            function (res) {
              if (!res) return false;
              return wgPostEdit === 'created'
                ? OO.ui.alert(`「${dailyPage}」に追加しました。`).then(() => false)
                : OO.ui.confirm(`「${dailyPage}」に追加しました。削除依頼に自動で報告しますか?`);
            },
            (err) => handleError(err, '日次ログへの追加に失敗しました。')
          )
          // 「はい」が選択されたら、閲覧中の削除依頼サブページに「日次ログに追加した」旨を報告する関数を実行
          .then((confirmed) => (confirmed ? informAFDPage(dailyPage, wgPageName) : false))
          // res は JQuery.Promise (truthy) か false
          .then(
            (res) => (res ? OO.ui.confirm('報告が完了しました。ページを再読込しますか?') : false),
            (err) => handleError(err, '報告に失敗しました。')
          )
          // 「はい」が選択されたら、ページを再読込
          .then((confirmed) => (confirmed ? location.reload() : false));
      }
    });
  }
}

// </nowiki>