Desafios Diários do Discourse

Estou levando minha filha para a escola no momento. Depois, tenho alguns compromissos esta manhã. Vou precisar de algum tempo para investigar.

1 curtida

Parece que algumas colunas do banco de dados podem não ter migrado corretamente. Esta versão adicionou várias colunas novas às tabelas existentes. Você pode tentar executar:

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

Usar o botão Atualizar no painel não aplica as migrações do banco de dados — é necessária uma reconstrução completa quando o plugin adiciona novas colunas.

Obrigado pela paciência. Vamos resolver isso!

1 curtida

Na verdade, você pode executar isso primeiro e publicar a saída?

./launcher enter app
su discourse -c 'cd /var/www/discourse && bundle exec rails runner "puts ActiveRecord::Base.connection.columns(\"daily_challenges\").map(&:name)"'
1 curtida
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

veja isso

ActiveModel::UnknownAttributeError (atributo desconhecido 'challenge_timezone' para DailyChallenge.) app/controllers/application_controller.rb:447:in 'block in ApplicationController#with_resolved_locale'

Parece que você está sem a coluna do banco de dados challenge_timezone. Você pode executar o seguinte:

./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)"'

Isso deve adicioná-la. Vou investigar por que ela não foi adicionada e atualizar os arquivos.

1 curtida

Certo, resta apenas aguardar a correção dele

ActiveModel::UnknownAttributeError (atributo desconhecido 'challenge_timezone' para 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'

Para garantir que estamos no diretório correto, execute primeiro:

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

Em seguida, execute:

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)"'

Após executá-lo, você pode digitar “exit” para sair do aplicativo.

Faça uma atualização forçada na página web (Ctrl-Shift-R) e tente novamente. Se isso não funcionar, enviarei uma correção em alguns instantes.

Estou em uma reunião. Atualizo em breve.

1 curtida

Acabei de enviar uma atualização. Você deverá poder atualizar através do painel de administração. Se isso não funcionar, talvez seja necessário executar

./launcher rebuild app
1 curtida

Funciona

Friends: Chandler Bing (Matthew Perry) Dançando

1 curtida

WOOOO!!! Obrigado por ficar comigo e me ajudar a resolver isso!!

Funny Man Dancing in Tutu

1 curtida

Então, o próximo passo terá algumas novas funções? Gostaria de compartilhar algumas ideias com você:

Sequências com moedas e emblemas, além de uma área/seção para acompanhar suas próprias estatísticas.

De qualquer forma, adoro e estou aguardando mais :smiley:

1 curtida

Estou trabalhando atualmente nesta parte. Será basicamente um “bot” que você cria (na verdade, apenas uma conta de usuário). O plugin monitorará menções ao bot. Quando ele as detectar, executará a ação. Por exemplo:

Nome do Bot: ChallengeBot

Alguém digita:

@ChallengeBot status

O bot enviará uma mensagem direta (DM) com o status atual da pessoa no desafio.

O bot também terá algumas outras opções.

1 curtida

Como obter essas informações para exibi-las em outro local? Ou fazê-las aparecer no cartão do usuário? Se houver algum caminho para fazer isso, seria ótimo.

v1.4.0 já está disponível!

Esta versão adiciona o ChallengeBot — uma conta de bot opcional que traz recursos de engajamento baseados em DM para seus desafios.

Novidades nesta versão:

  • Confirmação de check-in por DM — os membros recebem uma DM do ChallengeBot após cada check-in bem-sucedido, mostrando sua sequência atual e um link para o tópico do desafio.
  • Lembretes por DM — participantes que não fizeram check-in por 2 ou mais dias consecutivos (desafios diários) ou que não fizeram check-in até o último dia da semana (desafios semanais) recebem um lembrete suave do ChallengeBot. Inclui a contagem atual de check-ins e a meta. Pode ser ativado/desativado por desafio, com padrão ativado.
  • Comandos com @mention — os membros podem mencionar @ChallengeBot em qualquer tópico de desafio ativo para obter estatísticas pessoais via DM. O bot nunca responde no próprio tópico. Comandos disponíveis: status, leaderboard, streak, checkins, progress, help. Limitado a 10 comandos por usuário por hora.
  • Postagens de leaderboard e resultados finais — se o ChallengeBot estiver configurado, as postagens semanais de leaderboard e os resultados finais são agora enviados pela conta do bot em vez da conta do sistema.
  • Nova configuração do sitedaily_challenge_bot_username
  • Novo campo de desafio — alternador para lembretes por DM (padrão ativado)

A configuração do ChallengeBot é opcional — todos os recursos existentes continuam funcionando sem ele. Consulte o post principal para obter instruções completas de configuração.

Observação: Esta versão inclui uma migração de banco de dados. O botão Atualizar no painel aplicará automaticamente.

2 curtidas

Incrível :smiley:

Essa opção é possível se for enviada para MP e no tópico? Por sinal, configurei @system como chatbot.

CSS

.painel-desafio-diário {
    background-color: #1a1a1b;
    padding: 20px;
    border-radius: 8px;
    color: #d7dadc;
}

.título-subcabeçalho-página {
    color: #ffffff;
    font-size: 1.5rem;
    margin-bottom: 15px;
    border-bottom: 1px solid #343536;
    padding-bottom: 10px;
}

.dados-estatísticos.painel-estatísticas-fcd {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
    gap: 12px;
    margin-bottom: 30px;
}

.dados-estatístico {
    background-color: #272729;
    border: 1px solid #343536;
    padding: 15px;
    border-radius: 8px;
    transition: border-color 0.2s;
}

.dados-estatístico:hover {
    border-color: #818384;
}

.rótulo-dados-estatístico {
    color: #818384;
    font-size: 0.75rem;
    text-transform: uppercase;
    font-weight: 700;
    letter-spacing: 0.5px;
}

.valor-dados-estatístico {
    display: block;
    font-size: 1.8rem;
    font-weight: 600;
    color: #ff4500;
}

.tabela-classificação-fcd {
    width: 100%;
    border-collapse: separate;
    border-spacing: 0 8px;
}

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

.linha-classificação-fcd {
    background-color: #272729;
    transition: transform 0.1s ease;
}

.linha-classificação-fcd td {
    padding: 12px 15px;
    border-top: 1px solid #343536;
    border-bottom: 1px solid #343536;
}

.linha-classificação-fcd td:first-child {
    border-left: 1px solid #343536;
    border-top-left-radius: 8px;
    border-bottom-left-radius: 8px;
}

.linha-classificação-fcd td:last-child {
    border-right: 1px solid #343536;
    border-top-right-radius: 8px;
    border-bottom-right-radius: 8px;
}

.linha-classificação-fcd:hover {
    background-color: #2d2d2e;
}

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

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

ícone-sequência-fcd {
    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; }
}

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

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

rótulo-progresso-fcd {
    font-size: 0.8rem;
    color: #d7dadc;
    font-weight: bold;
}

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