Discourse 毎日チャレンジ

現在、娘を学校へ連れて行っています。その後、今朝は数件の予定が入っています。調査には少し時間がかかるでしょう。

「いいね!」 1

データベースの列が正しくマイグレーションされていない可能性があります。このバージョンでは、既存のテーブルにいくつかの新しい列が追加されました。以下のコマンドを実行してみてください。

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

パネル内の「Update」ボタンを使用してもデータベースのマイグレーションは適用されません。プラグインが新しい列を追加する場合は、完全な再ビルドが必要です。

お待ちいただきありがとうございます。すぐに解決いたします!

「いいね!」 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 (DailyChallenge の未知の属性 'challenge_timezone') app/controllers/application_controller.rb:447:in 'block in ApplicationController#with_resolved_locale'

challenge_timezone データベース列が不足しているようです。以下のコマンドを実行してください。

./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 (DailyChallenge の未知の属性 'challenge_timezone')
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: チャンドラー・ビング(マシュー・ペリー)が踊る

「いいね!」 1

わーい!!最後まで付き合ってくれて、一緒に解決してくれてありがとう!!

Funny Man Dancing in Tutu

「いいね!」 1

次のステップでは新しい機能が登場する予定ですか?いくつかアイデアを提案したいです。

コインやバッジを用いたストリーク機能、そして自身の統計を追跡できる場所やセクションの追加などです。

とにかく、このサービスが大好きです。さらなる更新を心待ちにしています :smiley:

「いいね!」 1

現在、この部分の開発を進めています。これは基本的に、ユーザーが作成する「ボット」(実際にはユーザーアカウント)になります。プラグインはボットへの言及を監視し、言及を検出すると対応するアクションを実行します。例えば:

ボット名: ChallengeBot

誰かが以下のように入力します:

@ChallengeBot status

ボットは、そのユーザーに現在のチャレンジ状況を示すダイレクトメッセージ(DM)を送信します。

また、ボットには他のオプションもいくつか用意される予定です。

「いいね!」 1

この情報を別の場所に表示するにはどうすればよいですか?それともユーザーカードに表示させることはできますか?もしそのための方法があれば教えてください。

v1.4.0 が現在利用可能です!

このリリースでは、ChallengeBot が追加されました。これは、チャレンジにダイレクトメッセージ(DM)を活用したエンゲージメント機能をもたらすオプションのボットアカウントです。

今回のリリースの新機能:

  • チェックイン確認 DM — メンバーは、すべての正常なチェックイン後に ChallengeBot から DM を受け取り、現在のストリークとチャレンジトピックへのリンクが表示されます。
  • リマインダー DM — 2 日以上連続してチェックインしていない参加者(デイリーチャレンジの場合)または週の最終日までにチェックインしていない参加者(ウィークリーチャレンジの場合)は、ChallengeBot から gentle なリマインダーを受け取ります。現在のチェックイン数と目標が含まれます。チャレンジごとにオン/オフを切り替えることができ、デフォルトでは有効です。
  • @メンション コマンド — メンバーは、アクティブなチャレンジトピック内で @ChallengeBot をメンションすることで、個人統計を DM で取得できます。ボットはトピック自体には返信しません。利用可能なコマンド: status, leaderboard, streak, checkins, progress, help。ユーザーあたりのコマンド数は 1 時間に 10 回まで制限されています。
  • リーダーボードと最終結果の投稿 — ChallengeBot が設定されている場合、ウィークリーリーダーボード投稿と最終結果投稿は、システムアカウントではなくボットアカウントから送信されるようになりました。
  • 新しいサイト設定daily_challenge_bot_username
  • 新しいチャレンジフィールド — リマインダー DM のトグル(デフォルトでは有効)

ChallengeBot のセットアップはオプションです。既存の機能はすべて、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;
}