Подпишитесь, чтобы разместить объявление

Я ищу способ реализовать категорию в виде простого маркетплейса, где пользователи могут купить рекламу (то есть опубликовать пост).

Похоже, что плагин подписок позволит добавить платное расширение для группы, а при отмене подписки — вручную или программно — пользователь будет удалён.

Моя цель — создать подписку, которая позволит опубликовать пост в категории, а затем удалить пользователя из группы, имеющей право на публикацию.

Можно ли этого добиться только с помощью плагина подписок или, возможно, в связке с плагинами подписок и автоматизации?

Если сказать проще: я хочу продавать отдельные посты. Ответы на посты будут бесплатными.

Я считаю, что этот набор разрешений позволит сделать то, что я запрашиваю, учитывая, что ‘marketplace’ — это группа подписок.

Думаю, вам понадобится плагин, который будет удалять их из группы при создании темы в категории «Реклама».

Мне кажется, что плагин автоматизации не будет удалять пользователей из групп.

Что ж, я сам не умею программировать, и поскольку это будет доказательством концепции до того, как я смогу заручиться поддержкой моего начальника, на данный момент я не могу предложить никакой финансовой поддержки.
Кто-нибудь ещё считает, что что-то подобное было бы полезно для сообщества?

Ещё один момент: есть ли какая-либо связь между Discourse и плагином подписок, которая могла бы отслеживать количество подписок у пользователя? Это помогло бы позволить кому-то покупать несколько постов сразу, а не покупать один, публиковать, затем покупать ещё один и снова публиковать.

Вам просто нужно попросить его пофантазировать для концепт-прототипа.

Скорее всего, это можно реализовать с помощью вебхуков и одного из инструментов для работы с ними, например Zapier.

Это усложнило бы плагин.

Конечно, но было бы здорово иметь такую возможность.
В любом случае, похоже, это сработает, если вы пропишете ID категории и название группы в коде напрямую.
Могут ли настоящие программисты доработать этот код так, чтобы эти переменные можно было задавать через страницу настроек плагина?

# 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

# Настройка сайта для включения/отключения плагина
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
  # Прослушивание событий создания постов
  DiscourseEvent.on(:post_created) do |post|
    next unless SiteSetting.auto_remove_group_enabled
    next unless post&.user # Убедитесь, что у поста есть пользователь
    next unless post&.topic&.category_id # Убедитесь, что пост находится в категории

    target_category_id = SiteSetting.auto_remove_group_category_id
    group_name = SiteSetting.auto_remove_group_name

    # Проверка, находится ли пост в настроенной категории
    if post.topic.category_id == target_category_id
      begin
        group = Group.find_by(name: group_name)
        unless group
          Rails.logger.error("AutoRemoveGroup: Группа '#{group_name}' не найдена")
          next
        end

        user = post.user
        if group.users.include?(user)
          group.remove(user)
          Rails.logger.info("AutoRemoveGroup: Пользователь #{user.username} удалён из группы #{group_name} после публикации в категории #{target_category_id}")
        else
          Rails.logger.info("AutoRemoveGroup: Пользователь #{user.username} не состоит в группе #{group_name}, действие не выполнено")
        end
      rescue StandardError => e
        Rails.logger.error("AutoRemoveGroup: Ошибка удаления пользователя из группы: #{e.message}")
      end
    end
  end
end

Это может сработать!

Начните с Discourse-plugin-skeleton, используйте его как ваш plugin.rb и посмотрите, чем может помочь Ask.discourse.com.

Используйте add_model_callback вместо Discourse.event. Примеры можно найти в репозитории all_the_plugins.

И Grok, и ask.discourse.com рекомендуют устанавливать плагин в /var/discourse/plugins/.

Проблема в том, что у меня нет такого пути — ни внутри, ни снаружи контейнера. Ближайший, который я могу найти внутри контейнера, это /var/www/discourse/plugins/.

Когда я пытаюсь установить плагин туда и пересобрать систему, он исчезает.

Хорошо, бот говорит, что для самостоятельной установки это нормально. Я не знаю, как настроить правильный репозиторий Git, чтобы установить плагин обычным способом. Кто-нибудь может помочь мне с этим?

Думаю, я настроил git, установил плагин, но получил ошибки. Честно говоря, именно здесь я теряюсь.

