プラグインで webhook を追加できますか?

I’m working on a plugin that communicates with an external web app. The web app is also informed of changes in Discourse through the use of webhooks.
Right now, installing the plugin is complicated, because it requires to also manually set up the webhooks. Is there a way my plugin could set up the webhooks itself?

I’m not much of a plugin author, but I’m pretty sure that you can call something like

hook = WebHook.new(payload_url: "https://sefsdf", secret: "lkjlkjlkj", active: true)
hook.save

Here are the other things in a webhook that you may or may not need to set.

 id: nil,
 payload_url: nil,
 content_type: 1,
 last_delivery_status: 1,
 status: 1,
 secret: "",
 wildcard_web_hook: false,
 verify_certificate: true,
 active: false,
 created_at: nil,
 updated_at: nil>

Ah that would only create a web hook record in the database but doesn’t enqueue any jobs.

What kind of custom fields/webhook are you sending to your web app? You could subscribe to certain DiscourseEvents and add a custom Sidekiq job which calls an API on your web app.

Thanks @tgxworld. I’ve seen examples of how to use DiscourseEvents to emulate Discourse native webhooks here and here. I will try to do that if there’s no other choice.

But this seems complex. I would love to have a one-liner, like what @pfaffman proposed. When you use the UI or the API to create a webhook, doesn’t Discourse call an internal function I could also use from my plugin.rb file?

Is this a call to the kind of internal function I’ve just mentioned?

If you want to invoke a webhook when certain internal event happens, here it is the example. GitHub - erickguan/discourse-user-created-webhook · GitHub.
If you want to add a new type of webhook, here it is the example. GitHub - erickguan/discourse-webhooks-example · GitHub

Thanks a lot @fantasticfears, I will try this.

最終的に私が行ったことは以下の通りです。

トピックの作成と削除に関する標準的な通知が必要だったため、Discourse が標準の webhook 機能の一部として既にそれらをキューイングしていることに気づきました。そのため、自分で実装する必要はありません。

@pfaffman 氏が提案したように、残っている作業は webhook をデータベースに追加することです。しかし、提案されたコードは何もエラーを返さずに失敗します。おそらく、パラメータが不足しているか、正しくないことが原因でしょう。

以下が私の完全な動作するコードです。

#customization:plugin.rb

# 管理者が手動で行う必要がないよう、webhook を自動的に追加します
after_initialize do
	# 以前インストールされた webhook を削除します(予約 ID = 1000)
	WebHook.where(id: 1000).destroy_all

	# webhook を作成します(予約 ID = 1000)
	hook = WebHook.new(
		id: 1000,							# 予約 ID
		payload_url: 'https://hfzeoihifzh/',
		content_type: 1,					# 1 = 'application/json'
		secret: "min12characters",
		active: true,
		verify_certificate: true,
		web_hook_event_type_ids: [1]		# 1 = トピックイベント
	)
	hook.save	
end