Files
discourse-chat-integration/plugin.rb
T
Gabriel GrubbaandJarek Radosz 3f8b67d1c1 Feature: add chat integration reference post (#216)
* FEATURE: Add chat integration reference post

This class works similar to a post but it is not a post.

* DEV: change how `excerpt` method works

* feature: Add `send_chat_integration_message` scriptable

add `send_chat_integration_message` scriptable that uses the rules to send a message to the chat provider
add locale strings for the new scriptable
update `ChatIntegrationReferencePost` `excerpt` method
add tests for `ChatIntegrationReferencePost`

* DEV: Add `get_channel_by_name` to every provider

This makes using `trigger_notification` easier with every provider as well.

* DEV: Add `get_channel_name` to all providers

This method gets the name of the channel based on how the provider identifies it.
Updates channel_name in locales yaml
Adds migrate_tag_added_filter_to_all_providers.rb to move all existing rules to use Automation

* DEV: Add removal of old migration data

Update small action locales with strings from core

* DEV: solve review comments

* DEV: update test locale strings

* DEV: remove empty line to trigger lint

* DEV: lint applied

* DEV: Add tests for automation integration

* DEV: add rails logger for when automatio error occurs

* DEV: move migration to be SQL only

Update provider helper to use hashes instead of dot notation

* DEV: update migration with correct table names

* DEV: Update migrate_tag_added_filter_to_all_providers to use smaller SQL queries

Commented out migrate_tag_added_from_filter_to_automation.rb

* DEV: update comments in migration file

* DEV: update indentation in client.en.yml

* DEV: update with review comments

* Update spec/lib/discourse_chat_integration/chat_integration_reference_post_spec.rb

Co-authored-by: Jarek Radosz <[email protected]>

* Update spec/lib/discourse_chat_integration/chat_integration_reference_post_spec.rb

Co-authored-by: Jarek Radosz <[email protected]>

* Update spec/lib/discourse_chat_integration/chat_integration_reference_post_spec.rb

Co-authored-by: Jarek Radosz <[email protected]>

* Update spec/integration/automation_spec.rb

Co-authored-by: Jarek Radosz <[email protected]>

* Update lib/discourse_chat_integration/chat_integration_reference_post.rb

Co-authored-by: Jarek Radosz <[email protected]>

* DEV: update specs with review comments

* DEV: update typos in tests

* DEV: inlined functions for getting channel name for provider in migration

---------

Co-authored-by: Jarek Radosz <[email protected]>
2024-09-11 10:42:52 -03:00

137 lines
4.8 KiB
Ruby

# frozen_string_literal: true
# name: discourse-chat-integration
# about: Allows integration with several external chat system providers
# meta_topic_id: 66522
# version: 0.1
# url: https://github.com/discourse/discourse-chat-integration
# author: David Taylor
enabled_site_setting :chat_integration_enabled
register_asset "stylesheets/chat-integration.scss"
register_svg_icon "rocket" if respond_to?(:register_svg_icon)
register_svg_icon "fa-arrow-circle-o-right" if respond_to?(:register_svg_icon)
# Site setting validators must be loaded before initialize
require_relative "lib/discourse_chat_integration/provider/slack/slack_enabled_setting_validator"
require_relative "lib/discourse_chat_integration/chat_integration_reference_post"
after_initialize do
require_relative "app/initializers/discourse_chat_integration"
require_relative "app/services/problem_check/channel_errors"
register_problem_check ProblemCheck::ChannelErrors
on(:site_setting_changed) do |setting_name, old_value, new_value|
is_enabled_setting = setting_name == :chat_integration_telegram_enabled
is_access_token = setting_name == :chat_integration_telegram_access_token
if (is_enabled_setting || is_access_token)
enabled =
is_enabled_setting ? new_value == true : SiteSetting.chat_integration_telegram_enabled
if enabled && SiteSetting.chat_integration_telegram_access_token.present?
Scheduler::Defer.later("Setup Telegram Webhook") do
DiscourseChatIntegration::Provider::TelegramProvider.setup_webhook
end
end
end
end
on(:post_created) do |post|
# This will run for every post, even PMs. Don't worry, they're filtered out later.
time = SiteSetting.chat_integration_delay_seconds.seconds
Jobs.enqueue_in(time, :notify_chats, post_id: post.id)
end
add_admin_route "chat_integration.menu_title", "chat-integration"
DiscourseChatIntegration::Provider.mount_engines
if defined?(DiscourseAutomation)
add_automation_scriptable("send_slack_message") do
field :message, component: :message, required: true, accepts_placeholders: true
field :url, component: :text, required: true
field :channel, component: :text, required: true
version 1
triggerables %i[point_in_time recurring topic_tags_changed]
script do |context, fields, automation|
channel_name = fields.dig("channel", "value")
channel =
DiscourseChatIntegration::Channel.new(
provider: "slack",
data: {
identifier: "##{channel_name}",
},
)
begin
message =
DiscourseChatIntegration::Provider::SlackProvider.create_slack_message(
context: context,
content: fields.dig("message", "value"),
url: fields.dig("url", "value"),
channel_name: channel_name,
)
DiscourseChatIntegration::Provider::SlackProvider.send_via_api(nil, channel, message)
rescue StandardError => _
# StandardError here is when there are no tags but content includes reference to them.
end
end
end
add_automation_scriptable("send_chat_integration_message") do
field :provider,
component: :choices,
extra: {
content:
DiscourseChatIntegration::Provider.enabled_provider_names.map do |provider|
{ id: provider, name: "chat_integration.provider.#{provider}.title" }
end,
},
required: true
field :channel_name, component: :text, required: true
version 1
triggerables %i[topic_tags_changed]
script do |context, fields, automation|
provider = fields.dig("provider", "value")
channel_name = fields.dig("channel_name", "value")
post =
DiscourseChatIntegration::ChatIntegrationReferencePost.new(
user: context["user"],
topic: context["topic"],
kind: context["kind"],
context: {
"added_tags" => context["added_tags"],
"removed_tags" => context["removed_tags"],
},
)
provider = DiscourseChatIntegration::Provider.get_by_name(provider)
channel = provider.get_channel_by_name(channel_name) # user must have created a channel in /admin/plugins/chat-integration/<provider> page
if channel.nil?
Rails.logger.warn "[discourse-automation] Channel not found. Automation ID: #{automation.id}"
next
end
begin
provider.trigger_notification(post, channel, nil)
rescue StandardError => _
Rails.logger.warn "[discourse-automation] Error while sending chat integration message. Automation ID: #{automation.id}"
end
end
end
end
end