メール欄があるレスだけ表示

メール欄があるレスだけ表示するボタンを追加します(同じメールアドレスのレスは最新のものだけ表示します)

目前为 2018-09-14 提交的版本。查看 最新版本

// ==UserScript==
// @name     メール欄があるレスだけ表示
// @version  2.5
// @grant    none
// @include  https://*.2chan.net/*/res/*
// @description メール欄があるレスだけ表示するボタンを追加します(同じメールアドレスのレスは最新のものだけ表示します)
// @namespace https://gf.qytechs.cn/users/114367
// ==/UserScript==

// ----------------------------------------
// 設定
var CONFIG = {
  showListOnPageLoaded: false,
  showListEvenWithoutMails: true,
  mailRegex: /^.+$/
};

// ----------------------------------------
// CSS
// [✉]ボタン
document.styleSheets[0].insertRule(`
	.mail-list-btn {
		cursor: pointer;
	}
`);
document.styleSheets[0].insertRule(`
	.mail-list-btn-on {
		color: #00f;
	}
`);
// リストの表示位置とか
document.styleSheets[0].insertRule(`
  .res-list-container {
    bottom: 20px;
    display: block;
		font-size: 12px;
    position: fixed;
    right: 5px;
    transition: .2s;
    width: 300px;
    z-index: 99;
  }
`);
// 件数表示
document.styleSheets[0].insertRule(`
	.res-count-label {
		display: block;
	}
`);
// レス全体
document.styleSheets[0].insertRule(`
  .res {
    background: #0002;
    border-radius: 5px;
    color: #800;
    margin: 5px;
    padding: 5px;
  }
`);
// メールアドレス
document.styleSheets[0].insertRule(`
  .res-mail {
    color: #00f;
  }
`);
// レス本文
document.styleSheets[0].insertRule(`
  .res-text {
		font-size: 90%;
    margin: 0;
		padding-left: 5px;
		width: auto;
  }
`);
// リストOFF時
document.styleSheets[0].insertRule(`
	.res-list-transparent {
		opacity: 0;
		pointer-events: none;
	}
`)

// ----------------------------------------
// Utils
var newElement = (tag, clazz, text) => {
  var e = document.createElement(tag);
  e.className = clazz;
  if (text) {
	  e.textContent = text;
  }
  return e;
};

// ----------------------------------------
// Properties
var mails = [];
var resList = {};

// ----------------------------------------
// Add elements
var resListContainer = newElement('DIV', 'res-list-container res-list-transparent', '');
document.body.insertBefore(resListContainer, null);
resListContainer.addEventListener('click', e => {
  if (e.target.classList.contains('res-mail')) {
    resList[e.target.textContent].mailElement.scrollIntoView({ behavior: 'smooth'});
  }
});
var resListCountLabel = newElement('DIV', 'res res-count-label', '');
var refreshResListCountLabel = () => { resListCountLabel.textContent = '✉ x ' + mails.length; };
refreshResListCountLabel();
resListContainer.insertBefore(resListCountLabel, null);
var mailButton = newElement('SPAN', 'res-list-button', '[✉]');

// ----------------------------------------
// Main
var lastCount = 0;
var searchRess = () => {
  var beforeCount = lastCount;
  var rtds = document.getElementsByClassName('rtd');
  lastCount = rtds.length;
  if (beforeCount === lastCount) return false
  var result = false;
  var newMails = [];
  var ignores = ['sage', '[sage]'];
  for (var i = lastCount - 1, rtd; rtd = rtds[i]; i --) {
    if (rtd.getAttribute('data-mail-searched')) break;
    rtd.setAttribute('data-mail-searched', '1');
    var mailElement =
        rtd.querySelector('[href^="mailto:"]') || // default
        rtd.getElementsByClassName('KOSHIAN_meran')[0] || // kosian
        rtd.querySelector('[color="#005ce6"]'); // futakuro
    if (!mailElement) continue;
    result = true;
    var mail = mailElement.href ? decodeURI(mailElement.href).replace('mailto:', '') : mailElement.textContent;
    if (ignores.indexOf(mail) !== -1) continue;
    if (!mail.match(CONFIG.mailRegex)) continue;
    if (!resList[mail]) newMails.unshift(mail);
    // BLOCKQUOTEタグを変なところにコピーすると一部のアドオンの動作がおかしくなるので本文はDIVにコピーする
    var text = document.createElement('DIV');
    var n = rtd.getElementsByTagName('BLOCKQUOTE')[0].firstChild;
    while (n) {
      text.appendChild(n.cloneNode(true));
      n = n.nextSibling;
    }
    resList[mail] = { mailElement: mailElement, text: text };
    ignores.push(mail);
  }
  mails = mails.concat(newMails);
  return result;
};

var refleshList = () => {
  var isUpdated = searchRess();
  if (!isUpdated) return;
  refreshResListCountLabel();
  mails.forEach(mail => {
    var resText = document.getElementById('res_text_' + mail);
    if (resText) {
      resText.replaceChild(resList[mail].text, resText.firstChild);
      return;
    }
    resText = newElement('DIV', 'res-text', '');
    resText.id = 'res_text_' + mail;
    resText.insertBefore(resList[mail].text, null);
    var res = newElement('DIV', 'res', '');
    res.insertBefore(newElement('DIV', 'res-mail', mail), null);
    res.insertBefore(resText, null);
    resListContainer.insertBefore(res, resListCountLabel);
  });
};

// ----------------------------------------
// List ON OFF
var timer;

var listOff = () => {
  if (!timer) return;
  clearInterval(timer);
  timer = null;
  resListContainer.classList.add('res-list-transparent');
  mailButton.classList.remove('mail-list-btn-on');
};

var listOn = () => {
  listOff();
  refleshList();
  if (CONFIG.showListEvenWithoutMails || mails.length) {
    resListContainer.classList.remove('res-list-transparent');
  }
  mailButton.classList.add('mail-list-btn-on');
	timer = setInterval(refleshList, 1500);
};

var toggle = e => {
  if (timer) {
    listOff();
  } else {
    listOn();
  }
};

var addMailButton = () => {
  mailButton.addEventListener('click', toggle);
  var futakuroBorderArea = document.getElementById('border_area');
  if (futakuroBorderArea) {
    futakuroBorderArea.insertBefore(mailButton, null);
  } else {
    document.getElementById('contres').insertBefore(mailButton, document.getElementById('contdisp').nextSibling);
  }
};

// ----------------------------------------
// START HERE !

// wait for futakuro
setTimeout(addMailButton, 500); 

if (CONFIG.showListOnPageLoaded) {
	listOn();
}

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址