해결: 리마인더 플러그인

:discourse2: 요약 Solved Reminders Plugin은 Solved 플러그인의 기능을 확장하여 해결된 주제에 대한 추가적인 알림 기능을 제공합니다.
:hammer_and_wrench: 저장소 링크 https://github.com/discourse/discourse-solved-reminders-plugin
:open_book: 설치 가이드 Discourse에 플러그인 설치하는 방법

:warning: 이 플러그인은 현재 활성 개발 단계에 있으며 아직 완전히 완성되지 않았습니다.

Solved Reminders Plugin은 Discourse Solved 플러그인의 기능을 확장하여 종료가 필요한 주제에 대한 알림 및 통지 기능을 추가합니다. 이 플러그인은 사용자가 주제를 해결로 표시하도록 장려하여 효율적인 주제 관리를 돕는 것뿐만 아니라, 축하 메시지로 사용자를 참여시킵니다.

기능

  • 자동 알림: 사용자에게 알림을 보내 주제에 다시 방문하여 해결로 표시하도록 유도합니다.
  • 참여 메시지: 주제를 성공적으로 해결한 사용자에게 축하를 전하고, 도움을 줄 수 있는 추가 주제를 제안합니다.
  • 완벽한 통합: Discourse Solved 플러그인과 함께 작동하여 매끄러운 사용자 경험을 보장합니다.

설치

Solved Reminders Plugin을 설치하려면 Discourse Meta 가이드에 설명된 일반적인 플러그인 설치 과정을 따르세요:

  1. 컨테이너 구성 편집: app.yml 파일의 hooks 섹션에 플러그인의 저장소 링크를 추가하세요.
hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/discourse-solved-reminders-plugin.git
  1. Discourse 컨테이너 재빌드: 애플리케이션을 재빌드하여 플러그인을 적용하세요.
./launcher rebuild app

구성

설치 후, Discourse 관리자 패널을 통해 플러그인 설정을 세밀하게 조정할 수 있습니다. 다음을 조정하는 것을 고려해 보세요:

사용

설정이 완료되면, 이 플러그인은 관리자가 구성한 설정에 따라 자동으로 작동합니다. 관련 사용자에게 알림과 메시지를 보내 주제가 해결에 도달하도록 적극적으로 지원합니다.

사용자에게 게시물을 해결로 표시하도록 상기시키기 위해 전송된 PM:

게시물을 해결로 표시한 사용자에게 전송된 PM:

사용자는 설정에서 유사한 주제를 해결로 표시하도록 추천하는 PM을 비활성화할 수 있습니다:

관리자는 커뮤니티의 필요에 따라 구성을 조정할 수 있습니다.

메시지 텍스트 사용자 지정

사용자에게 전송되는 알림 메시지는 사이트의 외관 → 사이트 텍스트 페이지의 mark_as_solution.message 항목에서 찾을 수 있습니다.

보고 및 데이터 분석

이 플러그인은 Discourse에 특정 데이터베이스 테이블을 추가하지 않지만, Data Explorer 플러그인과 조합하여 알림 메시지의 효과를 추적하고 분석할 수 있습니다.

아래는 이 플러그인과 함께 사용할 수 있는 두 가지 예시 Data Explorer SQL 쿼리입니다.

Solved Reminder 메시지 수

이 쿼리는 Solved Reminder 메시지에 대한 월별 집계 통계를 제공합니다. 이 쿼리는:

  • "There has been a reply on topic you posted"라는 텍스트를 포함하는 개인 메시지를 식별합니다
  • 월별로 데이터를 그룹화하고 다음을 계산합니다:
    • 전송된 알림 메시지 수
    • 이러한 알림을 받은 사용자 총 수
    • 이러한 알림을 읽은 사용자 수
    • 읽음률(읽은 사용자/수신자)
  • 알림 메시지 활동 및 효과의 월별 추이를 보여줍니다
SQL 상세 정보
-- [params]
-- date :start_date = 2024-01-01
-- date :end_date = 2025-12-31
-- text :reminder_text = %There has been a reply on topic you posted%

WITH reminder_pms AS (
  SELECT 
    t.id AS topic_id,
    t.created_at,
    p.id AS post_id,
    p.user_id AS sender_id,
    DATE_TRUNC('month', t.created_at) AS month
  FROM topics t
  JOIN posts p ON p.topic_id = t.id AND p.post_number = 1
  WHERE 
    t.archetype = 'private_message'
    AND t.created_at BETWEEN :start_date AND :end_date
    AND p.raw LIKE :reminder_text
),

recipient_stats AS (
  SELECT
    r.topic_id,
    r.month,
    COUNT(DISTINCT tu.user_id) AS total_recipients,
    COUNT(DISTINCT CASE WHEN tu.last_read_post_number > 0 THEN tu.user_id END) AS read_recipients
  FROM reminder_pms r
  JOIN topic_users tu ON tu.topic_id = r.topic_id AND tu.user_id != r.sender_id
  GROUP BY r.topic_id, r.month
)

SELECT 
  TO_CHAR(month, 'YYYY-MM') AS month,
  COUNT(DISTINCT topic_id) AS reminder_pms_sent,
  SUM(total_recipients) AS total_users_received,
  SUM(read_recipients) AS users_who_read,
  ROUND(100.0 * SUM(read_recipients) / NULLIF(SUM(total_recipients), 0), 2) AS read_rate_percentage
FROM recipient_stats
GROUP BY month
ORDER BY month

Solved Reminder 개별 메시지

