2019-05-13 10:37:49 +08:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
2021-07-13 14:36:16 -05:00
|
|
|
module DiscourseChatIntegration
|
2017-07-04 19:37:56 +01:00
|
|
|
class ProviderError < StandardError
|
|
|
|
attr_accessor :info
|
|
|
|
|
|
|
|
def initialize(message = nil, info: nil)
|
|
|
|
super(message)
|
|
|
|
self.info = info.nil? ? {} : info
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2017-06-27 19:21:27 +01:00
|
|
|
module Provider
|
|
|
|
def self.providers
|
2022-12-29 12:31:05 +00:00
|
|
|
constants.select { |constant| constant.to_s =~ /Provider$/ }.map(&method(:const_get))
|
2017-06-27 19:21:27 +01:00
|
|
|
end
|
|
|
|
|
2017-07-03 15:53:26 +01:00
|
|
|
def self.enabled_providers
|
2022-12-29 12:31:05 +00:00
|
|
|
self.providers.select { |provider| self.is_enabled(provider) }
|
2017-07-03 15:53:26 +01:00
|
|
|
end
|
|
|
|
|
2017-07-12 18:28:45 +01:00
|
|
|
def self.provider_names
|
2017-10-03 17:42:07 +08:00
|
|
|
self.providers.map! { |x| x::PROVIDER_NAME }
|
2017-07-12 18:28:45 +01:00
|
|
|
end
|
|
|
|
|
2017-07-05 15:03:02 +01:00
|
|
|
def self.enabled_provider_names
|
2017-10-03 17:42:07 +08:00
|
|
|
self.enabled_providers.map! { |x| x::PROVIDER_NAME }
|
2017-07-05 15:03:02 +01:00
|
|
|
end
|
|
|
|
|
2017-06-27 19:21:27 +01:00
|
|
|
def self.get_by_name(name)
|
2017-08-01 20:53:39 +01:00
|
|
|
self.providers.find { |p| p::PROVIDER_NAME == name }
|
2017-06-27 19:21:27 +01:00
|
|
|
end
|
|
|
|
|
2017-07-03 15:53:26 +01:00
|
|
|
def self.is_enabled(provider)
|
2022-12-29 12:31:05 +00:00
|
|
|
if defined?(provider::PROVIDER_ENABLED_SETTING)
|
2019-05-16 03:24:17 +03:00
|
|
|
SiteSetting.public_send(provider::PROVIDER_ENABLED_SETTING)
|
2017-07-03 15:53:26 +01:00
|
|
|
else
|
|
|
|
false
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2017-07-05 15:03:02 +01:00
|
|
|
class HookEngine < ::Rails::Engine
|
2021-07-13 14:36:16 -05:00
|
|
|
engine_name DiscourseChatIntegration::PLUGIN_NAME + "-hooks"
|
|
|
|
isolate_namespace DiscourseChatIntegration::Provider
|
2017-07-05 15:03:02 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
class HookController < ::ApplicationController
|
2021-07-13 14:36:16 -05:00
|
|
|
requires_plugin DiscourseChatIntegration::PLUGIN_NAME
|
2017-07-05 15:03:02 +01:00
|
|
|
|
2022-12-29 12:31:05 +00:00
|
|
|
class ProviderDisabled < StandardError
|
|
|
|
end
|
2017-07-05 15:03:02 +01:00
|
|
|
|
2022-12-29 12:31:05 +00:00
|
|
|
rescue_from ProviderDisabled do
|
2017-07-05 15:03:02 +01:00
|
|
|
rescue_discourse_actions(:not_found, 404)
|
|
|
|
end
|
|
|
|
|
|
|
|
def self.requires_provider(provider_name)
|
2017-09-04 10:44:32 +08:00
|
|
|
before_action do
|
2017-07-05 15:03:02 +01:00
|
|
|
raise ProviderDisabled.new unless Provider.enabled_provider_names.include?(provider_name)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def respond
|
2017-08-01 20:53:39 +01:00
|
|
|
render
|
2017-07-05 15:03:02 +01:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
# Automatically mount each provider's engine inside the HookEngine
|
|
|
|
def self.mount_engines
|
|
|
|
engines = []
|
2021-07-13 14:36:16 -05:00
|
|
|
DiscourseChatIntegration::Provider.providers.each do |provider|
|
2022-12-29 12:31:05 +00:00
|
|
|
engine =
|
|
|
|
provider
|
|
|
|
.constants
|
|
|
|
.select { |constant| constant.to_s =~ (/Engine$/) && (constant.to_s != "HookEngine") }
|
|
|
|
.map(&provider.method(:const_get))
|
|
|
|
.first
|
|
|
|
|
|
|
|
engines.push(engine: engine, name: provider::PROVIDER_NAME) if engine
|
2017-07-05 15:03:02 +01:00
|
|
|
end
|
|
|
|
|
2021-07-13 14:36:16 -05:00
|
|
|
DiscourseChatIntegration::Provider::HookEngine.routes.draw do
|
2022-12-29 12:31:05 +00:00
|
|
|
engines.each { |engine| mount engine[:engine], at: engine[:name] }
|
2017-07-05 15:03:02 +01:00
|
|
|
end
|
|
|
|
end
|
2017-06-27 19:21:27 +01:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2017-10-10 13:01:46 +08:00
|
|
|
require_relative "provider/slack/slack_provider"
|
|
|
|
require_relative "provider/telegram/telegram_provider"
|
|
|
|
require_relative "provider/discord/discord_provider"
|
|
|
|
require_relative "provider/mattermost/mattermost_provider"
|
|
|
|
require_relative "provider/matrix/matrix_provider"
|
|
|
|
require_relative "provider/zulip/zulip_provider"
|
|
|
|
require_relative "provider/rocketchat/rocketchat_provider"
|
|
|
|
require_relative "provider/gitter/gitter_provider"
|
2017-10-16 16:44:21 +02:00
|
|
|
require_relative "provider/flowdock/flowdock_provider"
|
2020-05-11 15:10:37 -04:00
|
|
|
require_relative "provider/groupme/groupme_provider"
|
2020-07-29 21:50:02 +05:30
|
|
|
require_relative "provider/teams/teams_provider"
|
2020-12-11 04:43:03 -05:00
|
|
|
require_relative "provider/webex/webex_provider"
|
2021-01-26 20:33:03 +00:00
|
|
|
require_relative "provider/google/google_provider"
|
2022-08-30 10:10:17 -07:00
|
|
|
require_relative "provider/guilded/guilded_provider"
|