Discourse에서 주제 닫기 및 아카이브하기 사용자 스크립트

(아마 Development 채널에 올리는 게 맞을 수도 있지만, 확신이 없어서 여기에 올립니다)

제가 조금 관리하는 포럼에서 오래된 그룹 가입 요청 PM을 닫고 아카이브 처리하며 받은함을 정리하던 중, 매번 수동으로 하는 게 짜증이 났습니다.

그래서 이 작업을 대신 해줄 userscript를 소개합니다! 우클릭을 해서 “Tampermonkey” 옵션으로 가서 “Close and Archive” 스크립트를 실행하면 됩니다!

코드:

// ==UserScript==
// @name         Close and Archive
// @namespace    http://tampermonkey.net/
// @version      2025-02-14
// @description  실행 시 현재 열려 있는 토픽/개인 메시지를 닫고 아카이브 처리합니다
// @author       Firepup Sixfifty
// @match        https://=hostname=/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=amcforum.wiki
// @grant        none
// @run-at       context-menu
// ==/UserScript==

(function() {
    'use strict';

    fetch(`https://${window.location.hostname}/t/${window.location.pathname.split('/')[3]}/status`, {
        "headers": {
            "content-type": "application/x-www-form-urlencoded; charset=UTF-8",
            "accept": "application/json",
            "x-csrf-token": document.querySelector("[name='csrf-token']").content
        },
        "body": "status=closed&enabled=true",
        "method": "PUT"
    }).then((r)=>{
        fetch(`https://${window.location.hostname}/t/${window.location.pathname.split('/')[3]}/status`, {
            "headers": {
                "content-type": "application/x-www-form-urlencoded; charset=UTF-8",
                "accept": "application/json",
                "x-csrf-token": document.querySelector("[name='csrf-token']").content
            },
            "body": "status=archived&enabled=true",
            "method": "PUT"
        }).then((r)=>{
            fetch(`https://${window.location.hostname}/t/${window.location.pathname.split('/')[3]}/archive-message`, {
                "headers": {
                    "accept": "application/json",
                    "x-csrf-token": document.querySelector("[name='csrf-token']").content
                },
                "method": "PUT"
            });
        })
    })
})();
1개의 좋아요

잠깐… 그럼 이걸 어떻게 실행하죠? 어디에 두어야 하나요?

Tampermonkey 브라우저 확장 프로그램용으로 작성된 스크립트입니다.

1개의 좋아요

PM 페이지에 있을 때 a 단축키보다 더 많은 기능을 수행하나요?

네 - PM도 함께 종료됩니다.

아카이브된 게시물에는 답글을 달 수 없습니다:

글쎄, 그냥 실수로 스태프가 그걸 발견하는 경우를 대비해서 닫아두는 거야. 답장할 필요가 없다는 걸 더 명확하게 보여주기 위해서야.

관리자이신가요, 아니면 모더레이터인가요? 관리자라면 유저스크립트에 의존하기보다 테마 컴포넌트를 직접 만들 수 있을 것입니다.

그렇다고 해도, 코드를 수정할 수 없는 사이트에서는 다양한 개선 사항을 위해 유저스크립트가 여전히 흥미로운 해결책입니다.

저는 많은 웹사이트에서 이를 사용하고 있습니다.

meta.discourse.org에서는 편집기 안에서 선택한 텍스트를 <kbd> 태그로 감싸는 Ctrl+Shift+k 단축키를 추가하는 스크립트를 하나 가지고 있습니다. :slight_smile:

// ==UserScript==
// @name         meta.discourse.org용 <kbd> 단축키
// @namespace    Violentmonkey Scripts
// @version      1.0
// @description  meta.discourse.org의 텍스트 영역에 Ctrl + Shift + k로 <kbd> 태그 삽입
// @author       chatGPT
// @match        https://meta.discourse.org/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    document.addEventListener('keydown', function(event) {
        if (event.ctrlKey && event.shiftKey && event.key === 'K') {
            const activeElement = document.activeElement;
            if (activeElement.tagName === 'TEXTAREA' && activeElement.classList.contains('ember-text-area')) {
                const start = activeElement.selectionStart;
                const end = activeElement.selectionEnd;
                const text = activeElement.value;
                const insertText = '<kbd>';
                const closeText = '</kbd>';

                const selectedText = text.slice(start, end);
                activeElement.value = text.slice(0, start) + insertText + selectedText + closeText + text.slice(end);

                const cursorPosition = end === start
                    ? start + insertText.length
                    : start + insertText.length + selectedText.length + closeText.length;

                activeElement.selectionStart = activeElement.selectionEnd = cursorPosition;

                event.preventDefault();
            }
        }
    });
})();

또한, Tampermonkey는 소스 코드가 공개되지 않았기 때문에 사용하지 않습니다. 저는 오픈 소스 소프트웨어를 선호하며, 경쟁 제품들이 여러 개 있지만(모두 비슷해 보이고 스크립트는 상호 호환됩니다) 가장 많이 사용되는 것은 Violentmonkey라고 생각합니다.

1개의 좋아요

TC를 만드는 게 귀찮아서 그냥 사용자 스크립트로 넣었거든요. 이렇게 하면 수정하고 테스트하기가 더 빨랐어요 (처음에는 콘솔에서 몇 번 실행해서 테스트했어요)

오오, 그거 진짜 좋은 기능인데, 공유해줘서 고마워요!

스크립트를 조금 수정해서 토픽에서도 작동하도록 만들었습니다. (참고로, 이렇게 하면 아카이브된 개인 메시지가 생성되는 이상한 효과가 발생합니다.)

1개의 좋아요