oshioki notifecation

おしおき支援ソフト第1弾 発展場情報の板が自動更新します。 ついでに音でお知らせします。

// ==UserScript==
// @name        oshioki notifecation
// @namespace   QuinceProject
// @description おしおき支援ソフト第1弾 発展場情報の板が自動更新します。 ついでに音でお知らせします。
// @include     http://77.xmbs.jp/miyuki-*-br_res.php?*
// @exclude     *disp=*
// @version     1.02
// @grant       none
// ==/UserScript==
//
// 対象ウェブブラウザは以下の通りです
// Firefox : 3.5以降(HTML5.1対応ブラウザ)
// (Chromeについては現在確認できていません)
//

(function(){

//設定 (☆星がついたものは変更可能です)
//設定はCookieによる保護をしています。
	var Cookies_Recipe ={
	// ☆ cookieの保管日数 ☆
		hokanbi : 14,
	// ☆ お知らせ音のURL/pass ☆
		load_Music : "https://dl.dropbox.com/u/7079101/coin.mp3",
	// ☆ お知らせ音のボリューム(0-100の範囲) ☆
		volume_Music : 60,
	// ☆ リロード時間 (サーバー保護のため60秒以上にしてください) ☆ 
		reload_Time : 60,
		
	//対象の掲示板のURL
		load_URL : "",
	//最後にリロードした時のレス番号
		Res_Last : 1,
	//最後にチェックした時のレス番号( Res_Last >= Res_Checked )
		Res_Checked : 1,
	};
	
//最新レス番号の取得用関数
	function load_ResNo(){
		var myNumber;
		var myNodes = document.getElementsByTagName('font');
		myString = new String();
		myString = myNodes[9].firstChild.nodeValue; 
				//9番目のfont直下が最新レスの番号に当たる
		if(!myString){
			myNumber = 0;
				//fontの最初の子ノードが文字列でなければ0を返す
		}
		else{
			myString = myString.replace( /\D/ , '' ); //数字以外を消す
			myNumber = parseInt(myString,10);
			if(!myNumber){
				myNumber = -1;
				//TEXTの形式が"No.XXXX"でなければ-1を返す
			}
		}
		return myNumber;
	}
	
//Cookieの書き込み用関数
	function makeCookie(MyCookies_Recipe){
		var expire = new Date();
		expire.setTime( expire.getTime() + MyCookies_Recipe.hokanbi * 1000 * 3600 * 24 );
		document.cookie = 'load_URL='+ MyCookies_Recipe.load_URL + '; expires=' + expire.toUTCString();
		document.cookie = 'Res_Last='+ MyCookies_Recipe.Res_Last + '; expires=' + expire.toUTCString();
		document.cookie = 'Res_Checked='+ MyCookies_Recipe.Res_Checked + '; expires=' + expire.toUTCString();
		document.cookie = 'load_Music='+ MyCookies_Recipe.load_Music + '; expires=' + expire.toUTCString();
		document.cookie = 'volume_Music='+ MyCookies_Recipe.volume_Music + '; expires=' + expire.toUTCString();
		document.cookie = 'reload_Time='+ MyCookies_Recipe.reload_Time + '; expires=' + expire.toUTCString();
		return 0;
	}
	
//Cookieの読み取り用関数
	function eatCookie(MyCookies_Recipe){
		var allcookies = document.cookie;
		if( allcookies != ''){
			var cookies = allcookies.split( ';' );
			for(var i = 0;i < cookies.length; i++){
				cookies[i] = cookies[i].replace( /=/ , ';' );  //最初の'='のみ置き換え
				cookies[i] = cookies[i].replace( / /gi , '' ); //空白は消す
				var cookie = cookies[i].split( ';' );          //もとが'='の部分で分割
				
				if(cookie[0] == "load_URL"){
					MyCookies_Recipe.load_URL = cookie[1];
				}else if(cookie[0] == "Res_Last"){
					MyCookies_Recipe.Res_Last = parseInt(cookie[1]);
				}else if(cookie[0] == "Res_Checked"){
					MyCookies_Recipe.Res_Checked = parseInt(cookie[1]);
				}else if(cookie[0] == "load_Music"){
					MyCookies_Recipe.load_Music = cookie[1];
				}else if(cookie[0] == "volume_Music"){
					MyCookies_Recipe.volume_Music = parseInt(cookie[1]);
				}else if(cookie[0] == "reload_Time"){
					MyCookies_Recipe.reload_Time = parseInt(cookie[1]);
				}
			}
		}
		return true;
	}
  
//レスチェック時の差分の判断関数
  function ResChecked_sabun(arg){
    if(arg == 0){
      document.getElementById("resInfoTxt").innerHTML = "おしらせ:現在未読はありません";
			return true;
    }else if(arg > 0){
      document.getElementById("resInfoTxt").innerHTML = "おしらせ:未読が" + arg + "件あります";
			return true;
    }else{
      document.getElementById("resInfoTxt").innerHTML = "おしらせ:ResCheckError";
			return false;
    }
  }
  
//レス確認のボタンを押した時(.resInfoBtn.onclick)
  function resetResChecked(MyCookies_Recipe){
    MyCookies_Recipe.Res_Checked = MyCookies_Recipe.Res_Last;
    ResChecked_sabun(0);
    makeCookie(MyCookies_Recipe);
		return true;
  }
    
//I/Oフォーム(上部追加分)のひな形用関数
  function IOForm_hinagata(MyCookies_Recipe){
    var IOFormHeaderCenter = document.createElement("center");
    
    var IOFormHeader = document.createElement("div");
    IOFormHeader.id = "IOFormHeader";
    
    var resInfo = document.createElement("div");
    resInfo.id = "resInfo";
    
    var resInfoBtn = document.createElement("input");
    resInfoBtn.id = "resInfoBtn";
    resInfoBtn.className = "SidebySide";
    resInfoBtn.type = "button";
    resInfoBtn.value = "確認";
    resInfoBtn.onclick = function(){resetResChecked(MyCookies_Recipe);};
    
    var resInfoTxt = document.createElement("div");
    resInfoTxt.id = "resInfoTxt";
    resInfoTxt.className = "SidebySide";
    
    document.body.insertBefore(IOFormHeaderCenter,document.body.firstChild);
    IOFormHeaderCenter.appendChild(IOFormHeader);
    IOFormHeader.appendChild(resInfo);
    resInfo.appendChild(resInfoTxt);
    resInfo.appendChild(resInfoBtn);
    return IOFormHeader;
  }
  
//リロード時の関数
	function funcExit(){
		window.stop();		//一旦読み込み中止してからでないと、次に上手く読み込まない?
		location.reload(true);	//キャッシュは破棄してリロード
	}
	
//CSS追加用関数
  function addGlobalStyle(css) {                         // Head部分にstyleを追加する関数
    var head, style;
    head = document.getElementsByTagName('head')[0];         // head要素を取る
    if (!head) { return }
    style = document.createElement('style');                 // 要素styleをつくる
    style.type = 'text/css';                                     // styleの属性typeを追加
    style.innerHTML = css;                                       // styleの属性として引数cssを追加
    head.appendChild(style);                                 // headの中に要素styleを追加する
  }
  
//追加CSS
  addGlobalStyle('.SidebySide {display : inline-block;font-size: small; }');
  
//本文
		//Cookieの取得(設定データ)
	eatCookie(Cookies_Recipe);
	
		//リロード時間はここで先に指定
	var Timer = setTimeout(funcExit,Cookies_Recipe.reload_Time * 1000);

		//事前に音声を取得
	var audio = new Audio(Cookies_Recipe.load_Music);
	audio.volume = Cookies_Recipe.volume_Music / 100.;

		//page内の最新レス番号を取得
	var Res_Now = load_ResNo();
	if(Res_Now == 0 || Res_Now == 1){
		alert("仕様変更?\n製作者に連絡ください\n(Res_Now = " + Res_Now + ")");
		return 0;
	}
	else{
			//ひな形の作成
		var IOForm = IOForm_hinagata(Cookies_Recipe);
    
			//URLに対応したCookieがなければ、新たに作る
		if(Cookies_Recipe.load_URL == location.href){
			if(Cookies_Recipe.Res_Last != Res_Now){
				audio.play();
				Cookies_Recipe.Res_Last = Res_Now;
			}
			ResChecked_sabun(Res_Now - Cookies_Recipe.Res_Checked);
		}else{
			Cookies_Recipe.load_URL = location.href;
			Cookies_Recipe.Res_Last = Res_Now;
			Cookies_Recipe.Res_Checked = Res_Now;
			ResChecked_sabun(Res_Now - Cookies_Recipe.Res_Checked);
		}
		makeCookie(Cookies_Recipe);
	}
  
})()