module DiscourseChat class ProviderError < StandardError attr_accessor :info def initialize(message = nil, info: nil) super(message) self.info = info.nil? ? {} : info end end module Provider def self.providers constants.select do |constant| constant.to_s =~ /Provider$/ end.map(&method(:const_get)) end def self.enabled_providers self.providers.select do |provider| self.is_enabled(provider) end end def self.provider_names self.providers.map {|x| x::PROVIDER_NAME} end def self.enabled_provider_names self.enabled_providers.map {|x| x::PROVIDER_NAME} end def self.get_by_name(name) self.providers.find{|p| p::PROVIDER_NAME == name} end def self.is_enabled(provider) if defined? provider::PROVIDER_ENABLED_SETTING SiteSetting.send(provider::PROVIDER_ENABLED_SETTING) else false end end class HookEngine < ::Rails::Engine engine_name DiscourseChat::PLUGIN_NAME+"-hooks" isolate_namespace DiscourseChat::Provider end class HookController < ::ApplicationController requires_plugin DiscourseChat::PLUGIN_NAME class ProviderDisabled < StandardError; end rescue_from ProviderDisabled do rescue_discourse_actions(:not_found, 404) end def self.requires_provider(provider_name) before_filter do raise ProviderDisabled.new unless Provider.enabled_provider_names.include?(provider_name) end end def respond render end end # Automatically mount each provider's engine inside the HookEngine def self.mount_engines engines = [] DiscourseChat::Provider.providers.each do |provider| engine = provider.constants.select do |constant| constant.to_s =~ /Engine$/ and not constant.to_s == "HookEngine" end.map(&provider.method(:const_get)).first if engine engines.push({engine: engine, name: provider::PROVIDER_NAME}) end end DiscourseChat::Provider::HookEngine.routes.draw do engines.each do |engine| mount engine[:engine], at: engine[:name] end end end end end require_relative "provider/slack/slack_provider.rb" require_relative "provider/telegram/telegram_provider.rb"