// ==UserScript== // @name ANWH:Agar通知Webhooks // @name:ja ANWH:Agar通知Webhooks // @name:en ANWH:Agar info⇒Webhooks // @version 0.2 // @namespace http://tampermonkey.net/tannichi-anwh // @description Agar サーバー情報を Webhooks(例えばDiscord) に通知します // @description:ja Agar サーバー情報を Webhooks(例えばDiscord) に通知します // @description:en notify Agar-server-info to Webhooks(e.g.Discord) // @author tannichi // @match http://agar.io/* // @match https://www.google.co.jp/uDV1b4P4 // @require http://ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min.js // @grant unsafeWindow // @grant GM_xmlhttpRequest // @grant GM_setValue // @grant GM_getValue // @downloadURL https://update.greasyfork.icu/scripts/40920/ANWH%3AAgar%E9%80%9A%E7%9F%A5Webhooks.user.js // @updateURL https://update.greasyfork.icu/scripts/40920/ANWH%3AAgar%E9%80%9A%E7%9F%A5Webhooks.meta.js // ==/UserScript== (function() { 'use strict'; const global = window.unsafeWindow || window; let my = { "name": "AgarNoticeWebhooks", "id": "anwh", "log": function(msg){ console.log(this.name + ":"+ msg); } }; let stat = { "prof_num": 2, "config_url": "https://www.google.co.jp/uDV1b4P4", "symbol_empty": "?", "symbol_done": "?", }; let cfg = {}, cfg_org = { "p1_use": true, "p1_msg": "@everyone come hear!", }; // ===== 初期処理 ==== function initialize(){ global[my.id] = {my:my, stat:stat, cfg:cfg}; var local_style = ''; local_style += '#anwh-cfg-dlg {'; //local_style += ' border-radius:0; font-size: 80%; padding: 2px 10px; position: fixed;'; //local_style += ' pointer-events: auto; background-color: rgba(32,32,32,0.4); color: #ffffff;'; //local_style += ' overflow: hidden;'; local_style += '}'; local_style += '#anwh-dialog input, #anwh-dialog label {'; local_style += ' width: auto; user-select: auto!important; pointer-events: auto;'; local_style += ' position: relative; float: initial;'; local_style += ' color: initial; background-color: initial; border: initial;'; //local_style += ' display: run-in;'; // NG local_style += '}'; local_style += '#anwh-dialog input[type="text"] {'; local_style += ' border: solid;'; local_style += '}'; $("head").append(''); // --- コントローラーの挿入先を探す ---- let htmlSet = null; if($("#settingsButton").length){ // orginal+ AgarTool htmlSet = function(html){ $("#settingsButton").before(html); }; }else if($(".btn-play").length){ // OGARio htmlSet = function(html){ $(".btn-play").before(html); }; }else{ // unknown htmlSet = function(html){ $("#nick")[0].after(html); }; } let html = ''; html += '
'; html += 'anwh:'; html += '?'; html += '?'; html += '
'; htmlSet(html); $("#anwh-notice").click(function(event){ my.log("notice click"); stat.notice = ! stat.notice; if(stat.notice){ $("#anwh-notice").text('⏳'); my.notice_start(); }else{ $("#anwh-notice").text('?'); my.notice_stop(); } }); $("#anwh-config").click(my.config); my.config_apply(); } // ===== 通知処理 ==== my.notice_start = function(){ // 画面からトークンが取得できれば、即送信する let tokenElem = $("#server-token,#server"); if(tokenElem.length){ my.notice_send(tokenElem.val()); return; } my.notice_token_detect(); }; my.notice_stop = function(){ }; my.notice_send = function(token){ let flg0 = {"token": token}; let flg_list = [flg0]; for(let name in cfg){ let res = /^p(\d+)_(.*)/.exec(name); if(res){ let prof_no = res[1]; let prof_name = res[2]; if(!(prof_no in flg_list)){ flg_list[prof_no] = {"no": prof_no}; } flg_list[prof_no][prof_name] = cfg[name]; } } if(cfg.leaderboard){ if($("#leaderboard-positions").length){ // OGARio flg0.leaderboard = $("#leaderboard-positions").text(); }else if($("#leaderboard").length){ // AgarTool flg0.leaderboard = $("#leaderboard").val(); } } if(cfg.tag){ flg0.tag = $('#clantag,#tag,#psk').val() || ""; } stat.send_count = 0; for(let prof_no = 1; prof_no < flg_list.length; prof_no ++){ let flg = {}; //Object.assign(flg, flg_list[0], flg_list[prof_no]); my.flg_merge(flg, flg_list[0]); my.flg_merge(flg, flg_list[prof_no]); my.notice_send_sub(flg); } if(stat.send_count === 0){ $("#anwh-notice").text(stat.symbol_empty); } }; my.flg_merge = function(dst, src){ for(let name in src){ let value = src[name]; if(typeof value !== "string" || value){ dst[name] = value; } } }; my.notice_send_sub = function(flg){ if(! flg.webhooksUrl || ! flg.use){ return; } let dataObj = {}; dataObj.content = (''+ (flg.msg || "")+ "\ntoken:"+ flg.token+ (cfg.tag ? " tag:"+ flg.tag : "")+ (cfg.leaderboard ? "\n"+"lb:"+ flg.leaderboard : "")) .replace(/^\n/, "") .replace(/\n\n/g, "\n"); let nick = flg.nick || $("#nick").val(); if(nick){ dataObj.username = nick; } if(flg.avatar){ dataObj.avatar_url = flg.avatar; } var dataStr = JSON.stringify(dataObj); my.log("notice data="+ dataStr); var xhr = new XMLHttpRequest(); xhr.open("POST", flg.webhooksUrl, true); xhr.setRequestHeader("Content-type", "application/json"); xhr.onreadystatechange = function () { if(xhr.readyState == 4 && (xhr.status == 200 || xhr.status == 204)) { //var json = JSON.parse(xhr.responseText); //console.log("OK email=" + json.email + ", pass=" + json.password); stat.send_count --; if(stat.send_count === 0){ $("#anwh-notice").text(stat.symbol_done); } } }; xhr.send(dataStr); stat.send_count ++; }; // ----- 画面に token が無い場合の処理 ----- my.notice_token_detect = function(){ let save_name = my.id +"_save_send"; let SockProt = global.WebSocket.prototype; if(save_name in SockProt){ my.log("WebSocket.send already hooked"); return; } let save_send = SockProt[save_name] = global.WebSocket.prototype.send; let urlRe = /^ws:\/\/live-arena-(\w+)\.agar\.io/; global.WebSocket.prototype.send = function(data){ save_send.apply(this, [data]); let res = urlRe.exec(this.url); my.log("catch send url="+ this.url +" res="+ res); if(res){ global.WebSocket.prototype.send = save_send; delete SockProt[save_name]; my.notice_send(res[1]); } }; }; // ===== 設定画面 ==== my.config = function(){ my.log("config clicked"); if(! stat.config_show){ my.config_sub(); } stat.config_show(); }; my.config_sub = function(){ let html = ''; html += ''; $("#anwh-config").after(html); let dlg = $("#anwh-dialog"); if(dlg.length && dlg.get(0).showModal){ stat.config_show = function(){ my.cfg_init(); my.cfg_load(cfg); dlg.get(0).showModal(); }; }else{ stat.config_show = function(){ my.cfg_init(); my.cfg_load(cfg); window.open(stat.config_url); }; return; } html = ''; html += 'Agar info⇒Webhooks'; dlg.append(html); my.config_init_sub($("#anwh-cfg-before")); my.config_cancel = function(){ dlg.get(0).close(); }; $("#anwh-cfg-parent").show(); }; my.config_init_sub = function(before){ //let html = '', spsp = '  ', brsp = '
  '; let html = '', spsp = '  ', brsp = '
  '; html += '
