search steam games name at bing(archive)

for Rewards

// ==UserScript==
// @name         search steam games name at bing(archive)
// @description  for Rewards
// @namespace    steam_name_bing
// @author       Covenant
// @version      1.0
// @license      MIT
// @homepage
// @match        https://store.steampowered.com/app/*
// @match        https://steamcommunity.com/app/*
// @match        https://store.steampowered.com/curator/*
// @icon         data:image/png;base64,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
// @grant        GM_setValue
// @grant        GM_getValue
// @grant        GM_registerMenuCommand
// @run-at       document-end
// @noframes
// ==/UserScript==
var btn_bing;
var btn_name_ja;
var input_word;
var name_en;
var name_ja;
var json_textarea;
var json=GM_getValue("steam_app_name_json", {"app_name":{}});
var is_show_link=GM_getValue("is_show_link",true);
function create_style(textContent,id,class_name){
    let style=create_node("style",class_name,true,document.body);
    style.type='text/css';
    style.id=id;
    style.textContent=textContent;
    return style;
}
const font_family_panel="font-family: 'Noto Sans Mono','Noto Mono','Cascadia Mono','Consolas','Liberation Mono','Monaco','Courier New','flag_patch','flag_white_patch','Noto Sans CJK JP','Meiryo','Yu Gothic','Microsoft JhengHei','symbol_sans','symbol2_sans','color_emoji','emoji_back',monospace;";
const font_family_code="font-family: 'Firple Slim','Noto Sans Mono','Noto Mono','Cascadia Code','Consolas','Liberation Mono','Monaco','Courier New','flag_patch','flag_white_patch','color_emoji','Noto Sans CJK JP','Meiryo','Yu Gothic','Microsoft JhengHei','symbol_sans','symbol2_sans','emoji_back',monospace;";
const font_family_steam="font-family: 'Motiva Sans',Arial, Helvetica,'flag_patch','flag_white_patch','color_emoji','Noto Sans CJK JP','Meiryo','Yu Gothic','Microsoft JhengHei','symbol_sans','symbol2_sans','emoji_back',sans-serif;";
const font_face_default=`
@font-face{font-family: 'color_emoji';src: local('Twemoji Mozilla'),/*url('file:///C:/Program Files/Mozilla Firefox/fonts/TwemojiMozilla.ttf'),*/local('Noto Color Emoji'),local('Segoe UI Emoji'),local('Apple Color Emoji');}
@font-face{font-family: 'symbol_sans';src: local('Segoe UI Symbol'),local('NotoSansSymbols-Regular'),local('NotoSansSymbols-Regular-Subsetted'),local('Noto Sans Symbols')/*,local('Apple Symbols')*/;}
@font-face{font-family: 'symbol2_sans';src: local('NotoSansSymbols2-Regular'),local('NotoSansSymbols-Regular-Subsetted2'),local('Meiryo');}
@font-face{font-family: 'emoji_back';src: local('Noto Color Emoji'),local('Toss Face Font Web'),local('Segoe UI Emoji');}
`;
var style_font_face=create_style(font_face_default,"gm_font_face_steam_name_bing",["user_gm_css","css_steam_name_bing"]);
var style_user_css=create_style(".user_input_local_bing{width: 70%;min-width: 32em;"+font_family_steam+"font-weight: 100;font-size: 110%;}","gm_user_css_steam_name_bing",["user_gm_css","css_steam_name_bing"]);
style_user_css.textContent+=`
.user_btn_steam{`+font_family_steam+`}
.user_textarea_json_steam{`+font_family_code+`font-size: 0.75rem;}
.user_textarea_json_steam{background: #1B2838;color: #ACB2B8;}
.user_textarea_json_steam{padding: 0.25em;min-width: 95%;min-height: 10em;border-style: inset;border-width: 0.2rem;border-color: #707070;}\n`;
function create_div(class_name,is_appendChild,node,refNode){
    let div=create_node("div",class_name,is_appendChild,node,refNode);
    div.style.backgroundSize='contain';
    div.style.backgroundRepeat='no-repeat';
    div.lang='ja';
    return div;
}
function create_a(innerText,url,class_name,is_appendChild,node,refNode){
    let anchor=create_node_text("a",innerText,class_name,is_appendChild,node,refNode);
    anchor.href=url;
    anchor.title=innerText;
    if(url.search(new RegExp("javascript", "i"))!=0||url.indexOf(":")!=10)anchor.target="_blank";
    return anchor;
}
function create_btn(innerText,class_name,is_appendChild,node,refNode){
    let btn=create_node_text("button",innerText,class_name,is_appendChild,node,refNode);
    return btn;
}
function create_input(placeholder,class_name,is_num,is_appendChild,node,refNode){
    let input=create_node("Input",class_name,is_appendChild,node,refNode);
    input.placeholder=placeholder;
    input.type="text";input.lang='ja';
    if(is_num)input.size="10";
    if(is_num)input.setAttribute("maxlength", "10");
    //if(is_num)input.setAttribute("oninput","this.value = this.value.replace(/[^0-9.]/g, '').replace(/(\\..*?)\\..*/g, '$1');");
    if(is_num){
        input.addEventListener("input", function (e) {
            this.value = this.value.replace(/[^0-9.]/g, '').replace(/(\..*?)\..*/g, '$1');
        });
    }return input;
}
function create_textarea(placeholder,class_name,is_appendChild,node,refNode){
    let textarea=create_node("textarea",class_name,is_appendChild,node,refNode);
    textarea.placeholder=placeholder;
    textarea.lang='ja';
    return textarea;
}
function create_node(tagname,class_name,is_appendChild,node,refNode){
    let element=document.createElement(tagname);
    element.id="";
    if(Array.isArray(class_name)){
        for(let i=0; i<class_name.length; i++){element.classList.add(class_name[i]);}
    }else if(typeof class_name==='string'){element.classList.add(class_name);}
    if(is_appendChild){node.appendChild(element);}else{node.insertBefore(element, refNode);}
    return element;
}
function create_node_text(tagname,innerText,class_name,is_appendChild,node,refNode){
    let element = create_node(tagname,class_name,is_appendChild,node,refNode);
    element.innerText=innerText;
    element.lang='ja';
    return element;
}
function fn_url(url){
    let obj_url=new URL(url);
    let params=obj_url.searchParams;
    return [obj_url,params];
}
async function fn_clipboard_w(str){
    try{
        await navigator.clipboard.writeText(str);
    }catch(e){alert(e.message);}
    finally{}
}
//console.log("break");
async function fn_re_steam_appdetails(response){
    let url=fn_url(response.url);
    let lang=url[1].get('l');
    if(response.status==200){
        let json=await response.json();
        let appid=steam_app_id(response.url);
        let data = json[appid];
        let { name, supported_languages, categories } = data.data;
        if(lang=="english"){
            name_en=name;
            input_word.value=name;
        }else if(lang=="japanese")name_ja=name;
    }else{
        if(lang=="english"){
            btn_bing.innerText+=" "+response.status;
        }
        //input_word.value=document.head.querySelectorAll('title')[0].innerText.replace(/ on Steam/i, '').replace(/Steam:/i, '').replace(/Steam - /i, '');
        console.log("appdetails response.status: "+response.status+response.responseHeaders);
    }
}
function fn_fetch(url,fn){
    fetch(url).then((response) => {
        console.log([
            "fetch",
            response.status,
            response.statusText,
            response.readyState,//
            response.responseHeaders,//
            response.ok,
            response.url].join("\n")
        );
        fn(response.clone());
        return response.json();
    }).then(data => {
        //console.log(data);
    }).catch(err => {
        console.log(err);
    });
}
function steam_app_id(url){
    url=fn_url(url);
    let host=url[0].host;
    let pathname=url[0].pathname;
    let ary_pathname=pathname.split('/');
    if(url[0].host=="store.steampowered.com"){
        if(ary_pathname[1]=="app")return ary_pathname[2];
        else if(ary_pathname[1]=="api")return url[1].get('appids');
    }else if(url[0].host=="steamdb.info"){
        if(ary_pathname[1]=="app")return ary_pathname[2];
    }else if(url[0].host=="steamcommunity.com"){
        if(ary_pathname[1]=="app")return ary_pathname[2];
        if(ary_pathname[3]=="achievements"){//achievements
            if(!isNaN(ary_pathname[2])){return ary_pathname[2];}
            else{
                var gameLogo_a=document.querySelectorAll('div.gameLogo>a')[0];
                if(gameLogo_a!=undefined){return fn_url(gameLogo_a.href)[0].pathname.split('/')[2];}
                else{return null;}
            }
        }
        if(url[1].get('category_753_Game[]')!=null)return url[1].get('category_753_Game[]').replace(/tag_app_/i, '');//Community Market
        if(ary_pathname[3]=="753")return parseInt(ary_pathname[4],10);//Community Market item
        if(ary_pathname[3]=="gamecards")return parseInt(ary_pathname[4],10);//badge
    }
    return null;
}

