Inscreva-se para postar um anúncio

Estou procurando uma maneira de implementar uma categoria como um marketplace simples, onde os usuários possam comprar um anúncio (ler postagem).

Parece que o plugin de assinaturas permitirá uma adição paga a um grupo, e então, quando a assinatura for cancelada, manual ou programaticamente, ela remove o usuário.

O que estou tentando fazer é uma assinatura que permita uma postagem em uma categoria e depois remova-os do grupo permitido para postar.

Isso pode ser realizado apenas com o plugin de assinaturas, ou talvez entre assinaturas e automação?

Dito de forma mais simples, quero vender postagens individuais. Respostas às postagens seriam gratuitas.

Acredito que este conjunto de permissões permitiria o que estou pedindo, dado que ‘marketplace’ é o grupo de assinatura.

Acho que você precisaria de um plugin que removesse os usuários do grupo ao criar um tópico na categoria de anúncios.

Eu não acho que o plugin de automação vá remover usuários de grupos.

1 curtida

Bem, eu não consigo programar por conta própria, e como isso seria uma prova de conceito antes de conseguir convencer meu chefe a apoiá-lo, não tenho como oferecer suporte financeiro no momento.
Mais alguém acha que algo assim seria útil para a comunidade?

Outra consideração, há alguma comunicação entre o Discourse e o plugin de assinaturas que poderia rastrear quantas assinaturas um usuário possui? Seria útil permitir que alguém compre várias postagens de uma só vez, em vez de comprar uma, postar, depois comprar outra e postar novamente.

Você só teria que dizer a ele para usar a imaginação dele para a prova de conceito.

Você provavelmente poderia fazer isso com webhooks e uma dessas ferramentas de webhook como o zapier.

Isso tornaria o plugin mais complicado.

Com certeza, mas seria legal ter.
De qualquer forma, parece que isso faria o trabalho, desde que você codifique o ID da categoria e o nome do grupo.
Algum programador de verdade pode expandir isso para que você possa definir essas variáveis na página de configurações do plugin?

# name: discourse-auto-remove-group
# version: 0.1
# authors: tknospdr
# url: https://github.com/tknospdr/discourse-auto-remove-group

enabled_site_setting :auto_remove_group_enabled

# Configuração do site para habilitar/desabilitar o plugin
register_site_setting :auto_remove_group_enabled, type: :boolean, default: false
register_site_setting :auto_remove_group_category_id, type: :integer, default: 0
register_site_setting :auto_remove_group_name, type: :string, default: ""

after_initialize do
  # Ouvir eventos de criação de post
  DiscourseEvent.on(:post_created) do |post|
    next unless SiteSetting.auto_remove_group_enabled
    next unless post&.user # Garante que o post tenha um usuário
    next unless post&.topic&.category_id # Garante que o post esteja em uma categoria

    target_category_id = SiteSetting.auto_remove_group_category_id
    group_name = SiteSetting.auto_remove_group_name

    # Verifica se o post está na categoria configurada
    if post.topic.category_id == target_category_id
      begin
        group = Group.find_by(name: group_name)
        unless group
          Rails.logger.error("AutoRemoveGroup: Grupo '#{group_name}' não encontrado")
          next
        end

        user = post.user
        if group.users.include?(user)
          group.remove(user)
          Rails.logger.info("AutoRemoveGroup: Usuário #{user.username} removido do grupo #{group_name} após postar na categoria #{target_category_id}")
        else
          Rails.logger.info("AutoRemoveGroup: Usuário #{user.username} não está no grupo #{group_name}, nenhuma ação tomada")
        end
      rescue StandardError => e
        Rails.logger.error("AutoRemoveGroup: Erro ao remover usuário do grupo: #{e.message}")
      end
    end
  end
end

Isso pode funcionar!

Comece com o Discourse-plugin-skeleton, faça dele o seu plugin.rb e talvez veja o que Ask.discourse.com pode fazer para ajudar.

E use add_model_callback em vez de Discourse.event. Você pode procurar no repositório all_the_plugins por alguns exemplos.

1 curtida

Tanto o grok quanto o ask.discourse.com dizem para instalar o plugin em /var/discouse/plugins/.

O problema é que não tenho esse caminho, nem dentro nem fora do contêiner. O mais próximo que consigo encontrar é dentro do contêiner, tenho /var/www/discourse/plugins/.

Quando tento instalá-lo lá e reconstruir, ele desaparece.

Ok, então o bot diz que isso é normal para uma instalação auto-hospedada. Não sei como configurar um repositório git adequado para instalar o plugin da maneira normal. Alguém pode me ajudar com isso?

Acho que consegui fazer o git funcionar, instalei o plugin e encontrei alguns erros. Honestamente, é aqui que estou perdido.