共通設定 ※同名項目は個別設定で上書きされます'; html += brsp +'with: '; html += ' '; html += brsp +''; html += brsp +''; html += brsp +''; for(let prof_no = 1; prof_no <= stat.prof_num; prof_no ++){ var prefix = "p"+ prof_no +"_"; html += '
'; html += ' '; html += brsp +''; html += brsp +''; html += brsp +''; html += brsp +''; } html += '
'; html += spsp +''; html += spsp +''; html += spsp +''; before.after(html); $("#anwh-cfg-default").click(function(){ my.cfg_load(cfg_org); }); $("#anwh-cfg-ok").click(function(){ cfg = my.cfg_save(); my.storage_setValue("config", JSON.stringify(cfg)); my.config_cancel(); my.config_apply(); }); $("#anwh-cfg-cancel").click(function(){ my.config_cancel(); }); }; my.config_apply = function(){ }; // ===== その他共通処理 ====== my.cfg_init = function(){ $.extend(cfg, cfg_org, JSON.parse(my.storage_getValue("config",'{}'))); }; my.cfg_save = function(){ var cfg_new = {}; $('[data-anwh-config]').each(function(){ var elem = $(this); var type = elem.prop('type'); var name = elem.attr('data-anwh-config'); var value; if(type === "checkbox"){ value = elem.prop('checked'); }else{ value = $(this).val(); } cfg_new[name] = value; }); return cfg_new; }; my.cfg_load = function(cfg_new){ $('[data-anwh-config]').each(function(){ var elem = $(this); var type = elem.prop('type'); var name = elem.attr('data-anwh-config'); if(cfg_new.hasOwnProperty(name)){ var value = cfg_new[name]; if(type === "checkbox"){ elem.prop('checked', value); }else{ $(this).val(value); } } }); }; my.storage_getValue = function(name, defval_){ //return global.localStorage[my.name +"_"+ name] || defval_; return GM_getValue(name, defval_); //return await GM.getValue(name, JSON.stringify(defval_)); }; my.storage_setValue = function(name, value){ //global.localStorage[my.name +"_"+ name] = value; GM_setValue(name, value); //await GM.setValue(name, JSON.stringify(value)); }; // ===== 起動処理 ==== my.cfg_init(); if(/https:\/\/www\.google\.co\.jp\//.test(location.href)){ $('body').html(''+ 'Agar info⇒Webhooks'+ ''); my.config_init_sub($("#anwh-cfg-before")); my.cfg_load(cfg); my.config_cancel = function(){ window.close(); }; return; } function pre_loop(){ // この時点では jQuery は使えない if(! document.getElementById("nick")){ my.pre_loop_timeout = (my.pre_loop_timeout || 1000) + 1000; setTimeout(pre_loop, my.pre_loop_timeout); my.log("wait for page load"); return; } // 念のため、もう1wait入れる setTimeout(initialize, 1000); //loadScript("https://greasyfork.org/scripts/40408-lib-ogario/code/lib%20OGARio.user.js", initialize); } pre_loop(); })();