Last active
August 29, 2018 12:31
-
-
Save hot-2130/c49493299dadd57bab9ddf9987df45e4 to your computer and use it in GitHub Desktop.
ブラウザ三国志 拠点画面に遠征訓練所・見張り台の一括建築完了日時一覧を表示
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| // ==UserScript== | |
| // @name bro3_enkunbank_view | |
| // @namespace bro3_enkunbank_view | |
| // @description ブラウザ三国志 一括建築完了日時表示(遠征訓練所・見張り台) byほっと | |
| // @include https://*.3gokushi.jp/village.php* | |
| // @include http://*.3gokushi.jp/village.php* | |
| // @version 1.5 | |
| // @require http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js | |
| // ==/UserScript== | |
| // version date author | |
| // 1.1 2018/06/25 作成開始 | |
| // 1.3 2018/08/01 https対応 | |
| // 1.4 2018/08/05 プロトコル変更対応 | |
| // 1.5 2018/08/29 拠点リンク追加 | |
| // to do | |
| // 一括建築中の遠征訓練所、見張り台の完了時間を拠点画面に表示します | |
| // 更新ボタンを押すと全拠点の遠征訓練所と見張り台の一括建築取得処理を行います | |
| // 完了時間が20時間以内の場合、文字が朱色になります | |
| // load jQuery | |
| jQuery.noConflict(); | |
| j$ = jQuery; | |
| //----------// | |
| // 変数定義 // | |
| //----------// | |
| // ソフトウェアバージョン | |
| var VERSION = "1.5"; | |
| var SERVER_NAME = location.hostname.match(/^(.*)\.3gokushi/)[1]; | |
| // 特殊定数 | |
| var PROTOCOL = location.protocol; | |
| var HOST = location.hostname; // アクセスURLホスト | |
| var SERVICE = ''; // サービス判定が必要な場合に使用する予約定数 | |
| var SVNAME = HOST.substr(0,location.hostname.indexOf(".")) + SERVICE; | |
| var EKV_KEY = "EKV_" + HOST.substr(0,HOST.indexOf(".")); | |
| var m_vilid = ''; | |
| //----------------// | |
| // メインルーチン // | |
| //----------------// | |
| (function() { | |
| //css定義を追加 | |
| ekv_addCss(); | |
| j$("#maps").prepend( | |
| "<div id=ekv_enkview style='border-radius: 5px;background-color: #000000;color: #ffffff; width:320px;margin-left: 245px;margin-top: -48px;'>\ | |
| <p style='border-bottom: solid 1px #ffffff;'><span id=ekv_enkhead style='margin-left: 10px;margin-top: 5px;font-size:12px;'>遠訓/見張り台一括建築完了日時</span><input type='button' value=\"更新\" id=ekv_enkbtn style='width: 40px; height: 18px;font-size:10px;margin-left: 10px;'></p> \ | |
| <div id=ekv_enktext class='scrollArea' style='overflow-y:scroll;margin: 5px 5px 5px 5px;height:50px;font-size:10px;'></div> \ | |
| </div>" | |
| ); | |
| j$("#ekv_enkbtn").on("click", function(){ | |
| j$("#ekv_enkbtn").text("取得中"); | |
| //遠訓建築情報初期化 | |
| var l_enkTimeAll = []; | |
| ekv_saveData(EKV_KEY+"_enkTime", l_enkTimeAll, true); | |
| var promise1 = Promise.resolve(); | |
| promise1 | |
| .then(ekv_allvil()) // 拠点読み取り | |
| .then(ekv_load) | |
| .then(ekv_getbanklist) // 貯金リスト | |
| .then(function(){ | |
| j$("#ekv_enkhead").text("遠訓/見張り台一括建築完了日時"); | |
| j$("#ekv_enkbtn").val("完了"); | |
| }) | |
| .catch(ekv_onRejectted); | |
| }); | |
| ekv_nowvil(); // 現拠点読み取り | |
| ekv_setbanklist(); // 貯金リスト表示 | |
| })(); | |
| function ekv_onRejectted(error) { | |
| console.log("error = " + error); | |
| } | |
| function ekv_nowvil(){ | |
| // 拠点の情報は一回消す | |
| var l_enkTimeList = ekv_loadData(EKV_KEY+"_enkTime", "[]", true); | |
| var l_enkTimeAll = []; | |
| ekv_saveData(EKV_KEY+"_enkTime", l_enkTimeAll, true); | |
| var l_vilid = j$(".basenameForm input:hidden[name='village_id']").val(); | |
| if (l_enkTimeList.length != 0 ){ | |
| for(var el = 0; el < l_enkTimeList.length; el++){ | |
| var l_enkTime = new Object; | |
| if (l_enkTimeList[el].id!=l_vilid){ | |
| l_enkTime.id=l_enkTimeList[el].id; | |
| l_enkTime.name=l_enkTimeList[el].name; | |
| l_enkTime.timer=l_enkTimeList[el].timer; | |
| l_enkTime.kind=l_enkTimeList[el].kind; | |
| l_enkTimeAll.push(l_enkTime); | |
| } | |
| } | |
| } | |
| ekv_saveData(EKV_KEY+"_enkTime", l_enkTimeAll, true); | |
| var l_lilen = j$("#actionLog li").length; | |
| for (var k=0; k<l_lilen; k++) { | |
| var l_txt=j$("#actionLog ul li").eq(k).text(); | |
| //遠征訓練所の一括建築を取得 | |
| if ((l_txt.indexOf("一括建設")!=-1) && ((l_txt.indexOf("遠征訓練所")!=-1) || (l_txt.indexOf("見張り台")!=-1))) { | |
| var l_kanryotime = j$("#actionLog ul span[class='buildTime']").eq(k).text(); | |
| var l_nokoritime = j$("#actionLog ul span[class='buildClock']").eq(k).text(); | |
| var l_kanryo = l_kanryotime.split(":"); | |
| var l_nokori = l_nokoritime.split(":"); | |
| var l_nokorimin = ((parseInt(l_nokori[0]))*3600)+((parseInt(l_nokori[1]))*60)+(parseInt(l_nokori[2])); | |
| var l_dt = new Date(); | |
| l_dt.setSeconds(l_dt.getSeconds() + l_nokorimin); | |
| var l_hours = l_dt.getHours(); //残り時間から計算した時間 | |
| if (((parseInt(l_kanryo[0]))==23)&&(l_hours==0)){ | |
| l_dt.setDate(l_dt.getDate() - 1); | |
| } | |
| if (((parseInt(l_kanryo[0]))==0)&&(l_hours==23)){ | |
| l_dt.setDate(l_dt.getDate() + 1); | |
| } | |
| //完了日時を登録 | |
| l_dt.setHours((parseInt(l_kanryo[0])),(parseInt(l_kanryo[1])),(parseInt(l_kanryo[2]))); | |
| l_vilid = j$(".basenameForm input:hidden[name='village_id']").val(); | |
| var l_name = j$(".basename span").eq(0).text(); | |
| var l_timer = l_dt.getTime(); //ミリ秒 | |
| //遠訓貯金リスト更新 | |
| var l_chk=0; | |
| l_enkTimeList = ekv_loadData(EKV_KEY+"_enkTime", "[]", true); | |
| l_enkTimeAll = []; | |
| ekv_saveData(EKV_KEY+"_enkTime", l_enkTimeAll, true); | |
| if (l_enkTimeList.length != 0) { | |
| for(var el = 0; el < l_enkTimeList.length; el++){ | |
| var l_enkTime = new Object; | |
| if(l_enkTimeList[el].id){ | |
| if (l_enkTimeList[el].id!=l_vilid){ | |
| l_enkTime.id=l_enkTimeList[el].id; | |
| l_enkTime.name=l_enkTimeList[el].name; | |
| l_enkTime.timer=l_enkTimeList[el].timer; | |
| l_enkTime.kind=l_enkTimeList[el].kind; | |
| } else { | |
| var l_chk2=0; | |
| if (l_txt.indexOf("遠征訓練所")!=-1){ | |
| if (l_enkTimeList[el].kind=="遠訓"){ | |
| l_enkTime.id=l_vilid; | |
| l_enkTime.name=l_name; | |
| l_enkTime.timer=l_timer; | |
| l_enkTime.kind="遠訓"; | |
| l_chk=1; | |
| l_chk2=1; | |
| } | |
| } else { | |
| if (l_enkTimeList[el].kind=="見張り"){ | |
| l_enkTime.id=l_vilid; | |
| l_enkTime.name=l_name; | |
| l_enkTime.timer=l_timer; | |
| l_enkTime.kind="見張り"; | |
| l_chk=1; | |
| l_chk2=1; | |
| } | |
| } | |
| if (l_chk2!=1){ | |
| l_enkTime.id=l_enkTimeList[el].id; | |
| l_enkTime.name=l_enkTimeList[el].name; | |
| l_enkTime.timer=l_enkTimeList[el].timer; | |
| l_enkTime.kind=l_enkTimeList[el].kind; | |
| } | |
| } | |
| l_enkTimeAll.push(l_enkTime); | |
| } | |
| } | |
| } | |
| if (l_chk!=1){ | |
| var l_enkTime = new Object; | |
| if (l_txt.indexOf("遠征訓練所")!=-1){ | |
| l_enkTime.id=l_vilid; | |
| l_enkTime.name=l_name; | |
| l_enkTime.timer=l_timer; | |
| l_enkTime.kind="遠訓"; | |
| } else { | |
| l_enkTime.id=l_vilid; | |
| l_enkTime.name=l_name; | |
| l_enkTime.timer=l_timer; | |
| l_enkTime.kind="見張り"; | |
| } | |
| l_enkTimeAll.push(l_enkTime); | |
| } | |
| ekv_saveData(EKV_KEY+"_enkTime", l_enkTimeAll, true); | |
| } | |
| } | |
| } | |
| function ekv_allvil(){ | |
| return function() { | |
| return new Promise(function (resolve, reject) { | |
| //拠点一覧取得 | |
| var arry_villist=[]; | |
| var arry_url=[]; | |
| var l_vilcnt=0; | |
| var l_vilid = j$(".basenameForm input:hidden[name='village_id']").val(); | |
| j$("div[class='sideBoxInner basename'] ul li").each(function(index){ | |
| var l_current = false; | |
| if (j$(this).attr("class") == 'on') { | |
| l_current = true; | |
| } | |
| if (l_current) { | |
| arry_villist[l_vilcnt]=j$("span", this).eq(0).text(); | |
| l_vilid = j$(".basenameForm input:hidden[name='village_id']").val(); | |
| l_url=PROTOCOL + "//" + HOST + "/village_change.php?village_id=" + l_vilid + "&from=menu&page=%2Fvillage.php"; | |
| arry_url[l_vilcnt]=l_url; | |
| } else { | |
| if (!(j$("span", this).eq(1).hasClass('buildingText'))){ | |
| arry_villist[l_vilcnt]=j$("a", this).eq(0).text(); | |
| l_url=PROTOCOL + "//" + HOST + j$("a", this).eq(0).attr('href'); | |
| arry_url[l_vilcnt]=l_url; | |
| } | |
| } | |
| l_vilcnt=l_vilcnt+1; | |
| }); | |
| m_vilid = l_vilid; | |
| var l_wait = false; | |
| var l_count = 0; | |
| var l_max = arry_villist.length; | |
| var l_url = ""; | |
| if (l_max < 1){ | |
| resolve(0); | |
| return; | |
| } | |
| var l_timer1 = setInterval(function(){ | |
| if (l_wait){ | |
| return; | |
| } | |
| l_wait = true; | |
| var l_num = l_count+1; | |
| j$("#ekv_enkhead").text("遠訓/見張り台一括建築完了日時取得中: " + l_num +"/" + arry_villist.length); | |
| l_url = arry_url[l_count]; | |
| j$.ajax({ | |
| type: 'get', | |
| url: l_url, | |
| datatype: 'html', | |
| cache: false | |
| }).done(function(data){ | |
| var l_lilen = j$(data).find("#actionLog li").length; | |
| for (var k=0; k<l_lilen; k++) { | |
| var l_txt=j$(data).find("#actionLog ul li").eq(k).text(); | |
| //遠征訓練所の一括建築を取得 | |
| if ((l_txt.indexOf("一括建設")!=-1) && ((l_txt.indexOf("遠征訓練所")!=-1) || (l_txt.indexOf("見張り台")!=-1))) { | |
| var l_kanryotime = j$(data).find("#actionLog ul span[class='buildTime']").eq(k).text(); | |
| var l_nokoritime = j$(data).find("#actionLog ul span[class='buildClock']").eq(k).text(); | |
| var l_kanryo = l_kanryotime.split(":"); | |
| var l_nokori = l_nokoritime.split(":"); | |
| var l_nokorimin = ((parseInt(l_nokori[0]))*3600)+((parseInt(l_nokori[1]))*60)+(parseInt(l_nokori[2])); | |
| var l_dt = new Date(); | |
| l_dt.setSeconds(l_dt.getSeconds() + l_nokorimin); | |
| var l_hours = l_dt.getHours(); //残り時間から計算した時間 | |
| if ((parseInt(l_kanryo[0])==23)&&(l_hours==0)){ | |
| l_dt.setDate(l_dt.getDate() - 1); | |
| } | |
| if ((parseInt(l_kanryo[0])==0)&&(l_hours==23)){ | |
| l_dt.setDate(l_dt.getDate() + 1); | |
| } | |
| //完了日時を登録 | |
| l_dt.setHours((parseInt(l_kanryo[0])),(parseInt(l_kanryo[1])),(parseInt(l_kanryo[2]))); | |
| l_vilid = j$(data).find(".basenameForm input:hidden[name='village_id']").val(); | |
| var l_name = j$(data).find(".basename span").eq(0).text(); | |
| var l_timer = l_dt.getTime(); //ミリ秒 | |
| //遠訓貯金リスト更新 | |
| var l_chk=0; | |
| var l_enkTimeList = ekv_loadData(EKV_KEY+"_enkTime", "[]", true); | |
| var l_enkTimeAll = []; | |
| ekv_saveData(EKV_KEY+"_enkTime", l_enkTimeAll, true); | |
| if (l_enkTimeList.length !== 0 ) { | |
| for( var el = 0; el < l_enkTimeList.length; el++ ){ | |
| var l_enkTime = new Object; | |
| if(l_enkTimeList[el].id){ | |
| if (l_enkTimeList[el].id!=l_vilid){ | |
| l_enkTime.id=l_enkTimeList[el].id; | |
| l_enkTime.name=l_enkTimeList[el].name; | |
| l_enkTime.timer=l_enkTimeList[el].timer; | |
| l_enkTime.kind=l_enkTimeList[el].kind; | |
| } else { | |
| var l_chk2=0; | |
| if (l_txt.indexOf("遠征訓練所")!=-1){ | |
| if (l_enkTimeList[el].kind=="遠訓"){ | |
| l_enkTime.id=l_vilid; | |
| l_enkTime.name=l_name; | |
| l_enkTime.timer=l_timer; | |
| l_enkTime.kind="遠訓"; | |
| l_chk=1; | |
| l_chk2=1; | |
| } | |
| } else { | |
| if (l_enkTimeList[el].kind=="見張り"){ | |
| l_enkTime.id=l_vilid; | |
| l_enkTime.name=l_name; | |
| l_enkTime.timer=l_timer; | |
| l_enkTime.kind="見張り"; | |
| l_chk=1; | |
| l_chk2=1; | |
| } | |
| } | |
| if (l_chk2!=1){ | |
| l_enkTime.id=l_enkTimeList[el].id; | |
| l_enkTime.name=l_enkTimeList[el].name; | |
| l_enkTime.timer=l_enkTimeList[el].timer; | |
| l_enkTime.kind=l_enkTimeList[el].kind; | |
| } | |
| } | |
| l_enkTimeAll.push(l_enkTime); | |
| } | |
| } | |
| } | |
| if (l_chk!=1){ | |
| var l_enkTime = new Object; | |
| if (l_txt.indexOf("遠征訓練所")!=-1){ | |
| l_enkTime.id=l_vilid; | |
| l_enkTime.name=l_name; | |
| l_enkTime.timer=l_timer; | |
| l_enkTime.kind="遠訓"; | |
| } else { | |
| l_enkTime.id=l_vilid; | |
| l_enkTime.name=l_name; | |
| l_enkTime.timer=l_timer; | |
| l_enkTime.kind="見張り"; | |
| } | |
| l_enkTimeAll.push(l_enkTime); | |
| } | |
| ekv_saveData(EKV_KEY+"_enkTime", l_enkTimeAll, true); | |
| } | |
| } | |
| l_count++; | |
| if ((l_count+1) > l_max){ | |
| clearInterval(l_timer1); | |
| resolve(0); | |
| } else { | |
| l_wait = false; | |
| } | |
| }); | |
| }, 200); | |
| }); | |
| }; | |
| } | |
| function ekv_setbanklist(){ | |
| var l_vilcnt=0; | |
| j$("div[class='sideBoxInner basename'] ul li").each(function(index){ | |
| if (!(j$("span", this).eq(1).hasClass('buildingText'))){ | |
| l_vilcnt=l_vilcnt+1; | |
| } | |
| }); | |
| var l_enkTimeList = ekv_loadData(EKV_KEY+"_enkTime", "[]", true); | |
| var l_html=""; | |
| if (l_enkTimeList.length !== 0 ){ | |
| //時間でソート | |
| l_enkTimeList.sort(function(a,b){ | |
| if(a.timer < b.timer) return -1; | |
| if(a.timer > b.timer) return 1; | |
| return 0; | |
| }); | |
| var l_dt = new Date(); | |
| for(var el = 0; el < l_enkTimeList.length; el++){ | |
| //残り時間取得 | |
| console.log(l_enkTimeList[el].timer); | |
| console.log(l_dt.getTime()); | |
| var diff = l_enkTimeList[el].timer - l_dt.getTime(); | |
| var dif_txt = ekv_computeDuration(diff); | |
| var setDate = new Date(); | |
| setDate.setTime(l_enkTimeList[el].timer); //ミリ秒から日時に変換 | |
| //月 | |
| //1月が0、12月が11。そのため+1をする。 | |
| var l_month = setDate.getMonth()+1; | |
| //日 | |
| var l_date = setDate.getDate(); | |
| //曜日 | |
| //日曜が0、土曜日が6。配列を使い曜日に変換する。 | |
| var dateT = ["日","月","火","水","木","金","土"]; | |
| var l_day = dateT[setDate.getDay()]; | |
| //時 | |
| var l_hours = setDate.getHours(); | |
| //分 | |
| var l_minutes = setDate.getMinutes(); | |
| //秒 | |
| //var l_seconds = dt.getSeconds(); | |
| var l_vilid = j$(".basenameForm input:hidden[name='village_id']").val(); | |
| var l_vilnametxt=""; | |
| var l_daytxt= "("+ l_enkTimeList[el].kind +") "+l_month+"/"+l_date+"("+l_day+") "+l_hours+":"+l_minutes+"残り("+dif_txt+")"; | |
| if (el!==0){ | |
| l_html=l_html+"<br />"; | |
| } | |
| var diffhour = diff/(1000*60*60); | |
| if (diffhour<20){ | |
| if (l_enkTimeList[el].id==l_vilid){ | |
| l_vilnametxt = l_enkTimeList[el].name; | |
| l_html=l_html+"<span style='font-weight:bold;color:#dd4827;'>"+ l_vilnametxt + l_daytxt+"</span>"; | |
| } else { | |
| var l_url=PROTOCOL + "//" + HOST + "/village_change.php?village_id=" + l_enkTimeList[el].id + "&from=menu&page=%2Fvillage.php"; | |
| l_vilnametxt = "<a href=" + l_url + " style='font-weight:bold;color:#dd4827;'>"+ l_enkTimeList[el].name + "</a>"; | |
| l_html=l_html+"<span style='font-weight:bold;color:#dd4827;'>"+ l_vilnametxt + l_daytxt+"</span>"; | |
| } | |
| } else { | |
| if (l_enkTimeList[el].id==l_vilid){ | |
| l_vilnametxt = l_enkTimeList[el].name; | |
| l_html=l_html+l_vilnametxt+l_daytxt; | |
| } else { | |
| var l_url =PROTOCOL + "//" + HOST + "/village_change.php?village_id=" + l_enkTimeList[el].id + "&from=menu&page=%2Fvillage.php"; | |
| l_vilnametxt = "<a href=" + l_url + ">"+ l_enkTimeList[el].name + "</a>"; | |
| l_html=l_html+l_vilnametxt+l_daytxt; | |
| } | |
| } | |
| } | |
| } | |
| j$("#ekv_enktext").empty(); | |
| j$("#ekv_enktext").append(l_html); | |
| } | |
| //----------------------------// | |
| // 遠訓貯金リスト取得 // | |
| //----------------------------// | |
| function ekv_getbanklist(){ | |
| return new Promise(function (resolve, reject) { | |
| ekv_setbanklist(); | |
| resolve(0); | |
| }); | |
| } | |
| //-----------------------------// | |
| //ミリ秒を時分秒へ変換 // | |
| //-----------------------------// | |
| function ekv_computeDuration(ms){ | |
| if (ms<360000000){ | |
| var h = String(Math.floor(ms / 3600000) + 100).substring(1); | |
| } else { | |
| var h = String(Math.floor(ms / 3600000) + 1000).substring(1); | |
| } | |
| var m = String(Math.floor((ms - h * 3600000)/60000)+ 100).substring(1); | |
| var s = String(Math.round((ms - h * 3600000 - m * 60000)/1000)+ 100).substring(1); | |
| //return h+':'+m+':'+s; | |
| return h+':'+m; | |
| } | |
| //-----------------------// | |
| // URL LOAD // | |
| //-----------------------// | |
| function ekv_load(){ | |
| return new Promise(function (resolve, reject) { | |
| l_url=PROTOCOL + "//" + HOST + "/village_change.php?village_id=" + m_vilid + "&from=menu&page=%2Fvillage.php"; | |
| console.log(l_url); | |
| j$.ajax({ | |
| type: 'get', | |
| url: l_url, | |
| datatype: 'html', | |
| cache: false | |
| }) | |
| .done(function(data){ | |
| resolve(0); | |
| }); | |
| }); | |
| } | |
| function ekv_loadData(key, value, ev) | |
| { | |
| var ret = ekv_getValue(key, value); | |
| return ev ? eval(eval('ret='+ret)) : ret; | |
| } | |
| function ekv_saveData(key, value, ev) | |
| { | |
| if (ev) { | |
| if (window.opera || typeof JSON != 'object') { | |
| value = toJSON(value); | |
| } | |
| else { | |
| value = JSON.stringify( value ); | |
| } | |
| } | |
| ekv_setValue(key, value); | |
| } | |
| function ekv_setValue(name, value) { | |
| value = (typeof value)[0] + value; | |
| localStorage.setItem(name, value); | |
| } | |
| function ekv_getValue(name, defaultvalue) { | |
| var value = localStorage.getItem(name); | |
| if (!value) return defaultvalue; | |
| var type = value[0]; | |
| value = value.substring(1); | |
| switch (type) { | |
| case 'b': | |
| return value == 'true'; | |
| case 'n': | |
| return Number(value); | |
| default: | |
| return value; | |
| } | |
| } | |
| function ekv_addGlobalStyle(css) { | |
| var head, style; | |
| head = document.getElementsByTagName('head')[0]; | |
| if (!head) { return; } | |
| style = document.createElement('style'); | |
| style.type = 'text/css'; | |
| style.innerHTML = css; | |
| head.appendChild(style); | |
| } | |
| //-----------------// | |
| // css定義の追加 // | |
| //-----------------// | |
| function ekv_addCss() { | |
| var css =" \ | |
| div[id^='ekv_'] .scrollArea::-webkit-scrollbar {background:#000000; width:8px;} \ | |
| div[id^='ekv_'] .scrollArea::-webkit-scrollbar-button { background:#000000;} \ | |
| div[id^='ekv_'] .scrollArea::-webkit-scrollbar-thumb { background:#ffffff;border-radius: 10px;} \ | |
| div[id^='ekv_'] .scrollArea::-webkit-scrollbar-corner { background:#000000;} \ | |
| "; | |
| ekv_addGlobalStyle(css); | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment