Band Ctrl+Enter Post And AutoSave

add Ctrl(cmd)+Enter Posting to Band.us, with AutoSave and Load button.

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         Band Ctrl+Enter Post And AutoSave
// @namespace    http://band.us/
// @version      0.3
// @description  add Ctrl(cmd)+Enter Posting to Band.us, with AutoSave and Load button. 
// @author       explainpark101
// @match        https://www.band.us/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=band.us
// @grant        GM_addStyle
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

    // --- 새로 추가된 버튼의 스타일을 정의합니다 ---
    GM_addStyle(`
        .load-temp-save-button {
            margin-left: 8px;
            background-color: #64748b;
            color: white;
            padding: 0 16px;
            height: 40px;
            border-radius: 8px;
            font-weight: bold;
            border: none;
            cursor: pointer;
            transition: background-color 0.2s;
        }
        .load-temp-save-button:hover {
            background-color: #475569;
        }
    `);

    const autoSave = (e) => {
        // 글쓰기 영역을 더 구체적으로 타겟팅합니다.
        const editor = e.target.closest('[contenteditable="true"]');
        if (!editor || editor.innerText.trim() === '') return;
        localStorage.setItem(location.pathname + "/tempsave", editor.innerText.replaceAll("\n\n", "\n"));
    };

    const loadSave = async () => {
        const savedText = localStorage.getItem(location.pathname + "/tempsave");
        if (!savedText) return;

        try {
            await navigator.clipboard.writeText(savedText);
            alert("임시저장 내용이 클립보드에 복사되었습니다. (Ctrl+V로 붙여넣으세요)");
        } catch (err) {
            console.error('클립보드 복사 실패:', err);
            alert("클립보드 복사에 실패했습니다.");
        }
    };

    const addLoadButton = () => {
        // 이미 버튼이 추가되었는지 확인
        if (document.querySelector('.load-temp-save-button')) {
            return true;
        }

        const submitButtonContainer = document.querySelector(".buttonSubmit");
        if (submitButtonContainer) {
            const loadButton = document.createElement('button');
            loadButton.textContent = '임시저장 불러오기';
            loadButton.type = 'button'; // form 제출을 방지
            loadButton.className = 'uButton -sizeM _btnSubmitPost';

            loadButton.addEventListener('click', loadSave);

            submitButtonContainer.insertAdjacentElement("afterBegin", loadButton);
            return true; // 버튼 추가 성공
        }
        return false; // 컨테이너를 못찾아 추가 실패
    };

    // --- 페이지 로드 시 임시저장 데이터가 있으면 버튼을 추가하는 로직 ---
    const savedData = localStorage.getItem(location.pathname + "/tempsave");
    if (savedData) {
        const checkInterval = setInterval(() => {
            // 버튼 추가를 시도하고, 성공하면 인터벌을 중단합니다.
            if (addLoadButton()) {
                clearInterval(checkInterval);
            }
        }, 500); // 0.5초마다 확인
    }


    window.addEventListener("keyup", e => {
        if (!location.pathname.startsWith("/band")) return;

        // Ctrl + Enter로 게시물 등록
        if (e.code == "Enter" && (e.ctrlKey || e.metaKey) && !e.shiftKey && !e.altKey) {
            document.querySelector(`div.buttonArea button[type="submit"]`)?.click();
            localStorage.removeItem(location.pathname + "/tempsave");
            return;
        }

        if (document.querySelector(`div.buttonArea button[type="submit"]:not(:disabled)`)) autoSave(e);
    });
})();