Discourse 일일 챌린지

지금 딸을 학교에 데려다 주고 있습니다. 그리고 오늘 오전에 몇 가지 약속이 있어요. 조사하는 데 시간이 좀 걸릴 것 같습니다.

1개의 좋아요

일부 데이터베이스 컬럼이 제대로 마이그레이션되지 않은 것 같습니다. 이 버전에서는 기존 테이블에 여러 개의 새 컬럼이 추가되었습니다. 다음 명령을 실행해 보실 수 있을까요?

cd /var/discourse && ./launcher rebuild app

패널의 업데이트 버튼을 사용하면 데이터베이스 마이그레이션이 적용되지 않습니다. 플러그인이 새 컬럼을 추가한 경우 전체 재빌드가 필요합니다.

인내심을 가져 주셔서 감사합니다. 해결책을 찾아보겠습니다!

1개의 좋아요

실제로, 먼저 이 코드를 실행한 후 출력을 게시해 주시겠어요?

./launcher enter app
su discourse -c 'cd /var/www/discourse && bundle exec rails runner "puts ActiveRecord::Base.connection.columns(\"daily_challenges\").map(&:name)"'
1개의 좋아요
root@segredin-app:/var/www/discourse# su discourse -c 'cd /var/www/discourse &&                                                                                         bundle exec rails runner "puts ActiveRecord::Base.connection.columns(\"daily_cha                                                                                        llenges\").map(&:name)"'
id
topic_id
hashtag
start_date
end_date
check_ins_needed
description
created_at
updated_at
final_post_sent
weekly_post_enabled
weekly_post_day
weekly_post_hour
award_badge
badge_name
badge_id
check_in_interval
week_start
category_id

이것을 보세요

ActiveModel::UnknownAttributeError (unknown attribute 'challenge_timezone' for DailyChallenge.) app/controllers/application_controller.rb:447:in 'block in ApplicationController#with_resolved_locale'

challenge_timezone DB 열이 없는 것 같습니다. 다음을 실행해 보시겠어요?

./launcher enter app
su discourse -c 'cd /var/www/discourse && bundle exec rails runner "ActiveRecord::Base.connection.add_column(:daily_challenges, :challenge_timezone, :string, default: \"UTC\") unless ActiveRecord::Base.connection.column_exists?(:daily_challenges, :challenge_timezone)"'

이렇게 하면 해당 열이 추가됩니다. 왜 추가되지 않았는지 조사해서 파일들을 업데이트하겠습니다.

1개의 좋아요

좋아, 아직 남아 있긴 하지만 그의 수정을 기다릴게요

ActiveModel::UnknownAttributeError (unknown attribute 'challenge_timezone' for DailyChallenge.)
app/controllers/application_controller.rb:447:in 'block in ApplicationController#with_resolved_locale'
app/controllers/application_controller.rb:447:in 'ApplicationController#with_resolved_locale'
app/controllers/application_controller.rb:1098:in 'ApplicationController#ensure_dont_cache_page'
lib/middleware/omniauth_bypass_middleware.rb:35:in 'Middleware::OmniauthBypassMiddleware#call'
lib/middleware/crawler_hooks.rb:11:in 'Middleware::CrawlerHooks#call'
lib/content_security_policy/middleware.rb:12:in 'ContentSecurityPolicy::Middleware#call'
lib/middleware/anonymous_cache.rb:420:in 'Middleware::AnonymousCache#call'
lib/middleware/csp_script_nonce_injector.rb:12:in 'Middleware::CspScriptNonceInjector#call'
config/initializers/008-rack-cors.rb:14:in 'Discourse::Cors#call'
lib/middleware/default_headers.rb:13:in 'Middleware::DefaultHeaders#call'
config/initializers/100-quiet_logger.rb:20:in 'DiscourseRackQuietAssetsLogger#call'
config/initializers/100-silence_logger.rb:29:in 'SilenceLogger#call'
lib/middleware/enforce_hostname.rb:23:in 'Middleware::EnforceHostname#call'
lib/middleware/request_tracker.rb:321:in 'Middleware::RequestTracker#call'
lib/middleware/overload_protections.rb:22:in 'Middleware::OverloadProtections#call'
lib/middleware/processing_request.rb:14:in 'Middleware::ProcessingRequest#call'

