# frozen_string_literal: true module Jobs class DiscourseChatMigrateFromSlackOfficial < ::Jobs::Onceoff def execute_onceoff(args) slack_installed = PluginStoreRow.where(plugin_name: "discourse-slack-official").exists? if slack_installed already_setup_rules = DiscourseChatIntegration::Channel.with_provider("slack").exists? already_setup_sitesettings = SiteSetting.chat_integration_slack_enabled || SiteSetting.chat_integration_slack_access_token.present? || SiteSetting.chat_integration_slack_incoming_webhook_token.present? || SiteSetting.chat_integration_slack_outbound_webhook_url.present? if !already_setup_rules && !already_setup_sitesettings ActiveRecord::Base.transaction do migrate_settings migrate_data is_slack_enabled = site_settings_value("slack_enabled") if is_slack_enabled slack_enabled = SiteSetting.find_by(name: "slack_enabled") slack_enabled.update!(value: "f") SiteSetting.chat_integration_slack_enabled = true SiteSetting.chat_integration_enabled = true end end end end end def migrate_data rows = [] PluginStoreRow .where(plugin_name: "discourse-slack-official") .where("key ~* :pat", pat: "^category_.*") .each do |row| PluginStore .cast_value(row.type_name, row.value) .each do |rule| category_id = if row.key == "category_*" nil else row.key.gsub!("category_", "") row.key.to_i end next if !category_id.nil? && !Category.exists?(id: category_id) valid_tags = [] valid_tags = Tag.where(name: rule[:tags]).pluck(:name) if rule[:tags] rows << { category_id: category_id, channel: rule[:channel], filter: rule[:filter], tags: valid_tags, } end end rows.each do |row| # Load an existing channel with this identifier. If none, create it row[:channel] = "##{row[:channel]}" unless row[:channel].start_with?("#") channel = DiscourseChatIntegration::Channel .with_provider("slack") .with_data_value("identifier", row[:channel]) .first if !channel channel = DiscourseChatIntegration::Channel.create( provider: "slack", data: { identifier: row[:channel], }, ) if !channel.id Rails.logger.warn("Error creating channel for #{row}") next end end # Create the rule, with clever logic for avoiding duplicates success = DiscourseChatIntegration::Helper.smart_create_rule( channel: channel, filter: row[:filter], category_id: row[:category_id], tags: row[:tags], ) end end private def migrate_settings if !(slack_access_token = site_settings_value("slack_access_token")).nil? SiteSetting.chat_integration_slack_access_token = slack_access_token end if !(slack_incoming_webhook_token = site_settings_value("slack_incoming_webhook_token")).nil? SiteSetting.chat_integration_slack_incoming_webhook_token = slack_incoming_webhook_token end if !( slack_discourse_excerpt_length = site_settings_value("slack_discourse_excerpt_length") ).nil? SiteSetting.chat_integration_slack_excerpt_length = slack_discourse_excerpt_length end if !(slack_outbound_webhook_url = site_settings_value("slack_outbound_webhook_url")).nil? SiteSetting.chat_integration_slack_outbound_webhook_url = slack_outbound_webhook_url end if !(slack_icon_url = site_settings_value("slack_icon_url")).nil? SiteSetting.chat_integration_slack_icon_url = slack_icon_url end if !(post_to_slack_window_secs = site_settings_value("post_to_slack_window_secs")).nil? SiteSetting.chat_integration_delay_seconds = post_to_slack_window_secs end if !(slack_discourse_username = site_settings_value("slack_discourse_username")).nil? username = User.find_by(username: slack_discourse_username.downcase)&.username SiteSetting.chat_integration_discourse_username = (username || Discourse.system_user.username) end end def site_settings_value(name) value = SiteSetting.find_by(name: name)&.value if value == "t" value = true elsif value == "f" value = false end value end end end