Roll20 Log轉換

將Roll20 Log轉換為IRC上色器可處理之格式

// ==UserScript==
// @name         Roll20 Log轉換
// @namespace    http://tampermonkey.net/
// @version      1.1
// @description  將Roll20 Log轉換為IRC上色器可處理之格式
// @author       Wei-Ting Hsu
// @match        https://app.roll20.net/campaigns/chatarchive/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=roll20.net
// @grant        none
// @license MIT
// @require https://cdn.jsdelivr.net/npm/dayjs@1/dayjs.min.js
// ==/UserScript==
(function() {
    'use strict';
    const marsaBtn = document.createElement("button");
    //let exportString = ""
    marsaBtn.id = "marsa-custom-btn";
    marsaBtn.style = "background:red; position:absolute;top:12px ;right:12px;";
    marsaBtn.innerText = "this is marsa custom btn";
    const handleTimeData=(timeData)=>{
        if(!timeData)
            return //防呆
            const timeDataArray=timeData.slice(0,timeData.length-2).split(':')//取得小時與分鐘array
        if(timeData.includes('PM'))//處理12小時制資料
            timeDataArray[0]=timeDataArray[0]==='12'?parseInt(timeDataArray[0]):parseInt(timeDataArray[0])+12
        else
            timeDataArray[0]=timeDataArray[0]==='12'? parseInt(timeDataArray[0])-12 : parseInt(timeDataArray[0])
        return timeDataArray.join(':')

    }
    marsaBtn.onclick = () => {
        let byName = "";
        let imgSrc = "";//圖片元素
        let time="";
        const root = document.createElement("div");//輸出的根元素
        root.style = "display:flex;flex-direction:column;"
        const massgeArray = document.getElementsByClassName("content")[0].children;
        for (let message of massgeArray) {
            const spanRoot = document.createElement("div");//每一行的根元素,用於處理頭像與文字
            spanRoot.style = "display:flex;align-items:start";//簡單樣式
            const inserSpan = document.createElement("span");//輸出的擲骰結果
            const rollresult = document.createElement("span");//時間戳記
            inserSpan.style="line-height:20px;padding-left:4px;"//簡單樣式
            rollresult.style="line-height:20px;padding-left:4px;"//簡單樣式
            //console.log(message.getElementsByClassName("avatar")[0].children[0])
            // if (message.getElementsByClassName("avatar")[0]) {
            //     imgSrc = message.getElementsByClassName("avatar")[0].children[0]?message.getElementsByClassName("avatar")[0].children[0].src:'';
            // }

            if (message.getElementsByClassName("by")[0]) {
                byName = message.getElementsByClassName("by")[0].innerText.slice(0, message.getElementsByClassName("by")[0].innerText.length-1).replace(' (GM)','(GM)')
                console.log(byName)
            }
            if (message.getElementsByClassName("tstamp")[0]) {
                let timeArray=message.getElementsByClassName("tstamp")[0].innerText.split(" ");
                if(timeArray.length>1)//當日log似乎沒有日期tag
                    timeArray[3]=handleTimeData(timeArray[3])
                else
                    timeArray=[new Date().getMonth()+1,new Date().getDate(),new Date().getFullYear(),handleTimeData(timeArray[0])]
                time = dayjs(timeArray[2]+'/'+timeArray[0]+'/'+timeArray[1]+' '+timeArray[3]).format('HH:mm')

            }

            if (message.classList.contains("rollresult")) {
                message.getElementsByClassName("rolled")[0]
                //console.log(message.getElementsByClassName("formula")[0].innerText.replace('rolling','.r'))
                const  formulaArray=message.getElementsByClassName("formula")
                inserSpan.textContent =  '<'+byName+'>' + message.getElementsByClassName("formula")[0].innerText.replace('rolling',' .r').replace(/\r\n|\n/g, "") + "\r\n"
                rollresult.textContent='<DICE> '+byName+' '+'投擲'+' '+(formulaArray[0].innerText.split(' ')[2]?formulaArray[0].innerText.split(' ')[2]:' ')+':'+formulaArray[0].innerText.split(' ')[1]+'='+formulaArray[1].innerText.replace(/\r\n|\n/g, "")+'='+message.getElementsByClassName("rolled")[0].innerText
                console.log(message.getElementsByClassName("formula")[0].innerText.split(' ')[1])
                console.log(rollresult.textContent)
                //exportString += ("<span>" + message.innerText.replace(/\r\n|\n/g, "") + "\r\n" + "</span>");
            }

            else if (message.classList.contains("emote")) {
                //inserSpan.style = "color:red;  font-style:italic;"
                inserSpan.textContent = '* '+message.innerText.replace(' (GM)','(GM)') + "\r\n";
                //exportString += "<span style='color:red;  font-style:italic;'>"+ message.innerText + "\r\n" + "</span>";
            }
            else {
                inserSpan.textContent = (!message.getElementsByClassName("by")[0] ? '<'+byName+'> ' : "") + message.innerText.replace(' (GM)','(GM)').replace(byName+':','<'+byName+'> ');
                // exportString += "<span>" + (!message.getElementsByClassName("by")[0] ? byName : "") + message.innerText + "\r\n" + "</span>";
            }
            // const img = document.createElement("img");
            // img.style = "max-width:20px;max-height:20px;";
            // img.src = imgSrc;
            //timeSpan.textContent='['+time+']'
            //spanRoot.appendChild(img)//先加圖片
            //spanRoot.appendChild(timeSpan)//先加時間
            inserSpan.innerText='['+time+'] '+inserSpan.innerText
            spanRoot.appendChild(inserSpan)//再加文字
            //console.log(spanRoot)
            root.appendChild(spanRoot);
            if(rollresult.innerText){
                rollresult.innerText='['+time+'] '+rollresult.innerText
                root.appendChild(rollresult);}
        }
        const link = document.createElement("a");
        const textFileAsBlob = new Blob([root.outerHTML], { type: 'text/html' });
        link.href = window.URL.createObjectURL(textFileAsBlob);
        link.download = dayjs(new Date()).format('YYYY/MM/DD HH:mm:ss')+" Log"
        link.click();
    };
    document.body.appendChild(marsaBtn)
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址