올바른 디렉터리인지 확인하려면 먼저 다음을 실행하세요:

cd /var/discourse && ./launcher enter app

그 다음 다음을 실행하세요:

su discourse -c 'cd /var/www/discourse && bundle exec rails runner "ActiveRecord::Base.connection.add_column(:daily_challenges, :challenge_timezone, :string, default: \"UTC\") unless ActiveRecord::Base.connection.column_exists?(:daily_challenges, :challenge_timezone)"'

실행한 후, 앱에서 벗어나려면 "exit"를 입력할 수 있습니다.

웹페이지를 강제 새로고침(Ctrl-Shift-R)한 뒤 다시 시도해 보세요. 그래도 작동하지 않으면 몇 분 내에 수정 사항을 배포하겠습니다.

회의 중입니다. 곧 업데이트하겠습니다.

1개의 좋아요

방금 업데이트를 푸시했습니다. 관리자 패널을 통해 업데이트할 수 있어야 합니다. 작동하지 않으면 다음을 실행해야 할 수 있습니다.

./launcher rebuild app
1개의 좋아요

동작합니다

Friends: Chandler Bing (Matthew Perry) Dancing

1개의 좋아요

우와!!! 함께 견뎌주고 문제를 해결하는 데 도움을 줘서 정말 고마워!!

Funny Man Dancing in Tutu

1개의 좋아요

다음 단계에서 새로운 기능이 추가될 예정인가요? 몇 가지 아이디어를 드리고 싶습니다.

코인과 배지가 포함된 스트릭(연속 달성) 기능, 그리고 내 통계를 확인할 수 있는 공간/섹션

어쨌든 정말 마음에 들고, 더 많은 업데이트를 기다리고 있습니다 :smiley:

1개의 좋아요

현재 이 부분을 작업하고 있습니다. 기본적으로는 사용자가 생성하는 “봇”(실제로는 단순한 사용자 계정)입니다. 이 플러그인은 봇에 대한 언급을 감시합니다. 언급을 발견하면 해당 작업을 실행합니다. 예를 들어:

봇 이름: ChallengeBot

누군가가 이렇게 입력합니다:

@ChallengeBot status

봇은 챌린지에서의 현재 상태를 담은 DM(다이렉트 메시지)을 해당 사용자에게 전송합니다.

봇에는 다른 옵션들도 몇 가지 있습니다.

1개의 좋아요

이 정보를 가져와서 다른 곳에 표시하는 방법, 또는 카드 사용자 화면에 표시하는 방법이 있을까요? 방법이 있다면 알려주시면 좋겠습니다.

v1.4.0이 이제 사용 가능합니다!

이번 릴리스에서는 ChallengeBot이 추가되었습니다. ChallengeBot은 챌린지에 DM 기반 참여 기능을 제공하는 선택적 봇 계정입니다.

이번 릴리스의 주요 변경 사항:

  • 체크인 확인 DM — 멤버는 성공적인 체크인 후 ChallengeBot으로부터 현재 연속 기록과 챌린지 토픽 링크가 포함된 DM을 받습니다.
  • 리마인더 DM — 2일 이상 연속으로 체크인하지 않은 참가자(일일 챌린지) 또는 주 마지막 날까지 체크인하지 않은 참가자(주별 챌린지)는 ChallengeBot으로부터 부드러운 알림을 받습니다. 현재 체크인 횟수와 목표가 포함됩니다. 챌린지별로 토글할 수 있으며, 기본값은 활성화되어 있습니다.
  • @멘션 명령어 — 멤버는 활성 챌린지 토픽에서 @ChallengeBot을 멘션하여 DM으로 개인 통계를 받을 수 있습니다. 봇은 토픽 자체에는 응답하지 않습니다. 사용 가능한 명령어: status, leaderboard, streak, checkins, progress, help. 사용자당 시간당 10개 명령어로 제한됩니다.
  • 리더보드 및 최종 결과 게시글 — ChallengeBot이 설정된 경우, 주별 리더보드 게시글과 최종 결과 게시글이 시스템 계정 대신 봇 계정에서 전송됩니다.
  • 새로운 사이트 설정daily_challenge_bot_username
  • 새로운 챌린지 필드 — 리마인더 DM 토글 (기본값: 활성화)

