# 해결: 리마인더 플러그인

**URL:** https://meta.discourse.org/t/solved-reminders-plugin/340336
**Category:** Plugin
**Tags:** official, solved, experimental, solved-reminders
**Created:** [12월 4, 2024, 11:00오전 UTC](https://meta.discourse.org/t/solved-reminders-plugin/340336 "2024-12-04T11:00:55Z")
**Posts on this page:** 1
**Showing post:** 1

<div class="post-metadata">

### Author: ![Discourse](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/discourse/32/148734_2.png) [@Discourse](https://meta.discourse.org/u/Discourse)
#### Post date: [12월 4, 2024, 11:00오전 UTC](https://meta.discourse.org/t/solved-reminders-plugin/340336/1 "2024-12-04T11:00:55Z")

</div>

| | | |
| --- | --- | --- |
| :discourse2: | **요약** | **Solved Reminders Plugin** 은 [Solved 플러그인](https://github.com/discourse/discourse-solved)의 기능을 확장하여 해결된 주제에 대한 추가적인 알림 기능을 제공합니다. |
| 🛠 | **저장소 링크** | [https://github.com/discourse/discourse-solved-reminders-plugin](https://github.com/discourse/discourse-solved-reminders-plugin) |
| 📖 | **설치 가이드** | [Discourse에 플러그인 설치하는 방법](https://meta.discourse.org/t/install-plugins-in-discourse/19157) |

> [@](#):
>
> :discourse2: 이 플러그인은 Discourse 팀이 관리하는 #official 플러그인이므로, #Support, #Contribute > Bug, #Contribute > UX, #Contribute > Feature 요청은 Meta의 해당 카테고리에서 작성하고 적절한 플러그인 태그를 붙여주시면 됩니다. 아래 링크를 클릭하여 시작해 보세요. 👍
> 
> [❓&nbsp; **지원**](https://meta.discourse.org/new-topic?category_id=6&body=%3E%20Before%20asking,%20did%20you%20search%20first%3F%20Press%20%F0%9F%94%8D%20at%20the%20upper%20right%20to%20search.&tags=solved-reminders "Solved Reminders 설정 및 사용에 대한 지원 요청") [🐛&nbsp; **버그**](https://meta.discourse.org/new-topic?category_id=1&tags=solved-reminders "버그 보고는 플러그인의 정상/일반적인 사용을 방해하는 문제가 있는 것을 의미합니다") [👀&nbsp; **UX**](https://meta.discourse.org/new-topic?category_id=9&tags=solved-reminders "Solved Reminders의 사용자 인터페이스 및 기능 표시 방식(언어 및 UI 요소 포함)에 대한 토론") [💡&nbsp; **기능**](https://meta.discourse.org/new-topic?category_id=2&tags=solved-reminders "기존 Solved Reminders 기능의 개선 또는 강화 방법 및 제안된 새 기능의 작동 방식에 대한 토론")

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

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

## 기능

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

## 설치

Solved Reminders Plugin을 설치하려면 [Discourse Meta 가이드](https://meta.discourse.org/t/install-a-plugin/19157)에 설명된 일반적인 플러그인 설치 과정을 따르세요:

1. **컨테이너 구성 편집** : `app.yml` 파일의 `hooks` 섹션에 플러그인의 저장소 링크를 추가하세요.

```plaintext
hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/discourse-solved-reminders-plugin.git

```

1. **Discourse 컨테이너 재빌드** : 애플리케이션을 재빌드하여 플러그인을 적용하세요.

```plaintext
./launcher rebuild app

```

## 구성

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

 ![solved-settings](https://global.discourse-cdn.com/meta/original/4X/1/5/b/15bd78c59c178dfe420b021c94915d386c728ae9.png)

## 사용

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

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

 ![solved-pm-remind](https://global.discourse-cdn.com/meta/original/4X/b/b/6/bb6b39a215e0770967c29f00fc4957a9fa1203e0.png)

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

 ![solved-pm-congrats](https://global.discourse-cdn.com/meta/original/4X/8/c/d/8cd78c55ef89036617abcb619a6d89926f069185.png)

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

 ![solved-preferences](https://global.discourse-cdn.com/meta/original/4X/8/1/5/8158ef89202c43c0923098ca37998e3807fc4d35.png)

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

## 메시지 텍스트 사용자 지정

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

 ![image showing the text customization settings page](https://global.discourse-cdn.com/meta/original/4X/f/4/9/f491fa67ac1729cdd934022c3bf495f998ec23fd.png)

## 보고 및 데이터 분석

이 플러그인은 Discourse에 특정 데이터베이스 테이블을 추가하지 않지만, [Data Explorer](https://meta.discourse.org/t/32566?silent=true) 플러그인과 조합하여 알림 메시지의 효과를 추적하고 분석할 수 있습니다.

아래는 이 플러그인과 함께 사용할 수 있는 두 가지 예시 [Data Explorer](https://meta.discourse.org/t/32566?silent=true) SQL 쿼리입니다.

### Solved Reminder 메시지 수

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

- "There has been a reply on topic you posted"라는 텍스트를 포함하는 개인 메시지를 식별합니다
- 월별로 데이터를 그룹화하고 다음을 계산합니다:
  - 전송된 알림 메시지 수
  - 이러한 알림을 받은 사용자 총 수
  - 이러한 알림을 읽은 사용자 수
  - 읽음률(읽은 사용자/수신자)

- 알림 메시지 활동 및 효과의 월별 추이를 보여줍니다

> **SQL 상세 정보**
>
> ```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 상세 정보**
>
> ```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
> 
> ```

---

_[View the full topic](https://meta.discourse.org/t/solved-reminders-plugin/340336)._