function fn_btn_search(){
    window.open('https://www.bing.com/search?q='+encodeURIComponent(input_word.value), '_blank');
    //redirectWindow.location;
}
function fn_btn_name_ja(){
    //let text=navigator.clipboard.readText().then(clipText => {tmp=clipText});
    input_word.value=name_ja;
}
function fn_btn_name_save(){
    let appid=steam_app_id(document.location);
    let url=fn_url(document.location);
    if(url[0].host=="store.steampowered.com"&&url[0].pathname.search(/\/app\/\d+.+/i)==0){
        json["app_name"][appid]={};
        if(name_en!=undefined){
            json["app_name"][appid]["en"]=name_en;
        }
        if(name_ja!=undefined){
            if(name_ja!=name_en)json["app_name"][appid]["ja"]=name_ja;
        }
    }else if(url[0].host=="steamcommunity.com"&&url[0].pathname.search(/\/app\/\d+.+/i)==0){
        let div_apphub_AppName=document.querySelectorAll("div.apphub_AppName")[0].innerText;
        json["app_name"][appid]={};
        json["app_name"][appid]["delisted"]=div_apphub_AppName;
    }
    GM_setValue('steam_app_name_json',json);
    this.innerText="save name✔️";
    console.log(json);
}
function fn_btn_remove(){
    let appid=steam_app_id(document.location);
    delete json["app_name"][appid];
    GM_setValue('steam_app_name_json',json);
}
function fn_btn_json_copy(){
    fn_clipboard_w(json_textarea.value);
}
function fn_btn_json_save(){
    try{
        let json=JSON.parse(json_textarea.value);
        if(json["app_name"]==undefined){throw (new Error("Thrown if the string to parse is not valid JSON."));}
        GM_setValue('steam_app_name_json',json);
    }catch(e){
        alert(e.message);
    }finally{}
}

