【NodeJS】Razer Synapse3のマクロ(ターボ)を検知する

ソフトウェア開発
広告だよ!!!たくさんクリックしてね

Synapseのユーザープロファイルを読み込んで、ターボ機能が有効かどうか判定するコードです。

ハードウェアにプロファイルを保存する機能を搭載している機種(Razer Basilisk Ultimate等)は検知できませんが・・・。

node.js v16.13.1で動作確認しました。

const fs = require('fs');
var exec = require('child_process').exec;

//プロファイルの存在するディレクトリ
const base_path = process.env.ProgramData + '\\Razer\\Razer Central\\Accounts';

console.log("[マクロチェックを起動しました]");

//1秒に1度マクロチェック
setInterval(main, 1000);

function main(){

    //ユーザープロファイルを列挙する
    const files = fs.readdirSync(base_path);
    let check_dirs = [];
    files.forEach(element => {
        const _s = element.substr( 0, 4 );
        if(_s == 'RZR_')
            check_dirs.push(element);
    });


    //検出:1 未検出:0 エラー発生:-1
    const macro_check_status = checkMacro(check_dirs);
    //console.log("\n")
    switch(macro_check_status.isMacro){
        case true:
            console.log("'" + macro_check_status.profile + "'プロファイルでマクロを検出しました");
            /*exec('taskkill /im AVA.exe /F', (err, stdout, stderr) => {
                if (err) {
                    console.log("AVAの強制終了に失敗しました");
                    
                }else{
                    console.log("完了");
                }
                console.log("マクロチェックを終了します");

                process.exit(1)
              }
            )*/
            break;
        case false:
            //console.log("マクロは検出されませんでした");
            break;
        default:
            console.log("チェック中にエラーが発生しました");
            break;
                
    }



}


function checkMacro(check_dirs){
    let report = {isMacro:false, profile:""};
    //ユーザープロファイルを一つずつ調べる
    check_dirs.forEach(chkdir => {
        //console.log(`\n------プロファイルディレクトリ${chkdir}------`);
        const dev_path = base_path + "\\" + chkdir + "\\Emily3\\Devices";

        //すべての登録マウスを調べる
        const mouses = fs.readdirSync(dev_path);
        mouses.forEach(mouse => {
            //マウスプロファイルの保管パス
            const pf_path = dev_path + "\\" + mouse + "\\";

            //アクティブマウスプロファイルのIDと名前を取得
            const xml = fs.readFileSync( pf_path + 'ActiveProfile.xml', "utf-8");
            const active_profile = xml.slice(xml.indexOf("<ProfileId>") + 11, xml.indexOf("</ProfileId>"));
            const active_profile_name = xml.slice(xml.indexOf("<Name>") + 6, xml.indexOf("</Name>"));

            //console.log(`マウス${mouse}においてアクティブなプロファイルは${active_profile}です`);

            //アクティブマウスプロファイルの設定データからマクロ設定を検索する
            const profiles = fs.readdirSync(pf_path + 'Features\\' + active_profile);
            profiles.forEach(profile => {
                if(profile.slice("-4") == ".xml"){

                    const prof_xml = fs.readFileSync( pf_path + 'Features\\' + active_profile + "\\" + profile);
                    if(prof_xml.indexOf("<IsTurbo>true</IsTurbo>") > -1)
                        report = {isMacro:true, profile:active_profile_name}; //マクロ有効
                    
                    
                }
                
            });
            

        });
    });
    
    return report;
}
タイトルとURLをコピーしました