/var/www/discourse/plugins/discourse-auto-remove-group/plugin.rb:9:in `activate!': método indefinido `register_site_setting' para uma instância de Plugin::Instance (NoMethodError)
Você não consegue iniciar o Discourse devido a erros no plugin em
/var/www/discourse/plugins/discourse-auto-remove-group

Por favor, tente remover este plugin e reconstruir novamente!
I, [2025-05-20T16:17:10.306025 #1]  INFO -- : 
I, [2025-05-20T16:17:10.347496 #1]  INFO -- : Encerrando processos assíncronos
I, [2025-05-20T16:17:10.350251 #1]  INFO -- : Enviando INT para HOME=/var/lib/postgresql USER=postgres executar chpst -u postgres:postgres:ssl-cert -U postgres:postgres:ssl-cert /usr/lib/postgresql/15/bin/postmaster -D /etc/postgresql/15/main pid: 42
I, [2025-05-20T16:17:10.351238 #1]  INFO -- : Enviando TERM para executar chpst -u redis -U redis /usr/bin/redis-server /etc/redis/redis.conf pid: 109
2025-05-20 16:17:10.351 UTC [42] LOG:  solicitação de desligamento rápido recebida
109:signal-handler (1747757830) Recebeu SIGTERM agendando desligamento...
109:M 20 Mai 2025 16:17:10.368 # Usuário solicitou desligamento...
109:M 20 Mai 2025 16:17:10.369 * Salvando o snapshot final RDB antes de sair.
2025-05-20 16:17:10.412 UTC [42] LOG:  abortando quaisquer transações ativas
2025-05-20 16:17:10.438 UTC [42] LOG:  trabalhador de fundo "logical replication launcher" (PID 56) saiu com código de saída 1
2025-05-20 16:17:10.438 UTC [51] LOG:  desligando
2025-05-20 16:17:10.447 UTC [51] LOG:  início do checkpoint: desligamento imediato
2025-05-20 16:17:10.526 UTC [51] LOG:  checkpoint concluído: escreveu 0 buffers (0,0%); 0 arquivo WAL adicionado, removido, reciclado; escrita=0.001 s, sincronização=0.001 s, total=0.088 s; arquivos de sincronização=0, mais longo=0.000 s, média=0.000 s; distância=0 kB, estimativa=4 kB
2025-05-20 16:17:10.540 UTC [42] LOG:  sistema de banco de dados desligado
109:M 20 Mai 2025 16:17:10.947 * Banco salvo no disco
109:M 20 Mai 2025 16:17:10.947 # Redis agora está pronto para sair, tchau tchau...


FALHOU
--------------------
Pups::ExecError: cd /var/www/discourse && su discourse -c 'bundle exec rake db:migrate' falhou com retorno #<Process::Status: pid 987 saída 1>
Localização da falha: /usr/local/lib/ruby/gems/3.3.0/gems/pups-1.2.1/lib/pups/exec_command.rb:132:in `spawn'
exec falhou com os parâmetros {"cd"=>"$home", "tag"=>"migrate", "hook"=>"db_migrate", "cmd"=>["su discourse -c 'bundle exec rake db:migrate'"]}
bootstrap falhou com código de saída 1
** FALHA AO BOOTSTRAP ** por favor, role para cima e procure por mensagens de erro anteriores, pode haver mais de uma.
./discourse-doctor pode ajudar a diagnosticar o problema.
9fed9596b10ffb4628947e678585b813813ae27a4de746feba16e89f2b9cdc51

Caramba! Após várias outras conversas com Ask Discourse e Grok. O plugin agora está funcionando.

Acho que IA é realmente ÚTIL às vezes.

É feio, mas confirmado que está funcionando.


1 curtida

Você tem uma instância de desenvolvimento configurada?

Eu nem sei o que isso significa. :sorrindo:

Você deve colocar o URL do repositório do Github no seu arquivo app.yml, se estiver executando uma instalação de produção.

O método de clonagem que você usou funciona mais para instalações de desenvolvimento, mas não acho que seja isso que você está executando (já que você está usando o launcher).

Ah sim, foi isso que eu fiz.
Adicionei uma linha de clone do git no arquivo app.yml e reconstrui para fazer as coisas acontecerem.

2 curtidas

Que bom que você conseguiu fazer funcionar!

Se você for desenvolver um plugin, é 1000 vezes mais rápido configurar um Instalar Discourse para desenvolvimento usando Docker ou Instalar Discourse no Windows para desenvolvimento ou Linux ou Mac.

Isso significa que você pode editar um arquivo e recarregar seu navegador para ver se funcionou. Às vezes, você nem precisa recarregar.

1 curtida