function main_01(){
    let title=document.querySelectorAll('div.apphub_HeaderStandardTop')[0];
    let game_meta_data=document.querySelectorAll('div.game_meta_data');
    let appid=steam_app_id(document.location);
    GM_registerMenuCommand("show link"+(is_show_link?"✔️":"❌"), () => {
        GM_setValue("is_show_link", !is_show_link);
        location.reload();
    });
    if(title!=undefined){//steam game page
        let div_print=create_div("user",true,title);
        input_word=create_input("game_name",["searchbox","user_input_local_bing"],false,true,div_print);
        fn_fetch("https://store.steampowered.com/api/appdetails?appids="+appid+"&l=english",fn_re_steam_appdetails);
        fn_fetch("https://store.steampowered.com/api/appdetails?appids="+appid+"&l=japanese",fn_re_steam_appdetails);
        btn_bing=create_btn("bingで検索",["btnv6_blue_hoverfade","user_btn_steam"],true,div_print);
        btn_bing.addEventListener('click',() => {fn_btn_search();});
        btn_name_ja=create_btn("name_ja",["btnv6_blue_hoverfade","user_btn_steam"],true,div_print);
        btn_name_ja.disabled=true;
        btn_name_ja.addEventListener('click',() => {fn_btn_name_ja();});
        let btn_name_save=create_btn("save name"+(json["app_name"][appid]!=undefined?"✔️":""),["btnv6_blue_hoverfade","user_btn_steam"],true,div_print);
        btn_name_save.disabled=true;
        btn_name_save.addEventListener('click',fn_btn_name_save);
        window.setTimeout(( () => {
            if(name_en==undefined&&name_ja==undefined){//429
                input_word.value=document.querySelectorAll('div#appHubAppName')[0].innerText;
            }else if(name_ja==name_en){
                btn_name_ja.style.setProperty("display", "none");
            }else{btn_name_ja.disabled=false;}
            btn_name_save.disabled=false;
        }),3000);
        window.setTimeout(( () => {
            if(is_show_link){
                let div_heading=create_div(['block',"heading","sans_steam"],true,game_meta_data[0]);
                div_heading.innerText="bingで検索";
                let div_json=create_div(['block',"user_div_steam_info"],true,game_meta_data[0]);
                for(let key_id in json["app_name"]){
                    for(let key_lang in json["app_name"][key_id]){
                        let str_name=json["app_name"][key_id][key_lang];
                        let link_bing=create_a(str_name,"https://www.bing.com/search?q="+encodeURIComponent(str_name),['linkbar',"external","sans_steam"],true,div_json);
                        link_bing.title=key_id;
                        //console.log(key_lang + ' - ' + json["app_name"][key_id][key_lang])
                    }
                }
                create_node("br",[],true,div_json);
                let btn_json_copy=create_btn("copy json",["btnv6_blue_hoverfade","user_btn_steam"],true,div_json);
                btn_json_copy.addEventListener('click',fn_btn_json_copy);
                let btn_json_save=create_btn("save bak json from text",["btnv6_blue_hoverfade","user_btn_steam"],true,div_json);
                btn_json_save.addEventListener('click',fn_btn_json_save);
                json_textarea=create_textarea("json={\"app_name\":{}}",["user_textarea_json_steam"],true,div_json);
                json_textarea.value=JSON.stringify(json,"1065970",2);
                let btn_remove=create_btn("remove: "+appid,["btnv6_blue_hoverfade","user_btn_steam"],true,div_json);
                btn_remove.addEventListener('click',fn_btn_remove);
            }
        }),1000);
    }
}
(function() {
    'use strict';
    let url=fn_url(document.location);
    window.onload = function(){
        if(url[0].host=="store.steampowered.com"){
            if(url[0].pathname.search(/\/app\/\d+.+/i)==0){
                main_01();//console.log("/\/app\/\d+.+/")
            }
        }else if(url[0].host=="steamcommunity.com"){
            if(url[0].pathname.search(/\/app\/\d+.+/i)==0){
                let div_apphub_AppDetails=document.querySelectorAll("div.apphub_AppDetails")[0];
                let btn_name_save=create_btn("save name",["btnv6_blue_hoverfade","user_btn_steam"],true,div_apphub_AppDetails);
                btn_name_save.addEventListener('click',fn_btn_name_save);
            }
        }
    };
})();