카테고리와 기간에 따른 사용자 게시물 제한 방법 도움

안녕하세요,

Discourse에서 특정 기능을 구현하는 방법에 대한 조언을 구하고 있습니다. 제가 관리하는 커뮤니티에서는 사용자가 지난 14일 이내에 두 개의 특정 카테고리 중 하나에 게시글을 올린 경우, 해당 두 카테고리에서 새 주제를 생성하지 못하도록 하는 규칙을 적용해야 합니다. 이전 주제가 삭제된 경우에도 이 제한이 적용되어야 합니다.

조사를 해본 결과, discourse-flexible-rate-limits 플러그인을 발견했는데, 좋은 출발점이 될 것 같습니다. 이 플러그인은 사용자 그룹과 동작에 기반한 유연한 속도 제한을 허용하지만, 단기적인 빈도(분, 시간, 일)에 초점을 맞추고 있으며 다음 항목을 직접 지원하지 않는 것으로 보입니다:

  1. 여러 카테고리 간 게시글 확인.
  2. 14일이라는 긴 시간 범위 적용.
  3. 삭제된 주제를 확인 대상에 포함.

이 플러그인을 커스터마이징하거나 처음부터 무언가를 만들기 전에, 다음 질문을 하고자 합니다:

  • 이 유형의 기능을 이미 처리하는 기존 플러그인이나 방법이 있는지 아시는 분이 계신가요?
  • discourse-flexible-rate-limits와 같은 기존 플러그인을 수정하여 카테고리 간 및 장기적인 제한을 포함하는 데 권장되는 접근 방식이 있나요?
  • 이를 효과적으로 구현하는 방법에 대한 일반적인 조언이 있을까요?

이 훌륭한 커뮤니티의 여러분이 주시는 통찰력이나 제안에 감사하겠습니다. 관심 있으신 분들을 위해, 제가 최종적으로 어떻게 구현하는지 업데이트도 공유할 의향이 있습니다.

도움 주시면 정말 감사하겠습니다!

정확히 이해하고 있는지는 잘 모르겠지만, 특정 카테고리에서 게시글을 작성하면 해당 사용자를 그룹에서 제외하는 플러그인을 원하시는 것 같습니다(토픽 생성 훅을 사용). 그리고 해당 카테고리에서 마지막 토픽을 작성한 지 며칠이 지나면 사용자를 다시 그룹에 추가하는 작업을 매일 실행하는 것입니다.

대략 3~5시간 정도 걸릴 것 같고, 좋은 스펙/테스트를 작성하면 조금 더 걸릴 수도 있습니다.

안녕하세요, @pfaffman . 명절 축하드리고 답변 감사합니다!

명확하게 설명하기 위해 플로우 차트를 만들어 보았습니다:

flowchart TB
    A0(사용자가 카테고리 A 또는 B에서 새 주제 생성 시도) --> A1{사용자가 면제 그룹<br>(관리자, 모더레이터, TL3, TL4, 구독자)에 속해 있는가?}
    A1 -- 아니요 --> B1(사용자의 카테고리 A, B 또는 C에서<br>마지막 주제 확인, 숨겨지거나 삭제된 기록 포함)
    A1 -- 예 --> Z1(게시 허용)

    B1 --> B2{해당 마지막 주제가<br>14일 이내에 생성되었는가?}
    B2 -- 예 --> C1(게시 차단 + 오류 표시,<br>쿨다운 시간 표시,<br>규칙 링크 제공)
    C1 --> E1(초안 저장 +<br>제출 버튼 비활성화) ---> End(종료)
    B2 -- 아니요 --> D1(게시 허용)

    D1 --> End(종료)
    Z1 --> End(종료)
