Roll20 Log轉換

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

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==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)
})();