Я ищу способ реализовать категорию в виде простого маркетплейса, где пользователи могут купить рекламу (то есть опубликовать пост).
Похоже, что плагин подписок позволит добавить платное расширение для группы, а при отмене подписки — вручную или программно — пользователь будет удалён.
Моя цель — создать подписку, которая позволит опубликовать пост в категории, а затем удалить пользователя из группы, имеющей право на публикацию.
Можно ли этого добиться только с помощью плагина подписок или, возможно, в связке с плагинами подписок и автоматизации?
Если сказать проще: я хочу продавать отдельные посты. Ответы на посты будут бесплатными.
Что ж, я сам не умею программировать, и поскольку это будет доказательством концепции до того, как я смогу заручиться поддержкой моего начальника, на данный момент я не могу предложить никакой финансовой поддержки.
Кто-нибудь ещё считает, что что-то подобное было бы полезно для сообщества?
Ещё один момент: есть ли какая-либо связь между Discourse и плагином подписок, которая могла бы отслеживать количество подписок у пользователя? Это помогло бы позволить кому-то покупать несколько постов сразу, а не покупать один, публиковать, затем покупать ещё один и снова публиковать.
Конечно, но было бы здорово иметь такую возможность.
В любом случае, похоже, это сработает, если вы пропишете 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
И 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
Если вы выполняете установку в режиме продакшена, вам следует указать URL-адрес репозитория GitHub в файле app.yml.
Метод клонирования, который вы использовали, больше подходит для установок в режиме разработки, но я не думаю, что вы используете именно его (поскольку вы используете лаунчер).
Это означает, что вы можете отредактировать файл и обновить страницу в браузере, чтобы проверить, сработало ли изменение. Иногда даже перезагрузка не требуется.