그리고 명확히 하기 위해 간단한 스펙도 만들어 보았습니다
```mermaid
flowchart TB
    A0(사용자가 카테고리 A 또는 B에서 새 주제 생성 시도) --> A1{사용자가 면제 그룹<br>(관리자, 모더레이터, TL3, TL4, 구독자)에 속해 있는가?}
    A1 -- 아니요 --> B1(사용자의 카테고리 A, B 또는 C에서<br>마지막 주제 확인, 숨겨지거나 삭제된 기록 포함)
    A1 -- 예 --> Z1(게시 허용)

    B1 --> B2{해당 마지막 주제가<br>14일 이내에 생성되었는가?}
    B2 -- 예 --> C1(게시 차단 + 오류 표시,<br>쿨다운 시간 표시,<br>규칙 링크 제공)
    C1 --> E1(초안 저장 +<br>제출 버튼 비활성화) ---> End(종료)
    B2 -- 아니요 --> D1(게시 허용)

    D1 --> End(종료)
    Z1 --> End(종료)

플로우 설명

  1. A0: 사용자가 카테고리 A 또는 B에서 새 주제 생성을 시작합니다.

  2. A1: 시스템이 사용자가 다음 면제 그룹 중 하나에 속하는지 확인합니다:
    • 관리자 (Administrators)
    • 모더레이터 (Moderators)
    • 신뢰 수준 3 (TL3)
    • 신뢰 수준 4 (TL4)
    • 사용자 정의 “구독자 (Subscribers)” 그룹
    • 예인 경우, 쿨다운 확인을 건너뛰고 즉시 게시를 허용합니다 (Z1).
    • 아니요인 경우, B1로 진행합니다.

  3. B1: 시스템은 사용자의 카테고리 A, B 또는 C에서 마지막으로 생성한 주제를 검색합니다. 이 검색에는 다음이 포함되어야 합니다:
    • 소프트 삭제된 주제 (데이터베이스에서 영구적으로 제거되지 않은 경우).
    • 숨겨지거나 컴플라이언스 카테고리로 이동된 주제 (예: 카테고리 C).

  4. B2: 시스템은 해당 마지막 주제의 생성일이 최근 14일 이내인지 확인합니다.
    • 예 → C1로 진행 (게시 차단).
    • 아니요 → D1로 진행 (게시 허용).

  5. C1: 시스템은 사용자가 여전히 쿨다운 상태임을 알리는 오류 메시지를 표시합니다. 메시지에는 다음이 포함되어야 합니다:
    • 아직 게시할 수 없다는 간단한 문구.
    • 일(day)과 시간(hour) 단위로 남은 시간 (분 표시 불필요).
    • 커뮤니티 규칙 페이지에 대한 링크 (아래에 제공됨).

  6. E1: 오류 표시 후, 사용자의 내용은 자동으로 초안으로 저장되며 “제출” 또는 “주제 생성” 버튼이 비활성화됩니다.

  7. D1: 사용자의 마지막 주제 생성 이후 14일 이상이 지난 경우, 시스템은 새 주제 게시를 허용합니다.

  8. Z1: 사용자가 면제 그룹에 속해 있으므로 제한 없이 게시할 수 있습니다.

2. 상세 사양 (Detailed Specification)

2.1 제한 그룹 vs. 면제 그룹

• 제한 그룹 (Restricted Groups):
• 다음 면제 그룹에 속하지 않는 모든 사용자 (일반적으로 TL0, TL1, TL2).
• 면제 그룹 (Exempt Groups):

  1. 관리자 (Administrators)
  2. 모더레이터 (Moderators)
  3. 신뢰 수준 3 (TL3)
  4. 신뢰 수준 4 (TL4)
  5. 구독자 (Subscribers) (사용자 정의 그룹)

이러한 면제 그룹은 14일 확인을 완전히 건너뜁니다.

2.2 대상 카테고리

• 새 주제 생성 시도:

• 제한 그룹에 속한 사용자가 카테고리 A 또는 B에서 새 주제를 생성하려고 할 때 트리거됩니다.

• 마지막 주제 확인:

• 시스템은 사용자의 카테고리 A, B 또는 C에서 마지막으로 생성한 주제를 확인합니다 (C는 “숨겨진” 또는 “컴플라이언스” 카테고리임).

참고: 카테고리 C는 사용자의 주제가 삭제/숨김/컴플라이언스 목적으로 이동된 상황을 포착하기 위해 포함됩니다. 사용자가 최근 14일 이내에 카테고리 C에서 주제를 생성했다면, 이 경우에도 쿨다운에 포함됩니다.

2.3 14일 쿨다운 로직

• 사용자의 가장 최근 주제 (A/B/C 중)가 14일 이내에 생성된 경우, A 또는 B에서의 새 주제 생성을 차단합니다.

• 14일 이상이 지난 경우, 허용합니다.

시간 계산

• 남은 시간을 일(day)과 시간(hour) 단위로 표시합니다 (예: “남은 시간 3일 12시간”).
• 분이나 초를 표시할 필요는 없습니다.

2.4 차단 및 초안 저장

• 차단 동작 (Blocking Behavior):
• 사용자가 차단되면 오류 메시지(C1)를 표시합니다.
• 시스템은 사용자의 내용을 자동으로 초안으로 저장합니다.
• 사용자가 진행할 수 없도록 “제출” 버튼이 비활성화됩니다.
• 오류 메시지 예시 (단순화됨):

죄송합니다, 아직 이 카테고리에서 새 주제를 생성할 수 없습니다.
마지막 주제가 14일 이내에 게시되었으며,
다시 게시할 수 있기까지 {X일 Y시간}이(가) 남았습니다.
자세한 내용은 커뮤니티 규칙을 참고하세요:
https://community.lezismore.org/t/topic/26/2

2.5 향후 확장성

  1. 추가 카테고리:

• 현재는 A, B, C만 구성되어 있습니다.

• 향후 이 쿨다운에 카테고리를 추가하거나 제거해야 하는 경우, 주요 코드 변경 없이 시스템이나 플러그인이 확장될 수 있도록 하십시오.

  1. 다른 시간 기간:

• 14일 기간은 플러그인 설정에서 구성 가능하게 할 수 있습니다 (7일, 30일 등으로 변경하려는 경우를 대비하여).

  1. 동적 그룹 지정:

• 면제 그룹을 추가하거나 줄이는 경우 (예: “구독자” 추가 또는 제거) 이를 지원해야 합니다.

3. 요약

  1. 제한 그룹 (TL0, TL1, TL2 또는 면제 그룹에 속하지 않는 모든 사용자)은 카테고리 A 또는 B에서 다른 주제를 생성하기 전에 14일 쿨다운을 적용받습니다.

  2. 면제 그룹 (관리자, 모더레이터, TL3, TL4, “구독자”)은 제한 없이 게시할 수 있습니다.

  3. 시스템은 카테고리 A, B 또는 C에서의 가장 최근 주제 생성을 확인합니다 (소프트 삭제되거나 숨겨진 경우 포함). 14일 이내에 생성된 경우, 새 주제는 차단됩니다.

  4. 오류 메시지: 남은 시간을 일/시간 단위로 표시하고 다음 커뮤니티 규칙에 대한 링크를 제공합니다:

• https://community.lezismore.org/t/topic/26/2

  1. 초안: 차단된 경우, 사용자의 게시물은 초안으로 저장되고 제출 버튼이 비활성화됩니다.

  2. 이 사양은 향후 추가 카테고리나 다른 시간 프레임으로 확장할 수 있습니다.

제안해 주시면 감사하겠습니다!

그게 제가 생각했던 내용과 거의 일치합니다. 제 해결책은 게시가 허용된 해당 카테고리에 게시글을 올릴 때, 그 사용자를 해당 그룹에서 제외하는 것입니다. 이렇게 하면 즉시 게시할 수 없다는 것이 명확해지며, 게시 방식을 변경하는 특수한 코드가 필요하지 않습니다.

아, 이제 당신의 해결책을 이해했습니다. :folded_hands: 그 접근법이 직관적으로 보일 수 있지만, 다음 사항에 대해 우려가 있습니다:

  1. 읽기 vs. 게시 권한

• 현재 TL1(또는 그 이상) 사용자는 A 및 B 카테고리에 읽기와 게시를 모두 할 수 있습니다.

• 14일 규칙을 위반할 때마다 사용자를 TL1에서 제거하면, 읽기 권한도 함께 잃게 됩니다. 하지만 우리는 게시만 차단하고 읽기는 막고 싶지 않습니다.

  1. 그룹 분리 필요

• “읽기는 되지만 게시는 안 되는” 상황을 해결하려면 여러 하위 그룹을 만들어야 합니다:

• TL1 제한 – A 또는 B에서 읽기와 답글은 가능하지만 토픽 생성은 불가.

• TL1 전체 – 읽기, 답글, 토픽 생성 모두 가능.

• 사용자가 14일 규칙을 위반하면 TL1 전체에서 TL1 제한으로 이동시킵니다. 이렇게 하면 더 복잡해집니다.

  1. 자동화 복잡성

• 개별 그룹이 있더라도, 쿨다운 기간이 지나면 사용자를 다시 “전체” 그룹으로 복귀시키는 자동화가 필요합니다.

• 즉, 14일 기간이 언제 끝나는지 계산하고 사용자를 TL1 제한에서 다시 TL1 전체로 재할당하는 로직(예: 예약 작업 또는 사용자 정의 코드)을 구현해야 합니다.

• 프로그래머가 아닌 저는 이렇게 복잡한 자동화를 혼자 처리하는 데 자신감이 없습니다.

즉, 특정 그룹에서 사용자를 제거하는 것이 게시 로직을 직접 수정하는 것을 피할 수 있지만, 추가 그룹과 복잡한 규칙을 만들어냅니다. 우리는 14일 동안 게시만 제한하고 싶을 뿐, 읽기 권한이나 기타 권한은 제한하고 싶지 않습니다.

제안이나 아이디어에 대해 진심으로 감사합니다. n8n을 통해 Discourse API와 웹훅으로 통합을 시도해 보았지만, 코딩 배경이 제한적이어서 저에게는 꽤 어려웠습니다.