插件可以添加 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