/var/www/discourse/plugins/discourse-auto-remove-group/plugin.rb:9:in `activate!': undefined method `register_site_setting' for an instance of Plugin::Instance (NoMethodError)
Вы не можете запустить Discourse из-за ошибок в плагине:
/var/www/discourse/plugins/discourse-auto-remove-group

Попробуйте удалить этот плагин и выполнить сборку заново!
I, [2025-05-20T16:17:10.306025 #1]  INFO -- : 
I, [2025-05-20T16:17:10.347496 #1]  INFO -- : Завершение асинхронных процессов
I, [2025-05-20T16:17:10.350251 #1]  INFO -- : Отправка INT для HOME=/var/lib/postgresql USER=postgres exec 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 -- : Отправка TERM для exec 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:  получен запрос быстрого завершения
109:signal-handler (1747757830) Получен SIGTERM, планирование завершения...
109:M 20 May 2025 16:17:10.368 # Пользователь запросил завершение...
109:M 20 May 2025 16:17:10.369 * Сохранение финального снимка RDB перед выходом.
2025-05-20 16:17:10.412 UTC [42] LOG:  прерывание любых активных транзакций
2025-05-20 16:17:10.438 UTC [42] LOG:  фоновый рабочий "logical replication launcher" (PID 56) завершил работу с кодом выхода 1
2025-05-20 16:17:10.438 UTC [51] LOG:  завершение работы
2025-05-20 16:17:10.447 UTC [51] LOG:  начало контрольной точки: немедленное завершение
2025-05-20 16:17:10.526 UTC [51] LOG:  контрольная точка завершена: записано 0 буферов (0.0%); добавлено 0 файлов WAL, удалено 0, переработано 0; write=0.001 с, sync=0.001 с, total=0.088 с; sync files=0, longest=0.000 с, average=0.000 с; distance=0 КБ, estimate=4 КБ
2025-05-20 16:17:10.540 UTC [42] LOG:  система баз данных завершена
109:M 20 May 2025 16:17:10.947 * База данных сохранена на диск
109:M 20 May 2025 16:17:10.947 # Redis готов к выходу, пока...


ОШИБКА
--------------------
Pups::ExecError: cd /var/www/discourse && su discourse -c 'bundle exec rake db:migrate' завершился с ошибкой, код возврата #<Process::Status: pid 987 exit 1>
Место ошибки: /usr/local/lib/ruby/gems/3.3.0/gems/pups-1.2.1/lib/pups/exec_command.rb:132:in `spawn'
Выполнение не удалось с параметрами {"cd"=>"$home", "tag"=>"migrate", "hook"=>"db_migrate", "cmd"=>["su discourse -c 'bundle exec rake db:migrate'"]}
Загрузка не удалась с кодом выхода 1
** ЗАГРУЗКА НЕ УДАЛАСЬ ** пожалуйста, прокрутите вверх и поищите более ранние сообщения об ошибках, их может быть несколько.
./discourse-doctor может помочь диагностировать проблему.
9fed9596b10ffb4628947e678585b813813ae27a4de746feba16e89f2b9cdc51

Чёрт возьми! После нескольких дальнейших разговоров с Ask Discourse и Grok плагин теперь работает.

Кажется, ИИ иногда действительно полезен.

Это выглядит не очень красиво, но подтверждено, что работает.


У вас настроен экземпляр для разработки?

Я даже не знаю, что это значит. :slight_smile:

Если вы выполняете установку в режиме продакшена, вам следует указать URL-адрес репозитория GitHub в файле app.yml.

Метод клонирования, который вы использовали, больше подходит для установок в режиме разработки, но я не думаю, что вы используете именно его (поскольку вы используете лаунчер).

Ах да, именно это я и сделал. Я добавил строку git clone в файл app.yml и пересобрал проект, чтобы всё заработало.

Рад, что у вас получилось!

Если вы планируете разрабатывать плагин, то настройка окружения с помощью установки Discourse для разработки с использованием Docker, установки Discourse на Windows для разработки или же на Linux или Mac — это в 1000 раз быстрее.

Это означает, что вы можете отредактировать файл и обновить страницу в браузере, чтобы проверить, сработало ли изменение. Иногда даже перезагрузка не требуется.