ChallengeBot 설정은 선택 사항입니다 — 설정하지 않아도 기존 모든 기능이 정상적으로 작동합니다. 전체 설정 안내는 메인 게시글을 참조하세요.

참고: 이 릴리스에는 데이터베이스 마이그레이션이 포함되어 있습니다. 패널의 업데이트 버튼을 누르면 자동으로 적용됩니다.

2개의 좋아요

멋지다 :smiley:

이 옵션은 PM으로 보내고 토픽에도 표시하는 방식으로 가능한가요? 참고로 저는 @system을 챗봇으로 설정해 두었습니다.

CSS

.daily-challenge-dashboard {
    background-color: #1a1a1b;
    padding: 20px;
    border-radius: 8px;
    color: #d7dadc;
}

.d-page-subheader__title {
    color: #ffffff;
    font-size: 1.5rem;
    margin-bottom: 15px;
    border-bottom: 1px solid #343536;
    padding-bottom: 10px;
}

.d-stat-tiles.fcd-stats {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
    gap: 12px;
    margin-bottom: 30px;
}

.d-stat-tile {
    background-color: #272729;
    border: 1px solid #343536;
    padding: 15px;
    border-radius: 8px;
    transition: border-color 0.2s;
}

.d-stat-tile:hover {
    border-color: #818384;
}

.d-stat-tile__label {
    color: #818384;
    font-size: 0.75rem;
    text-transform: uppercase;
    font-weight: 700;
    letter-spacing: 0.5px;
}

.d-stat-tile__value {
    display: block;
    font-size: 1.8rem;
    font-weight: 600;
    color: #ff4500;
}

.fcd-leaderboard__table {
    width: 100%;
    border-collapse: separate;
    border-spacing: 0 8px;
}

.fcd-leaderboard__table thead th {
    color: #818384;
    font-size: 0.7rem;
    text-transform: uppercase;
    padding: 0 15px 5px 15px;
    text-align: left;
}

.fcd-leaderboard__row {
    background-color: #272729;
    transition: transform 0.1s ease;
}

.fcd-leaderboard__row td {
    padding: 12px 15px;
    border-top: 1px solid #343536;
    border-bottom: 1px solid #343536;
}

.fcd-leaderboard__row td:first-child {
    border-left: 1px solid #343536;
    border-top-left-radius: 8px;
    border-bottom-left-radius: 8px;
}

.fcd-leaderboard__row td:last-child {
    border-right: 1px solid #343536;
    border-top-right-radius: 8px;
    border-bottom-right-radius: 8px;
}

.fcd-leaderboard__row:hover {
    background-color: #2d2d2e;
}

.fcd-rank {
    width: 24px;
    height: 24px;
    display: flex;
    align-items: center;
    justify-content: center;
    border-radius: 50%;
    font-weight: bold;
    font-size: 0.8rem;
}

.fcd-rank--gold { background: #ffd700; color: #000; box-shadow: 0 0 10px rgba(255, 215, 0, 0.3); }
.fcd-rank--silver { background: #c0c0c0; color: #000; }

.fcd-streak-icon {
    color: #ff4500;
    filter: drop-shadow(0 0 3px rgba(255, 69, 0, 0.5));
    animation: pulse 2s infinite;
}

@keyframes pulse {
    0% { transform: scale(1); opacity: 1; }
    50% { transform: scale(1.1); opacity: 0.8; }
    100% { transform: scale(1); opacity: 1; }
}

.fcd-progress {
    height: 8px;
    background-color: #343536;
    border-radius: 4px;
    overflow: hidden;
    width: 100px;
    display: inline-block;
    vertical-align: middle;
    margin-right: 8px;
}

.fcd-progress__bar {
    background: linear-gradient(90deg, #ff4500, #ff8c00);
    height: 100%;
    border-radius: 4px;
}

.fcd-progress__label {
    font-size: 0.8rem;
    color: #d7dadc;
    font-weight: bold;
}

.fcd-leaderboard__user img {
    border-radius: 50%;
    border: 2px solid #343536;
    margin-right: 10px;
}