이 쿼리는 알림 메시지를 받은 각 사용자의 상세한 개인 수준 데이터를 제공합니다. 이 쿼리는:

  • "There has been a reply on topic you posted"라는 텍스트를 포함하는 개인 메시지를 식별합니다
  • 각 개별 수신자를 나열하며 다음을 포함합니다:
    • 사용자 정보(ID, 사용자 이름, 이름, 이메일)
    • 메시지 세부 정보(제목, 링크)
    • 메시지를 읽었는지 여부(TRUE/FALSE)
    • 언제 읽었는지(해당하는 경우)
    • 얼마나 많은 초를 들여 보았는지
  • 결과는 전송 날짜와 사용자 이름으로 정렬되어 각 메시지를 누가 받았고 읽었는지를 정확히 보여줍니다
SQL 상세 정보
-- [params]
-- date :start_date = 2024-01-01
-- date :end_date = 2025-12-31
-- text :reminder_text = %There has been a reply on topic you posted%

WITH reminder_pms AS (
  SELECT 
    t.id AS topic_id,
    t.title AS message_title,
    t.slug AS message_slug,
    t.created_at AS sent_at,
    p.id AS post_id,
    p.user_id AS sender_id,
    p.raw AS message_content
  FROM topics t
  JOIN posts p ON p.topic_id = t.id AND p.post_number = 1
  WHERE 
    t.archetype = 'private_message'
    AND t.created_at BETWEEN :start_date AND :end_date
    AND p.raw LIKE :reminder_text
)

SELECT 
  u.id AS user_id,  -- 사용자 링크로 렌더링됨
  u.username,
  u.name,
  ue.email,
  r.topic_id,       -- 주제 링크로 렌더링됨
  r.message_title,
  -- 메시지에 대한 링크(참조를 위해 수동으로 구성)
  '/t/' || r.message_slug || '/' || r.topic_id AS message_link,
  r.sent_at,
  -- 사용자가 메시지를 읽었는지 확인
  CASE 
    WHEN tu.last_read_post_number > 0 THEN TRUE
    ELSE FALSE
  END AS message_read,
  -- 언제 읽었는지(읽은 경우)
  CASE 
    WHEN tu.last_read_post_number > 0 THEN tu.last_visited_at
    ELSE NULL
  END AS read_at,
  -- 얼마나 많은 시간(초)을 들여 보았는지
  ROUND(tu.total_msecs_viewed / 1000.0, 1) AS time_viewed_seconds
FROM reminder_pms r
JOIN topic_users tu ON tu.topic_id = r.topic_id
JOIN users u ON u.id = tu.user_id
LEFT JOIN user_emails ue ON ue.user_id = u.id AND ue.primary = TRUE
WHERE 
  -- 수신자 목록에서 발신자(시스템/봇) 제외
  tu.user_id != r.sender_id
ORDER BY 
  r.sent_at DESC,
  u.username
17개의 좋아요

축하 PM(개인 메시지)에 주제 제목을 포함할 수 있을까요? 사용자가 한 번에 여러 개의 해결책(Solution)을 받게 되면, PM이 어떤 해결책을 가리키고 있는지 모를 경우 혼란을 줄 수 있습니다.

n개의 게시글이 지난 후에 리마인더가 전송되도록 설정할 수 있는 옵션이 있을까요?

4개의 좋아요

두 가지 사항에 대해 다시 한번 확인하고자 합니다:

  1. 최소 1개의 답변이 달린 주제에 대해서만 해당 주제의 작성자에게 메시지가 전송되나요?
  2. 카테고리별 솔루션 플러그인 설정과 함께 작동하나요? 즉, 일부 카테고리에서 기능을 비활성화하려면 사이트 전체 솔루션 플러그인 토글을 끄고, 대신 해당 기능을 사용하려는 카테고리에서만 활성화해야 하는 것인가요?
3개의 좋아요

제안된 주제들은 무작위로 선택된 미해결 주제들인가요, 아니면 원래 해결된 주제와 관련 있는 대화인가요? 관련이 있다면 어떻게 식별되나요?

1개의 좋아요

게시물 2개가 새 주제로 분리되었습니다: 소스 코드를 플러그인으로 변환하는 방법

이 기능이 정말 유용할 것 같네요. 특히 우리 포럼에서는 사람들이 답변을 받은 후에도 해결된 답으로 표시하는 것을 자주 잊어버리는데, 그러면 우리 팀이 직접 들어가서 일일이 상기시켜 줘야 했거든요. :weary:

궁금한 점이 몇 가지 더 있습니다:

  • 리마인더 DM을 보내는 주체를 설정할 수 있나요, 아니면 항상 디스코봇(Discobot)으로 고정되어 있나요?
  • 원할 경우 DM의 텍스트도 수정할 수 있나요?

감사합니다.

1개의 좋아요

이 플러그인 감사합니다. 정말 유용합니다!

제가 이해하기로는, 이 알림은 14일마다 한 번만 실행되는 것 같습니다. 즉, 14일 동안 제가 생성한(해결로 표시하지 않은) 모든 주제에 대해 DM과 이메일이 발송된다는 뜻입니다.

플러그인을 설치한 지 5일 만에 수동으로 실행해 봤더니 DM(과 이메일)이 7개나 도착했습니다:

이건 좀 과한 것 같습니다. 저는 현재 많은 주제를 적극적으로 생성하는 관리자로서 다소 특이한 케이스일 수 있지만, 우리 사용자 중에서도 많은 주제를 생성하는 분들이 꽤 많습니다(좋네요).

이 알림을 하나로 통합하는 옵션을 만들 수 있을까요? 스레드당 메시지가 아닌, 하나의 메시지로 "7개의 게시물을 해결로 표시하세요"라고 보내는 방식입니다.

5개의 좋아요