Last active
May 13, 2019 13:35
-
-
Save hot-2130/68ba50ee9787a10b326655e880bce595 to your computer and use it in GitHub Desktop.
RAPT様の同盟員一覧の情報収集・プロフ変わって取れなくなったのを修正
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_alliance_info | |
| // @namespace https://gist.github.com/RAPT21/ | |
| // @description 同盟員一覧の情報収集 by RAPT with hot | |
| // @include http://*.3gokushi.jp/user/* | |
| // @include http://*.3gokushi.jp/alliance/info.php* | |
| // @include https://*.3gokushi.jp/user/* | |
| // @include https://*.3gokushi.jp/alliance/info.php* | |
| // @connect 3gokushi.jp | |
| // @require http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js | |
| // @require http://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js | |
| // @resource jqueryui_css http://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/themes/smoothness/jquery-ui.css | |
| // @grant GM_xmlhttpRequest | |
| // @grant GM_setValue | |
| // @grant GM_getValue | |
| // @author RAPT | |
| // @version 2017.01.21 | |
| // ==/UserScript== | |
| // 2017.01.21 Beyond から同盟情報ソート機能と CSV 取得機能のみ抽出 | |
| // リンクを同盟内ランキングの上に表示するようにした | |
| // 2017.01.21.2 2019/04/04 プロフのフォーマットが変わって取得できなくなったのを修正 | |
| // load jQuery | |
| jQuery.noConflict(); | |
| j$ = jQuery; | |
| var d = document; | |
| var $ = function(id) { return d.getElementById(id); }; | |
| var $x = function(xp,dc) { return d.evaluate(xp, dc||d, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; }; | |
| var $a = function(xp,dc) { var r = d.evaluate(xp, dc||d, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); var a=[]; for(var i=0; i<r.snapshotLength; i++){ a.push(r.snapshotItem(i)); } return a; }; | |
| var $e = function(dc,e,f) { if (!dc) return; dc.addEventListener(e, f, false); }; | |
| var BASE_X = -9999; | |
| var BASE_Y = -9999; | |
| var USER_ID = ""; | |
| var ALLY_ID = ""; | |
| var URL_PARAM = {}; | |
| var IMG_DIR = "/20100510-01/img/"; | |
| ////////////////////// | |
| //同盟表示の改善 | |
| ////////////////////// | |
| var SID = '' | |
| initUrlParams(); | |
| initPanel(); | |
| allianceSort(); | |
| allianceCSV(); | |
| //同盟表示のソート | |
| function allianceSort() | |
| { | |
| if( location.pathname != "/alliance/info.php" ) return; | |
| var sort_kind, sort_order; | |
| var sort_list = ["num", "str", "num", "num", "num", "str", "str"]; | |
| for(var i=0 ; i<8 ; i++) { | |
| var th = $x("//table[@summary=\"ランキング\"]//tr[2]//th[" + (i+1) + "]"); | |
| if( th ) { | |
| sort_kind = sort_list[i]; | |
| if( th.id == "alliance_info_ally_xy" ) sort_kind = "xy"; | |
| th.appendChild(d.createElement("br")); | |
| var a = d.createElement("a"); | |
| a.href = "javascript:void(0)"; | |
| (function(n, k){ | |
| $e(a, "click", function(){row_sort(n, k, "asc"); } ); | |
| })(i+1, sort_kind); | |
| var img = d.createElement("img"); | |
| img.src= IMG_DIR + "trade/icon_up.gif"; | |
| img.alt = "昇順に並べ替え"; | |
| img.title = img.alt; | |
| a.appendChild(img); | |
| th.appendChild(a); | |
| th.appendChild(d.createTextNode(" ")); | |
| a = d.createElement("a"); | |
| a.href = "javascript:void(0)"; | |
| (function(n, k){ | |
| $e(a, "click", function(){row_sort(n, k, "dsc"); } ); | |
| })(i+1, sort_kind); | |
| img = d.createElement("img"); | |
| img.src= IMG_DIR + "trade/icon_down.gif"; | |
| img.alt = "降順に並べ替え"; | |
| img.title = img.alt; | |
| a.appendChild(img); | |
| th.appendChild(a); | |
| } | |
| } | |
| function row_sort(col, kind, order) { | |
| var tbl = $x("//table[@summary=\"ランキング\"]"); | |
| var trs = $a("descendant::tr[position()>2]", tbl); | |
| sort_kind = kind; | |
| sort_order = order; | |
| var strs = new Array(); | |
| if( col == 2 || kind == "xy" ) { | |
| //名前 or座標はaの下 | |
| for(var i=0; i<trs.length ; i++) { | |
| var td = $x("descendant::td[" + col + "]", trs[i]); | |
| var a = $x("descendant::a", td); | |
| if( a ) strs.push({"node":trs[i], "value":a.innerHTML}); | |
| else strs.push({"node":trs[i], "value":""}); | |
| } | |
| } else { | |
| for(var i=0; i<trs.length ; i++) { | |
| var td = $x("descendant::td[" + col + "]", trs[i]); | |
| strs.push({"node":trs[i], "value":td.innerHTML}); | |
| } | |
| } | |
| strs.sort(row_cmp); | |
| for(var i=0 ; i<trs.length ; i++) { | |
| strs[i].node.parentNode.removeChild(strs[i].node); | |
| tbl.appendChild(strs[i].node); | |
| } | |
| } | |
| function row_cmp(a, b) | |
| { | |
| var ret = 0; | |
| if( sort_kind == "num" ){ | |
| ret = parseInt(a.value, 10) - parseInt(b.value, 10); | |
| }else if (sort_kind == "xy") { | |
| //座標 | |
| if( !a.value && !b.value ) ret = 0; | |
| else if( !a.value ) ret = 1; | |
| else if( !b.value ) ret = -1; | |
| else { | |
| var a_xy = a.value.split(","); | |
| var b_xy = b.value.split(","); | |
| ret = ( Math.pow(parseInt(a_xy[0], 10), 2) + Math.pow(parseInt(a_xy[1], 10), 2) ) - | |
| ( Math.pow(parseInt(b_xy[0], 10), 2) + Math.pow(parseInt(b_xy[1], 10), 2) ); | |
| } | |
| }else { | |
| if( a.value == b.value ) { | |
| ret = 0; | |
| } else if( a.value > b.value ) { | |
| ret = 1; | |
| }else { | |
| ret = -1; | |
| } | |
| } | |
| if( sort_order == "dsc") { | |
| ret = 0 - ret; | |
| } | |
| return ret; | |
| } | |
| } | |
| function getDatafromUserHTML(html) | |
| { | |
| var ret = []; | |
| var tmp = html.match(/<td[^>]*>ランク<\/td>[^<]*<td[^>]*>([0-9]+|-)<\/td>/); | |
| if( !tmp ) return null; | |
| if (tmp[1]!='-'){ | |
| ret["all_rank"] = parseInt(tmp[1] ,10); | |
| } else { | |
| ret["all_rank"] = "-"; | |
| } | |
| tmp = html.match(/<td[^>]*>総合<\/td>[^<]*<td[^>]*>([0-9]+)<\/td>/); | |
| if( !tmp ) { | |
| ret["all_point"] = "-"; | |
| } else { | |
| ret["all_point"] = parseInt(tmp[1] ,10); | |
| } | |
| tmp = html.match(/<td[^>]*>寄付<\/td>[^<]*<td[^>]*>([0-9]+)<\/td>/); | |
| if( !tmp ) { | |
| ret["contribution"] = "-"; | |
| } else { | |
| ret["contribution"] = parseInt(tmp[1] ,10); | |
| } | |
| tmp = html.match(/<td[^>]*>総人口<\/td>[^<]*<td[^>]*>([0-9]+)<\/td>/); | |
| if( !tmp ) { | |
| ret["jinko"] = "-"; | |
| } else { | |
| ret["jinko"] = parseInt(tmp[1] ,10); | |
| } | |
| tmp = html.match(/<td[^>]*>攻撃<\/td>[^<]*<td[^>]*>([0-9]+)<\/td>/); | |
| if( !tmp ) { | |
| ret["attack"] = "-"; | |
| } else { | |
| ret["attack"] = parseInt(tmp[1] ,10); | |
| } | |
| tmp = html.match(/<td[^>]*>防御<\/td>[^<]*<td[^>]*>([0-9]+)<\/td>/); | |
| if( !tmp ) { | |
| ret["defence"] = "-"; | |
| } else { | |
| ret["defence"] = parseInt(tmp[1] ,10); | |
| } | |
| tmp = html.match(/<td[^>]*>破壊<\/td>[^<]*<td[^>]*>([0-9]+)<\/td>/); | |
| if( !tmp ) { | |
| ret["destroy"] = "-"; | |
| } else { | |
| ret["destroy"] = parseInt(tmp[1] ,10); | |
| } | |
| tmp = html.match(/<td[^>]*>南蛮撃退<\/td>[^<]*<td[^>]*>([0-9]+)<\/td>/); | |
| if( !tmp ) { | |
| ret["npc_assault"] = "-"; | |
| } else { | |
| ret["npc_assault"] = parseInt(tmp[1] ,10); | |
| } | |
| tmp = html.match(/<td[^>]*>撃破スコア<\/td>[^<]*<td[^>]*>([0-9]+)<\/td>/); | |
| if( !tmp ) { | |
| ret["attack_score"] = "-"; | |
| } else { | |
| ret["attack_score"] = parseInt(tmp[1] ,10); | |
| } | |
| tmp = html.match(/<td[^>]*>防衛スコア<\/td>[^<]*<td[^>]*>([0-9]+)<\/td>/); | |
| if( !tmp ) { | |
| ret["defence_score"] = "-"; | |
| } else { | |
| ret["defence_score"] = parseInt(tmp[1] ,10); | |
| } | |
| tmp = html.match(/<td[^>]*>破砕スコア<\/td>[^<]*<td[^>]*>([0-9]+)<\/td>/); | |
| if( !tmp ) { | |
| ret["destroy_score"] = "-"; | |
| } else { | |
| ret["destroy_score"] = parseInt(tmp[1] ,10); | |
| } | |
| tmp = html.match(/<\/a>\n\t+\(本拠地\)\t+<\/td>[^<]*<td[^>]*>[^<]*<a href=(.*)>/); | |
| if ( !tmp ) return null; | |
| var match1 = tmp[1].match(/map.php\?x=([\-0-9]+)&y=([\-0-9]+)/); | |
| ret["x"] = parseInt(match1[1],10); | |
| ret["y"] = parseInt(match1[2],10); | |
| return ret; | |
| } | |
| function getXYListfromUserHTML(html) | |
| { | |
| var ret = new Array(); | |
| var tmp = html.match(/<td[^>]*>君主<\/td>[^<]*<td[^>]*>([^<]+)<img[^>]*>([^<]+)/); //W12専用 | |
| if (!tmp) { | |
| var tmp = html.match(/<td[^>]*>君主<\/td>[^<]*<td[^>]*>([^<]+)/); //それ以外の鯖 | |
| if( !tmp ) return null; | |
| var user_name = tmp[1].replace(/(^\s+|\s+$)/g, ""); | |
| } else { | |
| var user_name = tmp[2].replace(/(^\s+|\s+$)/g, ""); | |
| } | |
| tmp = html.match(/<td[^>]*>同盟<\/td>[^<]*<td[^>]*>[^>]*><a href="[^"]*">([^<]+)<\/a>[^>]*<\/td>/); | |
| if (!tmp) { | |
| tmp = html.match(/<td[^>]*>同盟<\/td>[^<]*<td[^>]*>[^>]*<a href="[^"]*">([^<]+)<\/a>[^>]*<\/td>/); | |
| if( !tmp ) return; | |
| } | |
| if( !tmp ) return; | |
| var ally_name = tmp[1]; | |
| var pos; | |
| //var reg = /<a href="\.\.\/(?:land|village_change)\.php[^"]*">\s*([^<\s]+)\s*<\/a>[^<]*<\/td>[^<]*<td[^>]*>[^<]*<a[^>]*>\(([\-0-9]+),([\-0-9]+)\)[^<]<\/a>[^<]*<\/td>[^<]*<td[^>]*>([0-9]+| )<\/td>/; | |
| var reg = /<a href="\.\.\/(?:land|village_change)\.php[^"]*">\s*([^<\s]+)\s*<\/a>[^<]*<\/td>[^<]*<td[^>]*>[^<]*<a[^>]*>[^(]*\(([\-0-9]+), ([\-0-9]+)\)[^<]*<\/a>[^<]*<\/td>[^<]*<td[^>]*>([^<]*)<\/td>/; | |
| var honkyo = 1; | |
| while((pos = html.search(reg) ) != -1 ) { | |
| html = html.substr(pos); | |
| var dat = html.match(reg); | |
| if( !dat ) break; | |
| //if( dat[4] == "" ) dat[4] = ""; | |
| var match1 = dat[4].match(/\b\d{1,3}(,\d{3})*\b/); | |
| if (match1) { | |
| dat[4] = match1[0]; | |
| } else { | |
| dat[4] = ""; | |
| } | |
| ret.push({"user_name":user_name, "ally_name":ally_name, "area_name":dat[1].replace(/(^\s+|\s+$)/g, ""), "x":dat[2], "y":dat[3], "jinko":dat[4], "honkyo":honkyo}); | |
| honkyo=""; | |
| html = html.substr(dat[0].length); | |
| } | |
| return ret; | |
| } | |
| function allianceCSV() | |
| { | |
| if( location.pathname != "/alliance/info.php" ) return; | |
| var aid; | |
| if( URL_PARAM.id ) aid = URL_PARAM.id; | |
| else aid = ALLY_ID; | |
| //CSV出力用 | |
| var tbl = $x("//table[@summary=\"ランキング\"]"); | |
| if( !tbl ) return; | |
| var box = d.createElement("table"); | |
| box.className = "tables"; | |
| box.summary = "CSV出力"; | |
| var tbody = d.createElement("tbody"); | |
| box.appendChild(tbody); | |
| var trh = d.createElement("tr"); | |
| tbody.appendChild(trh); | |
| var th = d.createElement("th"); | |
| th.className="ttl"; | |
| th.colspan="1" | |
| th.innerHTML="CSV出力"; | |
| trh.appendChild(th); | |
| var tr = d.createElement("tr"); | |
| tbody.appendChild(tr); | |
| var td = d.createElement("td"); | |
| tr.appendChild(td); | |
| tbl.parentNode.insertBefore(box, tbl); | |
| var lnk = d.createElement("a"); | |
| lnk.href = "javascript:void(0)"; | |
| lnk.innerHTML ="同盟員詳細情報csv"; | |
| td.appendChild(lnk); | |
| // tbl.parentNode.insertBefore(lnk, tbl); | |
| $e(lnk, "click", function() { | |
| if( $("alliance_info_csvWindow") ) return; | |
| if( confirm("同盟員の情報を一気に取得するためサーバに負荷をかけます。\n何度も実行するとDoS攻撃と同じなので、実行には注意して下さい") == false ) return; | |
| //窓作成 | |
| var elm_xy = cgetElementXY( this ); | |
| var yy = elm_xy.y - 420; | |
| if( yy < 0 ) yy = 0; | |
| createCSVWindow(10, yy); | |
| var trs = $a("//table[@summary=\"ランキング\"]//tr[position()>2]"); | |
| var elm_msg = $("alliance_info_csvWindow_message"); | |
| if( !elm_msg ) return; | |
| var elm_csv = $("alliance_info_csvWindow_csv"); | |
| if( !elm_csv ) return; | |
| var now_num = 0; | |
| var all_num = trs.length; | |
| if( all_num == 0 ) return; | |
| var csv_txt = "同盟内ランク\tuser_id\t名前\t同盟内point\t寄付\t拠点\t全体ランク\t全体point\t人口\t攻撃\t防御\t撃破スコア\t防御スコア\t本拠X座標\t本拠Y座標\n"; | |
| window.setTimeout(timerFunc ,0 ); | |
| function timerFunc() | |
| { | |
| if( !$("alliance_info_csvWindow") ) return; | |
| var tds = $a("descendant::td",trs[now_num]); | |
| if( tds.length < 5 ) { | |
| alert("ページフォーマットが変わったみたい"); | |
| return ; | |
| } | |
| var ids = tds[1].innerHTML.match(/\/user\/\?user_id\=(\d+).*\">(.+)<\/a>/); | |
| if( !ids ) { | |
| alert("ページフォーマットが変わったみたい"); | |
| return ; | |
| } | |
| var uid = parseInt(ids[1], 10); | |
| cajaxRequest("/user/?user_id=" + uid, "GET", "", function(req) { | |
| var dt = getDatafromUserHTML(req.responseText); | |
| if( dt ) { | |
| csv_txt += parseInt(tds[0].innerHTML, 10) + "\t"; | |
| csv_txt += uid + "\t"; | |
| csv_txt += ids[2] + "\t"; | |
| csv_txt += parseInt(tds[2].innerHTML, 10) + "\t"; | |
| csv_txt += parseInt(tds[3].innerHTML, 10) + "\t"; | |
| csv_txt += parseInt(tds[4].innerHTML, 10) + "\t"; | |
| csv_txt += dt.all_rank + "\t"; | |
| csv_txt += dt.all_point + "\t"; | |
| csv_txt += dt.jinko + "\t"; | |
| csv_txt += dt.attack + "\t"; | |
| csv_txt += dt.defence + "\t"; | |
| csv_txt += dt.attack_score + "\t"; | |
| csv_txt += dt.defence_score + "\t"; | |
| csv_txt += dt.x + "\t"; | |
| csv_txt += dt.y + "\n"; | |
| var xytd = $("alliance_info_xylink_" + uid ); | |
| if(xytd) { | |
| csetUserXY(aid, uid, dt.x, dt.y); | |
| xytd.innerHTML = cgetXYHtml(dt.x, dt.y ); | |
| } | |
| now_num ++; | |
| elm_msg.innerHTML = "取得中... ( " + now_num + " / " + all_num + " )"; | |
| if( now_num < all_num ) { | |
| window.setTimeout(timerFunc, 0); | |
| }else{ | |
| elm_msg.innerHTML += ".. 完了しました。CTRL + A → CTRL + Cでコピーし、Excelなどに貼りつけてください"; | |
| elm_csv.value = csv_txt; | |
| elm_csv.focus(); | |
| } | |
| } else { | |
| alert("user_id="+uid+"の取得に失敗しました" ); | |
| now_num ++; | |
| elm_msg.innerHTML = "取得中... ( " + now_num + " / " + all_num + " )"; | |
| if( now_num < all_num ) { | |
| window.setTimeout(timerFunc, 0); | |
| }else{ | |
| elm_msg.innerHTML += ".. 完了しました。CTRL + A → CTRL + Cでコピーし、Excelなどに貼りつけてください"; | |
| elm_csv.value = csv_txt; | |
| elm_csv.focus(); | |
| } | |
| } | |
| }, function(req){ | |
| alert("サーバからエラーが返りましたよ" ); | |
| }); | |
| } | |
| }); | |
| var lnk2 = d.createElement("a"); | |
| lnk2.href = "javascript:void(0)"; | |
| lnk2.innerHTML ="同盟員全領地座標csv"; | |
| td.insertBefore(lnk2, lnk.nextSibling); | |
| td.insertBefore(d.createTextNode(" "), lnk2); | |
| // tbl.parentNode.insertBefore(lnk2, lnk.nextSibling); | |
| // tbl.parentNode.insertBefore(d.createTextNode(" "), lnk2); | |
| $e(lnk2, "click", function() { | |
| if( $("alliance_info_csvWindow") ) return; | |
| if( confirm("同盟員の情報を一気に取得するためサーバに負荷をかけます。\n何度も実行するとDoS攻撃と同じなので、実行には注意して下さい") == false ) return; | |
| if( navigator.userAgent.toLowerCase().indexOf('chrome') == -1 ) { | |
| if( confirm("終盤の巨大同盟だと、CTRL+AやCTRL+Cの操作で10分くらい掛かります。\nChromeだとそんなに時間掛からないみたいです。続けますか?") == false ) return; | |
| } | |
| //窓作成 | |
| var elm_xy = cgetElementXY( this ); | |
| var yy = elm_xy.y - 420; | |
| if( yy < 0 ) yy = 0; | |
| createCSVWindow(10, yy); | |
| var trs = $a("//table[@summary=\"ランキング\"]//tr[position()>2]"); | |
| var elm_msg = $("alliance_info_csvWindow_message"); | |
| if( !elm_msg ) return; | |
| var elm_csv = $("alliance_info_csvWindow_csv"); | |
| if( !elm_csv ) return; | |
| var now_num = 0; | |
| var all_num = trs.length; | |
| if( all_num == 0 ) return; | |
| var csv_txt = "同盟\t君主\t領地名\tX\tY\t人口\t本拠\n"; | |
| window.setTimeout(timerFunc ,0 ); | |
| function timerFunc() | |
| { | |
| if( !$("alliance_info_csvWindow") ) return; | |
| var tds = $a("descendant::td",trs[now_num]); | |
| if( tds.length < 5 ) { | |
| alert("ページフォーマットが変わったみたい"); | |
| return ; | |
| } | |
| var ids = tds[1].innerHTML.match(/\/user\/\?user_id\=(\d+).*\">(.+)<\/a>/); | |
| if( !ids ) { | |
| alert("ページフォーマットが変わったみたい"); | |
| return ; | |
| } | |
| var uid = parseInt(ids[1], 10); | |
| cajaxRequest("/user/?user_id=" + uid, "GET", "", function(req) { | |
| var dt = getXYListfromUserHTML(req.responseText); | |
| if( dt ) { | |
| for(var i=0 ; i<dt.length ; i++) { | |
| csv_txt += dt[i].ally_name + "\t"; | |
| csv_txt += dt[i].user_name + "\t"; | |
| csv_txt += dt[i].area_name + "\t"; | |
| csv_txt += dt[i].x + "\t"; | |
| csv_txt += dt[i].y + "\t"; | |
| csv_txt += dt[i].jinko + "\t"; | |
| csv_txt += dt[i].honkyo + "\n"; | |
| } | |
| now_num ++; | |
| elm_msg.innerHTML = "取得中... ( " + now_num + " / " + all_num + " )"; | |
| if( now_num < all_num ) { | |
| window.setTimeout(timerFunc, 0); | |
| }else{ | |
| elm_msg.innerHTML += ".. 完了しました。CTRL + A → CTRL + Cでコピーし、Excelなどに貼りつけてください"; | |
| elm_csv.value = csv_txt; | |
| elm_csv.focus(); | |
| } | |
| } else { | |
| alert("取得に失敗しました" ); | |
| } | |
| }, function(req){ | |
| alert("サーバからエラーが返りましたよ" ); | |
| }); | |
| } | |
| }); | |
| function createCSVWindow(x, y) | |
| { | |
| var cc = $("alliance_info_csvWindow"); | |
| if( cc ) cc.parentNode.removeChild(cc); | |
| cc = d.createElement("div"); | |
| cc.id = "alliance_info_csvWindow"; | |
| cc.style.left = x + "px"; | |
| cc.style.top = y + "px"; | |
| cc.style.position = "absolute"; | |
| cc.style.backgroundColor = "lightgray"; | |
| cc.style.border = "outset 2px lightgray"; | |
| cc.style.fontSize = "12px"; | |
| cc.style.padding = "15px"; | |
| cc.style.zIndex = 1000; | |
| cc.style.padding = "10px"; | |
| var dv = d.createElement("div"); | |
| dv.id = "alliance_info_csvWindow_message"; | |
| cc.appendChild(dv); | |
| var tx = d.createElement("textarea"); | |
| tx.id = "alliance_info_csvWindow_csv"; | |
| tx.rows = 25; | |
| tx.cols = 140; | |
| tx.style.overflow = "scroll"; | |
| cc.appendChild(tx); | |
| cc.appendChild(d.createElement("br") ); | |
| ccreateButton(cc, "閉じる", "", function(){ | |
| var cc = $("alliance_info_csvWindow"); | |
| if( cc ) cc.parentNode.removeChild(cc); | |
| }); | |
| $("alliance_info_floatpanel").appendChild(cc); | |
| } | |
| } | |
| //------------------------------------ | |
| // 共通系そとだす | |
| //------------------------------------ | |
| function csaveData(key, value, local, ev) | |
| { | |
| if( local ) key = location.hostname + key; | |
| if( ev ) { | |
| if (window.opera || typeof JSON != 'object') { | |
| value = toJSON(value); | |
| } | |
| else { | |
| value = JSON.stringify( value ); | |
| } | |
| } | |
| GM_setValue(key, value ); | |
| } | |
| function cgetXYHtml(x,y) | |
| { | |
| var img_send = IMG_DIR + "report/icon_go.gif"; | |
| var img_mp = IMG_DIR + "report/icon_scout.gif"; | |
| var m = ""; | |
| var dist = cgetDistanceFromBase(x, y); | |
| if( dist != -1 ) { | |
| m = " 距離[" + dist.toFixed(2) + "]"; | |
| } | |
| var txt = ''; | |
| txt += '<a href="'+caddSessionId('/land.php?x=' + x + '&y=' + y + '#ptop')+'" title="表示" style="color:#0099cc; text-decoration: none;" onmouseover="'; | |
| txt += "this.style.textDecoration='underline';"+'" onmouseout="'+"this.style.textDecoration='none';"+'">' + x + ',' + y + '</a>'; | |
| txt += '<a href="'+caddSessionId('/map.php?x=' + x + '&y=' + y + '#ptop')+'" title="マップ' + x + ',' + y + '"><img src="' + img_mp + '" style="width:12px; height:12px; vertical-align:middle;"></a>'; | |
| txt += '<a href="'+caddSessionId('/facility/castle_send_troop.php?x=' + x + '&y=' + y + '#ptop')+'" title="兵を送る' + x + ',' + y + m + '">'; | |
| txt += '<img src="' + img_send + '" style="width:12px; height:12px; vertical-align:middle;"></a>'; | |
| return txt; | |
| } | |
| function csetUserXY(aid, uid, x, y) | |
| { | |
| var allylists = cloadData( "allyXYAllyList", "[]", true, true ); | |
| if( allylists.indexOf(aid) == -1 ) { | |
| allylists.push(aid); | |
| csaveData( "allyXYAllyList", allylists, true, true ); | |
| } | |
| var lists = cloadData( "allyXYList" + aid, "[]", true, true ); | |
| for(var i=0 ; i<lists.length ; i++) { | |
| if( lists[i].id == uid ) { | |
| return; | |
| } | |
| } | |
| lists.push({"id":uid, "x":x, "y":y}); | |
| csaveData( "allyXYList" + aid, lists, true, true ); | |
| } | |
| function initUrlParams() { | |
| var matches = location.search.match(/(?:\?|&)?([^=]+)(?:=([^&]+))?/g); | |
| if (matches) { | |
| var param; | |
| var key; | |
| var data; | |
| for(var i = 0 ; i < matches.length ; i++) { | |
| param = matches[i].match(/(?:\?|&)?([^=]+)(?:=([^&]+))?/); | |
| key = param[1]; | |
| data = param[2]; | |
| URL_PARAM[key] = ''; | |
| if( param.length == 3 && typeof data == 'string') { | |
| URL_PARAM[key] = decodeURIComponent(data); | |
| // session id | |
| if (key.toLowerCase() == 'ssid') { | |
| SID = key + '=' +data; | |
| } | |
| } | |
| } | |
| } | |
| } | |
| function cajaxRequest(url, method, param, func_success, func_fail){ | |
| var req = new XMLHttpRequest(); | |
| req.onreadystatechange = function() { | |
| if (req.readyState == 4 && req.status == 200){ | |
| func_success(req); | |
| } | |
| else if (req.readyState == 4 && req.status != 200){ | |
| func_fail(req); | |
| } | |
| }; | |
| if (SID) { | |
| var sdata = method.toLowerCase() == 'get' ? url : param; | |
| if (sdata.search(/(\?|&)SSID=[^&]+&?/i) < 0) { | |
| if (method.toLowerCase() == 'get') { | |
| url += (0 <= url.indexOf('?')) ? '&' : '?'; | |
| url += SID; | |
| } | |
| else { | |
| if (typeof param != 'string') param = ''; | |
| if (0 < param.length) param += '&'; | |
| param += SID; | |
| } | |
| } | |
| } | |
| req.open(method, url, true); | |
| if (method == 'POST'){ | |
| req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); | |
| } | |
| req.send(param); | |
| } | |
| function cloadData(key, value, local, ev) | |
| { | |
| if( local ) key = location.hostname + key; | |
| var ret = GM_getValue(key, value); | |
| return ev ? eval('ret='+ret) : ret; | |
| } | |
| function ccreateButton(container, text, title, func, width) | |
| { | |
| var btn = d.createElement("input"); | |
| btn.style.padding = "0px"; | |
| btn.type = "button"; | |
| btn.value = text; | |
| if (width == undefined) { | |
| btn.style.width = "54px"; | |
| } else { | |
| btn.style.width = width + "px"; | |
| } | |
| btn.style.height = "22px"; | |
| btn.style.verticalAlign = "middle"; | |
| btn.title = title; | |
| container.appendChild(d.createTextNode(" ")); | |
| container.appendChild(btn); | |
| container.appendChild(d.createTextNode(" ")); | |
| $e(btn, "click", func); | |
| return btn; | |
| } | |
| // その他拡張 | |
| //JSONとprototype.jsの衝突回避用 | |
| function toJSON(obj) { | |
| switch (typeof obj) { | |
| case 'string': | |
| return quote(obj); | |
| case 'number': | |
| return isFinite(obj) ? String(obj) : 'null'; | |
| case 'boolean': | |
| case 'null': | |
| return String(obj); | |
| case 'object': | |
| if (!obj) { | |
| return 'null'; | |
| } | |
| if (obj instanceof Date) { | |
| return isFinite(obj) ? obj.getUTCFullYear() + '-' | |
| + complementZero(obj.getUTCMonth() + 1) + '-' | |
| + complementZero(obj.getUTCDate()) + 'T' | |
| + complementZero(obj.getUTCHours()) + ':' | |
| + complementZero(obj.getUTCMinutes()) + ':' | |
| + complementZero(obj.getUTCSeconds()) + 'Z' : 'null'; | |
| } | |
| var partial = new Array(); | |
| var prefix = '{'; | |
| var suffix = '}'; | |
| if (obj instanceof Array) { | |
| prefix = '['; | |
| suffix = ']'; | |
| length = obj.length; | |
| for ( var i = 0; i < length; i++) { | |
| partial[i] = toJSON(obj[i]) || 'null'; | |
| } | |
| } else { | |
| for ( var key in obj) { | |
| if (Object.hasOwnProperty.call(obj, key)) { | |
| partial.push(quote(key) + ':' | |
| + (toJSON(obj[key]) || 'null')); | |
| } | |
| } | |
| } | |
| return prefix + partial.join(',') + suffix; | |
| break; | |
| default: | |
| return null; | |
| } | |
| function quote(str) { | |
| var escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g; | |
| var meta = { // table of character substitutions | |
| '\b' : '\\b', | |
| '\t' : '\\t', | |
| '\n' : '\\n', | |
| '\f' : '\\f', | |
| '\r' : '\\r', | |
| '"' : '\\"', | |
| '\\' : '\\\\' | |
| }; | |
| return escapable.test(str) ? '"' | |
| + str.replace(escapable, | |
| function(a) { | |
| var c = meta[a]; | |
| return typeof c === 'string' ? c : '\\u' | |
| + ('0000' + a.charCodeAt(0).toString(16)) | |
| .slice(-4); | |
| }) + '"' : '"' + str + '"'; | |
| } | |
| function complementZero(number) { | |
| return number < 10 ? '0' + number : number; | |
| } | |
| } | |
| function cgetDistanceFromBase(x, y) | |
| { | |
| if( BASE_X == -9999 ) { | |
| var xy = cgetCurrentBaseXY(); | |
| if( xy ) { | |
| BASE_X = xy.x; | |
| BASE_Y = xy.y; | |
| } | |
| } | |
| if( BASE_X != -9999 ) { | |
| var a = parseInt(x, 10); | |
| var b = parseInt(y, 10); | |
| return Math.sqrt(Math.pow(BASE_X - a, 2) + Math.pow(BASE_Y - b, 2)); | |
| } | |
| return -1; | |
| } | |
| function cgetCurrentBaseXY() | |
| { | |
| var nowLoc = $x('id("gnavi")//a[contains(@href,"map.php")]'); | |
| if (!nowLoc) nowLoc = $x('id("gNav")//a[contains(@href,"map.php")]'); | |
| if (!nowLoc) return null; | |
| var xy = nowLoc.href.match(/x=([\-0-9]+)&y=([\-0-9]+)/i); | |
| if( xy ) { | |
| return {'x':parseInt(xy[1], 10), 'y':parseInt(xy[2], 10)}; | |
| } | |
| } | |
| function cgetElementXY(elm) { | |
| if( !elm ) return null; | |
| var xx = 0; | |
| var yy = 0; | |
| while(elm){ | |
| xx += elm.offsetLeft; | |
| yy += elm.offsetTop; | |
| elm = elm.offsetParent; | |
| } | |
| return {"x":xx, "y":yy}; | |
| } | |
| function initPanel() | |
| { | |
| var panelBox = $("sidebar"); | |
| if( !panelBox ) return false; | |
| var basepanel = d.createElement("div"); | |
| basepanel.id = "alliance_info_basepanel"; | |
| var fixpanel = d.createElement("div"); | |
| fixpanel.id = "alliance_info_fixpanel"; | |
| var floatpanel = d.createElement("div"); | |
| floatpanel.id = "alliance_info_floatpanel"; | |
| var tmppanel = d.createElement("div"); | |
| tmppanel.id = "alliance_info_tmp"; | |
| tmppanel.style.display = "none"; | |
| basepanel.appendChild(fixpanel); | |
| basepanel.appendChild(floatpanel); | |
| basepanel.appendChild(tmppanel); | |
| panelBox.appendChild(basepanel); | |
| return true; | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
はじめまして。
こちらのツール使用させていただきましたが、プロフィールの,カンマのついたデータをキャッチしてくれないようです。
お手すきのときに修正お願いします